KVM: x86: do not go through ctxt->ops when emulating rsm
authorPaolo Bonzini <pbonzini@redhat.com>
Thu, 29 Sep 2022 17:20:12 +0000 (13:20 -0400)
committerPaolo Bonzini <pbonzini@redhat.com>
Wed, 9 Nov 2022 17:31:18 +0000 (12:31 -0500)
commit1d0da94cdafe38b2c501a8d55f981204e588e259
tree0c52eb40bdfa50955aa7012e3e79fd4311d57d97
parentf1554150d3c694e30e92c681c20ce9714cac3d42
KVM: x86: do not go through ctxt->ops when emulating rsm

Now that RSM is implemented in a single emulator callback, there is no
point in going through other callbacks for the sake of modifying
processor state.  Just invoke KVM's own internal functions directly,
and remove the callbacks that were only used by em_rsm; the only
substantial difference is in the handling of the segment registers
and descriptor cache, which have to be parsed into a struct kvm_segment
instead of a struct desc_struct.

This also fixes a bug where emulator_set_segment was shifting the
limit left by 12 if the G bit is set, but the limit had not been
shifted right upon entry to SMM.

The emulator context is still used to restore EIP and the general
purpose registers.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
Message-Id: <20220929172016.319443-5-pbonzini@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/kvm_emulate.h
arch/x86/kvm/smm.c
arch/x86/kvm/x86.c