Re: [PATCH v2 uq/master 2/2] x86: cpuid: reconstruct leaf 0Dh data

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

 



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
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux