From 54fb386c8845f5f2385e0f910c12fc4febdeef38 Mon Sep 17 00:00:00 2001 From: Marios Pomonis Date: Mon, 5 May 2025 02:51:27 -0700 Subject: executor/kvm: add SYZOS support for CPUID This commit adds support for CPUID instructions on AMD64. It also adds a relevant test. --- executor/common_kvm_amd64_syzos.h | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'executor/common_kvm_amd64_syzos.h') 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"); +} -- cgit mrf-deployment