Add a helper to detect whether or not KVM's forced emulation prefix is available. Use the helper to replace equivalent functionality in the emulator test. Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx> --- lib/x86/desc.h | 14 ++++++++++++++ x86/emulator.c | 15 +-------------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/lib/x86/desc.h b/lib/x86/desc.h index 8f708fd..c023b93 100644 --- a/lib/x86/desc.h +++ b/lib/x86/desc.h @@ -106,6 +106,20 @@ typedef struct __attribute__((packed)) { #define KVM_FEP "ud2; .byte 'k', 'v', 'm';" #define ASM_TRY_FEP(catch) __ASM_TRY(KVM_FEP, catch) +static inline bool is_fep_available(void) +{ + /* + * Use the non-FEP ASM_TRY() as KVM will inject a #UD on the prefix + * itself if forced emulation is not available. + */ + asm goto(ASM_TRY("%l[fep_unavailable]") + KVM_FEP "nop\n\t" + ::: "memory" : fep_unavailable); + return true; +fep_unavailable: + return false; +} + /* * selector 32-bit 64-bit * 0x00 NULL descriptor NULL descriptor diff --git a/x86/emulator.c b/x86/emulator.c index 6dc88f1..e1272a6 100644 --- a/x86/emulator.c +++ b/x86/emulator.c @@ -17,10 +17,6 @@ static int exceptions; -/* Forced emulation prefix, used to invoke the emulator unconditionally. */ -#define KVM_FEP_LENGTH 5 -static int fep_available = 1; - struct regs { u64 rax, rbx, rcx, rdx; u64 rsi, rdi, rsp, rbp; @@ -1121,12 +1117,6 @@ static void test_illegal_movbe(void) handle_exception(UD_VECTOR, 0); } -static void record_no_fep(struct ex_regs *regs) -{ - fep_available = 0; - regs->rip += KVM_FEP_LENGTH; -} - int main(void) { void *mem; @@ -1136,9 +1126,6 @@ int main(void) unsigned long t1, t2; setup_vm(); - handle_exception(UD_VECTOR, record_no_fep); - asm(KVM_FEP "nop"); - handle_exception(UD_VECTOR, 0); mem = alloc_vpages(2); install_page((void *)read_cr3(), IORAM_BASE_PHYS, mem); @@ -1190,7 +1177,7 @@ int main(void) test_ltr(mem); test_cmov(mem); - if (fep_available) { + if (is_fep_available()) { test_mmx_movq_mf(mem); test_movabs(mem); test_smsw_reg(mem); -- 2.37.1.559.g78731f0fdb-goog