i386: kvm: set CPUID_EXT_TSC_DEADLINE_TIMER on kvm_arch_get_supported_cpuid()
This moves the CPUID_EXT_TSC_DEADLINE_TIMER CPUID flag hacking from kvm_arch_init_vcpu() to kvm_arch_get_supported_cpuid(). Full git grep for kvm_arch_get_supported_cpuid: kvm.h:uint32_t kvm_arch_get_supported_cpuid(KVMState *env, uint32_t function, target-i386/cpu.c: x86_cpu_def->cpuid_7_0_ebx_features = kvm_arch_get_supported_cpuid(kvm_state, 0x7, 0, R_EBX); target-i386/cpu.c: *eax = kvm_arch_get_supported_cpuid(s, 0xA, count, R_EAX); target-i386/cpu.c: *ebx = kvm_arch_get_supported_cpuid(s, 0xA, count, R_EBX); target-i386/cpu.c: *ecx = kvm_arch_get_supported_cpuid(s, 0xA, count, R_ECX); target-i386/cpu.c: *edx = kvm_arch_get_supported_cpuid(s, 0xA, count, R_EDX); target-i386/cpu.c: *eax = kvm_arch_get_supported_cpuid(s, 0xd, count, R_EAX); target-i386/cpu.c: *ebx = kvm_arch_get_supported_cpuid(s, 0xd, count, R_EBX); target-i386/cpu.c: *ecx = kvm_arch_get_supported_cpuid(s, 0xd, count, R_ECX); target-i386/cpu.c: *edx = kvm_arch_get_supported_cpuid(s, 0xd, count, R_EDX); target-i386/kvm.c:uint32_t kvm_arch_get_supported_cpuid(KVMState *s, uint32_t function, target-i386/kvm.c: cpuid_1_edx = kvm_arch_get_supported_cpuid(s, 1, 0, R_EDX); target-i386/kvm.c: env->cpuid_features &= kvm_arch_get_supported_cpuid(s, 1, 0, R_EDX); * target-i386/kvm.c: env->cpuid_ext_features &= kvm_arch_get_supported_cpuid(s, 1, 0, R_ECX); target-i386/kvm.c: env->cpuid_ext2_features &= kvm_arch_get_supported_cpuid(s, 0x80000001, target-i386/kvm.c: env->cpuid_ext3_features &= kvm_arch_get_supported_cpuid(s, 0x80000001, target-i386/kvm.c: env->cpuid_svm_features &= kvm_arch_get_supported_cpuid(s, 0x8000000A, target-i386/kvm.c: kvm_arch_get_supported_cpuid(s, KVM_CPUID_FEATURES, 0, R_EAX); target-i386/kvm.c: kvm_arch_get_supported_cpuid(s, 0xC0000001, 0, R_EDX); Note that there is only one call for CPUID[1].ECX above (*), and it is the one that gets hacked to include CPUID_EXT_TSC_DEADLINE_TIMER, so we can simply make kvm_arch_get_supported_cpuid() set it, to let the rest of the code know the flag can be safely set by QEMU. One thing I was worrying about when doing this is that now kvm_arch_get_supported_cpuid() depends on kvm_irqchip_in_kernel(). But the 'kvm_kernel_irqchip' global variable is initialized during kvm_init(), that is called very early, and kvm_init() is already a requirement to run the GET_SUPPORTED_CPUID ioctl() (as kvm_init() is the function that initializes the 'kvm_state' global variable). Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
This commit is contained in:
		
							parent
							
								
									84bd945cf2
								
							
						
					
					
						commit
						ac67ee260a
					
				| 
						 | 
				
			
			@ -201,6 +201,14 @@ uint32_t kvm_arch_get_supported_cpuid(KVMState *s, uint32_t function,
 | 
			
		|||
         * GET_SUPPORTED_CPUID
 | 
			
		||||
         */
 | 
			
		||||
        ret |= CPUID_EXT_HYPERVISOR;
 | 
			
		||||
        /* tsc-deadline flag is not returned by GET_SUPPORTED_CPUID, but it
 | 
			
		||||
         * can be enabled if the kernel has KVM_CAP_TSC_DEADLINE_TIMER,
 | 
			
		||||
         * and the irqchip is in the kernel.
 | 
			
		||||
         */
 | 
			
		||||
        if (kvm_irqchip_in_kernel() &&
 | 
			
		||||
                kvm_check_extension(s, KVM_CAP_TSC_DEADLINE_TIMER)) {
 | 
			
		||||
            ret |= CPUID_EXT_TSC_DEADLINE_TIMER;
 | 
			
		||||
        }
 | 
			
		||||
    } else if (function == 0x80000001 && reg == R_EDX) {
 | 
			
		||||
        /* On Intel, kvm returns cpuid according to the Intel spec,
 | 
			
		||||
         * so add missing bits according to the AMD spec:
 | 
			
		||||
| 
						 | 
				
			
			@ -404,12 +412,7 @@ int kvm_arch_init_vcpu(CPUX86State *env)
 | 
			
		|||
 | 
			
		||||
    env->cpuid_features &= kvm_arch_get_supported_cpuid(s, 1, 0, R_EDX);
 | 
			
		||||
 | 
			
		||||
    j = env->cpuid_ext_features & CPUID_EXT_TSC_DEADLINE_TIMER;
 | 
			
		||||
    env->cpuid_ext_features &= kvm_arch_get_supported_cpuid(s, 1, 0, R_ECX);
 | 
			
		||||
    if (j && kvm_irqchip_in_kernel() &&
 | 
			
		||||
        kvm_check_extension(s, KVM_CAP_TSC_DEADLINE_TIMER)) {
 | 
			
		||||
        env->cpuid_ext_features |= CPUID_EXT_TSC_DEADLINE_TIMER;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    env->cpuid_ext2_features &= kvm_arch_get_supported_cpuid(s, 0x80000001,
 | 
			
		||||
                                                             0, R_EDX);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue