KVM: VMX: return correct segment limit and flags for CS/SS registers in real mode
authorGleb Natapov <gleb@redhat.com>
Wed, 12 Dec 2012 17:10:51 +0000 (19:10 +0200)
committerGleb Natapov <gleb@redhat.com>
Sun, 23 Dec 2012 12:01:03 +0000 (14:01 +0200)
commitc6ad115348035f474d6fb81005bb4764bdd128ef
tree5db62808fcba00af9102abbc78fcbe3eb0d649c1
parent0647f4aa8c58a7e5adb873b485c83e0c93d9c6d1
KVM: VMX: return correct segment limit and flags for CS/SS registers in real mode

VMX without unrestricted mode cannot virtualize real mode, so if
emulate_invalid_guest_state=0 kvm uses vm86 mode to approximate
it. Sometimes, when guest moves from protected mode to real mode, it
leaves segment descriptors in a state not suitable for use by vm86 mode
virtualization, so we keep shadow copy of segment descriptors for internal
use and load fake register to VMCS for guest entry to succeed. Till
now we kept shadow for all segments except SS and CS (for SS and CS we
returned parameters directly from VMCS), but since commit a5625189f6810
emulator enforces segment limits in real mode. This causes #GP during move
from protected mode to real mode when emulator fetches first instruction
after moving to real mode since it uses incorrect CS base and limit to
linearize the %rip. Fix by keeping shadow for SS and CS too.

Reviewed-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Gleb Natapov <gleb@redhat.com>
arch/x86/kvm/vmx.c