diff options
author | BrillyWu@viatech.com.cn <BrillyWu@viatech.com.cn> | 2011-04-25 01:55:15 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2011-05-22 08:39:55 -0400 |
commit | 4429d5dc1197aaf8188e4febcde54d26a51baf6c (patch) | |
tree | 5771d9afaa59b319ef6a4058a36cb5d64f6f52f3 | |
parent | 2aab2c5b2bac6510b3bd143ca83babee382f4302 (diff) |
KVM: Add CPUID support for VIA CPU
The CPUIDs for Centaur are added, and then the features of
PadLock hardware engine on VIA CPU, such as "ace", "ace_en"
and so on, can be passed into the kvm guest.
Signed-off-by: Brilly Wu <brillywu@viatech.com.cn>
Signed-off-by: Kary Jin <karyjin@viatech.com.cn>
Signed-off-by: Avi Kivity <avi@redhat.com>
-rw-r--r-- | arch/x86/kvm/x86.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index f5f2d3d44577..22bc69ccf3ef 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -2336,6 +2336,12 @@ static void do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, | |||
2336 | F(3DNOWPREFETCH) | 0 /* OSVW */ | 0 /* IBS */ | F(XOP) | | 2336 | F(3DNOWPREFETCH) | 0 /* OSVW */ | 0 /* IBS */ | F(XOP) | |
2337 | 0 /* SKINIT, WDT, LWP */ | F(FMA4) | F(TBM); | 2337 | 0 /* SKINIT, WDT, LWP */ | F(FMA4) | F(TBM); |
2338 | 2338 | ||
2339 | /* cpuid 0xC0000001.edx */ | ||
2340 | const u32 kvm_supported_word5_x86_features = | ||
2341 | F(XSTORE) | F(XSTORE_EN) | F(XCRYPT) | F(XCRYPT_EN) | | ||
2342 | F(ACE2) | F(ACE2_EN) | F(PHE) | F(PHE_EN) | | ||
2343 | F(PMM) | F(PMM_EN); | ||
2344 | |||
2339 | /* all calls to cpuid_count() should be made on the same cpu */ | 2345 | /* all calls to cpuid_count() should be made on the same cpu */ |
2340 | get_cpu(); | 2346 | get_cpu(); |
2341 | do_cpuid_1_ent(entry, function, index); | 2347 | do_cpuid_1_ent(entry, function, index); |
@@ -2445,6 +2451,20 @@ static void do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, | |||
2445 | entry->ecx &= kvm_supported_word6_x86_features; | 2451 | entry->ecx &= kvm_supported_word6_x86_features; |
2446 | cpuid_mask(&entry->ecx, 6); | 2452 | cpuid_mask(&entry->ecx, 6); |
2447 | break; | 2453 | break; |
2454 | /*Add support for Centaur's CPUID instruction*/ | ||
2455 | case 0xC0000000: | ||
2456 | /*Just support up to 0xC0000004 now*/ | ||
2457 | entry->eax = min(entry->eax, 0xC0000004); | ||
2458 | break; | ||
2459 | case 0xC0000001: | ||
2460 | entry->edx &= kvm_supported_word5_x86_features; | ||
2461 | cpuid_mask(&entry->edx, 5); | ||
2462 | break; | ||
2463 | case 0xC0000002: | ||
2464 | case 0xC0000003: | ||
2465 | case 0xC0000004: | ||
2466 | /*Now nothing to do, reserved for the future*/ | ||
2467 | break; | ||
2448 | } | 2468 | } |
2449 | 2469 | ||
2450 | kvm_x86_ops->set_supported_cpuid(function, entry); | 2470 | kvm_x86_ops->set_supported_cpuid(function, entry); |
@@ -2491,6 +2511,26 @@ static int kvm_dev_ioctl_get_supported_cpuid(struct kvm_cpuid2 *cpuid, | |||
2491 | if (nent >= cpuid->nent) | 2511 | if (nent >= cpuid->nent) |
2492 | goto out_free; | 2512 | goto out_free; |
2493 | 2513 | ||
2514 | /* Add support for Centaur's CPUID instruction. */ | ||
2515 | if (boot_cpu_data.x86_vendor == X86_VENDOR_CENTAUR) { | ||
2516 | do_cpuid_ent(&cpuid_entries[nent], 0xC0000000, 0, | ||
2517 | &nent, cpuid->nent); | ||
2518 | |||
2519 | r = -E2BIG; | ||
2520 | if (nent >= cpuid->nent) | ||
2521 | goto out_free; | ||
2522 | |||
2523 | limit = cpuid_entries[nent - 1].eax; | ||
2524 | for (func = 0xC0000001; | ||
2525 | func <= limit && nent < cpuid->nent; ++func) | ||
2526 | do_cpuid_ent(&cpuid_entries[nent], func, 0, | ||
2527 | &nent, cpuid->nent); | ||
2528 | |||
2529 | r = -E2BIG; | ||
2530 | if (nent >= cpuid->nent) | ||
2531 | goto out_free; | ||
2532 | } | ||
2533 | |||
2494 | do_cpuid_ent(&cpuid_entries[nent], KVM_CPUID_SIGNATURE, 0, &nent, | 2534 | do_cpuid_ent(&cpuid_entries[nent], KVM_CPUID_SIGNATURE, 0, &nent, |
2495 | cpuid->nent); | 2535 | cpuid->nent); |
2496 | 2536 | ||