xref: /aosp_15_r20/external/cpuinfo/scripts/arm-linux-filesystem-dump.py (revision 2b54f0db79fd8303838913b20ff3780cddaa909f)
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