|
@@ -15,7 +15,6 @@
|
|
|
*/
|
|
|
#include <linux/kvm_host.h>
|
|
|
|
|
|
-#include "kvm_svm.h"
|
|
|
#include "irq.h"
|
|
|
#include "mmu.h"
|
|
|
#include "kvm_cache_regs.h"
|
|
@@ -57,6 +56,46 @@ MODULE_LICENSE("GPL");
|
|
|
#define nsvm_printk(fmt, args...) do {} while(0)
|
|
|
#endif
|
|
|
|
|
|
+static const u32 host_save_user_msrs[] = {
|
|
|
+#ifdef CONFIG_X86_64
|
|
|
+ MSR_STAR, MSR_LSTAR, MSR_CSTAR, MSR_SYSCALL_MASK, MSR_KERNEL_GS_BASE,
|
|
|
+ MSR_FS_BASE,
|
|
|
+#endif
|
|
|
+ MSR_IA32_SYSENTER_CS, MSR_IA32_SYSENTER_ESP, MSR_IA32_SYSENTER_EIP,
|
|
|
+};
|
|
|
+
|
|
|
+#define NR_HOST_SAVE_USER_MSRS ARRAY_SIZE(host_save_user_msrs)
|
|
|
+
|
|
|
+struct kvm_vcpu;
|
|
|
+
|
|
|
+struct vcpu_svm {
|
|
|
+ struct kvm_vcpu vcpu;
|
|
|
+ struct vmcb *vmcb;
|
|
|
+ unsigned long vmcb_pa;
|
|
|
+ struct svm_cpu_data *svm_data;
|
|
|
+ uint64_t asid_generation;
|
|
|
+ uint64_t sysenter_esp;
|
|
|
+ uint64_t sysenter_eip;
|
|
|
+
|
|
|
+ u64 next_rip;
|
|
|
+
|
|
|
+ u64 host_user_msrs[NR_HOST_SAVE_USER_MSRS];
|
|
|
+ u64 host_gs_base;
|
|
|
+ unsigned long host_cr2;
|
|
|
+
|
|
|
+ u32 *msrpm;
|
|
|
+ struct vmcb *hsave;
|
|
|
+ u64 hsave_msr;
|
|
|
+
|
|
|
+ u64 nested_vmcb;
|
|
|
+
|
|
|
+ /* These are the merged vectors */
|
|
|
+ u32 *nested_msrpm;
|
|
|
+
|
|
|
+ /* gpa pointers to the real vectors */
|
|
|
+ u64 nested_vmcb_msrpm;
|
|
|
+};
|
|
|
+
|
|
|
/* enable NPT for AMD64 and X86 with PAE */
|
|
|
#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE)
|
|
|
static bool npt_enabled = true;
|