qemu-kvm.git uq/master queue
Anthony,
This obsoletes "[PULL v2 0/9] KVM changes for 2013-08-23"
The following changes since commit f03d07d4683b2e8325a7cb60b4e14b977b1a869c:
Merge remote-tracking branch 'quintela/migration.next' into staging (2013-07-23 10:57:23 -0500)
are available in the git repository at:
git://git.kernel.org/pub/scm/virt/kvm/qemu-kvm.git uq/master
for you to fetch changes up to 821c808bd1863efc2c1e977800ae77db633a185c:
kvm-stub: fix compilation (2013-08-28 17:07:02 +0300)
----------------------------------------------------------------
Arthur Chunqi Li (1):
Initialize IA32_FEATURE_CONTROL MSR in reset and migration
Jan Kiszka (1):
kvm: Simplify kvm_handle_io
Liu Jinsong (1):
kvm: x86: fix setting IA32_FEATURE_CONTROL with nested VMX disabled
Marcelo Tosatti (2):
kvm-all.c: max_cpus should not exceed KVM vcpu limit
kvm: i386: fix LAPIC TSC deadline timer save/restore
Paolo Bonzini (3):
target-i386: remove tabs from target-i386/cpu.h
kvm: migrate vPMU state
kvm-stub: fix compilation
Vincenzo Maffione (1):
kvm: add KVM_IRQFD_FLAG_RESAMPLE support
Wei Yang (1):
kvm: shorten the parameter list for get_real_device()
hw/i386/kvm/pci-assign.c | 9 +- hw/misc/vfio.c | 4 +- hw/virtio/virtio-pci.c | 2 +- include/sysemu/kvm.h | 3 +- kvm-all.c | 52 +++++------ kvm-stub.c | 3 +- target-i386/cpu.h | 217 ++++++++++++++++++++++++++-------------------- target-i386/kvm.c | 139 +++++++++++++++++++++++++++-- target-i386/machine.c | 66 ++++++++++++++ 9 files changed, 351 insertions(+), 144 deletions(-)
PATCH 1/10 Initialize IA32_FEATURE_CONTROL MSR in reset and migration
From: Arthur Chunqi Li <[email protected]>
The recent KVM patch adds IA32_FEATURE_CONTROL support. QEMU needs to clear this MSR when reset vCPU and keep the value of it when migration. This patch add this feature.
--- target-i386/cpu.h | 2 ++ target-i386/kvm.c | 4 ++++ target-i386/machine.c | 22 ++++++++++++++++++++++ 3 files changed, 28 insertions(+)
target-i386/cpu.h +2 -0
@@ -301,6 +301,7 @@#define MSR_IA32_APICBASE_BSP (1<<8)#define MSR_IA32_APICBASE_ENABLE (1<<11)#define MSR_IA32_APICBASE_BASE (0xfffff<<12) +#define MSR_IA32_FEATURE_CONTROL 0x0000003a#define MSR_TSC_ADJUST 0x0000003b#define MSR_IA32_TSCDEADLINE 0x6e0
@@ -813,6 +814,7 @@ typedef struct CPUX86State {uint64_t mcg_status;uint64_t msr_ia32_misc_enable; +uint64_t msr_ia32_feature_control;/* exception/interrupt handling */ int error_code;
target-i386/kvm.c +4 -0
@@ -1121,6 +1121,7 @@ static int kvm_put_msrs(X86CPU *cpu, int level)if (hyperv_vapic_recommended ()) {kvm_msr_entry_set (&msrs[n++],HV_X64_MSR_APIC_ASSIST_PAGE ,0 ); } +kvm_msr_entry_set (&msrs[n++],MSR_IA32_FEATURE_CONTROL , env->msr_ia32_feature_control); }if (env->mcg_cap) {int i;
@@ -1345,6 +1346,7 @@ static int kvm_get_msrs(X86CPU *cpu)if (has_msr_misc_enable) { msrs[n++].index =MSR_IA32_MISC_ENABLE ; } + msrs[n++].index =MSR_IA32_FEATURE_CONTROL ;if (!env->tsc_valid) { msrs[n++].index =MSR_IA32_TSC ;
@@ -1443,6 +1445,8 @@ static int kvm_get_msrs(X86CPU *cpu)case MSR_IA32_MISC_ENABLE : env->msr_ia32_misc_enable = msrs[i].data;break ; +case MSR_IA32_FEATURE_CONTROL : + env->msr_ia32_feature_control = msrs[i].data;default :if (msrs[i].index >=MSR_MC0_CTL && msrs[i].index <MSR_MC0_CTL + (env->mcg_cap &0xff ) *4 ) {
target-i386/machine.c +22 -0
@@ -435,6 +435,14 @@ static bool misc_enable_needed(void *opaque)return env->msr_ia32_misc_enable !=MSR_IA32_MISC_ENABLE_DEFAULT ; } +static bool feature_control_needed (void *opaque) +{ +X86CPU *cpu = opaque; +CPUX86State *env = &cpu->env; + +return env->msr_ia32_feature_control !=0 ; +} +static const VMStateDescription vmstate_msr_ia32_misc_enable = { .name ="cpu/msr_ia32_misc_enable" , .version_id =1 ,
@@ -446,6 +454,17 @@ static const VMStateDescription vmstate_msr_ia32_misc_enable = { } }; +static const VMStateDescription vmstate_msr_ia32_feature_control = { + .name ="cpu/msr_ia32_feature_control" , + .version_id =1 , + .minimum_version_id =1 , + .minimum_version_id_old =1 , + .fields = (VMStateField []) { +VMSTATE_UINT64 (env.msr_ia32_feature_control,X86CPU ), +VMSTATE_END_OF_LIST () + } +}; +const VMStateDescription vmstate_x86_cpu = { .name ="cpu" , .version_id =12 ,
@@ -571,6 +590,9 @@ const VMStateDescription vmstate_x86_cpu = { }, { .vmsd = &vmstate_msr_ia32_misc_enable, .needed = misc_enable_needed, + }, { + .vmsd = &vmstate_msr_ia32_feature_control, + .needed = feature_control_needed, } , { /* empty */ }
Signature · 1 line
1.7.10.4
PATCH 2/10 target-i386: remove tabs from target-i386/cpu.h
In reply to Gleb NatapovFrom: Paolo Bonzini <[email protected]>
--- target-i386/cpu.h | 192 ++++++++++++++++++++++++++--------------------------- 1 file changed, 96 insertions(+), 96 deletions(-)
target-i386/cpu.h +96 -96
@@ -37,9 +37,9 @@#define TARGET_HAS_ICE 1#ifdef TARGET_X86_64 -#define ELF_MACHINE EM_X86_64 +#define ELF_MACHINE EM_X86_64#else -#define ELF_MACHINE EM_386 +#define ELF_MACHINE EM_386#endif #define CPUArchState struct CPUX86State
@@ -98,10 +98,10 @@#define DESC_TSS_BUSY_MASK (1 << 9)/* eflags masks */ -#define CC_C 0x0001 -#define CC_P 0x0004 -#define CC_A 0x0010 -#define CC_Z 0x0040 +#define CC_C 0x0001 +#define CC_P 0x0004 +#define CC_A 0x0010 +#define CC_Z 0x0040#define CC_S 0x0080#define CC_O 0x0800
@@ -109,14 +109,14 @@#define IOPL_SHIFT 12#define VM_SHIFT 17 -#define TF_MASK 0x00000100 -#define IF_MASK 0x00000200 -#define DF_MASK 0x00000400 -#define IOPL_MASK 0x00003000 -#define NT_MASK 0x00004000 -#define RF_MASK 0x00010000 -#define VM_MASK 0x00020000 -#define AC_MASK 0x00040000 +#define TF_MASK 0x00000100 +#define IF_MASK 0x00000200 +#define DF_MASK 0x00000400 +#define IOPL_MASK 0x00003000 +#define NT_MASK 0x00004000 +#define RF_MASK 0x00010000 +#define VM_MASK 0x00020000 +#define AC_MASK 0x00040000#define VIF_MASK 0x00080000#define VIP_MASK 0x00100000#define ID_MASK 0x00200000
@@ -238,28 +238,28 @@#define DR7_TYPE_IO_RW 0x2#define DR7_TYPE_DATA_RW 0x3 -#define PG_PRESENT_BIT 0 -#define PG_RW_BIT 1 -#define PG_USER_BIT 2 -#define PG_PWT_BIT 3 -#define PG_PCD_BIT 4 -#define PG_ACCESSED_BIT 5 -#define PG_DIRTY_BIT 6 -#define PG_PSE_BIT 7 -#define PG_GLOBAL_BIT 8 -#define PG_NX_BIT 63 +#define PG_PRESENT_BIT 0 +#define PG_RW_BIT 1 +#define PG_USER_BIT 2 +#define PG_PWT_BIT 3 +#define PG_PCD_BIT 4 +#define PG_ACCESSED_BIT 5 +#define PG_DIRTY_BIT 6 +#define PG_PSE_BIT 7 +#define PG_GLOBAL_BIT 8 +#define PG_NX_BIT 63#define PG_PRESENT_MASK (1 << PG_PRESENT_BIT) -#define PG_RW_MASK (1 << PG_RW_BIT) -#define PG_USER_MASK (1 << PG_USER_BIT) -#define PG_PWT_MASK (1 << PG_PWT_BIT) -#define PG_PCD_MASK (1 << PG_PCD_BIT) +#define PG_RW_MASK (1 << PG_RW_BIT) +#define PG_USER_MASK (1 << PG_USER_BIT) +#define PG_PWT_MASK (1 << PG_PWT_BIT) +#define PG_PCD_MASK (1 << PG_PCD_BIT)#define PG_ACCESSED_MASK (1 << PG_ACCESSED_BIT) -#define PG_DIRTY_MASK (1 << PG_DIRTY_BIT) -#define PG_PSE_MASK (1 << PG_PSE_BIT) -#define PG_GLOBAL_MASK (1 << PG_GLOBAL_BIT) +#define PG_DIRTY_MASK (1 << PG_DIRTY_BIT) +#define PG_PSE_MASK (1 << PG_PSE_BIT) +#define PG_GLOBAL_MASK (1 << PG_GLOBAL_BIT)#define PG_HI_USER_MASK 0x7ff0000000000000LL -#define PG_NX_MASK (1LL << PG_NX_BIT) +#define PG_NX_MASK (1LL << PG_NX_BIT)#define PG_ERROR_W_BIT 1
@@ -269,32 +269,32 @@#define PG_ERROR_RSVD_MASK 0x08#define PG_ERROR_I_D_MASK 0x10 -#define MCG_CTL_P (1ULL<<8)/* MCG_CAP register available */ -#define MCG_SER_P (1ULL<<24)/* MCA recovery/new status bits */ +#define MCG_CTL_P (1ULL<<8)/* MCG_CAP register available */ +#define MCG_SER_P (1ULL<<24)/* MCA recovery/new status bits */ -#define MCE_CAP_DEF (MCG_CTL_P|MCG_SER_P) -#define MCE_BANKS_DEF 10 +#define MCE_CAP_DEF (MCG_CTL_P|MCG_SER_P) +#define MCE_BANKS_DEF 10 -#define MCG_STATUS_RIPV (1ULL<<0)/* restart ip valid */ -#define MCG_STATUS_EIPV (1ULL<<1)/* ip points to correct instruction */ -#define MCG_STATUS_MCIP (1ULL<<2)/* machine check in progress */ +#define MCG_STATUS_RIPV (1ULL<<0)/* restart ip valid */ +#define MCG_STATUS_EIPV (1ULL<<1)/* ip points to correct instruction */ +#define MCG_STATUS_MCIP (1ULL<<2)/* machine check in progress */ -#define MCI_STATUS_VAL (1ULL<<63)/* valid error */ -#define MCI_STATUS_OVER (1ULL<<62)/* previous errors lost */ -#define MCI_STATUS_UC (1ULL<<61)/* uncorrected error */ -#define MCI_STATUS_EN (1ULL<<60)/* error enabled */ -#define MCI_STATUS_MISCV (1ULL<<59)/* misc error reg. valid */ -#define MCI_STATUS_ADDRV (1ULL<<58)/* addr reg. valid */ -#define MCI_STATUS_PCC (1ULL<<57)/* processor context corrupt */ -#define MCI_STATUS_S (1ULL<<56)/* Signaled machine check */ -#define MCI_STATUS_AR (1ULL<<55)/* Action required */ +#define MCI_STATUS_VAL (1ULL<<63)/* valid error */ +#define MCI_STATUS_OVER (1ULL<<62)/* previous errors lost */ +#define MCI_STATUS_UC (1ULL<<61)/* uncorrected error */ +#define MCI_STATUS_EN (1ULL<<60)/* error enabled */ +#define MCI_STATUS_MISCV (1ULL<<59)/* misc error reg. valid */ +#define MCI_STATUS_ADDRV (1ULL<<58)/* addr reg. valid */ +#define MCI_STATUS_PCC (1ULL<<57)/* processor context corrupt */ +#define MCI_STATUS_S (1ULL<<56)/* Signaled machine check */ +#define MCI_STATUS_AR (1ULL<<55)/* Action required */ /* MISC register defines */ -#define MCM_ADDR_SEGOFF 0/* segment offset */ -#define MCM_ADDR_LINEAR 1/* linear address */ -#define MCM_ADDR_PHYS 2/* physical address */ -#define MCM_ADDR_MEM 3/* memory address */ -#define MCM_ADDR_GENERIC 7/* generic */ +#define MCM_ADDR_SEGOFF 0/* segment offset */ +#define MCM_ADDR_LINEAR 1/* linear address */ +#define MCM_ADDR_PHYS 2/* physical address */ +#define MCM_ADDR_MEM 3/* memory address */ +#define MCM_ADDR_GENERIC 7/* generic */ #define MSR_IA32_TSC 0x10#define MSR_IA32_APICBASE 0x1b
@@ -305,10 +305,10 @@#define MSR_TSC_ADJUST 0x0000003b#define MSR_IA32_TSCDEADLINE 0x6e0 -#define MSR_MTRRcap 0xfe -#define MSR_MTRRcap_VCNT 8 -#define MSR_MTRRcap_FIXRANGE_SUPPORT (1 << 8) -#define MSR_MTRRcap_WC_SUPPORTED (1 << 10) +#define MSR_MTRRcap 0xfe +#define MSR_MTRRcap_VCNT 8 +#define MSR_MTRRcap_FIXRANGE_SUPPORT (1 << 8) +#define MSR_MTRRcap_WC_SUPPORTED (1 << 10)#define MSR_IA32_SYSENTER_CS 0x174#define MSR_IA32_SYSENTER_ESP 0x175
@@ -320,33 +320,33 @@#define MSR_IA32_PERF_STATUS 0x198 -#define MSR_IA32_MISC_ENABLE 0x1a0 +#define MSR_IA32_MISC_ENABLE 0x1a0/* Indicates good rep/movs microcode on some processors: */ #define MSR_IA32_MISC_ENABLE_DEFAULT 1 -#define MSR_MTRRphysBase (reg) (0x200 + 2 * (reg)) -#define MSR_MTRRphysMask (reg) (0x200 + 2 * (reg) + 1) - -#define MSR_MTRRfix64K_00000 0x250 -#define MSR_MTRRfix16K_80000 0x258 -#define MSR_MTRRfix16K_A0000 0x259 -#define MSR_MTRRfix4K_C0000 0x268 -#define MSR_MTRRfix4K_C8000 0x269 -#define MSR_MTRRfix4K_D0000 0x26a -#define MSR_MTRRfix4K_D8000 0x26b -#define MSR_MTRRfix4K_E0000 0x26c -#define MSR_MTRRfix4K_E8000 0x26d -#define MSR_MTRRfix4K_F0000 0x26e -#define MSR_MTRRfix4K_F8000 0x26f +#define MSR_MTRRphysBase (reg) (0x200 + 2 * (reg)) +#define MSR_MTRRphysMask (reg) (0x200 + 2 * (reg) + 1) + +#define MSR_MTRRfix64K_00000 0x250 +#define MSR_MTRRfix16K_80000 0x258 +#define MSR_MTRRfix16K_A0000 0x259 +#define MSR_MTRRfix4K_C0000 0x268 +#define MSR_MTRRfix4K_C8000 0x269 +#define MSR_MTRRfix4K_D0000 0x26a +#define MSR_MTRRfix4K_D8000 0x26b +#define MSR_MTRRfix4K_E0000 0x26c +#define MSR_MTRRfix4K_E8000 0x26d +#define MSR_MTRRfix4K_F0000 0x26e +#define MSR_MTRRfix4K_F8000 0x26f#define MSR_PAT 0x277 -#define MSR_MTRRdefType 0x2ff +#define MSR_MTRRdefType 0x2ff -#define MSR_MC0_CTL 0x400 -#define MSR_MC0_STATUS 0x401 -#define MSR_MC0_ADDR 0x402 -#define MSR_MC0_MISC 0x403 +#define MSR_MC0_CTL 0x400 +#define MSR_MC0_STATUS 0x401 +#define MSR_MC0_ADDR 0x402 +#define MSR_MC0_MISC 0x403#define MSR_EFER 0xc0000080
@@ -550,24 +550,24 @@ typedef uint32_t FeatureWordArray[FEATURE_WORDS];#define CPUID_MWAIT_IBE (1 << 1)/* Interrupts can exit capability */ #define CPUID_MWAIT_EMX (1 << 0)/* enumeration supported */ -#define EXCP00_DIVZ 0 -#define EXCP01_DB 1 -#define EXCP02_NMI 2 -#define EXCP03_INT3 3 -#define EXCP04_INTO 4 -#define EXCP05_BOUND 5 -#define EXCP06_ILLOP 6 -#define EXCP07_PREX 7 -#define EXCP08_DBLE 8 -#define EXCP09_XERR 9 -#define EXCP0A_TSS 10 -#define EXCP0B_NOSEG 11 -#define EXCP0C_STACK 12 -#define EXCP0D_GPF 13 -#define EXCP0E_PAGE 14 -#define EXCP10_COPR 16 -#define EXCP11_ALGN 17 -#define EXCP12_MCHK 18 +#define EXCP00_DIVZ 0 +#define EXCP01_DB 1 +#define EXCP02_NMI 2 +#define EXCP03_INT3 3 +#define EXCP04_INTO 4 +#define EXCP05_BOUND 5 +#define EXCP06_ILLOP 6 +#define EXCP07_PREX 7 +#define EXCP08_DBLE 8 +#define EXCP09_XERR 9 +#define EXCP0A_TSS 10 +#define EXCP0B_NOSEG 11 +#define EXCP0C_STACK 12 +#define EXCP0D_GPF 13 +#define EXCP0E_PAGE 14 +#define EXCP10_COPR 16 +#define EXCP11_ALGN 17 +#define EXCP12_MCHK 18#define EXCP_SYSCALL 0x100/* only happens in user only emulation for syscall instruction */
@@ -1087,7 +1087,7 @@ static inline CPUX86State *cpu_init(const char *cpu_model)#define cpu_gen_code cpu_x86_gen_code#define cpu_signal_handler cpu_x86_signal_handler#define cpu_list x86_cpu_list -#define cpudef_setup x86_cpudef_setup +#define cpudef_setup x86_cpudef_setup/* MMU modes definitions */ #define MMU_MODE0_SUFFIX _kernel
Signature · 1 line
1.7.10.4
PATCH 3/10 kvm: migrate vPMU state
In reply to Gleb NatapovFrom: Paolo Bonzini <[email protected]>
--- target-i386/cpu.h | 23 ++++++++++++ target-i386/kvm.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++--- target-i386/machine.c | 44 +++++++++++++++++++++++ 3 files changed, 155 insertions(+), 5 deletions(-)
target-i386/cpu.h +23 -0
@@ -305,6 +305,8 @@#define MSR_TSC_ADJUST 0x0000003b#define MSR_IA32_TSCDEADLINE 0x6e0 +#define MSR_P6_PERFCTR0 0xc1 +#define MSR_MTRRcap 0xfe#define MSR_MTRRcap_VCNT 8#define MSR_MTRRcap_FIXRANGE_SUPPORT (1 << 8)
@@ -318,6 +320,8 @@#define MSR_MCG_STATUS 0x17a#define MSR_MCG_CTL 0x17b +#define MSR_P6_EVNTSEL0 0x186 +#define MSR_IA32_PERF_STATUS 0x198#define MSR_IA32_MISC_ENABLE 0x1a0
@@ -343,6 +347,14 @@#define MSR_MTRRdefType 0x2ff +#define MSR_CORE_PERF_FIXED_CTR0 0x309 +#define MSR_CORE_PERF_FIXED_CTR1 0x30a +#define MSR_CORE_PERF_FIXED_CTR2 0x30b +#define MSR_CORE_PERF_FIXED_CTR_CTRL 0x38d +#define MSR_CORE_PERF_GLOBAL_STATUS 0x38e +#define MSR_CORE_PERF_GLOBAL_CTRL 0x38f +#define MSR_CORE_PERF_GLOBAL_OVF_CTRL 0x390 +#define MSR_MC0_CTL 0x400#define MSR_MC0_STATUS 0x401#define MSR_MC0_ADDR 0x402
@@ -721,6 +733,9 @@ typedef struct {#define CPU_NB_REGS CPU_NB_REGS32#endif +#define MAX_FIXED_COUNTERS 3 +#define MAX_GP_COUNTERS (MSR_IA32_PERF_STATUS - MSR_P6_EVNTSEL0) +#define NB_MMU_MODES 3 typedef enum TPRAccess {
@@ -816,6 +831,14 @@ typedef struct CPUX86State {uint64_t msr_ia32_misc_enable;uint64_t msr_ia32_feature_control; +uint64_t msr_fixed_ctr_ctrl; +uint64_t msr_global_ctrl; +uint64_t msr_global_status; +uint64_t msr_global_ovf_ctrl; +uint64_t msr_fixed_counters[MAX_FIXED_COUNTERS ]; +uint64_t msr_gp_counters[MAX_GP_COUNTERS ]; +uint64_t msr_gp_evtsel[MAX_GP_COUNTERS ]; +/* exception/interrupt handling */ int error_code;int exception_is_int;
target-i386/kvm.c +88 -5
141 lines not on this page · raw message
target-i386/machine.c +44 -0
56 lines not on this page · raw message
Signature · 1 line
1.7.10.4
PATCH 4/10 kvm: add KVM_IRQFD_FLAG_RESAMPLE support
In reply to Gleb NatapovFrom: Vincenzo Maffione <[email protected]>
Added an EventNotifier* parameter to kvm-all.c:kvm_irqchip_add_irqfd_notifier(), in order to give KVM another eventfd to be used as "resamplefd". See the documentation in the linux kernel sources in Documentation/virtual/kvm/api.txt (section 4.75) for more details.
When the added parameter is passed NULL, the behaviour of the function is unchanged with respect to the previous versions.
--- hw/misc/vfio.c | 4 ++-- hw/virtio/virtio-pci.c | 2 +- include/sysemu/kvm.h | 3 ++- kvm-all.c | 17 +++++++++++++---- 4 files changed, 18 insertions(+), 8 deletions(-)
hw/misc/vfio.c +2 -2
@@ -646,7 +646,7 @@ static int vfio_msix_vector_do_use(PCIDevice *pdev, unsigned int nr, vector->virq = msg ?kvm_irqchip_add_msi_route (kvm_state, *msg) :-1 ;if (vector->virq <0 ||kvm_irqchip_add_irqfd_notifier (kvm_state, &vector->interrupt, - vector->virq) <0 ) { +NULL , vector->virq) <0 ) {if (vector->virq >=0 ) {kvm_irqchip_release_virq (kvm_state, vector->virq); vector->virq =-1 ;
@@ -814,7 +814,7 @@ retry: vector->virq =kvm_irqchip_add_msi_route (kvm_state, msg);if (vector->virq <0 ||kvm_irqchip_add_irqfd_notifier (kvm_state, &vector->interrupt, - vector->virq) <0 ) { +NULL , vector->virq) <0 ) {qemu_set_fd_handler (event_notifier_get_fd (&vector->interrupt), vfio_msi_interrupt,NULL , vector); }
hw/virtio/virtio-pci.c +1 -1
@@ -508,7 +508,7 @@ static int kvm_virtio_pci_irqfd_use(VirtIOPCIProxy *proxy,VirtQueue *vq =virtio_get_queue (proxy->vdev, queue_no);EventNotifier *n =virtio_queue_get_guest_notifier (vq);int ret; - ret =kvm_irqchip_add_irqfd_notifier (kvm_state, n, irqfd->virq); + ret =kvm_irqchip_add_irqfd_notifier (kvm_state, n,NULL , irqfd->virq);return ret; }
include/sysemu/kvm.h +2 -1
@@ -309,7 +309,8 @@ int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg);int kvm_irqchip_update_msi_route (KVMState *s,int virq,MSIMessage msg);void kvm_irqchip_release_virq (KVMState *s,int virq); -int kvm_irqchip_add_irqfd_notifier (KVMState *s,EventNotifier *n,int virq); +int kvm_irqchip_add_irqfd_notifier (KVMState *s,EventNotifier *n, +EventNotifier *rn,int virq);int kvm_irqchip_remove_irqfd_notifier (KVMState *s,EventNotifier *n,int virq);void kvm_pc_gsi_handler (void *opaque,int n,int level);void kvm_pc_setup_irq_routing (bool pci_enabled);
kvm-all.c +13 -4
@@ -1230,7 +1230,8 @@ int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg)return kvm_update_routing_entry (s, &kroute); } -static int kvm_irqchip_assign_irqfd (KVMState *s,int fd,int virq,bool assign) +static int kvm_irqchip_assign_irqfd (KVMState *s,int fd,int rfd,int virq, +bool assign) {struct kvm_irqfd irqfd = { .fd = fd,
@@ -1238,6 +1239,11 @@ static int kvm_irqchip_assign_irqfd(KVMState *s, int fd, int virq, bool assign) .flags = assign ? 0 : KVM_IRQFD_FLAG_DEASSIGN, }; +if (rfd !=-1 ) { + irqfd.flags |=KVM_IRQFD_FLAG_RESAMPLE ; + irqfd.resamplefd = rfd; + } +if (!kvm_irqfds_enabled ()) {return -ENOSYS ; }
@@ -1276,14 +1282,17 @@ int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg) }#endif /* !KVM_CAP_IRQ_ROUTING */ -int kvm_irqchip_add_irqfd_notifier (KVMState *s,EventNotifier *n,int virq) +int kvm_irqchip_add_irqfd_notifier (KVMState *s,EventNotifier *n, +EventNotifier *rn,int virq) { -return kvm_irqchip_assign_irqfd (s,event_notifier_get_fd (n), virq, true); +return kvm_irqchip_assign_irqfd (s,event_notifier_get_fd (n), + rn ?event_notifier_get_fd (rn) :-1 , virq, true); }int kvm_irqchip_remove_irqfd_notifier (KVMState *s,EventNotifier *n,int virq) { -return kvm_irqchip_assign_irqfd (s,event_notifier_get_fd (n), virq, false); +return kvm_irqchip_assign_irqfd (s,event_notifier_get_fd (n),-1 , virq, + false); }static int kvm_irqchip_create (KVMState *s)
Signature · 1 line
1.7.10.4
PATCH 5/10 kvm: x86: fix setting IA32_FEATURE_CONTROL with nested VMX disabled
In reply to Gleb NatapovFrom: Liu Jinsong <[email protected]>
This patch is to fix the bug https://bugs.launchpad.net/qemu-kvm/+bug/1207623
IA32_FEATURE_CONTROL is pointless if not expose VMX or SMX bits to cpuid.1.ecx of vcpu. Current qemu-kvm will error return when kvm_put_msrs or kvm_get_msrs.
--- target-i386/kvm.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)
target-i386/kvm.c +15 -2
@@ -65,6 +65,7 @@ static bool has_msr_star;static bool has_msr_hsave_pa;static bool has_msr_tsc_adjust;static bool has_msr_tsc_deadline; +static bool has_msr_feature_control;static bool has_msr_async_pf_en;static bool has_msr_pv_eoi_en;static bool has_msr_misc_enable;
@@ -666,6 +667,12 @@ int kvm_arch_init_vcpu(CPUState *cs)qemu_add_vm_change_state_handler (cpu_update_state, env); + c =cpuid_find_entry (&cpuid_data.cpuid,1 ,0 ); +if (c) { + has_msr_feature_control = !!(c->ecx &CPUID_EXT_VMX ) || + !!(c->ecx &CPUID_EXT_SMX ); + } + cpuid_data.cpuid.padding =0 ; r =kvm_vcpu_ioctl (cs,KVM_SET_CPUID2 , &cpuid_data);if (r) {
@@ -1169,7 +1176,10 @@ static int kvm_put_msrs(X86CPU *cpu, int level)if (hyperv_vapic_recommended ()) {kvm_msr_entry_set (&msrs[n++],HV_X64_MSR_APIC_ASSIST_PAGE ,0 ); } -kvm_msr_entry_set (&msrs[n++],MSR_IA32_FEATURE_CONTROL , env->msr_ia32_feature_control); +if (has_msr_feature_control) { +kvm_msr_entry_set (&msrs[n++],MSR_IA32_FEATURE_CONTROL , + env->msr_ia32_feature_control); + } }if (env->mcg_cap) {int i;
@@ -1394,7 +1404,9 @@ static int kvm_get_msrs(X86CPU *cpu)if (has_msr_misc_enable) { msrs[n++].index =MSR_IA32_MISC_ENABLE ; } - msrs[n++].index =MSR_IA32_FEATURE_CONTROL ; +if (has_msr_feature_control) { + msrs[n++].index =MSR_IA32_FEATURE_CONTROL ; + }if (!env->tsc_valid) { msrs[n++].index =MSR_IA32_TSC ;
@@ -1509,6 +1521,7 @@ static int kvm_get_msrs(X86CPU *cpu)break ;case MSR_IA32_FEATURE_CONTROL : env->msr_ia32_feature_control = msrs[i].data; +break ;default :if (msrs[i].index >=MSR_MC0_CTL && msrs[i].index <MSR_MC0_CTL + (env->mcg_cap &0xff ) *4 ) {
Signature · 1 line
1.7.10.4
PATCH 6/10 kvm: Simplify kvm_handle_io
In reply to Gleb NatapovFrom: Jan Kiszka <[email protected]>
Now that cpu_in/out is just a wrapper around address_space_rw, we can also call the latter directly. As host endianness == guest endianness, there is no need for the memory access helpers st*_p/ld*_p as well.
--- kvm-all.c | 28 ++-------------------------- 1 file changed, 2 insertions(+), 26 deletions(-)
kvm-all.c +2 -26
@@ -1508,32 +1508,8 @@ static void kvm_handle_io(uint16_t port, void *data, int direction, int size,uint8_t *ptr = data;for (i =0 ; i < count; i++) { -if (direction ==KVM_EXIT_IO_IN ) { -switch (size) { -case 1 : -stb_p (ptr,cpu_inb (port)); -break ; -case 2 : -stw_p (ptr,cpu_inw (port)); -break ; -case 4 : -stl_p (ptr,cpu_inl (port)); -break ; - } - }else { -switch (size) { -case 1 : -cpu_outb (port,ldub_p (ptr)); -break ; -case 2 : -cpu_outw (port,lduw_p (ptr)); -break ; -case 4 : -cpu_outl (port,ldl_p (ptr)); -break ; - } - } - +address_space_rw (&address_space_io, port, ptr, size, + direction ==KVM_EXIT_IO_OUT ); ptr += size; } }
Signature · 1 line
1.7.10.4
PATCH 7/10 kvm-all.c: max_cpus should not exceed KVM vcpu limit
In reply to Gleb NatapovFrom: Marcelo Tosatti <[email protected]>
maxcpus, which specifies the maximum number of hotpluggable CPUs, should not exceed KVM's vcpu limit.
--- kvm-all.c | 7 +++++++ 1 file changed, 7 insertions(+)
kvm-all.c +7 -0
@@ -1400,6 +1400,13 @@ int kvm_init(void) goto err; } +if (max_cpus > max_vcpus) { + ret = -EINVAL ; +fprintf (stderr,"Number of hotpluggable cpus requested (%d) exceeds max cpus " +"supported by KVM (%d)\n" , max_cpus, max_vcpus); + goto err; + } + s->vmfd =kvm_ioctl (s,KVM_CREATE_VM ,0 );if (s->vmfd <0 ) {#ifdef TARGET_S390X
Signature · 1 line
1.7.10.4
PATCH 8/10 kvm: i386: fix LAPIC TSC deadline timer save/restore
In reply to Gleb NatapovFrom: Marcelo Tosatti <[email protected]>
The configuration of the timer represented by MSR_IA32_TSCDEADLINE depends on:
- APIC LVT Timer register.
- TSC value.
Change the order to respect the dependency.
--- target-i386/kvm.c | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-)
target-i386/kvm.c +26 -3
@@ -1073,6 +1073,26 @@ static void kvm_msr_entry_set(struct kvm_msr_entry *entry, entry->data = value; } +static int kvm_put_tscdeadline_msr (X86CPU *cpu) +{ +CPUX86State *env = &cpu->env; +struct { +struct kvm_msrs info; +struct kvm_msr_entry entries[1 ]; + } msr_data; +struct kvm_msr_entry *msrs = msr_data.entries; + +if (!has_msr_tsc_deadline) { +return 0 ; + } + +kvm_msr_entry_set (&msrs[0 ],MSR_IA32_TSCDEADLINE , env->tsc_deadline); + + msr_data.info.nmsrs =1 ; + +return kvm_vcpu_ioctl (CPU (cpu),KVM_SET_MSRS , &msr_data); +} +static int kvm_put_msrs (X86CPU *cpu,int level) {CPUX86State *env = &cpu->env;
@@ -1096,9 +1116,6 @@ static int kvm_put_msrs(X86CPU *cpu, int level)if (has_msr_tsc_adjust) {kvm_msr_entry_set (&msrs[n++],MSR_TSC_ADJUST , env->tsc_adjust); } -if (has_msr_tsc_deadline) { -kvm_msr_entry_set (&msrs[n++],MSR_IA32_TSCDEADLINE , env->tsc_deadline); - }if (has_msr_misc_enable) {kvm_msr_entry_set (&msrs[n++],MSR_IA32_MISC_ENABLE , env->msr_ia32_misc_enable);
@@ -1808,6 +1825,12 @@ int kvm_arch_put_registers(CPUState *cpu, int level)return ret; } } + + ret =kvm_put_tscdeadline_msr (x86_cpu); +if (ret <0 ) { +return ret; + } + ret =kvm_put_vcpu_events (x86_cpu, level);if (ret <0 ) {return ret;
Signature · 1 line
1.7.10.4
PATCH 9/10 kvm: shorten the parameter list for get_real_device()
In reply to Gleb NatapovFrom: Wei Yang <[email protected]>
get_real_device() has 5 parameters with the last 4 is contained in the first structure.
This patch removes the last 4 parameters and directly use them from the first parameter.
--- hw/i386/kvm/pci-assign.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
hw/i386/kvm/pci-assign.c +4 -5
@@ -568,8 +568,7 @@ static int get_real_device_id(const char *devpath, uint16_t *val)return get_real_id (devpath,"device" , val); } -static int get_real_device (AssignedDevice *pci_dev,uint16_t r_seg, -uint8_t r_bus,uint8_t r_dev,uint8_t r_func) +static int get_real_device (AssignedDevice *pci_dev) {char dir[128 ], name[128 ];int fd, r =0 , v;
@@ -582,7 +581,8 @@ static int get_real_device(AssignedDevice *pci_dev, uint16_t r_seg, dev->region_number =0 ;snprintf (dir,sizeof (dir),"/sys/bus/pci/devices/%04x:%02x:%02x.%x/" , - r_seg, r_bus, r_dev, r_func); + pci_dev->host.domain, pci_dev->host.bus, + pci_dev->host.slot, pci_dev->host.function);snprintf (name,sizeof (name),"%sconfig" , dir);
@@ -1769,8 +1769,7 @@ static int assigned_initfn(struct PCIDevice *pci_dev)memcpy (dev->emulate_config_write, dev->emulate_config_read,sizeof (dev->emulate_config_read)); -if (get_real_device (dev, dev->host.domain, dev->host.bus, - dev->host.slot, dev->host.function)) { +if (get_real_device (dev)) {error_report ("pci-assign: Error: Couldn't get real device (%s)!" , dev->dev.qdev.id); goto out;
Signature · 1 line
1.7.10.4
PATCH 10/10 kvm-stub: fix compilation
In reply to Gleb NatapovFrom: Paolo Bonzini <[email protected]>
Non-KVM targets fail compilation on the uq/master branch. Fix the prototype of kvm_irqchip_add_irqfd_notifier to match the one in kvm-all.c.
--- kvm-stub.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
kvm-stub.c +2 -1
@@ -135,7 +135,8 @@ int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg)return -ENOSYS ; } -int kvm_irqchip_add_irqfd_notifier (KVMState *s,EventNotifier *n,int virq) +int kvm_irqchip_add_irqfd_notifier (KVMState *s,EventNotifier *n, +EventNotifier *rn,int virq) {return -ENOSYS ; }
Signature · 1 line
1.7.10.4