diff options
Diffstat (limited to 'libc/tools/gensyscalls.py')
| -rwxr-xr-x | libc/tools/gensyscalls.py | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/libc/tools/gensyscalls.py b/libc/tools/gensyscalls.py index aaa3de3..26cf3a5 100755 --- a/libc/tools/gensyscalls.py +++ b/libc/tools/gensyscalls.py @@ -48,7 +48,7 @@ def create_file( relpath ): x86_header = """/* autogenerated by gensyscalls.py */ #include <linux/err.h> #include <machine/asm.h> -#include <sys/linux-syscalls.h> +#include <asm/unistd.h> ENTRY(%(fname)s) """ @@ -115,7 +115,7 @@ END(%(fname)s) # mips_call = """/* autogenerated by gensyscalls.py */ -#include <sys/linux-syscalls.h> +#include <asm/unistd.h> .text .globl %(fname)s .align 4 @@ -303,9 +303,19 @@ class State: t["asm-mips"] = self.mips_genstub(syscall_func,"__NR_"+syscall_name) - def gen_NR_syscall(self, glibc_fp, linux_fp, name, id): + def gen_NR_syscall(self, linux_fp, name, id): linux_fp.write("#define __NR_%-25s (__NR_SYSCALL_BASE + %d)\n" % (name,id)) - glibc_fp.write("#define SYS_%-25s __NR_%s\n" % (name, name)) + + + def scan_linux_unistd_h(self, fp, path): + pattern = re.compile(r'^#define __NR_([a-z]\S+) .*') + syscalls = set() # MIPS defines everything three times; work around that. + for line in open(path): + m = re.search(pattern, line) + if m: + syscalls.add(m.group(1)) + for syscall in sorted(syscalls): + fp.write("#define SYS_%s __NR_%s\n" % (syscall, syscall)) def gen_linux_syscalls_h(self): @@ -315,6 +325,18 @@ class State: glibc_fp.write("#ifndef _BIONIC_GLIBC_SYSCALLS_H_\n") glibc_fp.write("#define _BIONIC_GLIBC_SYSCALLS_H_\n") + glibc_fp.write("#if defined(__arm__)\n") + self.scan_linux_unistd_h(glibc_fp, "libc/kernel/arch-arm/asm/unistd.h") + glibc_fp.write("#elif defined(__mips__)\n") + self.scan_linux_unistd_h(glibc_fp, "libc/kernel/arch-mips/asm/unistd.h") + glibc_fp.write("#elif defined(__i386__)\n") + self.scan_linux_unistd_h(glibc_fp, "libc/kernel/arch-x86/asm/unistd_32.h") + glibc_fp.write("#endif\n") + + glibc_fp.write("#endif /* _BIONIC_GLIBC_SYSCALLS_H_ */\n") + glibc_fp.close() + self.other_files.append(glibc_syscalls_h_path) + linux_syscalls_h_path = "include/sys/linux-syscalls.h" D("generating " + linux_syscalls_h_path) fp = create_file(linux_syscalls_h_path) @@ -335,50 +357,40 @@ class State: sc_id = sc["common"] sc_name = sc["name"] if sc_id >= 0: - self.gen_NR_syscall(glibc_fp, fp, sc_name, sc_id) + self.gen_NR_syscall(fp, sc_name, sc_id) # now, all arm-specific syscalls fp.write("\n#ifdef __arm__\n") - glibc_fp.write( "\n#ifdef __arm__\n") for sc in self.syscalls: sc_id = sc["armid"] sc_name = sc["name"] if sc_id >= 0: - self.gen_NR_syscall(glibc_fp, fp, sc_name, sc_id) + self.gen_NR_syscall(fp, sc_name, sc_id) fp.write("#endif\n") - glibc_fp.write("#endif\n") gen_syscalls = {} # all i386-specific syscalls fp.write("\n#ifdef __i386__\n") - glibc_fp.write("\n#ifdef __i386__\n") for sc in sorted(self.syscalls,key=lambda x:x["x86id"]): sc_id = sc["x86id"] sc_name = sc["name"] if sc_id >= 0 and sc_name not in gen_syscalls: - self.gen_NR_syscall(glibc_fp, fp, sc_name, sc_id) + self.gen_NR_syscall(fp, sc_name, sc_id) gen_syscalls[sc_name] = True fp.write("#endif\n") - glibc_fp.write("#endif\n") # all mips-specific syscalls fp.write("\n#ifdef __mips__\n") - glibc_fp.write("\n#ifdef __mips__\n") for sc in sorted(self.syscalls,key=lambda x:x["mipsid"]): sc_id = sc["mipsid"] if sc_id >= 0: - self.gen_NR_syscall(glibc_fp, fp, sc["name"], sc_id) + self.gen_NR_syscall(fp, sc["name"], sc_id) fp.write( "#endif\n" ); - glibc_fp.write( "#endif\n" ); fp.write( "\n#endif\n" ) fp.write( "\n#endif /* _BIONIC_LINUX_SYSCALLS_H_ */\n" ); fp.close() - glibc_fp.write("#endif\n") - glibc_fp.close() - - self.other_files.append(glibc_syscalls_h_path) self.other_files.append(linux_syscalls_h_path) |
