aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorAvi Kivity <avi@redhat.com>2012-08-21 10:07:03 -0400
committerMarcelo Tosatti <mtosatti@redhat.com>2012-08-27 19:02:20 -0400
commite2a610d7fc3e285af8061ff071761752255d95f6 (patch)
tree53f141c70dad87f00413bfb42097812270d86096 /arch
parent495e116684cebc5ae625916aba37fc07f345707b (diff)
KVM: VMX: Allow vm86 virtualization of big real mode
Usually, big real mode uses large (4GB) segments. Currently we don't virtualize this; if any segment has a limit other than 0xffff, we emulate. But if we set the vmx-visible limit to 0xffff, we can use vm86 to virtualize real mode; if an access overruns the segment limit, the guest will #GP, which we will trap and forward to the emulator. This results in significantly faster execution, and less risk of hitting an unemulated instruction. If the limit is less than 0xffff, we retain the existing behaviour. Signed-off-by: Avi Kivity <avi@redhat.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/kvm/vmx.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 4811d91759a1..fd21eb454663 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -3315,7 +3315,7 @@ static bool rmode_segment_valid(struct kvm_vcpu *vcpu, int seg)
3315 3315
3316 if (var.base != (var.selector << 4)) 3316 if (var.base != (var.selector << 4))
3317 return false; 3317 return false;
3318 if (var.limit != 0xffff) 3318 if (var.limit < 0xffff)
3319 return false; 3319 return false;
3320 if ((ar | (3 << AR_DPL_SHIFT)) != 0xf3) 3320 if ((ar | (3 << AR_DPL_SHIFT)) != 0xf3)
3321 return false; 3321 return false;