1
+ # !/usr/bin/perl
2
+
3
+ use strict;
4
+ use warnings;
5
+
6
+ my $in = $ARGV [0];
7
+ my $codesout = $ARGV [1];
8
+ my $codes = $ARGV [1];
9
+ $codes =~ s / .*include\/ uapi\/ / compel\/ plugins\/ / g ;
10
+ my $protosout = $ARGV [2];
11
+ my $protos = $ARGV [2];
12
+ $protos =~ s / .*include\/ uapi\/ / compel\/ plugins\/ / g ;
13
+ my $asmout = $ARGV [3];
14
+ my $asmcommon = $ARGV [4];
15
+ my $prototypes = $ARGV [5];
16
+ $prototypes =~ s / .*include\/ uapi\/ / compel\/ plugins\/ / g ;
17
+ my $bits = $ARGV [6];
18
+
19
+ my $codesdef = $codes ;
20
+ $codesdef =~ tr / .\-\// _/ ;
21
+ my $protosdef = $protos ;
22
+ $protosdef =~ tr / .\-\// _/ ;
23
+ my $code = " code$bits " ;
24
+ my $need_aux = 0;
25
+
26
+ unlink $codesout ;
27
+ unlink $protosout ;
28
+ unlink $asmout ;
29
+
30
+ open CODESOUT, " >" , $codesout or die $! ;
31
+ open PROTOSOUT, " >" , $protosout or die $! ;
32
+ open ASMOUT, " >" , $asmout or die $! ;
33
+ open IN, " <" , $in or die $! ;
34
+
35
+ print CODESOUT <<"END" ;
36
+ /* Autogenerated, don't edit */
37
+ #ifndef $codesdef
38
+ #define $codesdef
39
+ END
40
+
41
+ print PROTOSOUT <<"END" ;
42
+ /* Autogenerated, don't edit */
43
+ #ifndef $protosdef
44
+ #define $protosdef
45
+ #include <$prototypes >
46
+ #include <$codes >
47
+ END
48
+
49
+ print ASMOUT <<"END" ;
50
+ /* Autogenerated, don't edit */
51
+ #include <$codes >
52
+ #include "$asmcommon "
53
+ END
54
+
55
+
56
+ for (<IN>) {
57
+ if ($_ =~ / \# / ) {
58
+ next ;
59
+ }
60
+
61
+ my $code_macro ;
62
+ my $sys_macro ;
63
+ my $sys_name ;
64
+
65
+ if (/ (?<name>\S +)\s +(?<alias>\S +)\s +(?<code64>\d +|\! )\s +(?<code32>(?:\d +|\! ))\s +\( (?<args>.+)\) / ) {
66
+ $code_macro = " __NR_$+ {name}" ;
67
+ $sys_macro = " SYS_$+ {name}" ;
68
+ $sys_name = " sys_$+ {alias}" ;
69
+ } elsif (/ (?<name>\S +)\s +(?<code64>\d +|\! )\s +(?<code32>(?:\d +|\! ))\s +\( (?<args>.+)\) / ) {
70
+ $code_macro = " __NR_$+ {name}" ;
71
+ $sys_macro = " SYS_$+ {name}" ;
72
+ $sys_name = " sys_$+ {name}" ;
73
+ } else {
74
+ unlink $codesout ;
75
+ unlink $protosout ;
76
+ unlink $asmout ;
77
+
78
+ die " Invalid syscall definition file: invalid entry $_ \n " ;
79
+ }
80
+
81
+ if ($+ {$code } ne " !" ) {
82
+ print CODESOUT " #ifndef $code_macro \n #define $code_macro $+ {$code }\n #endif\n " ;
83
+ print CODESOUT " #ifndef $sys_macro \n #define $sys_macro $code_macro \n #endif\n " ;
84
+ print ASMOUT " syscall $sys_name , $code_macro \n " ;
85
+
86
+ } else {
87
+ $need_aux = 1;
88
+ }
89
+
90
+ print PROTOSOUT " extern long $sys_name ($+ {args});\n " ;
91
+ }
92
+
93
+ if ($need_aux == 1) {
94
+ print ASMOUT " #include <compel/plugins/std/syscall-aux.S>\n " ;
95
+ print CODESOUT " #include <compel/plugins/std/syscall-aux.h>\n " ;
96
+ }
97
+
98
+ print CODESOUT " #endif /* $codesdef */" ;
99
+ print PROTOSOUT " #endif /* $protosdef */" ;
0 commit comments