blob: 558b004864a2d85e30459b1f93f52e99408a57de [file] [log] [blame]
Elliott Hughes6b586e72021-04-15 13:39:08 -07001#!/usr/bin/env python3
Pavel Chupinf12a18b2012-12-12 13:11:48 +04002
3# This tool is used to generate the assembler system call stubs,
4# the header files listing all available system calls, and the
5# makefiles used to build all the stubs.
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -07006
Christopher Ferris01bd32e2014-08-05 12:19:27 -07007import atexit
Elliott Hughes103ccde2013-10-16 14:27:59 -07008import filecmp
9import glob
Elliott Hughes103ccde2013-10-16 14:27:59 -070010import re
11import shutil
12import stat
Elliott Hughesdc1fb702014-08-20 11:16:11 -070013import string
Elliott Hughes103ccde2013-10-16 14:27:59 -070014import sys
Christopher Ferris01bd32e2014-08-05 12:19:27 -070015import tempfile
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -070016
Elliott Hughesdc1fb702014-08-20 11:16:11 -070017
Elliott Hughes704772b2022-10-10 17:06:43 +000018SupportedArchitectures = [ "arm", "arm64", "riscv64", "x86", "x86_64" ]
Elliott Hughesdc1fb702014-08-20 11:16:11 -070019
Elliott Hughesd67b0372019-04-15 14:18:26 -070020syscall_stub_header = \
Elliott Hughes103ccde2013-10-16 14:27:59 -070021"""
Elliott Hughes0437f3f2013-10-07 23:53:13 -070022ENTRY(%(func)s)
Pavel Chupinf12a18b2012-12-12 13:11:48 +040023"""
24
Elliott Hughes0437f3f2013-10-07 23:53:13 -070025
Elliott Hughes0437f3f2013-10-07 23:53:13 -070026#
27# ARM assembler templates for each syscall stub
28#
29
30arm_eabi_call_default = syscall_stub_header + """\
31 mov ip, r7
Christopher Ferrisf5a91232016-04-27 18:31:02 -070032 .cfi_register r7, ip
Elliott Hughes0437f3f2013-10-07 23:53:13 -070033 ldr r7, =%(__NR_name)s
34 swi #0
35 mov r7, ip
Christopher Ferrisf5a91232016-04-27 18:31:02 -070036 .cfi_restore r7
Elliott Hughes0437f3f2013-10-07 23:53:13 -070037 cmn r0, #(MAX_ERRNO + 1)
38 bxls lr
39 neg r0, r0
Elliott Hughes011e1112014-09-08 15:25:01 -070040 b __set_errno_internal
Elliott Hughes0437f3f2013-10-07 23:53:13 -070041END(%(func)s)
42"""
43
44arm_eabi_call_long = syscall_stub_header + """\
45 mov ip, sp
Elliott Hughes0437f3f2013-10-07 23:53:13 -070046 stmfd sp!, {r4, r5, r6, r7}
Christopher Ferrised459702013-12-02 17:44:53 -080047 .cfi_def_cfa_offset 16
48 .cfi_rel_offset r4, 0
49 .cfi_rel_offset r5, 4
50 .cfi_rel_offset r6, 8
51 .cfi_rel_offset r7, 12
Elliott Hughes0437f3f2013-10-07 23:53:13 -070052 ldmfd ip, {r4, r5, r6}
53 ldr r7, =%(__NR_name)s
54 swi #0
55 ldmfd sp!, {r4, r5, r6, r7}
Christopher Ferrised459702013-12-02 17:44:53 -080056 .cfi_def_cfa_offset 0
Elliott Hughes0437f3f2013-10-07 23:53:13 -070057 cmn r0, #(MAX_ERRNO + 1)
58 bxls lr
59 neg r0, r0
Elliott Hughes011e1112014-09-08 15:25:01 -070060 b __set_errno_internal
Elliott Hughes0437f3f2013-10-07 23:53:13 -070061END(%(func)s)
62"""
63
64
65#
Elliott Hughesd67b0372019-04-15 14:18:26 -070066# Arm64 assembler template for each syscall stub
Colin Crossd1973ca2014-01-21 19:50:58 -080067#
68
69arm64_call = syscall_stub_header + """\
Colin Crossd1973ca2014-01-21 19:50:58 -080070 mov x8, %(__NR_name)s
71 svc #0
72
Colin Crossd1973ca2014-01-21 19:50:58 -080073 cmn x0, #(MAX_ERRNO + 1)
74 cneg x0, x0, hi
Elliott Hughes011e1112014-09-08 15:25:01 -070075 b.hi __set_errno_internal
Colin Crossd1973ca2014-01-21 19:50:58 -080076
77 ret
78END(%(func)s)
79"""
80
81
82#
Elliott Hughes704772b2022-10-10 17:06:43 +000083# RISC-V64 assembler templates for each syscall stub
84#
85
86riscv64_call = syscall_stub_header + """\
87 li a7, %(__NR_name)s
88 ecall
89
90 li a7, -MAX_ERRNO
91 bgtu a0, a7, 1f
92
93 ret
941:
95 neg a0, a0
caowenchengc42c7412023-03-09 09:16:34 +080096 tail __set_errno_internal
Elliott Hughes704772b2022-10-10 17:06:43 +000097END(%(func)s)
98"""
99
100#
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700101# x86 assembler templates for each syscall stub
102#
103
Christopher Ferrise4bc7562014-01-06 16:39:10 -0800104x86_registers = [ "ebx", "ecx", "edx", "esi", "edi", "ebp" ]
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700105
Mingwei Shibe910522015-11-12 07:02:14 +0000106x86_call_prepare = """\
107
108 call __kernel_syscall
109 pushl %eax
110 .cfi_adjust_cfa_offset 4
111 .cfi_rel_offset eax, 0
112
113"""
114
Elliott Hughes0437f3f2013-10-07 23:53:13 -0700115x86_call = """\
116 movl $%(__NR_name)s, %%eax
Mingwei Shibe910522015-11-12 07:02:14 +0000117 call *(%%esp)
118 addl $4, %%esp
119
Elliott Hughes9aceab52013-03-12 14:57:30 -0700120 cmpl $-MAX_ERRNO, %%eax
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700121 jb 1f
122 negl %%eax
123 pushl %%eax
Elliott Hughes011e1112014-09-08 15:25:01 -0700124 call __set_errno_internal
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700125 addl $4, %%esp
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -07001261:
127"""
128
Elliott Hughes0437f3f2013-10-07 23:53:13 -0700129x86_return = """\
130 ret
131END(%(func)s)
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700132"""
133
Elliott Hughes0437f3f2013-10-07 23:53:13 -0700134
Elliott Hughescd6780b2013-02-07 14:07:00 -0800135#
Elliott Hughesd67b0372019-04-15 14:18:26 -0700136# x86_64 assembler template for each syscall stub
Pavel Chupinf12a18b2012-12-12 13:11:48 +0400137#
138
Elliott Hughes0437f3f2013-10-07 23:53:13 -0700139x86_64_call = """\
140 movl $%(__NR_name)s, %%eax
Pavel Chupinf12a18b2012-12-12 13:11:48 +0400141 syscall
142 cmpq $-MAX_ERRNO, %%rax
143 jb 1f
144 negl %%eax
145 movl %%eax, %%edi
Elliott Hughes011e1112014-09-08 15:25:01 -0700146 call __set_errno_internal
Pavel Chupinf12a18b2012-12-12 13:11:48 +04001471:
148 ret
Elliott Hughes0437f3f2013-10-07 23:53:13 -0700149END(%(func)s)
Pavel Chupinf12a18b2012-12-12 13:11:48 +0400150"""
151
Raghu Gandham1fa0d842012-01-27 17:51:42 -0800152
David 'Digit' Turner95d751f2010-12-16 16:47:14 +0100153def param_uses_64bits(param):
154 """Returns True iff a syscall parameter description corresponds
155 to a 64-bit type."""
156 param = param.strip()
157 # First, check that the param type begins with one of the known
158 # 64-bit types.
159 if not ( \
160 param.startswith("int64_t") or param.startswith("uint64_t") or \
161 param.startswith("loff_t") or param.startswith("off64_t") or \
162 param.startswith("long long") or param.startswith("unsigned long long") or
163 param.startswith("signed long long") ):
164 return False
165
166 # Second, check that there is no pointer type here
167 if param.find("*") >= 0:
168 return False
169
170 # Ok
171 return True
172
Elliott Hughes0437f3f2013-10-07 23:53:13 -0700173
David 'Digit' Turner95d751f2010-12-16 16:47:14 +0100174def count_arm_param_registers(params):
175 """This function is used to count the number of register used
Elliott Hughescd6780b2013-02-07 14:07:00 -0800176 to pass parameters when invoking an ARM system call.
David 'Digit' Turner95d751f2010-12-16 16:47:14 +0100177 This is because the ARM EABI mandates that 64-bit quantities
178 must be passed in an even+odd register pair. So, for example,
179 something like:
180
181 foo(int fd, off64_t pos)
182
183 would actually need 4 registers:
184 r0 -> int
185 r1 -> unused
186 r2-r3 -> pos
187 """
188 count = 0
189 for param in params:
190 if param_uses_64bits(param):
191 if (count & 1) != 0:
192 count += 1
193 count += 2
194 else:
195 count += 1
196 return count
197
Elliott Hughes0437f3f2013-10-07 23:53:13 -0700198
David 'Digit' Turner95d751f2010-12-16 16:47:14 +0100199def count_generic_param_registers(params):
200 count = 0
201 for param in params:
202 if param_uses_64bits(param):
203 count += 2
204 else:
205 count += 1
206 return count
207
Elliott Hughes0437f3f2013-10-07 23:53:13 -0700208
Pavel Chupinf12a18b2012-12-12 13:11:48 +0400209def count_generic_param_registers64(params):
210 count = 0
211 for param in params:
212 count += 1
213 return count
214
Elliott Hughes0437f3f2013-10-07 23:53:13 -0700215
Elliott Hughescda62092013-03-22 13:50:44 -0700216# This lets us support regular system calls like __NR_write and also weird
217# ones like __ARM_NR_cacheflush, where the NR doesn't come at the start.
218def make__NR_name(name):
Christopher Ferris01bd32e2014-08-05 12:19:27 -0700219 if name.startswith("__ARM_NR_"):
Elliott Hughescda62092013-03-22 13:50:44 -0700220 return name
221 else:
222 return "__NR_%s" % (name)
223
Elliott Hughes0437f3f2013-10-07 23:53:13 -0700224
Elliott Hughesfff6e272013-10-24 17:03:20 -0700225def add_footer(pointer_length, stub, syscall):
226 # Add any aliases for this syscall.
Elliott Hughes0437f3f2013-10-07 23:53:13 -0700227 aliases = syscall["aliases"]
228 for alias in aliases:
Christopher Ferrisfa5faa02015-03-24 16:50:46 -0700229 stub += "\nALIAS_SYMBOL(%s, %s)\n" % (alias, syscall["func"])
Elliott Hughesfff6e272013-10-24 17:03:20 -0700230
Nick Kralevich00490ae2015-02-03 11:27:25 -0800231 # Use hidden visibility on LP64 for any functions beginning with underscores.
Elliott Hughes50080a22019-06-19 12:47:53 -0700232 if pointer_length == 64 and syscall["func"].startswith("__"):
Elliott Hughesd465eb42014-02-19 18:59:19 -0800233 stub += '.hidden ' + syscall["func"] + '\n'
Elliott Hughesfff6e272013-10-24 17:03:20 -0700234
Elliott Hughes0437f3f2013-10-07 23:53:13 -0700235 return stub
236
237
238def arm_eabi_genstub(syscall):
239 num_regs = count_arm_param_registers(syscall["params"])
240 if num_regs > 4:
241 return arm_eabi_call_long % syscall
242 return arm_eabi_call_default % syscall
243
244
Colin Crossd1973ca2014-01-21 19:50:58 -0800245def arm64_genstub(syscall):
246 return arm64_call % syscall
247
248
Elliott Hughes704772b2022-10-10 17:06:43 +0000249def riscv64_genstub(syscall):
250 return riscv64_call % syscall
251
252
Elliott Hughes0437f3f2013-10-07 23:53:13 -0700253def x86_genstub(syscall):
254 result = syscall_stub_header % syscall
Elliott Hughes0437f3f2013-10-07 23:53:13 -0700255
256 numparams = count_generic_param_registers(syscall["params"])
Mingwei Shibe910522015-11-12 07:02:14 +0000257 stack_bias = numparams*4 + 8
Christopher Ferrise4bc7562014-01-06 16:39:10 -0800258 offset = 0
259 mov_result = ""
Christopher Ferris15b91e92014-05-29 18:17:09 -0700260 first_push = True
Christopher Ferrise4bc7562014-01-06 16:39:10 -0800261 for register in x86_registers[:numparams]:
262 result += " pushl %%%s\n" % register
Christopher Ferris15b91e92014-05-29 18:17:09 -0700263 if first_push:
264 result += " .cfi_def_cfa_offset 8\n"
265 result += " .cfi_rel_offset %s, 0\n" % register
266 first_push = False
267 else:
268 result += " .cfi_adjust_cfa_offset 4\n"
269 result += " .cfi_rel_offset %s, 0\n" % register
Christopher Ferrise4bc7562014-01-06 16:39:10 -0800270 mov_result += " mov %d(%%esp), %%%s\n" % (stack_bias+offset, register)
Christopher Ferrise4bc7562014-01-06 16:39:10 -0800271 offset += 4
Elliott Hughes0437f3f2013-10-07 23:53:13 -0700272
Mingwei Shibe910522015-11-12 07:02:14 +0000273 result += x86_call_prepare
Christopher Ferris15b91e92014-05-29 18:17:09 -0700274 result += mov_result
Elliott Hughes0437f3f2013-10-07 23:53:13 -0700275 result += x86_call % syscall
276
Christopher Ferrise4bc7562014-01-06 16:39:10 -0800277 for register in reversed(x86_registers[:numparams]):
278 result += " popl %%%s\n" % register
Elliott Hughes0437f3f2013-10-07 23:53:13 -0700279
280 result += x86_return % syscall
281 return result
282
Serban Constantinescufeaa89a2013-10-07 16:49:09 +0100283
Elliott Hughes0437f3f2013-10-07 23:53:13 -0700284def x86_genstub_socketcall(syscall):
285 # %ebx <--- Argument 1 - The call id of the needed vectored
286 # syscall (socket, bind, recv, etc)
287 # %ecx <--- Argument 2 - Pointer to the rest of the arguments
288 # from the original function called (socket())
289
290 result = syscall_stub_header % syscall
Elliott Hughes0437f3f2013-10-07 23:53:13 -0700291
292 # save the regs we need
Christopher Ferrise4bc7562014-01-06 16:39:10 -0800293 result += " pushl %ebx\n"
Christopher Ferrise4bc7562014-01-06 16:39:10 -0800294 result += " .cfi_def_cfa_offset 8\n"
295 result += " .cfi_rel_offset ebx, 0\n"
Christopher Ferris15b91e92014-05-29 18:17:09 -0700296 result += " pushl %ecx\n"
297 result += " .cfi_adjust_cfa_offset 4\n"
298 result += " .cfi_rel_offset ecx, 0\n"
Mingwei Shibe910522015-11-12 07:02:14 +0000299 stack_bias = 16
300
301 result += x86_call_prepare
Elliott Hughes0437f3f2013-10-07 23:53:13 -0700302
303 # set the call id (%ebx)
Christopher Ferrise4bc7562014-01-06 16:39:10 -0800304 result += " mov $%d, %%ebx\n" % syscall["socketcall_id"]
Elliott Hughes0437f3f2013-10-07 23:53:13 -0700305
306 # set the pointer to the rest of the args into %ecx
Christopher Ferrise4bc7562014-01-06 16:39:10 -0800307 result += " mov %esp, %ecx\n"
308 result += " addl $%d, %%ecx\n" % (stack_bias)
Elliott Hughes0437f3f2013-10-07 23:53:13 -0700309
310 # now do the syscall code itself
311 result += x86_call % syscall
312
313 # now restore the saved regs
Christopher Ferrise4bc7562014-01-06 16:39:10 -0800314 result += " popl %ecx\n"
315 result += " popl %ebx\n"
Elliott Hughes0437f3f2013-10-07 23:53:13 -0700316
317 # epilog
318 result += x86_return % syscall
319 return result
320
321
322def x86_64_genstub(syscall):
323 result = syscall_stub_header % syscall
324 num_regs = count_generic_param_registers64(syscall["params"])
325 if (num_regs > 3):
326 # rcx is used as 4th argument. Kernel wants it at r10.
327 result += " movq %rcx, %r10\n"
328
329 result += x86_64_call % syscall
330 return result
331
332
Elliott Hughesdc1fb702014-08-20 11:16:11 -0700333class SysCallsTxtParser:
334 def __init__(self):
335 self.syscalls = []
Elliott Hughes1c1dfb82022-11-08 02:57:55 +0000336 self.lineno = 0
337 self.errors = False
Elliott Hughesdc1fb702014-08-20 11:16:11 -0700338
339 def E(self, msg):
Elliott Hughesbc6999f2021-02-03 13:13:57 -0800340 print("%d: %s" % (self.lineno, msg))
Elliott Hughes1c1dfb82022-11-08 02:57:55 +0000341 self.errors = True
Elliott Hughesdc1fb702014-08-20 11:16:11 -0700342
343 def parse_line(self, line):
344 """ parse a syscall spec line.
345
346 line processing, format is
347 return type func_name[|alias_list][:syscall_name[:socketcall_id]] ( [paramlist] ) architecture_list
348 """
349 pos_lparen = line.find('(')
350 E = self.E
351 if pos_lparen < 0:
352 E("missing left parenthesis in '%s'" % line)
353 return
354
355 pos_rparen = line.rfind(')')
356 if pos_rparen < 0 or pos_rparen <= pos_lparen:
357 E("missing or misplaced right parenthesis in '%s'" % line)
358 return
359
360 return_type = line[:pos_lparen].strip().split()
361 if len(return_type) < 2:
362 E("missing return type in '%s'" % line)
363 return
364
365 syscall_func = return_type[-1]
Elliott Hughesbc6999f2021-02-03 13:13:57 -0800366 return_type = ' '.join(return_type[:-1])
Elliott Hughesdc1fb702014-08-20 11:16:11 -0700367 socketcall_id = -1
368
369 pos_colon = syscall_func.find(':')
370 if pos_colon < 0:
371 syscall_name = syscall_func
372 else:
373 if pos_colon == 0 or pos_colon+1 >= len(syscall_func):
374 E("misplaced colon in '%s'" % line)
375 return
376
377 # now find if there is a socketcall_id for a dispatch-type syscall
378 # after the optional 2nd colon
379 pos_colon2 = syscall_func.find(':', pos_colon + 1)
380 if pos_colon2 < 0:
381 syscall_name = syscall_func[pos_colon+1:]
382 syscall_func = syscall_func[:pos_colon]
383 else:
384 if pos_colon2+1 >= len(syscall_func):
385 E("misplaced colon2 in '%s'" % line)
386 return
387 syscall_name = syscall_func[(pos_colon+1):pos_colon2]
388 socketcall_id = int(syscall_func[pos_colon2+1:])
389 syscall_func = syscall_func[:pos_colon]
390
391 alias_delim = syscall_func.find('|')
392 if alias_delim > 0:
393 alias_list = syscall_func[alias_delim+1:].strip()
394 syscall_func = syscall_func[:alias_delim]
395 alias_delim = syscall_name.find('|')
396 if alias_delim > 0:
397 syscall_name = syscall_name[:alias_delim]
Elliott Hughesbc6999f2021-02-03 13:13:57 -0800398 syscall_aliases = alias_list.split(',')
Elliott Hughesdc1fb702014-08-20 11:16:11 -0700399 else:
400 syscall_aliases = []
401
402 if pos_rparen > pos_lparen+1:
403 syscall_params = line[pos_lparen+1:pos_rparen].split(',')
Elliott Hughesbc6999f2021-02-03 13:13:57 -0800404 params = ','.join(syscall_params)
Elliott Hughesdc1fb702014-08-20 11:16:11 -0700405 else:
406 syscall_params = []
407 params = "void"
408
409 t = {
410 "name" : syscall_name,
411 "func" : syscall_func,
412 "aliases" : syscall_aliases,
413 "params" : syscall_params,
414 "decl" : "%-15s %s (%s);" % (return_type, syscall_func, params),
415 "socketcall_id" : socketcall_id
416 }
417
418 # Parse the architecture list.
419 arch_list = line[pos_rparen+1:].strip()
420 if arch_list == "all":
Elliott Hughesae03b122019-09-17 16:37:05 -0700421 for arch in SupportedArchitectures:
Elliott Hughesdc1fb702014-08-20 11:16:11 -0700422 t[arch] = True
423 else:
Elliott Hughesbc6999f2021-02-03 13:13:57 -0800424 for arch in arch_list.split(','):
Elliott Hughes2b499042020-02-13 14:21:55 -0800425 if arch == "lp32":
426 for arch in SupportedArchitectures:
427 if "64" not in arch:
428 t[arch] = True
429 elif arch == "lp64":
430 for arch in SupportedArchitectures:
431 if "64" in arch:
432 t[arch] = True
433 elif arch in SupportedArchitectures:
Elliott Hughesdc1fb702014-08-20 11:16:11 -0700434 t[arch] = True
435 else:
436 E("invalid syscall architecture '%s' in '%s'" % (arch, line))
437 return
438
439 self.syscalls.append(t)
440
Paul Lawrence7ea40902017-02-14 13:32:23 -0800441 def parse_open_file(self, fp):
442 for line in fp:
Elliott Hughesdc1fb702014-08-20 11:16:11 -0700443 self.lineno += 1
444 line = line.strip()
445 if not line: continue
446 if line[0] == '#': continue
447 self.parse_line(line)
Elliott Hughes1c1dfb82022-11-08 02:57:55 +0000448 if self.errors:
449 sys.exit(1)
Elliott Hughesdc1fb702014-08-20 11:16:11 -0700450
Paul Lawrence7ea40902017-02-14 13:32:23 -0800451 def parse_file(self, file_path):
Paul Lawrence7ea40902017-02-14 13:32:23 -0800452 with open(file_path) as fp:
Alessio Balsini93d4f8b2017-04-11 18:27:29 +0200453 self.parse_open_file(fp)
Elliott Hughesdc1fb702014-08-20 11:16:11 -0700454
455
John Catere86e5052019-09-26 14:47:03 -0400456def main(arch, syscall_file):
Elliott Hughes782c4852019-04-16 12:31:00 -0700457 parser = SysCallsTxtParser()
John Catere86e5052019-09-26 14:47:03 -0400458 parser.parse_file(syscall_file)
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700459
Elliott Hughes782c4852019-04-16 12:31:00 -0700460 for syscall in parser.syscalls:
461 syscall["__NR_name"] = make__NR_name(syscall["name"])
Pavel Chupinf12a18b2012-12-12 13:11:48 +0400462
Rupert Shuttleworthe99df592021-04-15 06:09:04 -0400463 if "arm" in syscall:
Elliott Hughes782c4852019-04-16 12:31:00 -0700464 syscall["asm-arm"] = add_footer(32, arm_eabi_genstub(syscall), syscall)
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700465
Rupert Shuttleworthe99df592021-04-15 06:09:04 -0400466 if "arm64" in syscall:
Elliott Hughes782c4852019-04-16 12:31:00 -0700467 syscall["asm-arm64"] = add_footer(64, arm64_genstub(syscall), syscall)
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700468
Elliott Hughes704772b2022-10-10 17:06:43 +0000469 if "riscv64" in syscall:
470 syscall["asm-riscv64"] = add_footer(64, riscv64_genstub(syscall), syscall)
471
Rupert Shuttleworthe99df592021-04-15 06:09:04 -0400472 if "x86" in syscall:
Elliott Hughes782c4852019-04-16 12:31:00 -0700473 if syscall["socketcall_id"] >= 0:
474 syscall["asm-x86"] = add_footer(32, x86_genstub_socketcall(syscall), syscall)
475 else:
476 syscall["asm-x86"] = add_footer(32, x86_genstub(syscall), syscall)
477 elif syscall["socketcall_id"] >= 0:
478 E("socketcall_id for dispatch syscalls is only supported for x86 in '%s'" % t)
479 return
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700480
Rupert Shuttleworthe99df592021-04-15 06:09:04 -0400481 if "x86_64" in syscall:
Elliott Hughes782c4852019-04-16 12:31:00 -0700482 syscall["asm-x86_64"] = add_footer(64, x86_64_genstub(syscall), syscall)
The Android Open Source Project4e468ed2008-12-17 18:03:48 -0800483
Elliott Hughes782c4852019-04-16 12:31:00 -0700484 print("/* Generated by gensyscalls.py. Do not edit. */\n")
485 print("#include <private/bionic_asm.h>\n")
486 for syscall in parser.syscalls:
Rupert Shuttleworthe99df592021-04-15 06:09:04 -0400487 if ("asm-%s" % arch) in syscall:
Elliott Hughes782c4852019-04-16 12:31:00 -0700488 print(syscall["asm-%s" % arch])
Chris Dearman50432122014-02-05 16:59:23 -0800489
Tamas Petz19d66e62019-12-03 17:18:43 +0100490 if arch == 'arm64':
491 print('\nNOTE_GNU_PROPERTY()\n')
The Android Open Source Projecta27d2ba2008-10-21 07:00:00 -0700492
Paul Lawrenceeabc3522016-11-11 11:33:42 -0800493if __name__ == "__main__":
John Catere86e5052019-09-26 14:47:03 -0400494 if len(sys.argv) < 2:
Elliott Hughesbc6999f2021-02-03 13:13:57 -0800495 print("Usage: gensyscalls.py ARCH SOURCE_FILE")
John Catere86e5052019-09-26 14:47:03 -0400496 sys.exit(1)
497
498 arch = sys.argv[1]
499 syscall_file = sys.argv[2]
500 main(arch, syscall_file)