On Tue, Jun 21, 2022, Maxim Levitsky wrote: > +static inline int update_emulation_mode(struct x86_emulate_ctxt *ctxt) Maybe emulator_recalc_and_set_mode()? It took me a second to understand that "update" also involves determining the "new" mode, e.g. I was trying to figure out where @mode was :-) > +{ > + u64 efer; > + struct desc_struct cs; > + u16 selector; > + u32 base3; > + > + ctxt->ops->get_msr(ctxt, MSR_EFER, &efer); > + > + if (!ctxt->ops->get_cr(ctxt, 0) & X86_CR0_PE) { > + /* Real mode. cpu must not have long mode active */ > + if (efer & EFER_LMA) > + return X86EMUL_UNHANDLEABLE; If we hit this, is there any hope of X86EMUL_UNHANDLEABLE doing the right thing? Ah, SMM and the ability to swizzle SMRAM state. Bummer. I was hoping we could just bug the VM. > + ctxt->mode = X86EMUL_MODE_REAL; > + return X86EMUL_CONTINUE; > + }