Albert S
db17e58deb
Classify syscalls into groups, for x86_64 only for now. Up to date for 5.15, generate some #ifndef for syscalls introduced since 5.10. Only support x86_64 therefore at this point. Switch from blacklisting to a default whitelist.
56 regels
1.2 KiB
Python
Executable File
56 regels
1.2 KiB
Python
Executable File
#!/usr/bin/python
|
|
import sys
|
|
import re
|
|
if len(sys.argv) < 2:
|
|
print("Usage: gengroup groupfile")
|
|
sys.exit(1)
|
|
fd = open(sys.argv[1], "r")
|
|
|
|
lines = fd.read().splitlines()
|
|
|
|
groupnames = set()
|
|
ifndef = dict()
|
|
|
|
def print_ifndefs():
|
|
for name in ifndef:
|
|
print("#ifndef __NR_%s" % name)
|
|
print("#define __NR_%s %s" % (name, ifndef[name]))
|
|
print("#endif")
|
|
|
|
def print_defines(names):
|
|
names = sorted(names)
|
|
i = 0
|
|
for name in names:
|
|
define = "#define %s ((uint64_t)1<<%s)" % (name, i)
|
|
print(define)
|
|
i = i + 1
|
|
|
|
for line in lines:
|
|
if line[0] == '#':
|
|
continue
|
|
|
|
splitted = line.split(' ')
|
|
if len(splitted) < 2:
|
|
print("Misformated line:", line)
|
|
sys.exit(1)
|
|
|
|
currentsyscall = splitted[0]
|
|
currentgroups = splitted[1].split(',')
|
|
|
|
flags = splitted[2] if len(splitted) > 2 else ""
|
|
if any( not s or s.isspace() for s in currentgroups ):
|
|
print("Misformated line (empty values):", line)
|
|
sys.exit(1)
|
|
groupnames.update(currentgroups)
|
|
|
|
genifndef = re.match(r"genifndef\((\d+)*\)", flags)
|
|
if genifndef:
|
|
ifndef[currentsyscall] = genifndef.groups(1)[0]
|
|
|
|
array_line = "{QSSB_SYS(%s), %s}," % (currentsyscall, '|'.join(currentgroups))
|
|
print(array_line)
|
|
|
|
print_ifndefs()
|
|
print_defines(groupnames)
|
|
|