xref: /aosp_15_r20/external/cpuinfo/src/x86/mockcpuid.c (revision 2b54f0db79fd8303838913b20ff3780cddaa909f)
1*2b54f0dbSXin Li #include <stdint.h>
2*2b54f0dbSXin Li #include <stddef.h>
3*2b54f0dbSXin Li 
4*2b54f0dbSXin Li #if !CPUINFO_MOCK
5*2b54f0dbSXin Li 	#error This file should be built only in mock mode
6*2b54f0dbSXin Li #endif
7*2b54f0dbSXin Li 
8*2b54f0dbSXin Li #include <cpuinfo-mock.h>
9*2b54f0dbSXin Li 
10*2b54f0dbSXin Li 
11*2b54f0dbSXin Li static struct cpuinfo_mock_cpuid* cpuinfo_mock_cpuid_data = NULL;
12*2b54f0dbSXin Li static uint32_t cpuinfo_mock_cpuid_entries = 0;
13*2b54f0dbSXin Li static uint32_t cpuinfo_mock_cpuid_leaf4_iteration = 0;
14*2b54f0dbSXin Li 
cpuinfo_mock_set_cpuid(struct cpuinfo_mock_cpuid * dump,size_t entries)15*2b54f0dbSXin Li void CPUINFO_ABI cpuinfo_mock_set_cpuid(struct cpuinfo_mock_cpuid* dump, size_t entries) {
16*2b54f0dbSXin Li 	cpuinfo_mock_cpuid_data = dump;
17*2b54f0dbSXin Li 	cpuinfo_mock_cpuid_entries = entries;
18*2b54f0dbSXin Li };
19*2b54f0dbSXin Li 
cpuinfo_mock_get_cpuid(uint32_t eax,uint32_t regs[4])20*2b54f0dbSXin Li void CPUINFO_ABI cpuinfo_mock_get_cpuid(uint32_t eax, uint32_t regs[4]) {
21*2b54f0dbSXin Li 	if (eax != 4) {
22*2b54f0dbSXin Li 		cpuinfo_mock_cpuid_leaf4_iteration = 0;
23*2b54f0dbSXin Li 	}
24*2b54f0dbSXin Li 	if (cpuinfo_mock_cpuid_data != NULL && cpuinfo_mock_cpuid_entries != 0) {
25*2b54f0dbSXin Li 		if (eax == 4) {
26*2b54f0dbSXin Li 			uint32_t skip_entries = cpuinfo_mock_cpuid_leaf4_iteration;
27*2b54f0dbSXin Li 			for (uint32_t i = 0; i < cpuinfo_mock_cpuid_entries; i++) {
28*2b54f0dbSXin Li 				if (eax == cpuinfo_mock_cpuid_data[i].input_eax) {
29*2b54f0dbSXin Li 					if (skip_entries-- == 0) {
30*2b54f0dbSXin Li 						regs[0] = cpuinfo_mock_cpuid_data[i].eax;
31*2b54f0dbSXin Li 						regs[1] = cpuinfo_mock_cpuid_data[i].ebx;
32*2b54f0dbSXin Li 						regs[2] = cpuinfo_mock_cpuid_data[i].ecx;
33*2b54f0dbSXin Li 						regs[3] = cpuinfo_mock_cpuid_data[i].edx;
34*2b54f0dbSXin Li 						cpuinfo_mock_cpuid_leaf4_iteration++;
35*2b54f0dbSXin Li 						return;
36*2b54f0dbSXin Li 					}
37*2b54f0dbSXin Li 				}
38*2b54f0dbSXin Li 			}
39*2b54f0dbSXin Li 		} else {
40*2b54f0dbSXin Li 			for (uint32_t i = 0; i < cpuinfo_mock_cpuid_entries; i++) {
41*2b54f0dbSXin Li 				if (eax == cpuinfo_mock_cpuid_data[i].input_eax) {
42*2b54f0dbSXin Li 					regs[0] = cpuinfo_mock_cpuid_data[i].eax;
43*2b54f0dbSXin Li 					regs[1] = cpuinfo_mock_cpuid_data[i].ebx;
44*2b54f0dbSXin Li 					regs[2] = cpuinfo_mock_cpuid_data[i].ecx;
45*2b54f0dbSXin Li 					regs[3] = cpuinfo_mock_cpuid_data[i].edx;
46*2b54f0dbSXin Li 					return;
47*2b54f0dbSXin Li 				}
48*2b54f0dbSXin Li 			}
49*2b54f0dbSXin Li 		}
50*2b54f0dbSXin Li 	}
51*2b54f0dbSXin Li 	regs[0] = regs[1] = regs[2] = regs[3] = 0;
52*2b54f0dbSXin Li }
53*2b54f0dbSXin Li 
cpuinfo_mock_get_cpuidex(uint32_t eax,uint32_t ecx,uint32_t regs[4])54*2b54f0dbSXin Li void CPUINFO_ABI cpuinfo_mock_get_cpuidex(uint32_t eax, uint32_t ecx, uint32_t regs[4]) {
55*2b54f0dbSXin Li 	cpuinfo_mock_cpuid_leaf4_iteration = 0;
56*2b54f0dbSXin Li 	if (cpuinfo_mock_cpuid_data != NULL && cpuinfo_mock_cpuid_entries != 0) {
57*2b54f0dbSXin Li 		for (uint32_t i = 0; i < cpuinfo_mock_cpuid_entries; i++) {
58*2b54f0dbSXin Li 			if (eax == cpuinfo_mock_cpuid_data[i].input_eax &&
59*2b54f0dbSXin Li 				ecx == cpuinfo_mock_cpuid_data[i].input_ecx)
60*2b54f0dbSXin Li 			{
61*2b54f0dbSXin Li 				regs[0] = cpuinfo_mock_cpuid_data[i].eax;
62*2b54f0dbSXin Li 				regs[1] = cpuinfo_mock_cpuid_data[i].ebx;
63*2b54f0dbSXin Li 				regs[2] = cpuinfo_mock_cpuid_data[i].ecx;
64*2b54f0dbSXin Li 				regs[3] = cpuinfo_mock_cpuid_data[i].edx;
65*2b54f0dbSXin Li 				return;
66*2b54f0dbSXin Li 			}
67*2b54f0dbSXin Li 		}
68*2b54f0dbSXin Li 	}
69*2b54f0dbSXin Li 	regs[0] = regs[1] = regs[2] = regs[3] = 0;
70*2b54f0dbSXin Li }
71