xref: /aosp_15_r20/external/cpuinfo/scripts/parse-x86-cpuid-dump.py (revision 2b54f0db79fd8303838913b20ff3780cddaa909f)
1*2b54f0dbSXin Li#!/usr/bin/env python
2*2b54f0dbSXin Li
3*2b54f0dbSXin Lifrom __future__ import print_function
4*2b54f0dbSXin Li
5*2b54f0dbSXin Liimport argparse
6*2b54f0dbSXin Liimport sys
7*2b54f0dbSXin Liimport re
8*2b54f0dbSXin Li
9*2b54f0dbSXin Li
10*2b54f0dbSXin Liparser = argparse.ArgumentParser(description='x86 CPUID dump parser')
11*2b54f0dbSXin Liparser.add_argument("input", metavar="INPUT", nargs=1,
12*2b54f0dbSXin Li                    help="Path to CPUID dump log")
13*2b54f0dbSXin Li
14*2b54f0dbSXin Li
15*2b54f0dbSXin Lidef main(args):
16*2b54f0dbSXin Li    options = parser.parse_args(args)
17*2b54f0dbSXin Li
18*2b54f0dbSXin Li    cpuid_dump = list()
19*2b54f0dbSXin Li    for line in open(options.input[0]).read().splitlines():
20*2b54f0dbSXin Li        match = re.match(r"CPUID ([\dA-F]{8}): ([\dA-F]{8})-([\dA-F]{8})-([\dA-F]{8})-([\dA-F]{8})", line)
21*2b54f0dbSXin Li        if match is not None:
22*2b54f0dbSXin Li            input_eax, eax, ebx, ecx, edx = tuple(int(match.group(i), 16) for i in [1, 2, 3, 4, 5])
23*2b54f0dbSXin Li            line = line[match.end(0):].strip()
24*2b54f0dbSXin Li            input_ecx = None
25*2b54f0dbSXin Li            match = re.match(r"\[SL (\d{2})\]", line)
26*2b54f0dbSXin Li            if match is not None:
27*2b54f0dbSXin Li                input_ecx = int(match.group(1), 16)
28*2b54f0dbSXin Li            cpuid_dump.append((input_eax, input_ecx, eax, ebx, ecx, edx))
29*2b54f0dbSXin Li
30*2b54f0dbSXin Li
31*2b54f0dbSXin Li    print("struct cpuinfo_mock_cpuid cpuid_dump[] = {")
32*2b54f0dbSXin Li    for input_eax, input_ecx, eax, ebx, ecx, edx in cpuid_dump:
33*2b54f0dbSXin Li        print("\t{")
34*2b54f0dbSXin Li        print("\t\t.input_eax = 0x%08X," % input_eax)
35*2b54f0dbSXin Li        if input_ecx is not None:
36*2b54f0dbSXin Li            print("\t\t.input_ecx = 0x%08X," % input_ecx)
37*2b54f0dbSXin Li        print("\t\t.eax = 0x%08X," % eax)
38*2b54f0dbSXin Li        print("\t\t.ebx = 0x%08X," % ebx)
39*2b54f0dbSXin Li        print("\t\t.ecx = 0x%08X," % ecx)
40*2b54f0dbSXin Li        print("\t\t.edx = 0x%08X," % edx)
41*2b54f0dbSXin Li        print("\t},")
42*2b54f0dbSXin Li    print("};")
43*2b54f0dbSXin Li    print()
44*2b54f0dbSXin Li
45*2b54f0dbSXin Li
46*2b54f0dbSXin Liif __name__ == "__main__":
47*2b54f0dbSXin Li    main(sys.argv[1:])
48