diff options
author | Glauber Costa <glommer@redhat.com> | 2009-10-06 13:24:50 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2009-12-03 02:32:14 -0500 |
commit | e3267cbbbfbcbe9c18833e89b10beabb1117cb55 (patch) | |
tree | 8d9ffc473a0a32fb7c0454069a30ac85a9a41e62 | |
parent | 91586a3b7d79432772a3cdcb81473cd08a237c79 (diff) |
KVM: x86: include pvclock MSRs in msrs_to_save
For a while now, we are issuing a rdmsr instruction to find out which
msrs in our save list are really supported by the underlying machine.
However, it fails to account for kvm-specific msrs, such as the pvclock
ones.
This patch moves then to the beginning of the list, and skip testing them.
Cc: stable@kernel.org
Signed-off-by: Glauber Costa <glommer@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
-rw-r--r-- | arch/x86/kvm/x86.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 385cd0a1e23d..4de5bc0a8e86 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -503,16 +503,19 @@ static inline u32 bit(int bitno) | |||
503 | * and KVM_SET_MSRS, and KVM_GET_MSR_INDEX_LIST. | 503 | * and KVM_SET_MSRS, and KVM_GET_MSR_INDEX_LIST. |
504 | * | 504 | * |
505 | * This list is modified at module load time to reflect the | 505 | * This list is modified at module load time to reflect the |
506 | * capabilities of the host cpu. | 506 | * capabilities of the host cpu. This capabilities test skips MSRs that are |
507 | * kvm-specific. Those are put in the beginning of the list. | ||
507 | */ | 508 | */ |
509 | |||
510 | #define KVM_SAVE_MSRS_BEGIN 2 | ||
508 | static u32 msrs_to_save[] = { | 511 | static u32 msrs_to_save[] = { |
512 | MSR_KVM_SYSTEM_TIME, MSR_KVM_WALL_CLOCK, | ||
509 | MSR_IA32_SYSENTER_CS, MSR_IA32_SYSENTER_ESP, MSR_IA32_SYSENTER_EIP, | 513 | MSR_IA32_SYSENTER_CS, MSR_IA32_SYSENTER_ESP, MSR_IA32_SYSENTER_EIP, |
510 | MSR_K6_STAR, | 514 | MSR_K6_STAR, |
511 | #ifdef CONFIG_X86_64 | 515 | #ifdef CONFIG_X86_64 |
512 | MSR_CSTAR, MSR_KERNEL_GS_BASE, MSR_SYSCALL_MASK, MSR_LSTAR, | 516 | MSR_CSTAR, MSR_KERNEL_GS_BASE, MSR_SYSCALL_MASK, MSR_LSTAR, |
513 | #endif | 517 | #endif |
514 | MSR_IA32_TSC, MSR_KVM_SYSTEM_TIME, MSR_KVM_WALL_CLOCK, | 518 | MSR_IA32_TSC, MSR_IA32_PERF_STATUS, MSR_IA32_CR_PAT, MSR_VM_HSAVE_PA |
515 | MSR_IA32_PERF_STATUS, MSR_IA32_CR_PAT, MSR_VM_HSAVE_PA | ||
516 | }; | 519 | }; |
517 | 520 | ||
518 | static unsigned num_msrs_to_save; | 521 | static unsigned num_msrs_to_save; |
@@ -2446,7 +2449,8 @@ static void kvm_init_msr_list(void) | |||
2446 | u32 dummy[2]; | 2449 | u32 dummy[2]; |
2447 | unsigned i, j; | 2450 | unsigned i, j; |
2448 | 2451 | ||
2449 | for (i = j = 0; i < ARRAY_SIZE(msrs_to_save); i++) { | 2452 | /* skip the first msrs in the list. KVM-specific */ |
2453 | for (i = j = KVM_SAVE_MSRS_BEGIN; i < ARRAY_SIZE(msrs_to_save); i++) { | ||
2450 | if (rdmsr_safe(msrs_to_save[i], &dummy[0], &dummy[1]) < 0) | 2454 | if (rdmsr_safe(msrs_to_save[i], &dummy[0], &dummy[1]) < 0) |
2451 | continue; | 2455 | continue; |
2452 | if (j < i) | 2456 | if (j < i) |