KVM fixes for 2.6.24-rc2
cover KVM fixes for 2.6.24-rc2
I intend to submit the following patchset shortly for mainline. All fixes are for fairly serious issues, including host crashes. Several will go into -stable as well.
Please review.
drivers/kvm/svm.c | 18 ++++++++++++++---- drivers/kvm/x86_emulate.c | 26 ++++++++++++++------------ 2 files changed, 28 insertions(+), 16 deletions(-)
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/
PATCH 1/5 KVM: x86 emulator: fix 'push imm8' emulation
'push imm8' found itself in the wrong switch somehow, so it is never executed.
This fixes Windows 2003 installation.
--- drivers/kvm/x86_emulate.c | 22 +++++++++++----------- 1 files changed, 11 insertions(+), 11 deletions(-)
drivers/kvm/x86_emulate.c +11 -11
@@ -980,17 +980,6 @@ done_prefixes: goto cannot_emulate; dst.val = (s32 ) src.val;break ; -case 0x6a :/* push imm8 */ - src.val =0L ; - src.val =insn_fetch (s8,1 , _eip); -push: - dst.type =OP_MEM ; - dst.bytes = op_bytes; - dst.val = src.val; -register_address_increment (_regs[VCPU_REGS_RSP ], -op_bytes); - dst.ptr = (void *)register_address (ctxt->ss_base, - _regs[VCPU_REGS_RSP ]); -break ; case 0x80 ... 0x83: /* Grp1 */switch (modrm_reg) {case 0 :
@@ -1243,6 +1232,17 @@ special_insn:register_address_increment (_regs[VCPU_REGS_RSP ], op_bytes); no_wb =1 ;/* Disable writeback. */ break ; +case 0x6a :/* push imm8 */ + src.val =0L ; + src.val =insn_fetch (s8,1 , _eip); + push: + dst.type =OP_MEM ; + dst.bytes = op_bytes; + dst.val = src.val; +register_address_increment (_regs[VCPU_REGS_RSP ], -op_bytes); + dst.ptr = (void *)register_address (ctxt->ss_base, + _regs[VCPU_REGS_RSP ]); +break ;case 0x6c :/* insb */ case 0x6d :/* insw/insd */ if (kvm_emulate_pio_string(ctxt->vcpu, NULL,
Signature · 1 line
1.5.3
PATCH 2/5 KVM: SVM: Fix SMP with kernel apic
In reply to Avi KivityAP processor needs to reset to the SIPI vector, not normal INIT.
--- drivers/kvm/svm.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-)
drivers/kvm/svm.c +6 -0
@@ -561,6 +561,12 @@ static void svm_vcpu_reset(struct kvm_vcpu *vcpu)struct vcpu_svm *svm =to_svm (vcpu);init_vmcb (svm->vmcb); + +if (vcpu->vcpu_id !=0 ) { + svm->vmcb->save.rip =0 ; + svm->vmcb->save.cs.base = svm->vcpu.sipi_vector <<12 ; + svm->vmcb->save.cs.selector = svm->vcpu.sipi_vector <<8 ; + } }static struct kvm_vcpu *svm_create_vcpu (struct kvm *kvm,unsigned int id)
Signature · 8 lines
1.5.3 ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/
PATCH 3/5 KVM: SVM: Defer nmi processing until switch to host state is complete
In reply to Avi KivityIf we stgi() too soon, nmis can reach the processor even though interrupts are disabled, catching it in a half-switched state. Delay the stgi() until we're done switching.
--- drivers/kvm/svm.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-)
drivers/kvm/svm.c +4 -4
@@ -1585,10 +1585,6 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)#endif : "cc", "memory" ); -local_irq_disable (); - -stgi (); -if ((svm->vmcb->save.dr7 &0xff ))load_db_regs (svm->host_db_regs);
@@ -1605,6 +1601,10 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)reload_tss (vcpu); +local_irq_disable (); + +stgi (); + svm->next_rip =0 ; }
Signature · 8 lines
1.5.3 ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/
PATCH 4/5 KVM: x86 emulator: invd instruction
In reply to Avi KivityEmulate the 'invd' instruction (opcode 0f 08).
--- drivers/kvm/x86_emulate.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-)
drivers/kvm/x86_emulate.c +3 -1
@@ -167,7 +167,7 @@ static u8 opcode_table[256] = {static u16 twobyte_table[256 ] = {/* 0x00 - 0x0F */ 0 , SrcMem | ModRM | DstReg,0 ,0 ,0 ,0 , ImplicitOps,0 , -0 , ImplicitOps,0 ,0 ,0 , ImplicitOps | ModRM,0 ,0 , + ImplicitOps, ImplicitOps,0 ,0 ,0 , ImplicitOps | ModRM,0 ,0 ,/* 0x10 - 0x1F */ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , ImplicitOps | ModRM,0 ,0 ,0 ,0 ,0 ,0 ,0 ,/* 0x20 - 0x2F */
@@ -1532,6 +1532,8 @@ twobyte_special_insn:case 0x06 :emulate_clts (ctxt->vcpu);break ; +case 0x08 :/* invd */ +break ;case 0x09 :/* wbinvd */ break ;case 0x0d :/* GrpP (prefetch) */
Signature · 8 lines
1.5.3 ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/
PATCH 5/5 KVM: SVM: Intercept the 'invd' and 'wbinvd' instructions
In reply to Avi Kivity'invd' can destroy host data, and 'wbinvd' allows the guest to induce long (milliseconds) latencies.
Noted by Ben Serebrin.
--- drivers/kvm/svm.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-)
drivers/kvm/svm.c +4 -0
@@ -494,6 +494,7 @@ static void init_vmcb(struct vmcb *vmcb)*/ /* (1ULL << INTERCEPT_SELECTIVE_CR0) | */ (1ULL <<INTERCEPT_CPUID ) | + (1ULL <<INTERCEPT_INVD ) | (1ULL <<INTERCEPT_HLT ) | (1ULL <<INTERCEPT_INVLPGA ) | (1ULL << INTERCEPT_IOIO_PROT) |
@@ -507,6 +508,7 @@ static void init_vmcb(struct vmcb *vmcb) (1ULL <<INTERCEPT_STGI ) | (1ULL <<INTERCEPT_CLGI ) | (1ULL <<INTERCEPT_SKINIT ) | + (1ULL <<INTERCEPT_WBINVD ) | (1ULL <<INTERCEPT_MONITOR ) | (1ULL <<INTERCEPT_MWAIT );
@@ -1247,6 +1249,7 @@ static int (*svm_exit_handlers[])(struct vcpu_svm *svm, [SVM_EXIT_VINTR] = interrupt_window_interception,/* [SVM_EXIT_CR0_SEL_WRITE] = emulate_on_interception, */ [SVM_EXIT_CPUID] = cpuid_interception, + [SVM_EXIT_INVD] = emulate_on_interception, [SVM_EXIT_HLT] = halt_interception, [SVM_EXIT_INVLPG] = emulate_on_interception, [SVM_EXIT_INVLPGA] = invalid_op_interception,
@@ -1261,6 +1264,7 @@ static int (*svm_exit_handlers[])(struct vcpu_svm *svm, [SVM_EXIT_STGI] = invalid_op_interception, [SVM_EXIT_CLGI] = invalid_op_interception, [SVM_EXIT_SKINIT] = invalid_op_interception, + [SVM_EXIT_WBINVD] = emulate_on_interception, [SVM_EXIT_MONITOR] = invalid_op_interception, [SVM_EXIT_MWAIT] = invalid_op_interception, };
Signature · 8 lines
1.5.3 ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/