chiark / gitweb /
[PATCH] klibc: version 1.0.6
[elogind.git] / klibc / klibc / socketcalls.pl
1 #!/usr/bin/perl
2
3 $v = $ENV{'KBUILD_VERBOSE'};
4 $quiet = defined($v) ? !$v : 0;
5
6 @args = ();
7 for $arg ( @ARGV ) {
8     if ( $arg =~ /^-/ ) {
9         if ( $arg eq '-q' ) {
10             $quiet = 1;
11         } else {
12             die "$0: Unknown option: $arg\n";
13         }
14     } else {
15         push(@args, $arg);
16     }
17 }
18 ($file, $arch, $outputdir) = @args;
19
20 if (!open(FILE, "< $file")) {
21     die "$file: $!\n";
22 }
23
24 print "socketcall-objs := ";
25 while ( defined($line = <FILE>) ) {
26     chomp $line;
27     $line =~ s/\s*[\#\;].*$//;  # Strip comments and trailing blanks
28     next unless $line;
29
30     if ( $line =~ /^\s*\<\?\>\s*(.*)\s+([_a-zA-Z][_a-zA-Z0-9]+)\s*\((.*)\)$/ ) {
31         $type = $1;
32         $name = $2;
33         $argv = $3;
34
35         @args = split(/\s*\,\s*/, $argv);
36         @cargs = ();
37
38         $i = 0;
39         for $arg ( @args ) {
40             push(@cargs, "$arg a".$i++);
41         }
42         $nargs = $i;
43         print " \\\n\tsocketcalls/${name}.o";
44
45         if ( $arch eq 'i386' ) {
46             open(OUT, '>', "${outputdir}/${name}.S")
47                 or die "$0: Cannot open ${outputdir}/${name}.S\n";
48
49             print OUT "#include <sys/socketcalls.h>\n";
50             print OUT "\n";
51             print OUT "\t.text\n";
52             print OUT "\t.align 4\n";
53             print OUT "\t.globl ${name}\n";
54             print OUT "\t.type ${name},\@function\n";
55             print OUT "${name}:\n";
56             print OUT "\tmovb \$SYS_\U${name}\E,%al\n";
57             print OUT "\tjmp __socketcall_common\n";
58             print OUT "\t.size ${name},.-${name}\n";
59             close(OUT);
60         } else {
61             open(OUT, '>', "${outputdir}/${name}.c")
62                 or die "$0: Cannot open ${outputdir}/${name}.c\n";
63
64             print OUT "#include \"socketcommon.h\"\n";
65             print OUT "\n";
66             print OUT "#ifndef __NR_${name}\n\n";
67
68             print OUT "extern long __socketcall(int, const unsigned long *);\n\n";
69
70             print OUT "$type $name (", join(', ', @cargs), ")\n";
71             print OUT "{\n";
72             print OUT "    unsigned long args[$nargs];\n";
73             for ( $i = 0 ; $i < $nargs ; $i++ ) {
74                 print OUT "    args[$i] = (unsigned long)a$i;\n";
75             }
76             print OUT "    return ($type) __socketcall(SYS_\U${name}\E, args);\n";
77             print OUT "}\n\n";
78
79             print OUT "#endif\n";
80
81             close(OUT);
82         }
83     } else {
84         die "$file:$.: Could not parse input\n";
85     }
86 }
87
88 print "\n";