1*2b54f0dbSXin Li#!/usr/bin/env python 2*2b54f0dbSXin Li 3*2b54f0dbSXin Liimport os 4*2b54f0dbSXin Liimport sys 5*2b54f0dbSXin Liimport argparse 6*2b54f0dbSXin Liimport shutil 7*2b54f0dbSXin Li 8*2b54f0dbSXin Li 9*2b54f0dbSXin Liparser = argparse.ArgumentParser(description='Android system files extractor') 10*2b54f0dbSXin Liparser.add_argument("-p", "--prefix", metavar="NAME", required=True, 11*2b54f0dbSXin Li help="Prefix for stored files, e.g. galaxy-s7-us") 12*2b54f0dbSXin Li 13*2b54f0dbSXin Li 14*2b54f0dbSXin LiSYSTEM_FILES = [ 15*2b54f0dbSXin Li "/proc/cpuinfo", 16*2b54f0dbSXin Li "/sys/devices/system/cpu/kernel_max", 17*2b54f0dbSXin Li "/sys/devices/system/cpu/possible", 18*2b54f0dbSXin Li "/sys/devices/system/cpu/present", 19*2b54f0dbSXin Li] 20*2b54f0dbSXin Li 21*2b54f0dbSXin LiCPU_FILES = [ 22*2b54f0dbSXin Li "cpufreq/cpuinfo_max_freq", 23*2b54f0dbSXin Li "cpufreq/cpuinfo_min_freq", 24*2b54f0dbSXin Li "topology/physical_package_id", 25*2b54f0dbSXin Li "topology/core_siblings_list", 26*2b54f0dbSXin Li "topology/core_id", 27*2b54f0dbSXin Li "topology/thread_siblings_list", 28*2b54f0dbSXin Li] 29*2b54f0dbSXin Li 30*2b54f0dbSXin LiCACHE_FILES = [ 31*2b54f0dbSXin Li "allocation_policy", 32*2b54f0dbSXin Li "coherency_line_size", 33*2b54f0dbSXin Li "level", 34*2b54f0dbSXin Li "number_of_sets", 35*2b54f0dbSXin Li "shared_cpu_list", 36*2b54f0dbSXin Li "size", 37*2b54f0dbSXin Li "type", 38*2b54f0dbSXin Li "ways_of_associativity", 39*2b54f0dbSXin Li "write_policy", 40*2b54f0dbSXin Li] 41*2b54f0dbSXin Li 42*2b54f0dbSXin Lidef c_escape(string): 43*2b54f0dbSXin Li c_string = "" 44*2b54f0dbSXin Li for c in string: 45*2b54f0dbSXin Li if c == "\\": 46*2b54f0dbSXin Li c_string += "\\\\" 47*2b54f0dbSXin Li elif c == "\"": 48*2b54f0dbSXin Li c_string += "\\\"" 49*2b54f0dbSXin Li elif c == "\t": 50*2b54f0dbSXin Li c_string += "\\t" 51*2b54f0dbSXin Li elif c == "\n": 52*2b54f0dbSXin Li c_string += "\\n" 53*2b54f0dbSXin Li elif c == "\r": 54*2b54f0dbSXin Li c_string += "\\r" 55*2b54f0dbSXin Li elif ord(c) == 0: 56*2b54f0dbSXin Li c_string += "\\0" 57*2b54f0dbSXin Li elif 32 <= ord(c) < 127: 58*2b54f0dbSXin Li c_string += c 59*2b54f0dbSXin Li else: 60*2b54f0dbSXin Li c_string += "x%02X" % ord(c) 61*2b54f0dbSXin Li return c_string 62*2b54f0dbSXin Li 63*2b54f0dbSXin Li 64*2b54f0dbSXin Lidef dump_system_file(stream, path): 65*2b54f0dbSXin Li try: 66*2b54f0dbSXin Li with open(path, "rb") as device_file: 67*2b54f0dbSXin Li content = device_file.read() 68*2b54f0dbSXin Li stream.write("\t{\n") 69*2b54f0dbSXin Li stream.write("\t\t.path = \"%s\",\n" % path) 70*2b54f0dbSXin Li stream.write("\t\t.size = %d,\n" % len(content)) 71*2b54f0dbSXin Li if len(content.splitlines()) > 1: 72*2b54f0dbSXin Li stream.write("\t\t.content =") 73*2b54f0dbSXin Li for line in content.splitlines(True): 74*2b54f0dbSXin Li stream.write("\n\t\t\t\"%s\"" % c_escape(line)) 75*2b54f0dbSXin Li stream.write(",\n") 76*2b54f0dbSXin Li else: 77*2b54f0dbSXin Li stream.write("\t\t.content = \"%s\",\n" % c_escape(content)) 78*2b54f0dbSXin Li stream.write("\t},\n") 79*2b54f0dbSXin Li return True 80*2b54f0dbSXin Li except IOError: 81*2b54f0dbSXin Li pass 82*2b54f0dbSXin Li 83*2b54f0dbSXin Li 84*2b54f0dbSXin Lidef main(args): 85*2b54f0dbSXin Li options = parser.parse_args(args) 86*2b54f0dbSXin Li 87*2b54f0dbSXin Li # with open(os.path.join("test", "dmesg", options.prefix + ".log"), "w") as dmesg_log: 88*2b54f0dbSXin Li # dmesg_log.write(device.Shell("dmesg")) 89*2b54f0dbSXin Li with open(os.path.join("test", options.prefix + ".h"), "w") as file_header: 90*2b54f0dbSXin Li file_header.write("struct cpuinfo_mock_file filesystem[] = {\n") 91*2b54f0dbSXin Li for path in SYSTEM_FILES: 92*2b54f0dbSXin Li dump_system_file(file_header, path) 93*2b54f0dbSXin Li for cpu in range(16): 94*2b54f0dbSXin Li for filename in CPU_FILES: 95*2b54f0dbSXin Li path = "/sys/devices/system/cpu/cpu%d/%s" % (cpu, filename) 96*2b54f0dbSXin Li dump_system_file(file_header, path) 97*2b54f0dbSXin Li for index in range(10): 98*2b54f0dbSXin Li for filename in CACHE_FILES: 99*2b54f0dbSXin Li path = "/sys/devices/system/cpu/cpu%d/cache/index%d/%s" % (cpu, index, filename) 100*2b54f0dbSXin Li dump_system_file(file_header, path) 101*2b54f0dbSXin Li file_header.write("\t{ NULL },\n") 102*2b54f0dbSXin Li file_header.write("};\n") 103*2b54f0dbSXin Li shutil.copy("/proc/cpuinfo", 104*2b54f0dbSXin Li os.path.join("test", "cpuinfo", options.prefix + ".log")) 105*2b54f0dbSXin Li 106*2b54f0dbSXin Liif __name__ == "__main__": 107*2b54f0dbSXin Li main(sys.argv[1:]) 108