File: gen-syscalls.pl

package info (click to toggle)
criu 4.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 11,500 kB
  • sloc: ansic: 139,280; python: 7,484; sh: 3,824; java: 2,799; makefile: 2,659; asm: 1,137; perl: 206; xml: 117; exp: 45
file content (99 lines) | stat: -rwxr-xr-x 2,354 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#!/usr/bin/perl

use strict;
use warnings;

my $in         = $ARGV[0];
my $codesout   = $ARGV[1];
my $codes      = $ARGV[1];
$codes         =~ s/.*include\/uapi\//compel\/plugins\//g;
my $protosout  = $ARGV[2];
my $protos     = $ARGV[2];
$protos        =~ s/.*include\/uapi\//compel\/plugins\//g;
my $asmout     = $ARGV[3];
my $asmcommon  = $ARGV[4];
my $prototypes = $ARGV[5];
$prototypes    =~ s/.*include\/uapi\//compel\/plugins\//g;
my $bits       = $ARGV[6];

my $codesdef   = $codes;
$codesdef      =~ tr/.\-\//_/;
my $protosdef  = $protos;
$protosdef     =~ tr/.\-\//_/;
my $code       = "code$bits";
my $need_aux   = 0;

unlink $codesout;
unlink $protosout;
unlink $asmout;

open CODESOUT,	">", $codesout	or die $!;
open PROTOSOUT, ">", $protosout or die $!;
open ASMOUT,	">", $asmout	or die $!;
open IN,	"<", $in	or die $!;

print CODESOUT <<"END";
/* Autogenerated, don't edit */
#ifndef $codesdef
#define $codesdef
END

print PROTOSOUT <<"END";
/* Autogenerated, don't edit */
#ifndef $protosdef
#define $protosdef
#include <$prototypes>
#include <$codes>
END

print ASMOUT <<"END";
/* Autogenerated, don't edit */
#include <$codes>
#include "$asmcommon"
END


for (<IN>) {
	if ($_ =~ /\#/) {
		next;
	}

	my $code_macro;
	my $sys_macro;
	my $sys_name;

	if (/(?<name>\S+)\s+(?<alias>\S+)\s+(?<code64>\d+|\!)\s+(?<code32>(?:\d+|\!))\s+\((?<args>.+)\)/) {
		$code_macro = "__NR_$+{name}";
		$sys_macro  = "SYS_$+{name}";
		$sys_name   = "sys_$+{alias}";
	} elsif (/(?<name>\S+)\s+(?<code64>\d+|\!)\s+(?<code32>(?:\d+|\!))\s+\((?<args>.+)\)/) {
		$code_macro = "__NR_$+{name}";
		$sys_macro  = "SYS_$+{name}";
		$sys_name   = "sys_$+{name}";
	} else {
		unlink $codesout;
		unlink $protosout;
		unlink $asmout;

		die "Invalid syscall definition file: invalid entry $_\n";
	}

	if ($+{$code} ne "!") {
		print CODESOUT "#ifndef $code_macro\n#define $code_macro $+{$code}\n#endif\n";
		print CODESOUT "#ifndef $sys_macro\n#define $sys_macro $code_macro\n#endif\n";
		print ASMOUT "syscall $sys_name, $code_macro\n";

	} else {
		$need_aux = 1;
	}

	print PROTOSOUT "extern long $sys_name($+{args});\n";
}

if ($need_aux == 1) {
	print ASMOUT   "#include <compel/plugins/std/syscall-aux.S>\n";
	print CODESOUT "#include <compel/plugins/std/syscall-aux.h>\n";
}

print CODESOUT  "#endif /* $codesdef */";
print PROTOSOUT "#endif /* $protosdef */";