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