diff options
Diffstat (limited to 'libc/tools/genfunctosyscallnrs.py')
-rwxr-xr-x | libc/tools/genfunctosyscallnrs.py | 95 |
1 files changed, 53 insertions, 42 deletions
diff --git a/libc/tools/genfunctosyscallnrs.py b/libc/tools/genfunctosyscallnrs.py index ecfc8abc1..fa488447a 100755 --- a/libc/tools/genfunctosyscallnrs.py +++ b/libc/tools/genfunctosyscallnrs.py @@ -1,60 +1,71 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import argparse -import collections import logging import os import re -import subprocess -import textwrap from gensyscalls import SupportedArchitectures, 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"]; + 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 - return arch_map def gen_syscall_nrs(out_file, base_syscall_file, syscall_NRs): - for arch in SupportedArchitectures: - base_names = load_syscall_names_from_file(base_syscall_file, arch) + for arch in SupportedArchitectures: + base_names = load_syscall_names_from_file(base_syscall_file, arch) + + for func, syscall in base_names.items(): + out_file.write("#define __" + arch + "_" + func + " " + + str(syscall_NRs[arch][syscall]) + ";\n") - 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) + 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_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() + main() |