dep: Add cpuinfo
This commit is contained in:
70
dep/cpuinfo/src/x86/mockcpuid.c
Normal file
70
dep/cpuinfo/src/x86/mockcpuid.c
Normal file
@@ -0,0 +1,70 @@
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#if !CPUINFO_MOCK
|
||||
#error This file should be built only in mock mode
|
||||
#endif
|
||||
|
||||
#include <cpuinfo-mock.h>
|
||||
|
||||
|
||||
static struct cpuinfo_mock_cpuid* cpuinfo_mock_cpuid_data = NULL;
|
||||
static uint32_t cpuinfo_mock_cpuid_entries = 0;
|
||||
static uint32_t cpuinfo_mock_cpuid_leaf4_iteration = 0;
|
||||
|
||||
void CPUINFO_ABI cpuinfo_mock_set_cpuid(struct cpuinfo_mock_cpuid* dump, size_t entries) {
|
||||
cpuinfo_mock_cpuid_data = dump;
|
||||
cpuinfo_mock_cpuid_entries = entries;
|
||||
};
|
||||
|
||||
void CPUINFO_ABI cpuinfo_mock_get_cpuid(uint32_t eax, uint32_t regs[4]) {
|
||||
if (eax != 4) {
|
||||
cpuinfo_mock_cpuid_leaf4_iteration = 0;
|
||||
}
|
||||
if (cpuinfo_mock_cpuid_data != NULL && cpuinfo_mock_cpuid_entries != 0) {
|
||||
if (eax == 4) {
|
||||
uint32_t skip_entries = cpuinfo_mock_cpuid_leaf4_iteration;
|
||||
for (uint32_t i = 0; i < cpuinfo_mock_cpuid_entries; i++) {
|
||||
if (eax == cpuinfo_mock_cpuid_data[i].input_eax) {
|
||||
if (skip_entries-- == 0) {
|
||||
regs[0] = cpuinfo_mock_cpuid_data[i].eax;
|
||||
regs[1] = cpuinfo_mock_cpuid_data[i].ebx;
|
||||
regs[2] = cpuinfo_mock_cpuid_data[i].ecx;
|
||||
regs[3] = cpuinfo_mock_cpuid_data[i].edx;
|
||||
cpuinfo_mock_cpuid_leaf4_iteration++;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (uint32_t i = 0; i < cpuinfo_mock_cpuid_entries; i++) {
|
||||
if (eax == cpuinfo_mock_cpuid_data[i].input_eax) {
|
||||
regs[0] = cpuinfo_mock_cpuid_data[i].eax;
|
||||
regs[1] = cpuinfo_mock_cpuid_data[i].ebx;
|
||||
regs[2] = cpuinfo_mock_cpuid_data[i].ecx;
|
||||
regs[3] = cpuinfo_mock_cpuid_data[i].edx;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
regs[0] = regs[1] = regs[2] = regs[3] = 0;
|
||||
}
|
||||
|
||||
void CPUINFO_ABI cpuinfo_mock_get_cpuidex(uint32_t eax, uint32_t ecx, uint32_t regs[4]) {
|
||||
cpuinfo_mock_cpuid_leaf4_iteration = 0;
|
||||
if (cpuinfo_mock_cpuid_data != NULL && cpuinfo_mock_cpuid_entries != 0) {
|
||||
for (uint32_t i = 0; i < cpuinfo_mock_cpuid_entries; i++) {
|
||||
if (eax == cpuinfo_mock_cpuid_data[i].input_eax &&
|
||||
ecx == cpuinfo_mock_cpuid_data[i].input_ecx)
|
||||
{
|
||||
regs[0] = cpuinfo_mock_cpuid_data[i].eax;
|
||||
regs[1] = cpuinfo_mock_cpuid_data[i].ebx;
|
||||
regs[2] = cpuinfo_mock_cpuid_data[i].ecx;
|
||||
regs[3] = cpuinfo_mock_cpuid_data[i].edx;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
regs[0] = regs[1] = regs[2] = regs[3] = 0;
|
||||
}
|
||||
Reference in New Issue
Block a user