Signed-off-by: Sean Christopherson <sean.j.christopherson@xxxxxxxxx> --- arch/x86/include/asm/kvm_emulate.h | 1 + arch/x86/kvm/emulate.c | 2 +- arch/x86/kvm/x86.c | 6 ++++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/kvm_emulate.h b/arch/x86/include/asm/kvm_emulate.h index e69ad18f8bf9..437ba2cc29f5 100644 --- a/arch/x86/include/asm/kvm_emulate.h +++ b/arch/x86/include/asm/kvm_emulate.h @@ -223,6 +223,7 @@ struct x86_emulate_ops { void (*set_nmi_mask)(struct x86_emulate_ctxt *ctxt, bool masked); unsigned (*get_hflags)(struct x86_emulate_ctxt *ctxt); + bool (*is_smm)(struct x86_emulate_ctxt *ctxt); int (*leave_smm)(struct x86_emulate_ctxt *ctxt); }; diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index d2c5510d9ac3..1c0c901db893 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -2331,7 +2331,7 @@ static int em_lseg(struct x86_emulate_ctxt *ctxt) static int em_rsm(struct x86_emulate_ctxt *ctxt) { - if ((ctxt->ops->get_hflags(ctxt) & X86EMUL_SMM_MASK) == 0) + if (!ctxt->ops->is_smm(ctxt)) return emulate_ud(ctxt); return ctxt->ops->leave_smm(ctxt); diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index dd8bdd9d934f..0c7b959d7dc6 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -5943,6 +5943,11 @@ static unsigned emulator_get_hflags(struct x86_emulate_ctxt *ctxt) return emul_to_vcpu(ctxt)->arch.hflags; } +static bool emulator_is_smm(struct x86_emulate_ctxt *ctxt) +{ + return emul_to_vcpu(ctxt)->arch.hflags & HF_SMM_MASK; +} + static int emulator_leave_smm(struct x86_emulate_ctxt *ctxt) { return leave_smm(emul_to_vcpu(ctxt)); @@ -5984,6 +5989,7 @@ static const struct x86_emulate_ops emulate_ops = { .get_cpuid = emulator_get_cpuid, .set_nmi_mask = emulator_set_nmi_mask, .get_hflags = emulator_get_hflags, + .is_smm = emulator_is_smm, .leave_smm = emulator_leave_smm, }; -- 2.21.0