qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v2 uq/master 2/2] x86: cpuid: reconstruct leaf 0


From: Paolo Bonzini
Subject: Re: [Qemu-devel] [PATCH v2 uq/master 2/2] x86: cpuid: reconstruct leaf 0Dh data
Date: Wed, 02 Oct 2013 17:37:31 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130923 Thunderbird/17.0.9

Il 02/10/2013 17:21, Gleb Natapov ha scritto:
>> -        if (kvm_enabled()) {
>> -            KVMState *s = cs->kvm_state;
>> +        kvm_mask =
>> +            kvm_arch_get_supported_cpuid(s, 0xd, 0, R_EAX) |
>> +            ((uint64_t)kvm_arch_get_supported_cpuid(s, 0xd, 0, R_EDX) << 
>> 32);
>>  
>> -            *eax = kvm_arch_get_supported_cpuid(s, 0xd, count, R_EAX);
>> -            *ebx = kvm_arch_get_supported_cpuid(s, 0xd, count, R_EBX);
>> -            *ecx = kvm_arch_get_supported_cpuid(s, 0xd, count, R_ECX);
>> -            *edx = kvm_arch_get_supported_cpuid(s, 0xd, count, R_EDX);
>> -        } else {
>> -            *eax = 0;
>> -            *ebx = 0;
>> -            *ecx = 0;
>> -            *edx = 0;
>> +        if (count == 0) {
>> +            *ecx = 0x240;
>> +            for (i = 2; i < ARRAY_SIZE(ext_save_areas); i++) {
>> +                const ExtSaveArea *esa = &ext_save_areas[i];
>> +                if ((env->features[esa->feature] & esa->bits) == esa->bits 
>> &&
>> +                    (kvm_mask & (1 << i)) != 0) {
>> +                    if (i < 32) {
>> +                        *eax |= 1 << i;
>> +                    } else {
>> +                        *edx |= 1 << (i - 32);
>> +                    }
>> +                    *ecx = MAX(*ecx, esa->offset + esa->size);
>> +                }
>> +            }
>> +            *eax |= kvm_mask & 3;
> Lets use define from previous patch.

Right.

>> +            *ebx = *ecx;
>> +        } else if (count == 1) {
>> +            *eax = kvm_arch_get_supported_cpuid(s, 0xd, 1, R_EAX);
>> +        } else if (count < ARRAY_SIZE(ext_save_areas)) {
>> +            const ExtSaveArea *esa = &ext_save_areas[count];
>> +            if ((env->features[esa->feature] & esa->bits) == esa->bits &&
>> +                (kvm_mask & (1 << count)) != 0) {
>> +                *eax = esa->offset;
>> +                *ebx = esa->size;
> Why do you hard code them instead of querying kernel? What if they
> depend on cpu type? (well if this happens we can forget about
> migration, but still...)

HPA confirmed (on xen-devel) that they will not depend on the CPU type.
 All offsets are documented in the SDM and in the additional Skylake
manual except for MPX, and he reported that he'd ask for MPX to be
documented as well.  As you said, if they changed it would be a total mess.

I hardcoded them because this is not KVM-specific knowledge.  TCG could
in principle reuse the same code, just skipping the part where it masks
away features not supported by KVM.

Paolo



reply via email to

[Prev in Thread] Current Thread [Next in Thread]