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