blob: 52b6fcff53325f9d80b75973f385fa8c2ebaf534 [file] [log] [blame]
#!/usr/bin/perl
#
# Generate the smd_rpc_sym.c symbol file for ONCRPC SMEM Logging
#
# Copyright (c) 2009, The Linux Foundation. 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 The Linux Foundation 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();