KVM updates for 2.6.21
cover KVM updates for 2.6.21
This patchset contains an assortment of guest and host fixes for kvm. Andrew, please queue for 2.6.21.
Signature · 8 lines
error compiling committee.c: too many arguments to function ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
PATCH 1/11 KVM: optimize inline assembly
From: Ingo Molnar <[email protected]>
forms like "0(%rsp)" generate an instruction with an unnecessary one byte displacement under certain circumstances. replace with the equivalent "(%rsp)".
drivers/kvm/vmx.c +6 -6
@@ -1784,10 +1784,10 @@ again:"kvm_vmx_return: " /* Save guest registers, load host registers, keep flags */ #ifdef CONFIG_X86_64 -"xchg %3, 0(%%rsp) \n\t" +"xchg %3, (%%rsp) \n\t" "mov %%rax, %c[rax](%3) \n\t" "mov %%rbx, %c[rbx](%3) \n\t" -"pushq 0(%%rsp); popq %c[rcx](%3) \n\t" +"pushq (%%rsp); popq %c[rcx](%3) \n\t" "mov %%rdx, %c[rdx](%3) \n\t" "mov %%rsi, %c[rsi](%3) \n\t" "mov %%rdi, %c[rdi](%3) \n\t"
@@ -1802,24 +1802,24 @@ again:"mov %%r15, %c[r15](%3) \n\t" "mov %%cr2, %%rax \n\t" "mov %%rax, %c[cr2](%3) \n\t" -"mov 0(%%rsp), %3 \n\t" +"mov (%%rsp), %3 \n\t" "pop %%rcx; pop %%r15; pop %%r14; pop %%r13; pop %%r12;" "pop %%r11; pop %%r10; pop %%r9; pop %%r8;" "pop %%rbp; pop %%rdi; pop %%rsi;" "pop %%rdx; pop %%rbx; pop %%rax \n\t"#else -"xchg %3, 0(%%esp) \n\t" +"xchg %3, (%%esp) \n\t" "mov %%eax, %c[rax](%3) \n\t" "mov %%ebx, %c[rbx](%3) \n\t" -"pushl 0(%%esp); popl %c[rcx](%3) \n\t" +"pushl (%%esp); popl %c[rcx](%3) \n\t" "mov %%edx, %c[rdx](%3) \n\t" "mov %%esi, %c[rsi](%3) \n\t" "mov %%edi, %c[rdi](%3) \n\t" "mov %%ebp, %c[rbp](%3) \n\t" "mov %%cr2, %%eax \n\t" "mov %%eax, %c[cr2](%3) \n\t" -"mov 0(%%esp), %3 \n\t" +"mov (%%esp), %3 \n\t" "pop %%ecx; popa \n\t"#endif
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
PATCH 2/11 KVM: Fix asm constraint for lldt instruction
In reply to Avi KivityFrom: S.Çağlar Onur <[email protected]>
lldt does not accept immediate operands, which "g" allows.
drivers/kvm/kvm.h +1 -1
@@ -558,7 +558,7 @@ static inline void load_gs(u16 sel)#ifndef load_ldtstatic inline void load_ldt (u16 sel) { - asm ("lldt %0" : :"g" (sel)); + asm ("lldt %0" : :"rm" (sel)); }#endif
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
kvm-devel mailing list [email protected]
https://lists.sourceforge.net/lists/listinfo/kvm-devel
Re: [PATCH 2/11] KVM: Fix asm constraint for lldt instruction
Quoted 4 lines · Avi Kivity
From: S.Çağlar Onur <[email protected]>
Signed-off-by Avi Kivity <[email protected]>
The mangled name is actually S.Çağlar Onur <[email protected]>. Apologies to S.Çağlar and Andrew. Will fix my script to include charset info.
Signature · 1 line
error compiling committee.c: too many arguments to function
PATCH 3/11 KVM: Fix gva_to_gpa()
In reply to Avi Kivitygva_to_gpa() needs to be updated to the new walk_addr() calling convention, otherwise it may oops under some circumstances.
Use the opportunity to remove all the code duplication in gva_to_gpa(), which essentially repeats the calculations in walk_addr().
drivers/kvm/paging_tmpl.h +7 -21
@@ -443,31 +443,17 @@ static int FNAME(page_fault)(struct kvm_static gpa_t FNAME (gva_to_gpa )(struct kvm_vcpu *vcpu,gva_t vaddr) {struct guest_walker walker; -pt_element_t guest_pte; -gpa_t gpa; +gpa_t gpa =UNMAPPED_GVA ; +int r; -FNAME (walk_addr)(&walker, vcpu, vaddr,0 ,0 ,0 ); - guest_pte = *walker.ptep; -FNAME (release_walker)(&walker); - -if (!is_present_pte (guest_pte)) -return UNMAPPED_GVA ; - -if (walker.level ==PT_DIRECTORY_LEVEL ) { -ASSERT ((guest_pte &PT_PAGE_SIZE_MASK )); -ASSERT (PTTYPE ==64 ||is_pse (vcpu)); + r =FNAME (walk_addr)(&walker, vcpu, vaddr,0 ,0 ,0 ); - gpa = (guest_pte &PT_DIR_BASE_ADDR_MASK ) | (vaddr & - (PT_LEVEL_MASK (PT_PAGE_TABLE_LEVEL ) | ~PAGE_MASK )); - -if (PTTYPE ==32 &&is_cpuid_PSE36 ()) - gpa |= (guest_pte &PT32_DIR_PSE36_MASK ) << - (32 -PT32_DIR_PSE36_SHIFT ); - }else { - gpa = (guest_pte &PT_BASE_ADDR_MASK ); - gpa |= (vaddr & ~PAGE_MASK ); +if (r) { + gpa = (gpa_t )walker.gfn <<PAGE_SHIFT ; + gpa |= vaddr & ~PAGE_MASK ; } +FNAME (release_walker)(&walker);return gpa; }
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
PATCH 4/11 KVM: vmx: handle triple faults by returning EXIT_REASON_SHUTDOWN to userspace
In reply to Avi KivityJust like svm.
drivers/kvm/vmx.c +6 -0
@@ -1373,6 +1373,11 @@ static int handle_external_interrupt(strreturn 1 ; } +static int handle_triple_fault (struct kvm_vcpu *vcpu,struct kvm_run *kvm_run) +{ + kvm_run->exit_reason =KVM_EXIT_SHUTDOWN ; +return 0 ; +}static int get_io_count (struct kvm_vcpu *vcpu,u64 *count) {
@@ -1633,6 +1638,7 @@ static int (*kvm_vmx_exit_handlers[])(st struct kvm_run *kvm_run) = { [EXIT_REASON_EXCEPTION_NMI ] = handle_exception, [EXIT_REASON_EXTERNAL_INTERRUPT ] = handle_external_interrupt, + [EXIT_REASON_TRIPLE_FAULT ] = handle_triple_fault, [EXIT_REASON_IO_INSTRUCTION ] = handle_io, [EXIT_REASON_CR_ACCESS ] = handle_cr, [EXIT_REASON_DR_ACCESS ] = handle_dr,
drivers/kvm/vmx.h +1 -0
@@ -180,6 +180,7 @@ enum vmcs_field {#define EXIT_REASON_EXCEPTION_NMI 0#define EXIT_REASON_EXTERNAL_INTERRUPT 1 +#define EXIT_REASON_TRIPLE_FAULT 2#define EXIT_REASON_PENDING_INTERRUPT 7
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
PATCH 5/11 KVM: fix what looks like an obvious typo in the file drivers/kvm/svm.c
In reply to Avi KivityFrom: Robert P. J. Day <[email protected]>
drivers/kvm/svm.c +1 -1
@@ -1163,7 +1163,7 @@ static int svm_set_msr(struct kvm_vcpu *case MSR_K6_STAR : vcpu->svm->vmcb->save.star = data;break ; -#ifdef CONFIG_X86_64_ +#ifdef CONFIG_X86_64 case MSR_LSTAR : vcpu->svm->vmcb->save.lstar = data;break ;
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
PATCH 6/11 KVM: Fix mmu going crazy of guest sets cr0.wp == 0
In reply to Avi KivityThe kvm mmu relies on cr0.wp being set even if the guest does not set it. The vmx code correctly forces cr0.wp at all times, the svm code does not, so it can't boot solaris without this patch.
drivers/kvm/svm.c +1 -1
@@ -723,7 +723,7 @@ static void svm_set_cr0(struct kvm_vcpu }#endif vcpu->svm->cr0 = cr0; - vcpu->svm->vmcb->save.cr0 = cr0 |CR0_PG_MASK ; + vcpu->svm->vmcb->save.cr0 = cr0 |CR0_PG_MASK |CR0_WP_MASK ; vcpu->cr0 = cr0; }
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
PATCH 7/11 KVM: SVM: Hack initial cpu csbase to be consistent with intel
In reply to Avi KivityThis allows us to run the mmu testsuite on amd.
drivers/kvm/svm.c +7 -1
@@ -528,7 +528,13 @@ static void init_vmcb(struct vmcb *vmcb) save->cs.attrib =SVM_SELECTOR_READ_MASK |SVM_SELECTOR_P_MASK |SVM_SELECTOR_S_MASK |SVM_SELECTOR_CODE_MASK ; save->cs.limit =0xffff ; - save->cs.base =0xffff0000 ; +/* +* cs.base should really be 0xffff0000, but vmx can't handle that, so +* be consistent with it. +* +* Replace when we have real mode working for vmx. +*/ + save->cs.base =0xf0000 ; save->gdtr.limit =0xffff ; save->idtr.limit =0xffff ;
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
PATCH 8/11 KVM: Two-way apic tpr synchronization
In reply to Avi KivityFrom: Dor Laor <dor.laor-atKUWr5tajBWk0Htik3J/[email protected]>
We report the value of cr8 to userspace on an exit. Also let userspace change cr8 when we re-enter the guest. The lets 64-bit guest code maintain the tpr correctly.
Thanks for Yaniv Kamay for the idea.
drivers/kvm/kvm_main.c +3 -0
@@ -1360,6 +1360,9 @@ static int kvm_dev_ioctl_run(struct kvmif (!vcpu)return -ENOENT ; +/* re-sync apic's tpr */ + vcpu->cr8 = kvm_run->cr8; +if (kvm_run->emulated) { kvm_arch_ops->skip_emulated_instruction (vcpu); kvm_run->emulated =0 ;
include/linux/kvm.h +2 -0
@@ -65,6 +65,8 @@ struct kvm_run {__u8 ready_for_interrupt_injection;__u8 if_flag;__u16 padding2; + +/* in (pre_kvm_run), out (post_kvm_run) */ __u64 cr8;__u64 apic_base;
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
PATCH 9/11 KVM: VMX: Reload ds and es even in 64-bit mode
In reply to Avi KivityOr 32-bit userspace will get confused.
drivers/kvm/vmx.c +0 -2
@@ -1863,9 +1863,7 @@ again:fx_restore (vcpu->host_fx_image); vcpu->interrupt_window_open = (vmcs_read32 (GUEST_INTERRUPTIBILITY_INFO ) &3 ) ==0 ; -#ifndef CONFIG_X86_64 asm ("mov %0, %%ds; mov %0, %%es" : :"r" (__USER_DS)); -#endif /* * Profile KVM exit RIPs:
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
PATCH 10/11 KVM: Fix mismatch between 32-bit and 64-bit abi
In reply to Avi KivityUnfortunately requiring a version bump.
include/linux/kvm.h +2 -1
@@ -11,7 +11,7 @@#include <asm/types.h> #include <linux/ioctl.h> -#define KVM_API_VERSION 2 +#define KVM_API_VERSION 3/* * Architectural interrupt line count, and the size of the bitmap needed
@@ -187,6 +187,7 @@ struct kvm_translation {__u8 valid;__u8 writeable;__u8 usermode; +__u8 pad[5 ]; };/* for KVM_INTERRUPT */
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
PATCH 11/11 KVM: fix vcpu freeing bug
In reply to Avi KivityFrom: Ingo Molnar <[email protected]>
vcpu_load() can return NULL and it sometimes does in failure paths (for example when the userspace ABI version is too old) - causing a preemption count underflow in the ->vcpu_free() later on. So check for NULL.
drivers/kvm/kvm_main.c +3 -1
@@ -272,7 +272,9 @@ static void kvm_free_physmem(struct kvmstatic void kvm_free_vcpu (struct kvm_vcpu *vcpu) { -vcpu_load (vcpu->kvm,vcpu_slot (vcpu)); +if (!vcpu_load (vcpu->kvm,vcpu_slot (vcpu))) +return ; +kvm_mmu_destroy (vcpu);vcpu_put (vcpu); kvm_arch_ops->vcpu_free (vcpu);
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV