qemu-kvm.git uq/master queue
The following changes since commit 4972d592113c627d4b6ea1be5c94a85b56099afd:
Stefan Weil (1):
win32: Add missing function ffs
are available in the git repository at:
git://git.kernel.org/pub/scm/virt/kvm/qemu-kvm.git uq/master
Andre Przywara (1):
fix CPUID vendor override
Jan Kiszka (1):
kvm: Switch kvm_update_guest_debug to run_on_cpu
Marcelo Tosatti (1):
kvm: init mp_state
Sheng Yang (4):
kvm: Extend kvm_arch_get_supported_cpuid() to support index Enable XSAVE related CPUID
kvm: Enable XSAVE live migration support
kvm: Fix cpu_is_bsp() compilation warning
kvm-all.c | 33 +++++++--- kvm.h | 4 +- target-i386/cpu.h | 7 ++- target-i386/cpuid.c | 23 +++++++- target-i386/kvm.c | 165 ++++++++++++++++++++++++++++++++++++++++++++++--- target-i386/machine.c | 20 ++++++ 6 files changed, 228 insertions(+), 24 deletions(-)
PATCH 1/7 kvm: Switch kvm_update_guest_debug to run_on_cpu
From: Jan Kiszka <[email protected]>
Guest debugging under KVM is currently broken once io-threads are enabled. Easily fixable by switching the fake on_vcpu to the real run_on_cpu implementation.
--- kvm-all.c | 12 +----------- 1 files changed, 1 insertions(+), 11 deletions(-)
kvm-all.c +1 -11
@@ -1033,16 +1033,6 @@ void kvm_setup_guest_memory(void *start, size_t size) }#ifdef KVM_CAP_SET_GUEST_DEBUG -static void on_vcpu (CPUState *env,void (*func)(void *data),void *data) -{ -#ifdef CONFIG_IOTHREAD -if (env != cpu_single_env) { -abort (); - } -#endif -func (data); -} -struct kvm_sw_breakpoint *kvm_find_sw_breakpoint (CPUState *env,target_ulong pc) {
@@ -1086,7 +1076,7 @@ int kvm_update_guest_debug(CPUState *env, unsigned long reinject_trap)kvm_arch_update_guest_debug (env, &data.dbg); data.env = env; -on_vcpu (env, kvm_invoke_set_guest_debug, &data); +run_on_cpu (env, kvm_invoke_set_guest_debug, &data);return data.err; }
Signature · 1 line
1.6.6.1
PATCH 2/7 fix CPUID vendor override
In reply to Marcelo TosattiFrom: Andre Przywara <[email protected]>
the meaning of vendor_override is actually the opposite of how it is currently used :-(
Fix it to allow KVM to export the non-native CPUID vendor if explicitly requested by the user.
The intended behavior is:
With TCG:
- always inject the configured vendor (either hard-coded, in config files or via ",vendor=" commandline)
With KVM:
- by default inject the host's vendor
- if the user specifies ",vendor=" on the commandline, use this instead of the host's vendor
- all pre-configured vendors (hard-coded, config file) are ignored
--- target-i386/cpuid.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
target-i386/cpuid.c +1 -1
@@ -982,7 +982,7 @@ static void get_cpuid_vendor(CPUX86State *env, uint32_t *ebx,* this if you want to use KVM's sysenter/syscall emulation * in compatibility mode and when doing cross vendor migration */ -if (kvm_enabled () && env->cpuid_vendor_override) { +if (kvm_enabled () && ! env->cpuid_vendor_override) {host_cpuid (0 ,0 ,NULL , ebx, ecx, edx); } }
Signature · 1 line
1.6.6.1
PATCH 3/7 kvm: Extend kvm_arch_get_supported_cpuid() to support index
In reply to Marcelo TosattiFrom: Sheng Yang <[email protected]>
Would use it later for XSAVE related CPUID.
--- kvm.h | 2 +- target-i386/kvm.c | 19 +++++++++++-------- 2 files changed, 12 insertions(+), 9 deletions(-)
kvm.h +1 -1
@@ -144,7 +144,7 @@ bool kvm_arch_stop_on_emulation_error(CPUState *env);int kvm_check_extension (KVMState *s,unsigned int extension);uint32_t kvm_arch_get_supported_cpuid (CPUState *env,uint32_t function, -int reg); +uint32_t index,int reg);void kvm_cpu_synchronize_state (CPUState *env);void kvm_cpu_synchronize_post_reset (CPUState *env);void kvm_cpu_synchronize_post_init (CPUState *env);
target-i386/kvm.c +11 -8
@@ -71,7 +71,8 @@ static struct kvm_cpuid2 *try_get_cpuid(KVMState *s, int max)return cpuid; } -uint32_t kvm_arch_get_supported_cpuid (CPUState *env,uint32_t function,int reg) +uint32_t kvm_arch_get_supported_cpuid (CPUState *env,uint32_t function, +uint32_t index,int reg) {struct kvm_cpuid2 *cpuid;int i, max;
@@ -88,7 +89,8 @@ uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function, int reg) }for (i =0 ; i < cpuid->nent; ++i) { -if (cpuid->entries[i].function == function) { +if (cpuid->entries[i].function == function && + cpuid->entries[i].index == index) {switch (reg) {case R_EAX : ret = cpuid->entries[i].eax;
@@ -110,7 +112,7 @@ uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function, int reg)/* On Intel, kvm returns cpuid according to the Intel spec, * so add missing bits according to the AMD spec: */ - cpuid_1_edx =kvm_arch_get_supported_cpuid (env,1 ,R_EDX ); + cpuid_1_edx =kvm_arch_get_supported_cpuid (env,1 ,0 ,R_EDX ); ret |= cpuid_1_edx &0x183f7ff ;break ; }
@@ -126,7 +128,8 @@ uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function, int reg)#else -uint32_t kvm_arch_get_supported_cpuid (CPUState *env,uint32_t function,int reg) +uint32_t kvm_arch_get_supported_cpuid (CPUState *env,uint32_t function, +uint32_t index,int reg) {return -1U ; }
@@ -178,16 +181,16 @@ int kvm_arch_init_vcpu(CPUState *env) env->mp_state =KVM_MP_STATE_RUNNABLE ; - env->cpuid_features &=kvm_arch_get_supported_cpuid (env,1 ,R_EDX ); + env->cpuid_features &=kvm_arch_get_supported_cpuid (env,1 ,0 ,R_EDX ); i = env->cpuid_ext_features &CPUID_EXT_HYPERVISOR ; - env->cpuid_ext_features &=kvm_arch_get_supported_cpuid (env,1 ,R_ECX ); + env->cpuid_ext_features &=kvm_arch_get_supported_cpuid (env,1 ,0 ,R_ECX ); env->cpuid_ext_features |= i; env->cpuid_ext2_features &=kvm_arch_get_supported_cpuid (env,0x80000001 , -R_EDX ); +0 ,R_EDX ); env->cpuid_ext3_features &=kvm_arch_get_supported_cpuid (env,0x80000001 , -R_ECX ); +0 ,R_ECX ); cpuid_i =0 ;
Signature · 1 line
1.6.6.1
PATCH 4/7 Enable XSAVE related CPUID
In reply to Marcelo TosattiFrom: Sheng Yang <[email protected]>
We can support it in KVM now. The 0xd leaf is queried from KVM.
--- target-i386/cpuid.c | 21 +++++++++++++++++++++ 1 files changed, 21 insertions(+), 0 deletions(-)
target-i386/cpuid.c +21 -0
@@ -1087,6 +1087,27 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count, *ecx =0 ; *edx =0 ;break ; +case 0xD : +/* Processor Extended State */ +if (!(env->cpuid_ext_features &CPUID_EXT_XSAVE )) { + *eax =0 ; + *ebx =0 ; + *ecx =0 ; + *edx =0 ; +break ; + } +if (kvm_enabled ()) { + *eax =kvm_arch_get_supported_cpuid (env,0xd , count,R_EAX ); + *ebx =kvm_arch_get_supported_cpuid (env,0xd , count,R_EBX ); + *ecx =kvm_arch_get_supported_cpuid (env,0xd , count,R_ECX ); + *edx =kvm_arch_get_supported_cpuid (env,0xd , count,R_EDX ); + }else { + *eax =0 ; + *ebx =0 ; + *ecx =0 ; + *edx =0 ; + } +break ;case 0x80000000 : *eax = env->cpuid_xlevel; *ebx = env->cpuid_vendor1;
Signature · 1 line
1.6.6.1
PATCH 5/7 kvm: Enable XSAVE live migration support
In reply to Marcelo TosattiFrom: Sheng Yang <[email protected]>
--- kvm-all.c | 21 +++++++ kvm.h | 2 + target-i386/cpu.h | 7 ++- target-i386/kvm.c | 139 ++++++++++++++++++++++++++++++++++++++++++++++++- target-i386/machine.c | 20 +++++++ 5 files changed, 186 insertions(+), 3 deletions(-)
kvm-all.c +21 -0
@@ -71,6 +71,7 @@ struct KVMState#endif int irqchip_in_kernel;int pit_in_kernel; +int xsave, xcrs; };static KVMState *kvm_state;
@@ -686,6 +687,16 @@ int kvm_init(int smp_cpus) s->debugregs =kvm_check_extension (s,KVM_CAP_DEBUGREGS );#endif + s->xsave =0 ; +#ifdef KVM_CAP_XSAVE + s->xsave =kvm_check_extension (s,KVM_CAP_XSAVE ); +#endif + + s->xcrs =0 ; +#ifdef KVM_CAP_XCRS + s->xcrs =kvm_check_extension (s,KVM_CAP_XCRS ); +#endif + ret =kvm_arch_init (s, smp_cpus);if (ret <0 ) goto err;
@@ -1014,6 +1025,16 @@ int kvm_has_debugregs(void)return kvm_state->debugregs; } +int kvm_has_xsave (void ) +{ +return kvm_state->xsave; +} + +int kvm_has_xcrs (void ) +{ +return kvm_state->xcrs; +} +void kvm_setup_guest_memory (void *start,size_t size) {if (!kvm_has_sync_mmu ()) {
kvm.h +2 -0
@@ -40,6 +40,8 @@ int kvm_has_sync_mmu(void);int kvm_has_vcpu_events (void );int kvm_has_robust_singlestep (void );int kvm_has_debugregs (void ); +int kvm_has_xsave (void ); +int kvm_has_xcrs (void );#ifdef NEED_CPU_H int kvm_init_vcpu (CPUState *env);
target-i386/cpu.h +6 -1
@@ -718,6 +718,11 @@ typedef struct CPUX86State {uint16_t fpus_vmstate;uint16_t fptag_vmstate;uint16_t fpregs_format_vmstate; + +uint64_t xstate_bv; +XMMReg ymmh_regs[CPU_NB_REGS ]; + +uint64_t xcr0; } CPUX86State;CPUX86State *cpu_x86_init (const char *cpu_model);
@@ -899,7 +904,7 @@ uint64_t cpu_get_tsc(CPUX86State *env);#define cpu_list_id x86_cpu_list#define cpudef_setup x86_cpudef_setup -#define CPU_SAVE_VERSION 11 +#define CPU_SAVE_VERSION 12/* MMU modes definitions */ #define MMU_MODE0_SUFFIX _kernel
target-i386/kvm.c +137 -2
169 lines not on this page · raw message
target-i386/machine.c +20 -0
@@ -47,6 +47,22 @@ static const VMStateDescription vmstate_xmm_reg = {#define VMSTATE_XMM_REGS (_field, _state, _n) \ VMSTATE_STRUCT_ARRAY(_field, _state, _n, 0, vmstate_xmm_reg, XMMReg) +/* YMMH format is the same as XMM */ +static const VMStateDescription vmstate_ymmh_reg = { + .name ="ymmh_reg" , + .version_id =1 , + .minimum_version_id =1 , + .minimum_version_id_old =1 , + .fields = (VMStateField []) { +VMSTATE_UINT64 (XMM_Q (0 ), XMMReg), +VMSTATE_UINT64 (XMM_Q (1 ), XMMReg), +VMSTATE_END_OF_LIST () + } +}; + +#define VMSTATE_YMMH_REGS_VARS (_field, _state, _n, _v) \ + VMSTATE_STRUCT_ARRAY(_field, _state, _n, _v, vmstate_ymmh_reg, XMMReg) +static const VMStateDescription vmstate_mtrr_var = { .name ="mtrr_var" , .version_id =1 ,
@@ -453,6 +469,10 @@ static const VMStateDescription vmstate_cpu = {/* KVM pvclock msr */ VMSTATE_UINT64_V (system_time_msr, CPUState,11 ),VMSTATE_UINT64_V (wall_clock_msr, CPUState,11 ), +/* XSAVE related fields */ +VMSTATE_UINT64_V (xcr0, CPUState,12 ), +VMSTATE_UINT64_V (xstate_bv, CPUState,12 ), +VMSTATE_YMMH_REGS_VARS (ymmh_regs, CPUState,CPU_NB_REGS ,12 ),VMSTATE_END_OF_LIST () /* The above list is not sorted /wrt version numbers, watch out! */ }
Signature · 1 line
1.6.6.1
PATCH 6/7 kvm: init mp_state
In reply to Marcelo Tosatti--- target-i386/kvm.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-)
target-i386/kvm.c +6 -0
@@ -282,6 +282,12 @@ void kvm_arch_reset_vcpu(CPUState *env) env->interrupt_injected =-1 ; env->nmi_injected =0 ; env->nmi_pending =0 ; +if (kvm_irqchip_in_kernel ()) { + env->mp_state =cpu_is_bsp (env) ?KVM_MP_STATE_RUNNABLE : +KVM_MP_STATE_UNINITIALIZED ; + }else { + env->mp_state =KVM_MP_STATE_RUNNABLE ; + } }static int kvm_has_msr_star (CPUState *env)
Signature · 1 line
1.6.6.1
PATCH 7/7 kvm: Fix cpu_is_bsp() compilation warning
In reply to Marcelo TosattiFrom: Sheng Yang <[email protected]>
--- target-i386/kvm.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
target-i386/kvm.c +1 -0
@@ -25,6 +25,7 @@#include "gdbstub.h" #include "host-utils.h" #include "hw/pc.h" +#include "hw/apic.h" #include "ioport.h" #ifdef CONFIG_KVM_PARA
Signature · 1 line
1.6.6.1
Quoted 14 lines · Marcelo Tosatti
The following changes since commit
4972d592113c627d4b6ea1be5c94a85b56099afd:
Stefan Weil (1):
win32: Add missing function ffsare available in the git repository at:
git://git.kernel.org/pub/scm/virt/kvm/qemu-kvm.gituq/masterAndre Przywara (1):
fix CPUID vendor overrideJan Kiszka (1):
kvm: Switchkvm_update_guest_debugtorun_on_cpu
Quoted 9 lines
Marcelo Tosatti (1):
kvm: initmp_stateSheng Yang (4):
kvm: Extendkvm_arch_get_supported_cpuid()to support index Enable XSAVE related CPUID
kvm: Enable XSAVE live migration support
kvm: Fixcpu_is_bsp()compilation warning
Pulled. Thanks.
Regards,
Anthony Liguori
Quoted 10 lines
kvm-all.c | 33 +++++++--- kvm.h | 4 +- target-i386/cpu.h | 7 ++- target-i386/cpuid.c | 23 +++++++- target-i386/kvm.c | 165 ++++++++++++++++++++++++++++++++++++++++++++++--- target-i386/machine.c | 20 ++++++ 6 files changed, 228 insertions(+), 24 deletions(-)