|
|
|
|
|
import os |
|
import sys |
|
import argparse |
|
import shutil |
|
|
|
|
|
parser = argparse.ArgumentParser(description='Android system files extractor') |
|
parser.add_argument("-p", "--prefix", metavar="NAME", required=True, |
|
help="Prefix for stored files, e.g. galaxy-s7-us") |
|
|
|
|
|
SYSTEM_FILES = [ |
|
"/proc/cpuinfo", |
|
"/sys/devices/system/cpu/kernel_max", |
|
"/sys/devices/system/cpu/possible", |
|
"/sys/devices/system/cpu/present", |
|
] |
|
|
|
CPU_FILES = [ |
|
"cpufreq/cpuinfo_max_freq", |
|
"cpufreq/cpuinfo_min_freq", |
|
"topology/physical_package_id", |
|
"topology/core_siblings_list", |
|
"topology/core_id", |
|
"topology/thread_siblings_list", |
|
] |
|
|
|
CACHE_FILES = [ |
|
"allocation_policy", |
|
"coherency_line_size", |
|
"level", |
|
"number_of_sets", |
|
"shared_cpu_list", |
|
"size", |
|
"type", |
|
"ways_of_associativity", |
|
"write_policy", |
|
] |
|
|
|
def c_escape(string): |
|
c_string = "" |
|
for c in string: |
|
if c == "\\": |
|
c_string += "\\\\" |
|
elif c == "\"": |
|
c_string += "\\\"" |
|
elif c == "\t": |
|
c_string += "\\t" |
|
elif c == "\n": |
|
c_string += "\\n" |
|
elif c == "\r": |
|
c_string += "\\r" |
|
elif ord(c) == 0: |
|
c_string += "\\0" |
|
elif 32 <= ord(c) < 127: |
|
c_string += c |
|
else: |
|
c_string += "x%02X" % ord(c) |
|
return c_string |
|
|
|
|
|
def dump_system_file(stream, path): |
|
try: |
|
with open(path, "rb") as device_file: |
|
content = device_file.read() |
|
stream.write("\t{\n") |
|
stream.write("\t\t.path = \"%s\",\n" % path) |
|
stream.write("\t\t.size = %d,\n" % len(content)) |
|
if len(content.splitlines()) > 1: |
|
stream.write("\t\t.content =") |
|
for line in content.splitlines(True): |
|
stream.write("\n\t\t\t\"%s\"" % c_escape(line)) |
|
stream.write(",\n") |
|
else: |
|
stream.write("\t\t.content = \"%s\",\n" % c_escape(content)) |
|
stream.write("\t},\n") |
|
return True |
|
except IOError: |
|
pass |
|
|
|
|
|
def main(args): |
|
options = parser.parse_args(args) |
|
|
|
|
|
|
|
with open(os.path.join("test", options.prefix + ".h"), "w") as file_header: |
|
file_header.write("struct cpuinfo_mock_file filesystem[] = {\n") |
|
for path in SYSTEM_FILES: |
|
dump_system_file(file_header, path) |
|
for cpu in range(16): |
|
for filename in CPU_FILES: |
|
path = "/sys/devices/system/cpu/cpu%d/%s" % (cpu, filename) |
|
dump_system_file(file_header, path) |
|
for index in range(10): |
|
for filename in CACHE_FILES: |
|
path = "/sys/devices/system/cpu/cpu%d/cache/index%d/%s" % (cpu, index, filename) |
|
dump_system_file(file_header, path) |
|
file_header.write("\t{ NULL },\n") |
|
file_header.write("};\n") |
|
shutil.copy("/proc/cpuinfo", |
|
os.path.join("test", "cpuinfo", options.prefix + ".log")) |
|
|
|
if __name__ == "__main__": |
|
main(sys.argv[1:]) |
|
|