1a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project# common python utility routines for the Bionic tool scripts 2a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 3a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Projectimport sys, os, commands, string 4a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 5a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project# support Bionic architectures, add new ones as appropriate 6a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project# 71fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandhambionic_archs = [ "arm", "x86", "mips" ] 8a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 9a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project# basic debugging trace support 10a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project# call D_setlevel to set the verbosity level 11a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project# and D(), D2(), D3(), D4() to add traces 12a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project# 131fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandhamverbose = 0 14a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 15a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Projectdef D(msg): 16a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project global verbose 17a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if verbose > 0: 18a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project print msg 19a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 20a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Projectdef D2(msg): 21a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project global verbose 22a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if verbose >= 2: 23a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project print msg 24a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 25a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Projectdef D3(msg): 26a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project global verbose 27a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if verbose >= 3: 28a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project print msg 29a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 30a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Projectdef D4(msg): 31a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project global verbose 32a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if verbose >= 4: 33a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project print msg 34a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 35a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Projectdef D_setlevel(level): 36a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project global verbose 37a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project verbose = level 38a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 39a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 40a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Projectdef find_dir_of(path): 41a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project '''return the directory name of 'path', or "." if there is none''' 42a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project # remove trailing slash 43a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if len(path) > 1 and path[-1] == '/': 44a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project path = path[:-1] 45a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 46a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project # find parent directory name 47a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project d = os.path.dirname(path) 48a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if d == "": 49a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project return "." 50a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project else: 51a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project return d 52a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 53a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project# other stuff 54a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project# 55a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project# 56a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Projectdef find_file_from_upwards(from_path,target_file): 57a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project """find a file in the current directory or its parents. if 'from_path' is None, 58a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project seach from the current program's directory""" 59a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project path = from_path 60a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if path == None: 61a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project path = find_dir_of(sys.argv[0]) 62a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project D("this script seems to be located in: %s" % path) 63a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 64a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project while 1: 65a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if path == "": 66a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project path = "." 67a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 68a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project file = path + "/" + target_file 69a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project D("probing "+file) 70a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 71a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if os.path.isfile(file): 72a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project D("found %s in %s" % (target_file, path)) 73a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project return file 74a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 75a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if path == ".": 76a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project break 77a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 78a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project path = os.path.dirname(path) 79a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 80a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project path = "" 81a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project while 1: 82a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project path = "../" + path 83a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project file = path + target_file 84a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project D("probing "+file) 85a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 86a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if os.path.isfile(file): 87a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project D("found %s in %s" % (target_file, path)) 88a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project return file 89a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 90a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 91a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project return None 92a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 93a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Projectdef find_bionic_root(): 94a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project '''find the root of the Bionic source tree. we check for the SYSCALLS.TXT file 95a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project from the location of the current program's directory.''' 96a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 97a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project # note that we can't use find_file_from_upwards() since we can't use os.path.abspath 98a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project # that's because in some cases the p4 client is in a symlinked directory, and this 99a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project # function will return the real path instead, which later creates problems when 100a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project # p4 commands are issued 101a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project # 102a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project file = find_file_from_upwards(None, "SYSCALLS.TXT") 103a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if file: 104a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project return os.path.dirname(file) 105a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project else: 106a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project return None 107a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 108fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turnerdef find_original_kernel_headers(): 109fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner """try to find the directory containing the original kernel headers""" 110fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner bionic_root = find_bionic_root() 111fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner if not bionic_root: 112fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner D("Could not find Bionic root !!") 113fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner return None 114fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner 115fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner path = os.path.normpath(bionic_root + "/../../external/kernel-headers/original") 116fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner if not os.path.isdir(path): 117fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner D("Could not find %s" % (path)) 118fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner return None 119fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner 120fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner return path 121fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner 122a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Projectdef find_kernel_headers(): 123a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project """try to find the directory containing the kernel headers for this machine""" 124fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner 125fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner # First try to find the original kernel headers. 126fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner ret = find_original_kernel_headers() 127fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner if ret: 128fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner D("found original kernel headers in: %s" % (ret)) 129fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner return ret 130fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner 131a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project status, version = commands.getstatusoutput( "uname -r" ) # get Linux kernel version 132a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if status != 0: 133a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project D("could not execute 'uname -r' command properly") 134a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project return None 135a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 136a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project # get rid of the "-xenU" suffix that is found in Xen virtual machines 137a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if len(version) > 5 and version[-5:] == "-xenU": 138a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project version = version[:-5] 139a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 140fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner path = "/usr/src/linux-headers-" + version + "/include" 141fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner D("probing %s for kernel headers" % (path)) 142a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project ret = os.path.isdir( path ) 143a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if ret: 144fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner D("found kernel headers in: %s" % (path)) 145a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project return path 146a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project return None 147a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 148fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turnerdef find_arch_header(kernel_headers,arch,header): 149fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner # First, try in <root>/arch/<arm>/include/<header> 150fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner # corresponding to the location in the kernel source tree for 151fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner # certain architectures (e.g. arm). 152fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner path = "%s/arch/%s/include/asm/%s" % (kernel_headers, arch, header) 153fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner D("Probing for %s" % path) 154fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner if os.path.exists(path): 155fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner return path 156fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner 157fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner # Try <root>/asm-<arch>/include/<header> corresponding to the location 158fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner # in the kernel source tree for other architectures (e.g. x86). 159fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner path = "%s/include/asm-%s/%s" % (kernel_headers, arch, header) 160fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner D("Probing for %s" % path) 161fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner if os.path.exists(path): 162fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner return path 163fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner 164fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner # Otherwise, look under <root>/asm-<arch>/<header> corresponding 165fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner # the original kernel headers directory 166fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner path = "%s/asm-%s/%s" % (kernel_headers, arch, header) 167fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner D("Probing for %s" % path) 168fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner if os.path.exists(path): 169fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner return path 170fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner 171fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner 172fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner return None 173a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 174a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project# parser for the SYSCALLS.TXT file 175a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project# 176a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Projectclass SysCallsTxtParser: 177a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project def __init__(self): 178a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project self.syscalls = [] 179a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project self.lineno = 0 180a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 1811fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham def E(self, msg): 182a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project print "%d: %s" % (self.lineno, msg) 183a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 184a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project def parse_line(self, line): 1854e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project """ parse a syscall spec line. 1864e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project 1874e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project line processing, format is 1884e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project return type func_name[:syscall_name[:call_id]] ( [paramlist] ) (syscall_number[,syscall_number_x86])|stub 1894e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project """ 190a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project pos_lparen = line.find('(') 191a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project E = self.E 192a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if pos_lparen < 0: 193a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project E("missing left parenthesis in '%s'" % line) 194a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project return 195a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 196a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project pos_rparen = line.rfind(')') 197a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if pos_rparen < 0 or pos_rparen <= pos_lparen: 198a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project E("missing or misplaced right parenthesis in '%s'" % line) 199a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project return 200a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 201a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project return_type = line[:pos_lparen].strip().split() 202a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if len(return_type) < 2: 203a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project E("missing return type in '%s'" % line) 204a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project return 205a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 206a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project syscall_func = return_type[-1] 207a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project return_type = string.join(return_type[:-1],' ') 2084e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project call_id = -1 209a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 210a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project pos_colon = syscall_func.find(':') 211a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if pos_colon < 0: 212a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project syscall_name = syscall_func 213a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project else: 214a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if pos_colon == 0 or pos_colon+1 >= len(syscall_func): 215a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project E("misplaced colon in '%s'" % line) 216a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project return 2174e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project 2184e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project # now find if there is a call_id for a dispatch-type syscall 2194e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project # after the optional 2nd colon 2204e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project pos_colon2 = syscall_func.find(':', pos_colon + 1) 2214e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project if pos_colon2 < 0: 2224e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project syscall_name = syscall_func[pos_colon+1:] 2234e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project syscall_func = syscall_func[:pos_colon] 2244e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project else: 2254e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project if pos_colon2+1 >= len(syscall_func): 2264e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project E("misplaced colon2 in '%s'" % line) 2274e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project return 2284e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project syscall_name = syscall_func[(pos_colon+1):pos_colon2] 2294e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project call_id = int(syscall_func[pos_colon2+1:]) 2304e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project syscall_func = syscall_func[:pos_colon] 231a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 232a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if pos_rparen > pos_lparen+1: 233a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project syscall_params = line[pos_lparen+1:pos_rparen].split(',') 234a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project params = string.join(syscall_params,',') 235a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project else: 236a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project syscall_params = [] 237a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project params = "void" 238a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 239a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project number = line[pos_rparen+1:].strip() 240a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if number == "stub": 2411fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham syscall_common = -1 2421fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham syscall_arm = -1 2431fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham syscall_x86 = -1 2441fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham syscall_mips = -1 245a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project else: 246a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project try: 247a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if number[0] == '#': 248a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project number = number[1:].strip() 249a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project numbers = string.split(number,',') 2501fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham if len(numbers) == 1: 2511fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham syscall_common = int(numbers[0]) 2521fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham syscall_arm = -1 2531fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham syscall_x86 = -1 2541fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham syscall_mips = -1 2551fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham else: 2561fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham if len(numbers) == 3: 2571fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham syscall_common = -1 2581fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham syscall_arm = int(numbers[0]) 2591fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham syscall_x86 = int(numbers[1]) 2601fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham syscall_mips = int(numbers[2]) 2611fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham else: 2621fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham E("invalid syscall number format in '%s'" % line) 2631fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham return 264a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project except: 265a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project E("invalid syscall number in '%s'" % line) 266a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project return 267a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 2681fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham global verbose 269fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner if verbose >= 2: 2701fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham if call_id == -1: 2711fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham if syscall_common == -1: 2721fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham print "%s: %d,%d,%d" % (syscall_name, syscall_arm, syscall_x86, syscall_mips) 2731fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham else: 2741fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham print "%s: %d" % (syscall_name, syscall_common) 275fc2693110ee8a2ba22a445ad9855fbe9e118d439David 'Digit' Turner else: 2761fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham if syscall_common == -1: 2771fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham print "%s(%d): %d,%d,%d" % (syscall_name, call_id, syscall_arm, syscall_x86, syscall_mips) 2781fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham else: 2791fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham print "%s(%d): %d" % (syscall_name, call_id, syscall_common) 2801fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham 2811fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham t = { "armid" : syscall_arm, 2821fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham "x86id" : syscall_x86, 2831fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham "mipsid" : syscall_mips, 2841fa0d849576555577ffd9675677a3c95f21b754eRaghu Gandham "common" : syscall_common, 2854e468ed2eb86a2406e14f1eca82072ee501d05fdThe Android Open Source Project "cid" : call_id, 286a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project "name" : syscall_name, 287a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project "func" : syscall_func, 288a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project "params" : syscall_params, 289a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project "decl" : "%-15s %s (%s);" % (return_type, syscall_func, params) } 290a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project self.syscalls.append(t) 291a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 292a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project def parse_file(self, file_path): 293a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project D2("parse_file: %s" % file_path) 294a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project fp = open(file_path) 295a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project for line in fp.xreadlines(): 296a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project self.lineno += 1 297a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project line = line.strip() 298a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if not line: continue 299a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if line[0] == '#': continue 300a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project self.parse_line(line) 301a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 302a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project fp.close() 303a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 304a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 305a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Projectclass Output: 306a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project def __init__(self,out=sys.stdout): 307a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project self.out = out 308a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 309a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project def write(self,msg): 310a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project self.out.write(msg) 311a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 312a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project def writeln(self,msg): 313a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project self.out.write(msg) 314a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project self.out.write("\n") 315a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 316a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Projectclass StringOutput: 317a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project def __init__(self): 318a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project self.line = "" 319a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 320a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project def write(self,msg): 321a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project self.line += msg 322a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project D2("write '%s'" % msg) 323a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 324a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project def writeln(self,msg): 325a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project self.line += msg + '\n' 326a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project D2("write '%s\\n'"% msg) 327a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 328a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project def get(self): 329a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project return self.line 330a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 331a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 332a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Projectdef create_file_path(path): 333a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project dirs = [] 334a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project while 1: 335a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project parent = os.path.dirname(path) 336a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if parent == "/": 337a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project break 338a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project dirs.append(parent) 339a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project path = parent 340a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 341a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project dirs.reverse() 342a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project for dir in dirs: 343a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project #print "dir %s" % dir 344a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if os.path.isdir(dir): 345a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project continue 346a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project os.mkdir(dir) 347a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 348a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Projectdef walk_source_files(paths,callback,args,excludes=[]): 349a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project """recursively walk a list of paths and files, only keeping the source files in directories""" 350a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project for path in paths: 351a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if not os.path.isdir(path): 352a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project callback(path,args) 353a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project else: 354a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project for root, dirs, files in os.walk(path): 355a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project #print "w-- %s (ex: %s)" % (repr((root,dirs)), repr(excludes)) 356a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if len(excludes): 357a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project for d in dirs[:]: 358a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if d in excludes: 359a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project dirs.remove(d) 360a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project for f in files: 361a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project r, ext = os.path.splitext(f) 362a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if ext in [ ".h", ".c", ".cpp", ".S" ]: 363a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project callback( "%s/%s" % (root,f), args ) 364a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project 365a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Projectdef cleanup_dir(path): 366a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project """create a directory if needed, and ensure that it is totally empty 367a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project by removing any existing content in it""" 368a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if not os.path.exists(path): 369a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project os.mkdir(path) 370a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project else: 371a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project for root, dirs, files in os.walk(path, topdown=False): 372a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project if root.endswith("kernel_headers/"): 373a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project # skip 'kernel_headers' 374a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project continue 375a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project for name in files: 376a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project os.remove(os.path.join(root, name)) 377a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project for name in dirs: 378a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project os.rmdir(os.path.join(root, name)) 379