aboutsummaryrefslogtreecommitdiffstats
path: root/executor/common_kvm_amd64_syzos.h
diff options
context:
space:
mode:
authorMarios Pomonis <pomonis@google.com>2025-05-05 02:51:27 -0700
committerAlexander Potapenko <glider@google.com>2025-05-19 09:47:30 +0000
commit54fb386c8845f5f2385e0f910c12fc4febdeef38 (patch)
tree234c9e207044057338f33b66f956aef4653aded4 /executor/common_kvm_amd64_syzos.h
parent27f689959decd391b047c8034d481267d500549e (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.h21
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");
+}