forked from luck/tmp_suning_uos_patched
KVM: Workaround vmx inability to virtualize the reset state
The reset state has cs.selector == 0xf000 and cs.base == 0xffff0000, which aren't compatible with vm86 mode, which is used for real mode virtualization. When we create a vcpu, we set cs.base to 0xf0000, but if we get there by way of a reset, the values are inconsistent and vmx refuses to enter guest mode. Workaround by detecting the state and munging it appropriately. Signed-off-by: Avi Kivity <avi@qumranet.com>
This commit is contained in:
parent
aac012245a
commit
8cb5b03332
@ -712,6 +712,8 @@ static void enter_rmode(struct kvm_vcpu *vcpu)
|
|||||||
|
|
||||||
vmcs_write32(GUEST_CS_AR_BYTES, 0xf3);
|
vmcs_write32(GUEST_CS_AR_BYTES, 0xf3);
|
||||||
vmcs_write32(GUEST_CS_LIMIT, 0xffff);
|
vmcs_write32(GUEST_CS_LIMIT, 0xffff);
|
||||||
|
if (vmcs_readl(GUEST_CS_BASE) == 0xffff0000)
|
||||||
|
vmcs_writel(GUEST_CS_BASE, 0xf0000);
|
||||||
vmcs_write16(GUEST_CS_SELECTOR, vmcs_readl(GUEST_CS_BASE) >> 4);
|
vmcs_write16(GUEST_CS_SELECTOR, vmcs_readl(GUEST_CS_BASE) >> 4);
|
||||||
|
|
||||||
fix_rmode_seg(VCPU_SREG_ES, &vcpu->rmode.es);
|
fix_rmode_seg(VCPU_SREG_ES, &vcpu->rmode.es);
|
||||||
|
Loading…
Reference in New Issue
Block a user