diff options
| author | Marios Pomonis <pomonis@google.com> | 2025-05-05 02:51:27 -0700 |
|---|---|---|
| committer | Alexander Potapenko <glider@google.com> | 2025-05-19 09:47:30 +0000 |
| commit | 54fb386c8845f5f2385e0f910c12fc4febdeef38 (patch) | |
| tree | 234c9e207044057338f33b66f956aef4653aded4 /executor/common_kvm_amd64_syzos.h | |
| parent | 27f689959decd391b047c8034d481267d500549e (diff) | |
executor/kvm: add SYZOS support for CPUID
This commit adds support for CPUID instructions on AMD64. It also adds a
relevant test.
Diffstat (limited to 'executor/common_kvm_amd64_syzos.h')
| -rw-r--r-- | executor/common_kvm_amd64_syzos.h | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/executor/common_kvm_amd64_syzos.h b/executor/common_kvm_amd64_syzos.h index b98b33337..706396d1a 100644 --- a/executor/common_kvm_amd64_syzos.h +++ b/executor/common_kvm_amd64_syzos.h @@ -21,6 +21,7 @@ extern char *__start_guest, *__stop_guest; typedef enum { SYZOS_API_UEXIT, SYZOS_API_CODE, + SYZOS_API_CPUID, SYZOS_API_STOP, // Must be the last one } syzos_api_id; @@ -39,8 +40,15 @@ struct api_call_code { uint8 insns[]; }; +struct api_call_cpuid { + struct api_call_header header; + uint32 eax; + uint32 ecx; +}; + static void guest_uexit(uint64 exit_code); static void guest_execute_code(uint8* insns, uint64 size); +static void guest_cpuid(uint32 eax, uint32 ecx); typedef enum { UEXIT_END = (uint64)-1, @@ -73,6 +81,10 @@ guest_main(uint64 size, uint64 cpu) guest_execute_code(ccmd->insns, cmd->size - sizeof(struct api_call_header)); break; } + case SYZOS_API_CPUID: { + struct api_call_cpuid* ccmd = (struct api_call_cpuid*)cmd; + guest_cpuid(ccmd->eax, ccmd->ecx); + } } addr += cmd->size; size -= cmd->size; @@ -94,3 +106,12 @@ GUEST_CODE static noinline void guest_uexit(uint64 exit_code) volatile uint64* ptr = (volatile uint64*)X86_ADDR_UEXIT; *ptr = exit_code; } + +GUEST_CODE static noinline void guest_cpuid(uint32 eax, uint32 ecx) +{ + asm volatile( + "cpuid\n" + : // Currently ignore outputs + : "a"(eax), "c"(ecx) + : "rbx", "rdx"); +} |
