On 8/1/22 18:44, Sean Christopherson wrote: > On Sun, Jul 31, 2022, Michal Luczaj wrote: >> +{ >> + exceptions = 0; >> + handle_exception(UD_VECTOR, illegal_lea_handler); > > No need to use a custom handler (ignore any patterns in emulator.c that suggest > it's "mandatory", emulator is one of the oldest test). ASM_TRY() can handle all > of this without any globals. > ... > static void test_illegal_lea(void) > { > unsigned int vector; > > asm volatile (ASM_TRY("1f") > KVM_FEP ".byte 0x8d; .byte 0xc0\n\t" > "1:" > : : : "memory", "eax"); > > vector = exception_vector(); > report(vector == UD_VECTOR, > "Wanted #UD on LEA with /reg, got vector = %d", vector); > } I must be missing something important. There is `handle_exception(UD_VECTOR, 0)` early in `main()` which simply undoes `handle_exception(6, check_exception_table)` set by `setup_idt()`. If there's no more exception table walk for #UD, `ASM_TRY` alone can't possibly work, am I corrent? If so, am I supposed to restore the `check_exception_table()` handler? Or maybe using `test_for_exception()` would be more elegant: static void illegal_lea(void *unused) { asm volatile(KVM_FEP ".byte 0x8d, 0xc0" : : : "memory", "eax"); } static void test_illegal_lea(void) { bool fault; fault = test_for_exception(UD_VECTOR, &illegal_lea, NULL); report(fault, "Wanted #UD on LEA with /reg"); } Thanks for hints, Michal