diff mbox

KVM: Fix IA32e Windows can't boot issue

Message ID 1246435671-25485-1-git-send-email-sheng@linux.intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Sheng Yang July 1, 2009, 8:07 a.m. UTC
One typo in commit: "KVM: convert custom marker based tracing to
event traces" caused:

set_cr8: #GP, reserved bits 0x7f

when try to boot up IA32e Windows guest.

One value has been written to R8 instead of specific register, then the
value of specific register can be invalid as CR8. Guest RMW it, then got
trouble.

Signed-off-by: Sheng Yang <sheng@linux.intel.com>
---
 arch/x86/kvm/vmx.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

Comments

Sheng Yang July 1, 2009, 8:20 a.m. UTC | #1
On Wednesday 01 July 2009 16:21:13 Avi Kivity wrote:
> On 07/01/2009 11:07 AM, Sheng Yang wrote:
> > One typo in commit: "KVM: convert custom marker based tracing to
> > event traces" caused:
> >
> > set_cr8: #GP, reserved bits 0x7f
> >
> > when try to boot up IA32e Windows guest.
> >
> > One value has been written to R8 instead of specific register, then the
> > value of specific register can be invalid as CR8. Guest RMW it, then got
> > trouble.
>
> Applied, thanks.  Strange how I didn't see it - I have both Windows XP
> x64 and Vista x64 in my test suite.

Forgot to mention, it only happened in some of our machines here...
Avi Kivity July 1, 2009, 8:21 a.m. UTC | #2
On 07/01/2009 11:07 AM, Sheng Yang wrote:
> One typo in commit: "KVM: convert custom marker based tracing to
> event traces" caused:
>
> set_cr8: #GP, reserved bits 0x7f
>
> when try to boot up IA32e Windows guest.
>
> One value has been written to R8 instead of specific register, then the
> value of specific register can be invalid as CR8. Guest RMW it, then got
> trouble.
>    

Applied, thanks.  Strange how I didn't see it - I have both Windows XP 
x64 and Vista x64 in my test suite.
diff mbox

Patch

diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 119fa47..3a75db3 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -2903,7 +2903,7 @@  static int handle_cr(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
 			return 1;
 		case 8:
 			val = kvm_get_cr8(vcpu);
-			kvm_register_write(vcpu, cr, val);
+			kvm_register_write(vcpu, reg, val);
 			trace_kvm_cr_read(cr, val);
 			skip_emulated_instruction(vcpu);
 			return 1;