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