#!/usr/bin/perl
-($arch, $file) = @ARGV;
+
+$v = $ENV{'KBUILD_VERBOSE'};
+$quiet = defined($v) ? !$v : 0;
+
+@args = ();
+for $arg ( @ARGV ) {
+ if ( $arg =~ /^-/ ) {
+ if ( $arg eq '-q' ) {
+ $quiet = 1;
+ } else {
+ die "$0: Unknown option: $arg\n";
+ }
+ } else {
+ push(@args, $arg);
+ }
+}
+($file, $arch, $outputdir) = @args;
if (!open(FILE, "< $file")) {
- print STDERR "$file: $!\n";
- exit(1);
+ die "$file: $!\n";
}
+print "socketcall-objs := ";
while ( defined($line = <FILE>) ) {
chomp $line;
- $line =~ s/\s*\#.*$//; # Strip comments and trailing blanks
+ $line =~ s/\s*[\#\;].*$//; # Strip comments and trailing blanks
next unless $line;
- if ( $line =~ /^\s*(.*)\s+([_a-zA-Z][_a-zA-Z0-9]+)\s*\((.*)\)$/ ) {
+ if ( $line =~ /^\s*\<\?\>\s*(.*)\s+([_a-zA-Z][_a-zA-Z0-9]+)\s*\((.*)\)$/ ) {
$type = $1;
$name = $2;
$argv = $3;
push(@cargs, "$arg a".$i++);
}
$nargs = $i;
+ print " \\\n\t${name}.o";
if ( $arch eq 'i386' ) {
- open(OUT, "> socketcalls/${name}.S")
- or die "$0: Cannot open socketcalls/${name}.S\n";
+ open(OUT, '>', "${outputdir}/${name}.S")
+ or die "$0: Cannot open ${outputdir}/${name}.S\n";
print OUT "#include <sys/socketcalls.h>\n";
print OUT "\n";
print OUT "\tmovb \$SYS_\U${name}\E,%al\n";
print OUT "\tjmp __socketcall_common\n";
print OUT "\t.size ${name},.-${name}\n";
+ close(OUT);
} else {
- open(OUT, "> socketcalls/${name}.c")
- or die "$0: Cannot open socketcalls/${name}.c\n";
- print OUT "#include \"socketcommon.h\"\n\n";
-
- print OUT "#ifdef __NR_$name\n\n";
- print OUT "_syscall", scalar(@args), "(", $type, ',', $name;
- $i = 0;
- foreach $arg ( @args ) {
- print OUT ",", $arg, ",a",$i++;
- }
- print OUT ");\n";
- print OUT "\n#else\n\n";
-
+ open(OUT, '>', "${outputdir}/${name}.c")
+ or die "$0: Cannot open ${outputdir}/${name}.c\n";
+
+ print OUT "#include \"../socketcommon.h\"\n";
+ print OUT "\n";
+ print OUT "#ifndef __NR_${name}\n\n";
+
+ print OUT "extern long __socketcall(int, const unsigned long *);\n\n";
+
print OUT "$type $name (", join(', ', @cargs), ")\n";
print OUT "{\n";
print OUT " unsigned long args[$nargs];\n";
for ( $i = 0 ; $i < $nargs ; $i++ ) {
print OUT " args[$i] = (unsigned long)a$i;\n";
}
- print OUT " return ($type) socketcall(SYS_\U${name}\E, args);\n";
- print OUT "}\n";
- print OUT "\n#endif\n";
+ print OUT " return ($type) __socketcall(SYS_\U${name}\E, args);\n";
+ print OUT "}\n\n";
+
+ print OUT "#endif\n";
+
+ close(OUT);
}
- close(OUT);
} else {
- print STDERR "$file:$.: Could not parse input\n";
- exit(1);
+ die "$file:$.: Could not parse input\n";
}
}
+
+print "\n";