File: syscall_names_gen.py

package info (click to toggle)
vuos 0.9.4-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,616 kB
  • sloc: ansic: 22,155; python: 284; makefile: 28; sh: 4
file content (49 lines) | stat: -rwxr-xr-x 1,313 bytes parent folder | download | duplicates (2)
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
#!/usr/bin/env python3
import sys
import os

syscall_names = []
for line in sys.stdin:
	fields = line.split()
	if len(fields) == 3 and fields[0] == '#define':
		name = fields[1]
		if name[:5] == '__NR_':
			syscall_names.insert(0, name[5:])

print('''#include<sys/syscall.h>
#include<stddef.h>
struct syscallname {
  int sysno;
  char *syscall_name;
  struct syscallname *next;
};

static struct syscallname syscallname_table[] = {''')
for name in syscall_names:
  print(f'''#ifdef __NR_{name}
			{{__NR_{name}, "{name}", NULL}},
#endif''')
print('};')
print('''
#define SYSCALLNAME_TABLE_LEN (sizeof(syscallname_table) / sizeof(*syscallname_table))
#define SYSCALLNAME_HASHMASK 255
static struct syscallname *syscall_name_hash[SYSCALLNAME_HASHMASK + 1];

const char *syscallname(int sysno) {
	int key = sysno & SYSCALLNAME_HASHMASK;
	struct syscallname *scan;
	for (scan = syscall_name_hash[key]; scan != NULL; scan = scan->next)
		if (sysno == scan->sysno)
			return scan->syscall_name;
	return "unknown";
}

__attribute__((constructor))
	static void init (void) {
		unsigned int i;
		for (i = 0; i < SYSCALLNAME_TABLE_LEN; i++) {
			int key = syscallname_table[i].sysno & SYSCALLNAME_HASHMASK;
			syscallname_table[i].next = syscall_name_hash[key];
			syscall_name_hash[key] = &syscallname_table[i];
		}
}''')