diff options
author | Anthony Liguori <aliguori@us.ibm.com> | 2007-04-29 04:56:06 -0400 |
---|---|---|
committer | Avi Kivity <avi@qumranet.com> | 2007-05-03 03:52:32 -0400 |
commit | 94dfbdb3894eda2f673b70e20da2743c4a8d3968 (patch) | |
tree | 74e7a4a31a72ed0e3753e9390189d2e8132ecf0e /drivers/kvm/kvm_svm.h | |
parent | 2807696c3791d6dd1dcf20f022eaa2dc7615bc5d (diff) |
KVM: SVM: Only save/restore MSRs when needed
We only have to save/restore MSR_GS_BASE on every VMEXIT. The rest can be
saved/restored when we leave the VCPU. Since we don't emulate the DEBUGCTL
MSRs and the guest cannot write to them, we don't have to worry about
saving/restoring them at all.
This shaves a whopping 40% off raw vmexit costs on AMD.
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>
Diffstat (limited to 'drivers/kvm/kvm_svm.h')
-rw-r--r-- | drivers/kvm/kvm_svm.h | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/drivers/kvm/kvm_svm.h b/drivers/kvm/kvm_svm.h index a1a9eba50d47..a869983d683d 100644 --- a/drivers/kvm/kvm_svm.h +++ b/drivers/kvm/kvm_svm.h | |||
@@ -9,17 +9,15 @@ | |||
9 | #include "svm.h" | 9 | #include "svm.h" |
10 | #include "kvm.h" | 10 | #include "kvm.h" |
11 | 11 | ||
12 | static const u32 host_save_msrs[] = { | 12 | static const u32 host_save_user_msrs[] = { |
13 | #ifdef CONFIG_X86_64 | 13 | #ifdef CONFIG_X86_64 |
14 | MSR_STAR, MSR_LSTAR, MSR_CSTAR, MSR_SYSCALL_MASK, MSR_KERNEL_GS_BASE, | 14 | MSR_STAR, MSR_LSTAR, MSR_CSTAR, MSR_SYSCALL_MASK, MSR_KERNEL_GS_BASE, |
15 | MSR_FS_BASE, MSR_GS_BASE, | 15 | MSR_FS_BASE, |
16 | #endif | 16 | #endif |
17 | MSR_IA32_SYSENTER_CS, MSR_IA32_SYSENTER_ESP, MSR_IA32_SYSENTER_EIP, | 17 | MSR_IA32_SYSENTER_CS, MSR_IA32_SYSENTER_ESP, MSR_IA32_SYSENTER_EIP, |
18 | MSR_IA32_DEBUGCTLMSR, /*MSR_IA32_LASTBRANCHFROMIP, | ||
19 | MSR_IA32_LASTBRANCHTOIP, MSR_IA32_LASTINTFROMIP,MSR_IA32_LASTINTTOIP,*/ | ||
20 | }; | 18 | }; |
21 | 19 | ||
22 | #define NR_HOST_SAVE_MSRS ARRAY_SIZE(host_save_msrs) | 20 | #define NR_HOST_SAVE_USER_MSRS ARRAY_SIZE(host_save_user_msrs) |
23 | #define NUM_DB_REGS 4 | 21 | #define NUM_DB_REGS 4 |
24 | 22 | ||
25 | struct vcpu_svm { | 23 | struct vcpu_svm { |
@@ -32,7 +30,8 @@ struct vcpu_svm { | |||
32 | 30 | ||
33 | u64 next_rip; | 31 | u64 next_rip; |
34 | 32 | ||
35 | u64 host_msrs[NR_HOST_SAVE_MSRS]; | 33 | u64 host_user_msrs[NR_HOST_SAVE_USER_MSRS]; |
34 | u64 host_gs_base; | ||
36 | unsigned long host_cr2; | 35 | unsigned long host_cr2; |
37 | unsigned long host_db_regs[NUM_DB_REGS]; | 36 | unsigned long host_db_regs[NUM_DB_REGS]; |
38 | unsigned long host_dr6; | 37 | unsigned long host_dr6; |