xref: /aosp_15_r20/bionic/libc/tools/genfunctosyscallnrs.py (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*8d67ca89SAndroid Build Coastguard Worker
3*8d67ca89SAndroid Build Coastguard Workerimport argparse
4*8d67ca89SAndroid Build Coastguard Workerimport logging
5*8d67ca89SAndroid Build Coastguard Workerimport os
6*8d67ca89SAndroid Build Coastguard Workerimport re
7*8d67ca89SAndroid Build Coastguard Worker
8*8d67ca89SAndroid Build Coastguard Workerfrom gensyscalls import SupportedArchitectures, SysCallsTxtParser
9*8d67ca89SAndroid Build Coastguard Workerfrom genseccomp import parse_syscall_NRs
10*8d67ca89SAndroid Build Coastguard Worker
11*8d67ca89SAndroid Build Coastguard Worker
12*8d67ca89SAndroid Build Coastguard Workerdef load_syscall_names_from_file(file_path, architecture):
13*8d67ca89SAndroid Build Coastguard Worker    parser = SysCallsTxtParser()
14*8d67ca89SAndroid Build Coastguard Worker    parser.parse_open_file(open(file_path))
15*8d67ca89SAndroid Build Coastguard Worker    arch_map = {}
16*8d67ca89SAndroid Build Coastguard Worker    for syscall in parser.syscalls:
17*8d67ca89SAndroid Build Coastguard Worker        if syscall.get(architecture):
18*8d67ca89SAndroid Build Coastguard Worker            arch_map[syscall["func"]] = syscall["name"]
19*8d67ca89SAndroid Build Coastguard Worker
20*8d67ca89SAndroid Build Coastguard Worker    return arch_map
21*8d67ca89SAndroid Build Coastguard Worker
22*8d67ca89SAndroid Build Coastguard Worker
23*8d67ca89SAndroid Build Coastguard Workerdef gen_syscall_nrs(out_file, base_syscall_file, syscall_NRs):
24*8d67ca89SAndroid Build Coastguard Worker    for arch in syscall_NRs.keys():
25*8d67ca89SAndroid Build Coastguard Worker        base_names = load_syscall_names_from_file(base_syscall_file, arch)
26*8d67ca89SAndroid Build Coastguard Worker
27*8d67ca89SAndroid Build Coastguard Worker        for func, syscall in base_names.items():
28*8d67ca89SAndroid Build Coastguard Worker            out_file.write("#define __" + arch + "_" + func + " " +
29*8d67ca89SAndroid Build Coastguard Worker                           str(syscall_NRs[arch][syscall]) + "\n")
30*8d67ca89SAndroid Build Coastguard Worker
31*8d67ca89SAndroid Build Coastguard Worker
32*8d67ca89SAndroid Build Coastguard Workerdef main():
33*8d67ca89SAndroid Build Coastguard Worker    parser = argparse.ArgumentParser(
34*8d67ca89SAndroid Build Coastguard Worker        description=
35*8d67ca89SAndroid Build Coastguard Worker        "Generates a mapping of bionic functions to system call numbers per architecture."
36*8d67ca89SAndroid Build Coastguard Worker    )
37*8d67ca89SAndroid Build Coastguard Worker    parser.add_argument("--verbose", "-v", help="Enables verbose logging.")
38*8d67ca89SAndroid Build Coastguard Worker    parser.add_argument("--out-dir",
39*8d67ca89SAndroid Build Coastguard Worker                        help="The output directory for the output files")
40*8d67ca89SAndroid Build Coastguard Worker    parser.add_argument(
41*8d67ca89SAndroid Build Coastguard Worker        "base_file",
42*8d67ca89SAndroid Build Coastguard Worker        metavar="base-file",
43*8d67ca89SAndroid Build Coastguard Worker        type=str,
44*8d67ca89SAndroid Build Coastguard Worker        help="The path of the base syscall list (SYSCALLS.TXT).")
45*8d67ca89SAndroid Build Coastguard Worker    parser.add_argument(
46*8d67ca89SAndroid Build Coastguard Worker        "files",
47*8d67ca89SAndroid Build Coastguard Worker        metavar="FILE",
48*8d67ca89SAndroid Build Coastguard Worker        type=str,
49*8d67ca89SAndroid Build Coastguard Worker        nargs="+",
50*8d67ca89SAndroid Build Coastguard Worker        help=("A syscall name-number mapping file for an architecture.\n"))
51*8d67ca89SAndroid Build Coastguard Worker    args = parser.parse_args()
52*8d67ca89SAndroid Build Coastguard Worker
53*8d67ca89SAndroid Build Coastguard Worker    if args.verbose:
54*8d67ca89SAndroid Build Coastguard Worker        logging.basicConfig(level=logging.DEBUG)
55*8d67ca89SAndroid Build Coastguard Worker    else:
56*8d67ca89SAndroid Build Coastguard Worker        logging.basicConfig(level=logging.INFO)
57*8d67ca89SAndroid Build Coastguard Worker
58*8d67ca89SAndroid Build Coastguard Worker    syscall_NRs = {}
59*8d67ca89SAndroid Build Coastguard Worker    for filename in args.files:
60*8d67ca89SAndroid Build Coastguard Worker        m = re.search(r"libseccomp_gen_syscall_nrs_([^/]+)", filename)
61*8d67ca89SAndroid Build Coastguard Worker        syscall_NRs[m.group(1)] = parse_syscall_NRs(filename)
62*8d67ca89SAndroid Build Coastguard Worker
63*8d67ca89SAndroid Build Coastguard Worker    output_path = os.path.join(args.out_dir, "func_to_syscall_nrs.h")
64*8d67ca89SAndroid Build Coastguard Worker    with open(output_path, "w") as output_file:
65*8d67ca89SAndroid Build Coastguard Worker        gen_syscall_nrs(out_file=output_file,
66*8d67ca89SAndroid Build Coastguard Worker                        syscall_NRs=syscall_NRs,
67*8d67ca89SAndroid Build Coastguard Worker                        base_syscall_file=args.base_file)
68*8d67ca89SAndroid Build Coastguard Worker
69*8d67ca89SAndroid Build Coastguard Worker
70*8d67ca89SAndroid Build Coastguard Workerif __name__ == "__main__":
71*8d67ca89SAndroid Build Coastguard Worker    main()
72