huangcm
2024-12-18 9d29be7f7249789d6ffd0440067187a9f040c2cd
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
#!/usr/bin/env python
 
import argparse
import collections
import logging
import os
import re
import subprocess
import textwrap
 
from gensyscalls import SysCallsTxtParser
from genseccomp import parse_syscall_NRs
 
def load_syscall_names_from_file(file_path, architecture):
  parser = SysCallsTxtParser()
  parser.parse_open_file(open(file_path))
  arch_map = {}
  for syscall in parser.syscalls:
    if syscall.get(architecture):
      arch_map[syscall["func"]] = syscall["name"];
 
  return arch_map
 
def gen_syscall_nrs(out_file, base_syscall_file, syscall_NRs):
  for arch in ('arm', 'arm64', 'mips', 'mips64', 'x86', 'x86_64'):
    base_names = load_syscall_names_from_file(base_syscall_file, arch)
 
    for func,syscall in base_names.iteritems():
      out_file.write("#define __" + arch + "_" + func + " " + str(syscall_NRs[arch][syscall]) + ";\n")
 
def main():
  parser = argparse.ArgumentParser(
      description="Generates a mapping of bionic functions to system call numbers per architecture.")
  parser.add_argument("--verbose", "-v", help="Enables verbose logging.")
  parser.add_argument("--out-dir",
                      help="The output directory for the output files")
  parser.add_argument("base_file", metavar="base-file", type=str,
                      help="The path of the base syscall list (SYSCALLS.TXT).")
  parser.add_argument("files", metavar="FILE", type=str, nargs="+",
                      help=("A syscall name-number mapping file for an architecture.\n"))
  args = parser.parse_args()
 
  if args.verbose:
    logging.basicConfig(level=logging.DEBUG)
  else:
    logging.basicConfig(level=logging.INFO)
 
  syscall_files = []
  syscall_NRs = {}
  for filename in args.files:
    m = re.search(r"libseccomp_gen_syscall_nrs_([^/]+)", filename)
    syscall_NRs[m.group(1)] = parse_syscall_NRs(filename)
 
  output_path = os.path.join(args.out_dir, "func_to_syscall_nrs.h")
  with open(output_path, "w") as output_file:
    gen_syscall_nrs(out_file=output_file,
             syscall_NRs=syscall_NRs, base_syscall_file=args.base_file)
 
if __name__ == "__main__":
  main()