Initial Contribution
msm-2.6.38: tag AU_LINUX_ANDROID_GINGERBREAD.02.03.04.00.142
Signed-off-by: Bryan Huntsman <bryanh@codeaurora.org>
diff --git a/arch/arm/mach-msm/mkrpcsym.pl b/arch/arm/mach-msm/mkrpcsym.pl
new file mode 100644
index 0000000..f4abb5f
--- /dev/null
+++ b/arch/arm/mach-msm/mkrpcsym.pl
@@ -0,0 +1,162 @@
+#!/usr/bin/perl
+#
+# Generate the smd_rpc_sym.c symbol file for ONCRPC SMEM Logging
+#
+# Copyright (c) 2009, Code Aurora Forum. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+# * Neither the name of Code Aurora Forum, Inc. nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+use strict;
+use POSIX;
+
+my $base_fn = "smd_rpc_sym";
+my %prog_table;
+my ($in, $out) = @ARGV;
+my $max_table_size = 1024;
+
+my $header = <<"EOF";
+/* Autogenerated by mkrpcsym.pl. Do not edit */
+EOF
+
+sub smd_rpc_gen_files() {
+ my $c_fp;
+ my $h_fp;
+ my @table;
+ my $tbl_index;
+ my $num_undefined=0;
+
+ # Process the input hash table into an array
+ # Any duplicate items will be combined, missing items will
+ # become "UNKNOWN" We end-up with a fully-qualified table
+ # from 0 to n.
+
+ $prog_table{"UNDEFINED"}{'name'}="UNDEFINED";
+ $prog_table{"UNDEFINED"}{'prog'}=-1;
+ my $hex_num = 0xFFFF;
+ foreach my $api_prog (sort {$a cmp $b} keys %prog_table ) {
+ $tbl_index = hex($api_prog) & hex("0000FFFF");
+ if($prog_table{$api_prog}{'prog'} >= 0) {
+ if($tbl_index < $max_table_size) {
+ $table[$tbl_index]=$prog_table{$api_prog};
+ } else {
+ print "Skipping table item $tbl_index, larger ",
+ "than max:$max_table_size \n";
+ }
+ }
+ }
+ for (my $i=0; $i<=$#table; $i++) {
+ if (!exists $table[$i]) {
+ $table[$i]=$prog_table{"UNDEFINED"};
+ $num_undefined++;
+ }
+ }
+
+
+ open($c_fp, ">", $out) or die $!;
+ print $c_fp $header;
+ print $c_fp "\n\n\n";
+ print $c_fp <<"EOF";
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/debugfs.h>
+#include <linux/module.h>
+
+struct sym {
+ const char *str;
+};
+
+EOF
+
+# Each API is named starts with "CB " to allow both the forward and
+# callback names of the API to be returned from a common database.
+# By convention, program names starting with 0x30 are forward APIS,
+# API names starting with 0x31 are callback apis.
+ print $c_fp "const char *smd_rpc_syms[] = {\n";
+
+ for (my $i=0; $i<= $#table; $i++) {
+ my $l = length($table[$i]{'name'});
+ my $t = floor((45 - $l - 4)/8);
+ print $c_fp "\t\"CB ".uc($table[$i]{'name'})."\",";
+ if($table[$i]{'name'} ne "UNDEFINED") {
+ for (my $i=0;$i<$t;$i++) {
+ print $c_fp "\t";
+ }
+ print $c_fp "/*".$table[$i]{'prog'}."*/\n";
+ } else {
+ print $c_fp "\n";
+ }
+ }
+
+ print $c_fp "};\n";
+ print $c_fp <<"EOF";
+
+static struct sym_tbl {
+ const char **data;
+ int size;
+} tbl = { smd_rpc_syms, ARRAY_SIZE(smd_rpc_syms)};
+
+const char *smd_rpc_get_sym(uint32_t val)
+{
+ int idx = val & 0xFFFF;
+ if (idx < tbl.size) {
+ if (val & 0x01000000)
+ return tbl.data[idx];
+ else
+ return tbl.data[idx] + 3;
+ }
+ return 0;
+}
+EXPORT_SYMBOL(smd_rpc_get_sym);
+
+EOF
+ close $c_fp;
+}
+
+sub read_smd_rpc_table() {
+ my $fp;
+ my $line;
+ open($fp, "<", $in) or die "$! File:$in";
+ while ($line = <$fp>) {
+ chomp($line);
+ if($line =~ /([^\s]+)\s+([\w]+)$/) {
+ if(defined $prog_table{$1}) {
+ print "Error entry already defined $1,",
+ " in $prog_table{$1}{name} \n";
+ } else {
+ $prog_table{$1}{'name'}=$2;
+ $prog_table{$1}{'prog'}=$1;
+ }
+ } else {
+ if($line =~ /\w/) {
+ print "Error parsing error >>$line<< \n";
+ }
+ }
+ }
+ close $fp;
+}
+
+read_smd_rpc_table();
+smd_rpc_gen_files();