177bb564dc7b3f1771a116b52a3227a91b5235026Stephen Crane#!/usr/bin/env python
2f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin
3f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin# This tool is used to generate the assembler system call stubs,
4f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin# the header files listing all available system calls, and the
5f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin# makefiles used to build all the stubs.
6a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
701bd32e0e46ab8d9b6aeda77a550ec08074728a6Christopher Ferrisimport atexit
8103ccde8fe2f2c8abde914a8ba736b2e9cb8d20bElliott Hughesimport commands
9103ccde8fe2f2c8abde914a8ba736b2e9cb8d20bElliott Hughesimport filecmp
10103ccde8fe2f2c8abde914a8ba736b2e9cb8d20bElliott Hughesimport glob
11dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughesimport logging
12103ccde8fe2f2c8abde914a8ba736b2e9cb8d20bElliott Hughesimport os.path
13103ccde8fe2f2c8abde914a8ba736b2e9cb8d20bElliott Hughesimport re
14103ccde8fe2f2c8abde914a8ba736b2e9cb8d20bElliott Hughesimport shutil
15103ccde8fe2f2c8abde914a8ba736b2e9cb8d20bElliott Hughesimport stat
16dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughesimport string
17103ccde8fe2f2c8abde914a8ba736b2e9cb8d20bElliott Hughesimport sys
1801bd32e0e46ab8d9b6aeda77a550ec08074728a6Christopher Ferrisimport tempfile
19a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
20dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes
21dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughesall_arches = [ "arm", "arm64", "mips", "mips64", "x86", "x86_64" ]
22dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes
23a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
24a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project# temp directory where we store all intermediate files
2501bd32e0e46ab8d9b6aeda77a550ec08074728a6Christopher Ferrisbionic_temp = tempfile.mkdtemp(prefix="bionic_gensyscalls");
2601bd32e0e46ab8d9b6aeda77a550ec08074728a6Christopher Ferris# Make sure the directory is deleted when the script exits.
2701bd32e0e46ab8d9b6aeda77a550ec08074728a6Christopher Ferrisatexit.register(shutil.rmtree, bionic_temp)
2801bd32e0e46ab8d9b6aeda77a550ec08074728a6Christopher Ferris
2901bd32e0e46ab8d9b6aeda77a550ec08074728a6Christopher Ferrisbionic_libc_root = os.path.join(os.environ["ANDROID_BUILD_TOP"], "bionic/libc")
30a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
31103ccde8fe2f2c8abde914a8ba736b2e9cb8d20bElliott Hugheswarning = "Generated by gensyscalls.py. Do not edit."
32103ccde8fe2f2c8abde914a8ba736b2e9cb8d20bElliott Hughes
33f12a18b85061e7121c7534faf3625137e56b770dPavel ChupinDRY_RUN = False
34f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin
35f12a18b85061e7121c7534faf3625137e56b770dPavel Chupindef make_dir(path):
361fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham    path = os.path.abspath(path)
37a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project    if not os.path.exists(path):
38a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project        parent = os.path.dirname(path)
39a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project        if parent:
40a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project            make_dir(parent)
41a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project        os.mkdir(path)
42a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
430437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes
44f12a18b85061e7121c7534faf3625137e56b770dPavel Chupindef create_file(relpath):
4501bd32e0e46ab8d9b6aeda77a550ec08074728a6Christopher Ferris    full_path = os.path.join(bionic_temp, relpath)
4601bd32e0e46ab8d9b6aeda77a550ec08074728a6Christopher Ferris    dir = os.path.dirname(full_path)
47a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project    make_dir(dir)
4801bd32e0e46ab8d9b6aeda77a550ec08074728a6Christopher Ferris    return open(full_path, "w")
49a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
50a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
51103ccde8fe2f2c8abde914a8ba736b2e9cb8d20bElliott Hughessyscall_stub_header = "/* " + warning + " */\n" + \
52103ccde8fe2f2c8abde914a8ba736b2e9cb8d20bElliott Hughes"""
53ed74484dcbc2e156a6e5fa861a62425b12e55128Elliott Hughes#include <private/bionic_asm.h>
54a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
550437f3ff296a4c66675c7386b0522e6062413e5aElliott HughesENTRY(%(func)s)
56a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project"""
57a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
580437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes
59f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin#
60f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin# ARM assembler templates for each syscall stub
61f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin#
62f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin
63f12a18b85061e7121c7534faf3625137e56b770dPavel Chupinarm_eabi_call_default = syscall_stub_header + """\
64faa0fdb1194172f578f973097d61e580bce528dcMatthieu Castet    mov     ip, r7
65f5a9123d9f365e3a72ac9f2a3921f439541a87e8Christopher Ferris    .cfi_register r7, ip
660437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    ldr     r7, =%(__NR_name)s
67a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project    swi     #0
68faa0fdb1194172f578f973097d61e580bce528dcMatthieu Castet    mov     r7, ip
69f5a9123d9f365e3a72ac9f2a3921f439541a87e8Christopher Ferris    .cfi_restore r7
709aceab50155b17741faded1fb22e2daa51a07fb1Elliott Hughes    cmn     r0, #(MAX_ERRNO + 1)
719aceab50155b17741faded1fb22e2daa51a07fb1Elliott Hughes    bxls    lr
729aceab50155b17741faded1fb22e2daa51a07fb1Elliott Hughes    neg     r0, r0
73011e111d299284b65af07add523a9dccac356244Elliott Hughes    b       __set_errno_internal
740437f3ff296a4c66675c7386b0522e6062413e5aElliott HughesEND(%(func)s)
75cd6780b1677503a0dfa91c8a9c0c635dbbd48366Elliott Hughes"""
76a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
77f12a18b85061e7121c7534faf3625137e56b770dPavel Chupinarm_eabi_call_long = syscall_stub_header + """\
78a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project    mov     ip, sp
79a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project    stmfd   sp!, {r4, r5, r6, r7}
80ed45970ac5a182e512669cfa5c15b9f4fa783ad7Christopher Ferris    .cfi_def_cfa_offset 16
81ed45970ac5a182e512669cfa5c15b9f4fa783ad7Christopher Ferris    .cfi_rel_offset r4, 0
82ed45970ac5a182e512669cfa5c15b9f4fa783ad7Christopher Ferris    .cfi_rel_offset r5, 4
83ed45970ac5a182e512669cfa5c15b9f4fa783ad7Christopher Ferris    .cfi_rel_offset r6, 8
84ed45970ac5a182e512669cfa5c15b9f4fa783ad7Christopher Ferris    .cfi_rel_offset r7, 12
85a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project    ldmfd   ip, {r4, r5, r6}
860437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    ldr     r7, =%(__NR_name)s
87a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project    swi     #0
88a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project    ldmfd   sp!, {r4, r5, r6, r7}
89ed45970ac5a182e512669cfa5c15b9f4fa783ad7Christopher Ferris    .cfi_def_cfa_offset 0
909aceab50155b17741faded1fb22e2daa51a07fb1Elliott Hughes    cmn     r0, #(MAX_ERRNO + 1)
919aceab50155b17741faded1fb22e2daa51a07fb1Elliott Hughes    bxls    lr
929aceab50155b17741faded1fb22e2daa51a07fb1Elliott Hughes    neg     r0, r0
93011e111d299284b65af07add523a9dccac356244Elliott Hughes    b       __set_errno_internal
940437f3ff296a4c66675c7386b0522e6062413e5aElliott HughesEND(%(func)s)
95a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project"""
96a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
970437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes
98cd6780b1677503a0dfa91c8a9c0c635dbbd48366Elliott Hughes#
99d1973ca51325393f304e82a4d79874f33e54ac16Colin Cross# Arm64 assembler templates for each syscall stub
100d1973ca51325393f304e82a4d79874f33e54ac16Colin Cross#
101d1973ca51325393f304e82a4d79874f33e54ac16Colin Cross
102d1973ca51325393f304e82a4d79874f33e54ac16Colin Crossarm64_call = syscall_stub_header + """\
103d1973ca51325393f304e82a4d79874f33e54ac16Colin Cross    mov     x8, %(__NR_name)s
104d1973ca51325393f304e82a4d79874f33e54ac16Colin Cross    svc     #0
105d1973ca51325393f304e82a4d79874f33e54ac16Colin Cross
106d1973ca51325393f304e82a4d79874f33e54ac16Colin Cross    cmn     x0, #(MAX_ERRNO + 1)
107d1973ca51325393f304e82a4d79874f33e54ac16Colin Cross    cneg    x0, x0, hi
108011e111d299284b65af07add523a9dccac356244Elliott Hughes    b.hi    __set_errno_internal
109d1973ca51325393f304e82a4d79874f33e54ac16Colin Cross
110d1973ca51325393f304e82a4d79874f33e54ac16Colin Cross    ret
111d1973ca51325393f304e82a4d79874f33e54ac16Colin CrossEND(%(func)s)
112d1973ca51325393f304e82a4d79874f33e54ac16Colin Cross"""
113d1973ca51325393f304e82a4d79874f33e54ac16Colin Cross
114d1973ca51325393f304e82a4d79874f33e54ac16Colin Cross
115d1973ca51325393f304e82a4d79874f33e54ac16Colin Cross#
1160437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes# MIPS assembler templates for each syscall stub
1171fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham#
118cd6780b1677503a0dfa91c8a9c0c635dbbd48366Elliott Hughes
1199abbbdc5346020e33a8fdbe7254dd0fdff9df616Elliott Hughesmips_call = syscall_stub_header + """\
1201fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham    .set noreorder
121d4ca231ae2891e5c9eccb6e9a2e6af7fabcfc2a5Elliott Hughes    .cpload $t9
122d4ca231ae2891e5c9eccb6e9a2e6af7fabcfc2a5Elliott Hughes    li $v0, %(__NR_name)s
1231fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham    syscall
124d4ca231ae2891e5c9eccb6e9a2e6af7fabcfc2a5Elliott Hughes    bnez $a3, 1f
125d4ca231ae2891e5c9eccb6e9a2e6af7fabcfc2a5Elliott Hughes    move $a0, $v0
126d4ca231ae2891e5c9eccb6e9a2e6af7fabcfc2a5Elliott Hughes    j $ra
1271fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham    nop
1281fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham1:
129d4ca231ae2891e5c9eccb6e9a2e6af7fabcfc2a5Elliott Hughes    la $t9,__set_errno_internal
130d4ca231ae2891e5c9eccb6e9a2e6af7fabcfc2a5Elliott Hughes    j $t9
1311fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham    nop
1321fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham    .set reorder
1339abbbdc5346020e33a8fdbe7254dd0fdff9df616Elliott HughesEND(%(func)s)
1340437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes"""
1350437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes
1360437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes
1370437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes#
1385043212b7615bc4c03463c4d242769de69cd4685Chris Dearman# MIPS64 assembler templates for each syscall stub
1395043212b7615bc4c03463c4d242769de69cd4685Chris Dearman#
1405043212b7615bc4c03463c4d242769de69cd4685Chris Dearman
1419abbbdc5346020e33a8fdbe7254dd0fdff9df616Elliott Hughesmips64_call = syscall_stub_header + """\
1425043212b7615bc4c03463c4d242769de69cd4685Chris Dearman    .set push
1435043212b7615bc4c03463c4d242769de69cd4685Chris Dearman    .set noreorder
144ab413c535c872a773b99a941bfba02ddc1711f4aElliott Hughes    li $v0, %(__NR_name)s
1455043212b7615bc4c03463c4d242769de69cd4685Chris Dearman    syscall
146ab413c535c872a773b99a941bfba02ddc1711f4aElliott Hughes    bnez $a3, 1f
147ab413c535c872a773b99a941bfba02ddc1711f4aElliott Hughes    move $a0, $v0
148ab413c535c872a773b99a941bfba02ddc1711f4aElliott Hughes    j $ra
1495043212b7615bc4c03463c4d242769de69cd4685Chris Dearman    nop
1505043212b7615bc4c03463c4d242769de69cd4685Chris Dearman1:
151ab413c535c872a773b99a941bfba02ddc1711f4aElliott Hughes    move $t0, $ra
152ab413c535c872a773b99a941bfba02ddc1711f4aElliott Hughes    bal 2f
1535043212b7615bc4c03463c4d242769de69cd4685Chris Dearman    nop
1545043212b7615bc4c03463c4d242769de69cd4685Chris Dearman2:
155ab413c535c872a773b99a941bfba02ddc1711f4aElliott Hughes    .cpsetup $ra, $t1, 2b
156ab413c535c872a773b99a941bfba02ddc1711f4aElliott Hughes    LA $t9, __set_errno_internal
1575043212b7615bc4c03463c4d242769de69cd4685Chris Dearman    .cpreturn
158ab413c535c872a773b99a941bfba02ddc1711f4aElliott Hughes    j $t9
159ab413c535c872a773b99a941bfba02ddc1711f4aElliott Hughes    move $ra, $t0
1605043212b7615bc4c03463c4d242769de69cd4685Chris Dearman    .set pop
1619abbbdc5346020e33a8fdbe7254dd0fdff9df616Elliott HughesEND(%(func)s)
1625043212b7615bc4c03463c4d242769de69cd4685Chris Dearman"""
1635043212b7615bc4c03463c4d242769de69cd4685Chris Dearman
1645043212b7615bc4c03463c4d242769de69cd4685Chris Dearman
1655043212b7615bc4c03463c4d242769de69cd4685Chris Dearman#
1660437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes# x86 assembler templates for each syscall stub
1670437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes#
1680437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes
169e4bc7561219ddb7cfb7b33f731caa92a7766b9caChristopher Ferrisx86_registers = [ "ebx", "ecx", "edx", "esi", "edi", "ebp" ]
1700437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes
171be910529322b461148debefd50b9e0d67ae84f8eMingwei Shix86_call_prepare = """\
172be910529322b461148debefd50b9e0d67ae84f8eMingwei Shi
173be910529322b461148debefd50b9e0d67ae84f8eMingwei Shi    call    __kernel_syscall
174be910529322b461148debefd50b9e0d67ae84f8eMingwei Shi    pushl   %eax
175be910529322b461148debefd50b9e0d67ae84f8eMingwei Shi    .cfi_adjust_cfa_offset 4
176be910529322b461148debefd50b9e0d67ae84f8eMingwei Shi    .cfi_rel_offset eax, 0
177be910529322b461148debefd50b9e0d67ae84f8eMingwei Shi
178be910529322b461148debefd50b9e0d67ae84f8eMingwei Shi"""
179be910529322b461148debefd50b9e0d67ae84f8eMingwei Shi
1800437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughesx86_call = """\
1810437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    movl    $%(__NR_name)s, %%eax
182be910529322b461148debefd50b9e0d67ae84f8eMingwei Shi    call    *(%%esp)
183be910529322b461148debefd50b9e0d67ae84f8eMingwei Shi    addl    $4, %%esp
184be910529322b461148debefd50b9e0d67ae84f8eMingwei Shi
1850437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    cmpl    $-MAX_ERRNO, %%eax
1860437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    jb      1f
1870437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    negl    %%eax
1880437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    pushl   %%eax
189011e111d299284b65af07add523a9dccac356244Elliott Hughes    call    __set_errno_internal
1900437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    addl    $4, %%esp
1910437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes1:
1920437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes"""
1930437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes
1940437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughesx86_return = """\
1950437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    ret
1960437f3ff296a4c66675c7386b0522e6062413e5aElliott HughesEND(%(func)s)
1970437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes"""
1980437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes
1990437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes
2000437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes#
2010437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes# x86_64 assembler templates for each syscall stub
2020437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes#
2030437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes
2040437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughesx86_64_call = """\
2050437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    movl    $%(__NR_name)s, %%eax
2060437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    syscall
2070437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    cmpq    $-MAX_ERRNO, %%rax
2080437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    jb      1f
2090437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    negl    %%eax
2100437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    movl    %%eax, %%edi
211011e111d299284b65af07add523a9dccac356244Elliott Hughes    call    __set_errno_internal
2120437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes1:
2130437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    ret
2140437f3ff296a4c66675c7386b0522e6062413e5aElliott HughesEND(%(func)s)
2151fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham"""
2161fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham
2170437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes
21895d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turnerdef param_uses_64bits(param):
21995d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner    """Returns True iff a syscall parameter description corresponds
22095d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner       to a 64-bit type."""
22195d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner    param = param.strip()
22295d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner    # First, check that the param type begins with one of the known
22395d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner    # 64-bit types.
22495d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner    if not ( \
22595d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner       param.startswith("int64_t") or param.startswith("uint64_t") or \
22695d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner       param.startswith("loff_t") or param.startswith("off64_t") or \
22795d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner       param.startswith("long long") or param.startswith("unsigned long long") or
22895d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner       param.startswith("signed long long") ):
22995d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner           return False
23095d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner
23195d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner    # Second, check that there is no pointer type here
23295d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner    if param.find("*") >= 0:
23395d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner            return False
23495d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner
23595d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner    # Ok
23695d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner    return True
23795d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner
2380437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes
23995d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turnerdef count_arm_param_registers(params):
24095d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner    """This function is used to count the number of register used
241cd6780b1677503a0dfa91c8a9c0c635dbbd48366Elliott Hughes       to pass parameters when invoking an ARM system call.
24295d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner       This is because the ARM EABI mandates that 64-bit quantities
24395d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner       must be passed in an even+odd register pair. So, for example,
24495d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner       something like:
24595d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner
24695d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner             foo(int fd, off64_t pos)
24795d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner
24895d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner       would actually need 4 registers:
24995d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner             r0 -> int
25095d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner             r1 -> unused
25195d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner             r2-r3 -> pos
25295d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner   """
25395d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner    count = 0
25495d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner    for param in params:
25595d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner        if param_uses_64bits(param):
25695d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner            if (count & 1) != 0:
25795d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner                count += 1
25895d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner            count += 2
25995d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner        else:
26095d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner            count += 1
26195d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner    return count
26295d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner
2630437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes
26495d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turnerdef count_generic_param_registers(params):
26595d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner    count = 0
26695d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner    for param in params:
26795d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner        if param_uses_64bits(param):
26895d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner            count += 2
26995d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner        else:
27095d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner            count += 1
27195d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner    return count
27295d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turner
2730437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes
274f12a18b85061e7121c7534faf3625137e56b770dPavel Chupindef count_generic_param_registers64(params):
275f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin    count = 0
276f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin    for param in params:
277f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin        count += 1
278f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin    return count
279f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin
2800437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes
281cda62094ef6ab44d3804954fff75be1246725c36Elliott Hughes# This lets us support regular system calls like __NR_write and also weird
282cda62094ef6ab44d3804954fff75be1246725c36Elliott Hughes# ones like __ARM_NR_cacheflush, where the NR doesn't come at the start.
283cda62094ef6ab44d3804954fff75be1246725c36Elliott Hughesdef make__NR_name(name):
28401bd32e0e46ab8d9b6aeda77a550ec08074728a6Christopher Ferris    if name.startswith("__ARM_NR_"):
285cda62094ef6ab44d3804954fff75be1246725c36Elliott Hughes        return name
286cda62094ef6ab44d3804954fff75be1246725c36Elliott Hughes    else:
287cda62094ef6ab44d3804954fff75be1246725c36Elliott Hughes        return "__NR_%s" % (name)
288cda62094ef6ab44d3804954fff75be1246725c36Elliott Hughes
289a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
290fff6e272e9edea3f33b2f64ec9e342413d92e36fElliott Hughesdef add_footer(pointer_length, stub, syscall):
291fff6e272e9edea3f33b2f64ec9e342413d92e36fElliott Hughes    # Add any aliases for this syscall.
2920437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    aliases = syscall["aliases"]
2930437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    for alias in aliases:
294fa5faa0ce6deba5ad9c96fe5cf74e63e4a6edfb3Christopher Ferris        stub += "\nALIAS_SYMBOL(%s, %s)\n" % (alias, syscall["func"])
295fff6e272e9edea3f33b2f64ec9e342413d92e36fElliott Hughes
29600490ae3f351e07ed4cc2a94b11cba6a22f37311Nick Kralevich    # Use hidden visibility on LP64 for any functions beginning with underscores.
29700490ae3f351e07ed4cc2a94b11cba6a22f37311Nick Kralevich    # Force hidden visibility for any functions which begin with 3 underscores
29800490ae3f351e07ed4cc2a94b11cba6a22f37311Nick Kralevich    if (pointer_length == 64 and syscall["func"].startswith("__")) or syscall["func"].startswith("___"):
299d465eb4e76c24b1e782438a4c9e2c9abc20fe66cElliott Hughes        stub += '.hidden ' + syscall["func"] + '\n'
300fff6e272e9edea3f33b2f64ec9e342413d92e36fElliott Hughes
3010437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    return stub
302f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin
303f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin
3040437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughesdef arm_eabi_genstub(syscall):
3050437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    num_regs = count_arm_param_registers(syscall["params"])
3060437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    if num_regs > 4:
3070437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes        return arm_eabi_call_long % syscall
3080437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    return arm_eabi_call_default % syscall
3096fe4e8795452651862c1e02994f434ec5f0d5832H.J. Lu
310f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin
311d1973ca51325393f304e82a4d79874f33e54ac16Colin Crossdef arm64_genstub(syscall):
312d1973ca51325393f304e82a4d79874f33e54ac16Colin Cross    return arm64_call % syscall
313d1973ca51325393f304e82a4d79874f33e54ac16Colin Cross
314d1973ca51325393f304e82a4d79874f33e54ac16Colin Cross
3150437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughesdef mips_genstub(syscall):
3160437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    return mips_call % syscall
317a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
318a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
3195043212b7615bc4c03463c4d242769de69cd4685Chris Dearmandef mips64_genstub(syscall):
3205043212b7615bc4c03463c4d242769de69cd4685Chris Dearman    return mips64_call % syscall
3215043212b7615bc4c03463c4d242769de69cd4685Chris Dearman
3225043212b7615bc4c03463c4d242769de69cd4685Chris Dearman
3230437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughesdef x86_genstub(syscall):
3240437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    result     = syscall_stub_header % syscall
325a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
3260437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    numparams = count_generic_param_registers(syscall["params"])
327be910529322b461148debefd50b9e0d67ae84f8eMingwei Shi    stack_bias = numparams*4 + 8
328e4bc7561219ddb7cfb7b33f731caa92a7766b9caChristopher Ferris    offset = 0
329e4bc7561219ddb7cfb7b33f731caa92a7766b9caChristopher Ferris    mov_result = ""
33015b91e92a0bb4a15b4f2258bea332f4a67fa94d7Christopher Ferris    first_push = True
331e4bc7561219ddb7cfb7b33f731caa92a7766b9caChristopher Ferris    for register in x86_registers[:numparams]:
332e4bc7561219ddb7cfb7b33f731caa92a7766b9caChristopher Ferris        result     += "    pushl   %%%s\n" % register
33315b91e92a0bb4a15b4f2258bea332f4a67fa94d7Christopher Ferris        if first_push:
33415b91e92a0bb4a15b4f2258bea332f4a67fa94d7Christopher Ferris          result   += "    .cfi_def_cfa_offset 8\n"
33515b91e92a0bb4a15b4f2258bea332f4a67fa94d7Christopher Ferris          result   += "    .cfi_rel_offset %s, 0\n" % register
33615b91e92a0bb4a15b4f2258bea332f4a67fa94d7Christopher Ferris          first_push = False
33715b91e92a0bb4a15b4f2258bea332f4a67fa94d7Christopher Ferris        else:
33815b91e92a0bb4a15b4f2258bea332f4a67fa94d7Christopher Ferris          result   += "    .cfi_adjust_cfa_offset 4\n"
33915b91e92a0bb4a15b4f2258bea332f4a67fa94d7Christopher Ferris          result   += "    .cfi_rel_offset %s, 0\n" % register
340e4bc7561219ddb7cfb7b33f731caa92a7766b9caChristopher Ferris        mov_result += "    mov     %d(%%esp), %%%s\n" % (stack_bias+offset, register)
341e4bc7561219ddb7cfb7b33f731caa92a7766b9caChristopher Ferris        offset += 4
342e4bc7561219ddb7cfb7b33f731caa92a7766b9caChristopher Ferris
343be910529322b461148debefd50b9e0d67ae84f8eMingwei Shi    result += x86_call_prepare
34415b91e92a0bb4a15b4f2258bea332f4a67fa94d7Christopher Ferris    result += mov_result
3450437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    result += x86_call % syscall
346a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
347e4bc7561219ddb7cfb7b33f731caa92a7766b9caChristopher Ferris    for register in reversed(x86_registers[:numparams]):
348e4bc7561219ddb7cfb7b33f731caa92a7766b9caChristopher Ferris        result += "    popl    %%%s\n" % register
3494e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project
3500437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    result += x86_return % syscall
3510437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    return result
3524e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project
353feaa89a1bcc643a9c3892bb56e020e00779bbb3aSerban Constantinescu
3540437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughesdef x86_genstub_socketcall(syscall):
3550437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    #   %ebx <--- Argument 1 - The call id of the needed vectored
3560437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    #                          syscall (socket, bind, recv, etc)
3570437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    #   %ecx <--- Argument 2 - Pointer to the rest of the arguments
3580437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    #                          from the original function called (socket())
3590437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes
3600437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    result = syscall_stub_header % syscall
3614e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project
3620437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    # save the regs we need
363e4bc7561219ddb7cfb7b33f731caa92a7766b9caChristopher Ferris    result += "    pushl   %ebx\n"
364e4bc7561219ddb7cfb7b33f731caa92a7766b9caChristopher Ferris    result += "    .cfi_def_cfa_offset 8\n"
365e4bc7561219ddb7cfb7b33f731caa92a7766b9caChristopher Ferris    result += "    .cfi_rel_offset ebx, 0\n"
36615b91e92a0bb4a15b4f2258bea332f4a67fa94d7Christopher Ferris    result += "    pushl   %ecx\n"
36715b91e92a0bb4a15b4f2258bea332f4a67fa94d7Christopher Ferris    result += "    .cfi_adjust_cfa_offset 4\n"
36815b91e92a0bb4a15b4f2258bea332f4a67fa94d7Christopher Ferris    result += "    .cfi_rel_offset ecx, 0\n"
369be910529322b461148debefd50b9e0d67ae84f8eMingwei Shi    stack_bias = 16
370be910529322b461148debefd50b9e0d67ae84f8eMingwei Shi
371be910529322b461148debefd50b9e0d67ae84f8eMingwei Shi    result += x86_call_prepare
3724e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project
3730437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    # set the call id (%ebx)
374e4bc7561219ddb7cfb7b33f731caa92a7766b9caChristopher Ferris    result += "    mov     $%d, %%ebx\n" % syscall["socketcall_id"]
3754e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project
3760437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    # set the pointer to the rest of the args into %ecx
377e4bc7561219ddb7cfb7b33f731caa92a7766b9caChristopher Ferris    result += "    mov     %esp, %ecx\n"
378e4bc7561219ddb7cfb7b33f731caa92a7766b9caChristopher Ferris    result += "    addl    $%d, %%ecx\n" % (stack_bias)
3794e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project
3800437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    # now do the syscall code itself
3810437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    result += x86_call % syscall
3824e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project
3830437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    # now restore the saved regs
384e4bc7561219ddb7cfb7b33f731caa92a7766b9caChristopher Ferris    result += "    popl    %ecx\n"
385e4bc7561219ddb7cfb7b33f731caa92a7766b9caChristopher Ferris    result += "    popl    %ebx\n"
386a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
3870437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    # epilog
3880437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    result += x86_return % syscall
3890437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    return result
390a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
391a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
3920437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughesdef x86_64_genstub(syscall):
3930437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    result = syscall_stub_header % syscall
3940437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    num_regs = count_generic_param_registers64(syscall["params"])
3950437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    if (num_regs > 3):
3960437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes        # rcx is used as 4th argument. Kernel wants it at r10.
3970437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes        result += "    movq    %rcx, %r10\n"
398a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
3990437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    result += x86_64_call % syscall
4000437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    return result
401a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
4020437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes
403dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughesclass SysCallsTxtParser:
404dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes    def __init__(self):
405dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        self.syscalls = []
406dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        self.lineno   = 0
407dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes
408dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes    def E(self, msg):
409dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        print "%d: %s" % (self.lineno, msg)
410dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes
411dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes    def parse_line(self, line):
412dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        """ parse a syscall spec line.
413dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes
414dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        line processing, format is
415dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes           return type    func_name[|alias_list][:syscall_name[:socketcall_id]] ( [paramlist] ) architecture_list
416dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        """
417dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        pos_lparen = line.find('(')
418dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        E          = self.E
419dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        if pos_lparen < 0:
420dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            E("missing left parenthesis in '%s'" % line)
421dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            return
422dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes
423dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        pos_rparen = line.rfind(')')
424dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        if pos_rparen < 0 or pos_rparen <= pos_lparen:
425dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            E("missing or misplaced right parenthesis in '%s'" % line)
426dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            return
427dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes
428dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        return_type = line[:pos_lparen].strip().split()
429dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        if len(return_type) < 2:
430dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            E("missing return type in '%s'" % line)
431dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            return
432dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes
433dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        syscall_func = return_type[-1]
434dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        return_type  = string.join(return_type[:-1],' ')
435dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        socketcall_id = -1
436dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes
437dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        pos_colon = syscall_func.find(':')
438dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        if pos_colon < 0:
439dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            syscall_name = syscall_func
440dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        else:
441dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            if pos_colon == 0 or pos_colon+1 >= len(syscall_func):
442dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes                E("misplaced colon in '%s'" % line)
443dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes                return
444dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes
445dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            # now find if there is a socketcall_id for a dispatch-type syscall
446dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            # after the optional 2nd colon
447dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            pos_colon2 = syscall_func.find(':', pos_colon + 1)
448dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            if pos_colon2 < 0:
449dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes                syscall_name = syscall_func[pos_colon+1:]
450dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes                syscall_func = syscall_func[:pos_colon]
451dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            else:
452dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes                if pos_colon2+1 >= len(syscall_func):
453dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes                    E("misplaced colon2 in '%s'" % line)
454dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes                    return
455dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes                syscall_name = syscall_func[(pos_colon+1):pos_colon2]
456dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes                socketcall_id = int(syscall_func[pos_colon2+1:])
457dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes                syscall_func = syscall_func[:pos_colon]
458dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes
459dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        alias_delim = syscall_func.find('|')
460dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        if alias_delim > 0:
461dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            alias_list = syscall_func[alias_delim+1:].strip()
462dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            syscall_func = syscall_func[:alias_delim]
463dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            alias_delim = syscall_name.find('|')
464dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            if alias_delim > 0:
465dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes                syscall_name = syscall_name[:alias_delim]
466dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            syscall_aliases = string.split(alias_list, ',')
467dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        else:
468dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            syscall_aliases = []
469dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes
470dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        if pos_rparen > pos_lparen+1:
471dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            syscall_params = line[pos_lparen+1:pos_rparen].split(',')
472dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            params         = string.join(syscall_params,',')
473dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        else:
474dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            syscall_params = []
475dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            params         = "void"
476dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes
477dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        t = {
478dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes              "name"    : syscall_name,
479dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes              "func"    : syscall_func,
480dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes              "aliases" : syscall_aliases,
481dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes              "params"  : syscall_params,
482dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes              "decl"    : "%-15s  %s (%s);" % (return_type, syscall_func, params),
483dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes              "socketcall_id" : socketcall_id
484dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        }
485dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes
486dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        # Parse the architecture list.
487dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        arch_list = line[pos_rparen+1:].strip()
488dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        if arch_list == "all":
489dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            for arch in all_arches:
490dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes                t[arch] = True
491dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        else:
492dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            for arch in string.split(arch_list, ','):
493dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes                if arch in all_arches:
494dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes                    t[arch] = True
495dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes                else:
496dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes                    E("invalid syscall architecture '%s' in '%s'" % (arch, line))
497dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes                    return
498dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes
499dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        self.syscalls.append(t)
500dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes
501dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        logging.debug(t)
502dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes
5037ea4090c65a02626b8aacaf44456af021937dd5ePaul Lawrence    def parse_open_file(self, fp):
5047ea4090c65a02626b8aacaf44456af021937dd5ePaul Lawrence        for line in fp:
505dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            self.lineno += 1
506dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            line = line.strip()
507dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            if not line: continue
508dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            if line[0] == '#': continue
509dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            self.parse_line(line)
510dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes
5117ea4090c65a02626b8aacaf44456af021937dd5ePaul Lawrence    def parse_file(self, file_path):
5127ea4090c65a02626b8aacaf44456af021937dd5ePaul Lawrence        logging.debug("parse_file: %s" % file_path)
5137ea4090c65a02626b8aacaf44456af021937dd5ePaul Lawrence        with open(file_path) as fp:
51493d4f8b2fa1924963f397a0d16e3e38ac4ef2352Alessio Balsini            self.parse_open_file(fp)
515dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes
516dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes
5170437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughesclass State:
5180437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    def __init__(self):
5190437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes        self.old_stubs = []
5200437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes        self.new_stubs = []
5210437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes        self.other_files = []
5220437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes        self.syscalls = []
5230437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes
5240437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes
5250437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes    def process_file(self, input):
526a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project        parser = SysCallsTxtParser()
527a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project        parser.parse_file(input)
528a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project        self.syscalls = parser.syscalls
529a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project        parser = None
530a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
5310437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes        for syscall in self.syscalls:
5320437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes            syscall["__NR_name"] = make__NR_name(syscall["name"])
5330437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes
5340437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes            if syscall.has_key("arm"):
535fff6e272e9edea3f33b2f64ec9e342413d92e36fElliott Hughes                syscall["asm-arm"] = add_footer(32, arm_eabi_genstub(syscall), syscall)
536d1973ca51325393f304e82a4d79874f33e54ac16Colin Cross
537d1973ca51325393f304e82a4d79874f33e54ac16Colin Cross            if syscall.has_key("arm64"):
538d1973ca51325393f304e82a4d79874f33e54ac16Colin Cross                syscall["asm-arm64"] = add_footer(64, arm64_genstub(syscall), syscall)
5390437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes
5400437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes            if syscall.has_key("x86"):
5410437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes                if syscall["socketcall_id"] >= 0:
542fff6e272e9edea3f33b2f64ec9e342413d92e36fElliott Hughes                    syscall["asm-x86"] = add_footer(32, x86_genstub_socketcall(syscall), syscall)
5434e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project                else:
544fff6e272e9edea3f33b2f64ec9e342413d92e36fElliott Hughes                    syscall["asm-x86"] = add_footer(32, x86_genstub(syscall), syscall)
5450437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes            elif syscall["socketcall_id"] >= 0:
546d612165c6705379aa50144afc35aa40c16793728Elliott Hughes                E("socketcall_id for dispatch syscalls is only supported for x86 in '%s'" % t)
5474e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project                return
548cd6780b1677503a0dfa91c8a9c0c635dbbd48366Elliott Hughes
5490437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes            if syscall.has_key("mips"):
550fff6e272e9edea3f33b2f64ec9e342413d92e36fElliott Hughes                syscall["asm-mips"] = add_footer(32, mips_genstub(syscall), syscall)
5510437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes
5525043212b7615bc4c03463c4d242769de69cd4685Chris Dearman            if syscall.has_key("mips64"):
5535043212b7615bc4c03463c4d242769de69cd4685Chris Dearman                syscall["asm-mips64"] = add_footer(64, mips64_genstub(syscall), syscall)
5545043212b7615bc4c03463c4d242769de69cd4685Chris Dearman
5550437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes            if syscall.has_key("x86_64"):
556fff6e272e9edea3f33b2f64ec9e342413d92e36fElliott Hughes                syscall["asm-x86_64"] = add_footer(64, x86_64_genstub(syscall), syscall)
5574e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project
5588ecf2258274b6ef2630a503a314573d80517465aElliott Hughes
559d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes    # Scan Linux kernel asm/unistd.h files containing __NR_* constants
560d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes    # and write out equivalent SYS_* constants for glibc source compatibility.
5611b91c6c11f6b4b8c082da41339b861981570bb4aElliott Hughes    def gen_glibc_syscalls_h(self):
5628aabbd7f63286e87fe95b672fad814b4625efa85Elliott Hughes        glibc_syscalls_h_path = "include/bits/glibc-syscalls.h"
563dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        logging.info("generating " + glibc_syscalls_h_path)
5649724ce3a09f8c0869a45c4ebdef665a1ee049734Elliott Hughes        glibc_fp = create_file(glibc_syscalls_h_path)
565103ccde8fe2f2c8abde914a8ba736b2e9cb8d20bElliott Hughes        glibc_fp.write("/* %s */\n" % warning)
566d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes        glibc_fp.write("#ifndef _BIONIC_BITS_GLIBC_SYSCALLS_H_\n")
567d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes        glibc_fp.write("#define _BIONIC_BITS_GLIBC_SYSCALLS_H_\n")
568d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes
569d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes        # Collect the set of all syscalls for all architectures.
570d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes        syscalls = set()
571daebd05739d6c29e7126a20aeeab73de530d293edimitry        pattern = re.compile(r'^\s*#\s*define\s*__NR_([a-z_]\S+)')
572d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes        for unistd_h in ["kernel/uapi/asm-generic/unistd.h",
573d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes                         "kernel/uapi/asm-arm/asm/unistd.h",
57448af7cb2e205dcc2f09a1a1b8a1a37c93e1943f0Christopher Ferris                         "kernel/uapi/asm-arm/asm/unistd-common.h",
57548af7cb2e205dcc2f09a1a1b8a1a37c93e1943f0Christopher Ferris                         "kernel/uapi/asm-arm/asm/unistd-eabi.h",
57648af7cb2e205dcc2f09a1a1b8a1a37c93e1943f0Christopher Ferris                         "kernel/uapi/asm-arm/asm/unistd-oabi.h",
577d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes                         "kernel/uapi/asm-mips/asm/unistd.h",
578d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes                         "kernel/uapi/asm-x86/asm/unistd_32.h",
579d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes                         "kernel/uapi/asm-x86/asm/unistd_64.h"]:
580d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes          for line in open(os.path.join(bionic_libc_root, unistd_h)):
581d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes            m = re.search(pattern, line)
582d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes            if m:
583d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes              nr_name = m.group(1)
584d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes              if 'reserved' not in nr_name and 'unused' not in nr_name:
585d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes                syscalls.add(nr_name)
586d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes
587d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes        # Write out a single file listing them all. Note that the input
588d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes        # files include #if trickery, so even for a single architecture
589d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes        # we don't know exactly which ones are available.
590d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes        # https://code.google.com/p/android/issues/detail?id=215853
591d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes        for syscall in sorted(syscalls):
592d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes          nr_name = make__NR_name(syscall)
593d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes          glibc_fp.write("#if defined(%s)\n" % nr_name)
594d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes          glibc_fp.write("  #define SYS_%s %s\n" % (syscall, nr_name))
595d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes          glibc_fp.write("#endif\n")
596d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes
597d2f725eaedc9c98c353885f20c0ff7ef13e3477fElliott Hughes        glibc_fp.write("#endif /* _BIONIC_BITS_GLIBC_SYSCALLS_H_ */\n")
5985c2772f59d3b6f564897187324d8606f54423207Elliott Hughes        glibc_fp.close()
5995c2772f59d3b6f564897187324d8606f54423207Elliott Hughes        self.other_files.append(glibc_syscalls_h_path)
6005c2772f59d3b6f564897187324d8606f54423207Elliott Hughes
601a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
602d612165c6705379aa50144afc35aa40c16793728Elliott Hughes    # Write each syscall stub.
603a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project    def gen_syscall_stubs(self):
6040437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes        for syscall in self.syscalls:
605d612165c6705379aa50144afc35aa40c16793728Elliott Hughes            for arch in all_arches:
6060437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes                if syscall.has_key("asm-%s" % arch):
6070437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes                    filename = "arch-%s/syscalls/%s.S" % (arch, syscall["func"])
608dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes                    logging.info(">>> generating " + filename)
609d612165c6705379aa50144afc35aa40c16793728Elliott Hughes                    fp = create_file(filename)
6100437f3ff296a4c66675c7386b0522e6062413e5aElliott Hughes                    fp.write(syscall["asm-%s" % arch])
611d612165c6705379aa50144afc35aa40c16793728Elliott Hughes                    fp.close()
612d612165c6705379aa50144afc35aa40c16793728Elliott Hughes                    self.new_stubs.append(filename)
613d612165c6705379aa50144afc35aa40c16793728Elliott Hughes
614d612165c6705379aa50144afc35aa40c16793728Elliott Hughes
615d612165c6705379aa50144afc35aa40c16793728Elliott Hughes    def regenerate(self):
616dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        logging.info("scanning for existing architecture-specific stub files...")
617a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
618d612165c6705379aa50144afc35aa40c16793728Elliott Hughes        for arch in all_arches:
61901bd32e0e46ab8d9b6aeda77a550ec08074728a6Christopher Ferris            arch_dir = "arch-" + arch
620dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            logging.info("scanning " + os.path.join(bionic_libc_root, arch_dir))
62101bd32e0e46ab8d9b6aeda77a550ec08074728a6Christopher Ferris            rel_path = os.path.join(arch_dir, "syscalls")
62201bd32e0e46ab8d9b6aeda77a550ec08074728a6Christopher Ferris            for file in os.listdir(os.path.join(bionic_libc_root, rel_path)):
62301bd32e0e46ab8d9b6aeda77a550ec08074728a6Christopher Ferris                if file.endswith(".S"):
62401bd32e0e46ab8d9b6aeda77a550ec08074728a6Christopher Ferris                  self.old_stubs.append(os.path.join(rel_path, file))
625a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
626dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        logging.info("found %d stub files" % len(self.old_stubs))
627a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
628f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin        if not os.path.exists(bionic_temp):
629dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            logging.info("creating %s..." % bionic_temp)
630f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin            make_dir(bionic_temp)
631a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
632dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        logging.info("re-generating stubs and support files...")
633a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
6341b91c6c11f6b4b8c082da41339b861981570bb4aElliott Hughes        self.gen_glibc_syscalls_h()
635a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project        self.gen_syscall_stubs()
636a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
637dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes        logging.info("comparing files...")
638a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project        adds    = []
639a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project        edits   = []
640a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
641a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project        for stub in self.new_stubs + self.other_files:
64201bd32e0e46ab8d9b6aeda77a550ec08074728a6Christopher Ferris            tmp_file = os.path.join(bionic_temp, stub)
64301bd32e0e46ab8d9b6aeda77a550ec08074728a6Christopher Ferris            libc_file = os.path.join(bionic_libc_root, stub)
64401bd32e0e46ab8d9b6aeda77a550ec08074728a6Christopher Ferris            if not os.path.exists(libc_file):
645fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner                # new file, git add it
646dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes                logging.info("new file:     " + stub)
64701bd32e0e46ab8d9b6aeda77a550ec08074728a6Christopher Ferris                adds.append(libc_file)
64801bd32e0e46ab8d9b6aeda77a550ec08074728a6Christopher Ferris                shutil.copyfile(tmp_file, libc_file)
649a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
65001bd32e0e46ab8d9b6aeda77a550ec08074728a6Christopher Ferris            elif not filecmp.cmp(tmp_file, libc_file):
651dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes                logging.info("changed file: " + stub)
652f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin                edits.append(stub)
653a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
654a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project        deletes = []
655a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project        for stub in self.old_stubs:
656a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project            if not stub in self.new_stubs:
657dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes                logging.info("deleted file: " + stub)
65801bd32e0e46ab8d9b6aeda77a550ec08074728a6Christopher Ferris                deletes.append(os.path.join(bionic_libc_root, stub))
659f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin
660f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin        if not DRY_RUN:
661f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin            if adds:
662f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin                commands.getoutput("git add " + " ".join(adds))
663f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin            if deletes:
664f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin                commands.getoutput("git rm " + " ".join(deletes))
665f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin            if edits:
666f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin                for file in edits:
66701bd32e0e46ab8d9b6aeda77a550ec08074728a6Christopher Ferris                    shutil.copyfile(os.path.join(bionic_temp, file),
66801bd32e0e46ab8d9b6aeda77a550ec08074728a6Christopher Ferris                                    os.path.join(bionic_libc_root, file))
66901bd32e0e46ab8d9b6aeda77a550ec08074728a6Christopher Ferris                commands.getoutput("git add " + " ".join((os.path.join(bionic_libc_root, file)) for file in edits))
670f12a18b85061e7121c7534faf3625137e56b770dPavel Chupin
67101bd32e0e46ab8d9b6aeda77a550ec08074728a6Christopher Ferris            commands.getoutput("git add %s" % (os.path.join(bionic_libc_root, "SYSCALLS.TXT")))
672fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner
673fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner        if (not adds) and (not deletes) and (not edits):
674dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            logging.info("no changes detected!")
675fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner        else:
676dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hughes            logging.info("ready to go!!")
677a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
678dc1fb7000adb77c647f70428fd6ce224e3938220Elliott Hugheslogging.basicConfig(level=logging.INFO)
679a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
680eabc35265141485e7a531ef67a076ef799500f4ePaul Lawrenceif __name__ == "__main__":
681eabc35265141485e7a531ef67a076ef799500f4ePaul Lawrence    state = State()
682eabc35265141485e7a531ef67a076ef799500f4ePaul Lawrence    state.process_file(os.path.join(bionic_libc_root, "SYSCALLS.TXT"))
683eabc35265141485e7a531ef67a076ef799500f4ePaul Lawrence    state.regenerate()
684