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 Livoid 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 Livoid 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 Livoid 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