blob: ea60eec25ac4344a6e3dc53bc21bb3d1083e53cd [file] [log] [blame]
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -07001#!/usr/bin/python
2#
Raghu Gandham1fa0d842012-01-27 17:51:42 -08003# this tool is used to generate the syscall assembler templates
4# to be placed into arch-{arm,x86,mips}/syscalls, as well as the content
5# of arch-{arm,x86,mips}/linux/_syscalls.h
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -07006#
7
The Android Open Source Project4e468ed2008-12-17 18:03:48 -08008import sys, os.path, glob, re, commands, filecmp, shutil
Raghu Gandham1fa0d842012-01-27 17:51:42 -08009import getpass
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -070010
11from bionic_utils import *
12
Elliott Hughes18bc9752013-06-17 10:26:10 -070013bionic_libc_root = os.environ["ANDROID_BUILD_TOP"] + "/bionic/libc/"
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -070014
15# temp directory where we store all intermediate files
16bionic_temp = "/tmp/bionic_gensyscalls/"
17
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -070018def make_dir( path ):
Raghu Gandham1fa0d842012-01-27 17:51:42 -080019 path = os.path.abspath(path)
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -070020 if not os.path.exists(path):
21 parent = os.path.dirname(path)
22 if parent:
23 make_dir(parent)
24 os.mkdir(path)
25
26def create_file( relpath ):
27 dir = os.path.dirname( bionic_temp + relpath )
28 make_dir(dir)
29 return open( bionic_temp + relpath, "w" )
30
Elliott Hughescd6780b2013-02-07 14:07:00 -080031#
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -070032# x86 assembler templates for each syscall stub
33#
34
35x86_header = """/* autogenerated by gensyscalls.py */
Elliott Hughes9aceab52013-03-12 14:57:30 -070036#include <linux/err.h>
Elliott Hughes7582a9c2013-02-06 17:08:15 -080037#include <machine/asm.h>
Elliott Hughes5c2772f2013-03-21 22:15:06 -070038#include <asm/unistd.h>
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -070039
Elliott Hughes7582a9c2013-02-06 17:08:15 -080040ENTRY(%(fname)s)
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -070041"""
42
43x86_registers = [ "%ebx", "%ecx", "%edx", "%esi", "%edi", "%ebp" ]
44
45x86_call = """ movl $%(idname)s, %%eax
46 int $0x80
Elliott Hughes9aceab52013-03-12 14:57:30 -070047 cmpl $-MAX_ERRNO, %%eax
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -070048 jb 1f
49 negl %%eax
50 pushl %%eax
51 call __set_errno
52 addl $4, %%esp
53 orl $-1, %%eax
541:
55"""
56
57x86_return = """ ret
Elliott Hughes7582a9c2013-02-06 17:08:15 -080058END(%(fname)s)
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -070059"""
60
Elliott Hughescd6780b2013-02-07 14:07:00 -080061#
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -070062# ARM assembler templates for each syscall stub
63#
Elliott Hughescd6780b2013-02-07 14:07:00 -080064
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -070065arm_header = """/* autogenerated by gensyscalls.py */
Elliott Hughescda62092013-03-22 13:50:44 -070066#include <asm/unistd.h>
Elliott Hughes9aceab52013-03-12 14:57:30 -070067#include <linux/err.h>
Kenny Rootf540c032011-02-17 10:31:30 -080068#include <machine/asm.h>
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -070069
Kenny Rootf540c032011-02-17 10:31:30 -080070ENTRY(%(fname)s)
71"""
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -070072
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -070073arm_eabi_call_default = arm_header + """\
Matthieu Castetfaa0fdb2013-01-16 14:02:50 +010074 mov ip, r7
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -070075 ldr r7, =%(idname)s
76 swi #0
Matthieu Castetfaa0fdb2013-01-16 14:02:50 +010077 mov r7, ip
Elliott Hughes9aceab52013-03-12 14:57:30 -070078 cmn r0, #(MAX_ERRNO + 1)
79 bxls lr
80 neg r0, r0
81 b __set_errno
Elliott Hughescd6780b2013-02-07 14:07:00 -080082END(%(fname)s)
83"""
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -070084
85arm_eabi_call_long = arm_header + """\
86 mov ip, sp
87 .save {r4, r5, r6, r7}
88 stmfd sp!, {r4, r5, r6, r7}
89 ldmfd ip, {r4, r5, r6}
90 ldr r7, =%(idname)s
91 swi #0
92 ldmfd sp!, {r4, r5, r6, r7}
Elliott Hughes9aceab52013-03-12 14:57:30 -070093 cmn r0, #(MAX_ERRNO + 1)
94 bxls lr
95 neg r0, r0
96 b __set_errno
Elliott Hughescd6780b2013-02-07 14:07:00 -080097END(%(fname)s)
98"""
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -070099
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700100#
Raghu Gandham1fa0d842012-01-27 17:51:42 -0800101# mips assembler templates for each syscall stub
102#
Elliott Hughescd6780b2013-02-07 14:07:00 -0800103
Raghu Gandham1fa0d842012-01-27 17:51:42 -0800104mips_call = """/* autogenerated by gensyscalls.py */
Elliott Hughes5c2772f2013-03-21 22:15:06 -0700105#include <asm/unistd.h>
Raghu Gandham1fa0d842012-01-27 17:51:42 -0800106 .text
107 .globl %(fname)s
108 .align 4
109 .ent %(fname)s
110
111%(fname)s:
112 .set noreorder
113 .cpload $t9
114 li $v0, %(idname)s
115 syscall
116 bnez $a3, 1f
117 move $a0, $v0
118 j $ra
119 nop
1201:
121 la $t9,__set_errno
122 j $t9
123 nop
124 .set reorder
125 .end %(fname)s
126"""
127
David 'Digit' Turner95d751f2010-12-16 16:47:14 +0100128def param_uses_64bits(param):
129 """Returns True iff a syscall parameter description corresponds
130 to a 64-bit type."""
131 param = param.strip()
132 # First, check that the param type begins with one of the known
133 # 64-bit types.
134 if not ( \
135 param.startswith("int64_t") or param.startswith("uint64_t") or \
136 param.startswith("loff_t") or param.startswith("off64_t") or \
137 param.startswith("long long") or param.startswith("unsigned long long") or
138 param.startswith("signed long long") ):
139 return False
140
141 # Second, check that there is no pointer type here
142 if param.find("*") >= 0:
143 return False
144
145 # Ok
146 return True
147
148def count_arm_param_registers(params):
149 """This function is used to count the number of register used
Elliott Hughescd6780b2013-02-07 14:07:00 -0800150 to pass parameters when invoking an ARM system call.
David 'Digit' Turner95d751f2010-12-16 16:47:14 +0100151 This is because the ARM EABI mandates that 64-bit quantities
152 must be passed in an even+odd register pair. So, for example,
153 something like:
154
155 foo(int fd, off64_t pos)
156
157 would actually need 4 registers:
158 r0 -> int
159 r1 -> unused
160 r2-r3 -> pos
161 """
162 count = 0
163 for param in params:
164 if param_uses_64bits(param):
165 if (count & 1) != 0:
166 count += 1
167 count += 2
168 else:
169 count += 1
170 return count
171
172def count_generic_param_registers(params):
173 count = 0
174 for param in params:
175 if param_uses_64bits(param):
176 count += 2
177 else:
178 count += 1
179 return count
180
Elliott Hughescda62092013-03-22 13:50:44 -0700181# This lets us support regular system calls like __NR_write and also weird
182# ones like __ARM_NR_cacheflush, where the NR doesn't come at the start.
183def make__NR_name(name):
184 if name.startswith("__"):
185 return name
186 else:
187 return "__NR_%s" % (name)
188
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700189class State:
190 def __init__(self):
191 self.old_stubs = []
192 self.new_stubs = []
193 self.other_files = []
194 self.syscalls = []
195
The Android Open Source Project4e468ed2008-12-17 18:03:48 -0800196 def x86_genstub(self, fname, numparams, idname):
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700197 t = { "fname" : fname,
198 "idname" : idname }
199
200 result = x86_header % t
201 stack_bias = 4
202 for r in range(numparams):
203 result += " pushl " + x86_registers[r] + "\n"
204 stack_bias += 4
205
206 for r in range(numparams):
207 result += " mov %d(%%esp), %s" % (stack_bias+r*4, x86_registers[r]) + "\n"
208
209 result += x86_call % t
210
211 for r in range(numparams):
212 result += " popl " + x86_registers[numparams-r-1] + "\n"
213
Elliott Hughes7582a9c2013-02-06 17:08:15 -0800214 result += x86_return % t
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700215 return result
216
Elliott Hughesd6121652013-09-25 22:43:36 -0700217 def x86_genstub_socketcall(self, fname, idname, socketcall_id):
The Android Open Source Project4e468ed2008-12-17 18:03:48 -0800218 # %ebx <--- Argument 1 - The call id of the needed vectored
219 # syscall (socket, bind, recv, etc)
220 # %ecx <--- Argument 2 - Pointer to the rest of the arguments
221 # from the original function called (socket())
222 t = { "fname" : fname,
223 "idname" : idname }
224
225 result = x86_header % t
226 stack_bias = 4
227
228 # save the regs we need
229 result += " pushl %ebx" + "\n"
230 stack_bias += 4
231 result += " pushl %ecx" + "\n"
232 stack_bias += 4
233
234 # set the call id (%ebx)
Elliott Hughesd6121652013-09-25 22:43:36 -0700235 result += " mov $%d, %%ebx" % (socketcall_id) + "\n"
The Android Open Source Project4e468ed2008-12-17 18:03:48 -0800236
237 # set the pointer to the rest of the args into %ecx
238 result += " mov %esp, %ecx" + "\n"
239 result += " addl $%d, %%ecx" % (stack_bias) + "\n"
240
241 # now do the syscall code itself
242 result += x86_call % t
243
244 # now restore the saved regs
245 result += " popl %ecx" + "\n"
246 result += " popl %ebx" + "\n"
247
248 # epilog
Elliott Hughes7582a9c2013-02-06 17:08:15 -0800249 result += x86_return % t
The Android Open Source Project4e468ed2008-12-17 18:03:48 -0800250 return result
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700251
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700252
253 def arm_eabi_genstub(self,fname, flags, idname):
254 t = { "fname" : fname,
255 "idname" : idname }
256 if flags:
257 numargs = int(flags)
258 if numargs > 4:
259 return arm_eabi_call_long % t
260 return arm_eabi_call_default % t
261
262
Raghu Gandham1fa0d842012-01-27 17:51:42 -0800263 def mips_genstub(self,fname, idname):
264 t = { "fname" : fname,
265 "idname" : idname }
266 return mips_call % t
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700267
268 def process_file(self,input):
269 parser = SysCallsTxtParser()
270 parser.parse_file(input)
271 self.syscalls = parser.syscalls
272 parser = None
273
274 for t in self.syscalls:
275 syscall_func = t["func"]
276 syscall_params = t["params"]
277 syscall_name = t["name"]
Elliott Hughesd6121652013-09-25 22:43:36 -0700278 __NR_name = make__NR_name(t["name"])
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700279
Elliott Hughesd6121652013-09-25 22:43:36 -0700280 if t.has_key("arm"):
David 'Digit' Turner95d751f2010-12-16 16:47:14 +0100281 num_regs = count_arm_param_registers(syscall_params)
Elliott Hughesd6121652013-09-25 22:43:36 -0700282 t["asm-arm"] = self.arm_eabi_genstub(syscall_func, num_regs, __NR_name)
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700283
Elliott Hughesd6121652013-09-25 22:43:36 -0700284 if t.has_key("x86"):
David 'Digit' Turner95d751f2010-12-16 16:47:14 +0100285 num_regs = count_generic_param_registers(syscall_params)
Elliott Hughesd6121652013-09-25 22:43:36 -0700286 if t["socketcall_id"] >= 0:
287 t["asm-x86"] = self.x86_genstub_socketcall(syscall_func, __NR_name, t["socketcall_id"])
The Android Open Source Project4e468ed2008-12-17 18:03:48 -0800288 else:
Elliott Hughesd6121652013-09-25 22:43:36 -0700289 t["asm-x86"] = self.x86_genstub(syscall_func, num_regs, __NR_name)
290 elif t["socketcall_id"] >= 0:
291 E("socketcall_id for dispatch syscalls is only supported for x86 in '%s'" % t)
The Android Open Source Project4e468ed2008-12-17 18:03:48 -0800292 return
Elliott Hughescd6780b2013-02-07 14:07:00 -0800293
Elliott Hughesd6121652013-09-25 22:43:36 -0700294 if t.has_key("mips"):
Elliott Hughescda62092013-03-22 13:50:44 -0700295 t["asm-mips"] = self.mips_genstub(syscall_func, make__NR_name(syscall_name))
The Android Open Source Project4e468ed2008-12-17 18:03:48 -0800296
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700297
Elliott Hughes1b91c6c2013-03-22 18:56:24 -0700298 # Scan a Linux kernel asm/unistd.h file containing __NR_* constants
299 # and write out equivalent SYS_* constants for glibc source compatibility.
Elliott Hughes5c2772f2013-03-21 22:15:06 -0700300 def scan_linux_unistd_h(self, fp, path):
301 pattern = re.compile(r'^#define __NR_([a-z]\S+) .*')
302 syscalls = set() # MIPS defines everything three times; work around that.
303 for line in open(path):
304 m = re.search(pattern, line)
305 if m:
306 syscalls.add(m.group(1))
307 for syscall in sorted(syscalls):
Elliott Hughescda62092013-03-22 13:50:44 -0700308 fp.write("#define SYS_%s %s\n" % (syscall, make__NR_name(syscall)))
Elliott Hughes8ecf2252013-03-21 18:06:55 -0700309
310
Elliott Hughes1b91c6c2013-03-22 18:56:24 -0700311 def gen_glibc_syscalls_h(self):
Elliott Hughescda62092013-03-22 13:50:44 -0700312 # TODO: generate a separate file for each architecture, like glibc's bits/syscall.h.
Elliott Hughes9724ce32013-03-21 19:43:54 -0700313 glibc_syscalls_h_path = "include/sys/glibc-syscalls.h"
Elliott Hughes1b91c6c2013-03-22 18:56:24 -0700314 D("generating " + glibc_syscalls_h_path)
Elliott Hughes9724ce32013-03-21 19:43:54 -0700315 glibc_fp = create_file(glibc_syscalls_h_path)
316 glibc_fp.write("/* Auto-generated by gensyscalls.py; do not edit. */\n")
317 glibc_fp.write("#ifndef _BIONIC_GLIBC_SYSCALLS_H_\n")
318 glibc_fp.write("#define _BIONIC_GLIBC_SYSCALLS_H_\n")
319
Elliott Hughes5c2772f2013-03-21 22:15:06 -0700320 glibc_fp.write("#if defined(__arm__)\n")
Elliott Hughes18bc9752013-06-17 10:26:10 -0700321 self.scan_linux_unistd_h(glibc_fp, bionic_libc_root + "/kernel/arch-arm/asm/unistd.h")
Elliott Hughes5c2772f2013-03-21 22:15:06 -0700322 glibc_fp.write("#elif defined(__mips__)\n")
Elliott Hughes18bc9752013-06-17 10:26:10 -0700323 self.scan_linux_unistd_h(glibc_fp, bionic_libc_root + "/kernel/arch-mips/asm/unistd.h")
Elliott Hughes5c2772f2013-03-21 22:15:06 -0700324 glibc_fp.write("#elif defined(__i386__)\n")
Elliott Hughes18bc9752013-06-17 10:26:10 -0700325 self.scan_linux_unistd_h(glibc_fp, bionic_libc_root + "/kernel/arch-x86/asm/unistd_32.h")
Elliott Hughes5c2772f2013-03-21 22:15:06 -0700326 glibc_fp.write("#endif\n")
327
328 glibc_fp.write("#endif /* _BIONIC_GLIBC_SYSCALLS_H_ */\n")
329 glibc_fp.close()
330 self.other_files.append(glibc_syscalls_h_path)
331
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700332
Elliott Hughesd6121652013-09-25 22:43:36 -0700333 # Write the contents of syscalls.mk.
The Android Open Source Project4e468ed2008-12-17 18:03:48 -0800334 def gen_arch_syscalls_mk(self, arch):
335 path = "arch-%s/syscalls.mk" % arch
Elliott Hughesd6121652013-09-25 22:43:36 -0700336 D("generating " + path)
337 fp = create_file(path)
338 fp.write("# Auto-generated by gensyscalls.py. Do not edit.\n")
339 fp.write("syscall_src :=\n")
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700340 for sc in self.syscalls:
Elliott Hughesd6121652013-09-25 22:43:36 -0700341 if sc.has_key("asm-%s" % arch):
342 fp.write("syscall_src += arch-%s/syscalls/%s.S\n" % (arch, sc["func"]))
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700343 fp.close()
Elliott Hughesd6121652013-09-25 22:43:36 -0700344 self.other_files.append(path)
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700345
Raghu Gandham1fa0d842012-01-27 17:51:42 -0800346
Elliott Hughesd6121652013-09-25 22:43:36 -0700347 # Write each syscall stub.
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700348 def gen_syscall_stubs(self):
349 for sc in self.syscalls:
Elliott Hughesd6121652013-09-25 22:43:36 -0700350 for arch in all_arches:
351 if sc.has_key("asm-%s" % arch):
352 filename = "arch-%s/syscalls/%s.S" % (arch, sc["func"])
353 D2(">>> generating " + filename)
354 fp = create_file(filename)
355 fp.write(sc["asm-%s" % arch])
356 fp.close()
357 self.new_stubs.append(filename)
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700358
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700359
Elliott Hughesd6121652013-09-25 22:43:36 -0700360 def regenerate(self):
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700361 D( "scanning for existing architecture-specific stub files" )
362
Elliott Hughes18bc9752013-06-17 10:26:10 -0700363 bionic_libc_root_len = len(bionic_libc_root)
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700364
Elliott Hughesd6121652013-09-25 22:43:36 -0700365 for arch in all_arches:
Elliott Hughes18bc9752013-06-17 10:26:10 -0700366 arch_path = bionic_libc_root + "arch-" + arch
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700367 D( "scanning " + arch_path )
368 files = glob.glob( arch_path + "/syscalls/*.S" )
369 for f in files:
Elliott Hughes18bc9752013-06-17 10:26:10 -0700370 self.old_stubs.append( f[bionic_libc_root_len:] )
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700371
372 D( "found %d stub files" % len(self.old_stubs) )
373
374 if not os.path.exists( bionic_temp ):
375 D( "creating %s" % bionic_temp )
Raghu Gandham1fa0d842012-01-27 17:51:42 -0800376 make_dir( bionic_temp )
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700377
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700378 D( "re-generating stubs and support files" )
379
Elliott Hughes1b91c6c2013-03-22 18:56:24 -0700380 self.gen_glibc_syscalls_h()
Elliott Hughesd6121652013-09-25 22:43:36 -0700381 for arch in all_arches:
The Android Open Source Project4e468ed2008-12-17 18:03:48 -0800382 self.gen_arch_syscalls_mk(arch)
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700383 self.gen_syscall_stubs()
384
385 D( "comparing files" )
386 adds = []
387 edits = []
388
389 for stub in self.new_stubs + self.other_files:
Elliott Hughes18bc9752013-06-17 10:26:10 -0700390 if not os.path.exists( bionic_libc_root + stub ):
David 'Digit' Turnerfc269312010-10-11 22:11:06 +0200391 # new file, git add it
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700392 D( "new file: " + stub)
Elliott Hughes18bc9752013-06-17 10:26:10 -0700393 adds.append( bionic_libc_root + stub )
394 shutil.copyfile( bionic_temp + stub, bionic_libc_root + stub )
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700395
Elliott Hughes18bc9752013-06-17 10:26:10 -0700396 elif not filecmp.cmp( bionic_temp + stub, bionic_libc_root + stub ):
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700397 D( "changed file: " + stub)
398 edits.append( stub )
399
400 deletes = []
401 for stub in self.old_stubs:
402 if not stub in self.new_stubs:
403 D( "deleted file: " + stub)
Elliott Hughes18bc9752013-06-17 10:26:10 -0700404 deletes.append( bionic_libc_root + stub )
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700405
406
407 if adds:
David 'Digit' Turnerfc269312010-10-11 22:11:06 +0200408 commands.getoutput("git add " + " ".join(adds))
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700409 if deletes:
David 'Digit' Turnerfc269312010-10-11 22:11:06 +0200410 commands.getoutput("git rm " + " ".join(deletes))
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700411 if edits:
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700412 for file in edits:
Elliott Hughes18bc9752013-06-17 10:26:10 -0700413 shutil.copyfile( bionic_temp + file, bionic_libc_root + file )
David 'Digit' Turnerfc269312010-10-11 22:11:06 +0200414 commands.getoutput("git add " +
Elliott Hughes18bc9752013-06-17 10:26:10 -0700415 " ".join((bionic_libc_root + file) for file in edits))
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700416
Elliott Hughes18bc9752013-06-17 10:26:10 -0700417 commands.getoutput("git add %s%s" % (bionic_libc_root,"SYSCALLS.TXT"))
David 'Digit' Turnerfc269312010-10-11 22:11:06 +0200418
419 if (not adds) and (not deletes) and (not edits):
420 D("no changes detected!")
421 else:
422 D("ready to go!!")
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700423
424D_setlevel(1)
425
426state = State()
Elliott Hughes18bc9752013-06-17 10:26:10 -0700427state.process_file(bionic_libc_root+"SYSCALLS.TXT")
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700428state.regenerate()