aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/kvm/kvm_main.c21
-rw-r--r--drivers/kvm/vmx.c12
2 files changed, 12 insertions, 21 deletions
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c
index f8f11c75ecbd..088a445d1df7 100644
--- a/drivers/kvm/kvm_main.c
+++ b/drivers/kvm/kvm_main.c
@@ -72,17 +72,6 @@ static struct dentry *debugfs_dir;
72#define CR8_RESEVED_BITS (~0x0fULL) 72#define CR8_RESEVED_BITS (~0x0fULL)
73#define EFER_RESERVED_BITS 0xfffffffffffff2fe 73#define EFER_RESERVED_BITS 0xfffffffffffff2fe
74 74
75struct vmx_msr_entry *find_msr_entry(struct kvm_vcpu *vcpu, u32 msr)
76{
77 int i;
78
79 for (i = 0; i < vcpu->nmsrs; ++i)
80 if (vcpu->guest_msrs[i].index == msr)
81 return &vcpu->guest_msrs[i];
82 return 0;
83}
84EXPORT_SYMBOL_GPL(find_msr_entry);
85
86#ifdef CONFIG_X86_64 75#ifdef CONFIG_X86_64
87// LDT or TSS descriptor in the GDT. 16 bytes. 76// LDT or TSS descriptor in the GDT. 16 bytes.
88struct segment_descriptor_64 { 77struct segment_descriptor_64 {
@@ -1124,8 +1113,6 @@ static int get_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata)
1124 1113
1125void set_efer(struct kvm_vcpu *vcpu, u64 efer) 1114void set_efer(struct kvm_vcpu *vcpu, u64 efer)
1126{ 1115{
1127 struct vmx_msr_entry *msr;
1128
1129 if (efer & EFER_RESERVED_BITS) { 1116 if (efer & EFER_RESERVED_BITS) {
1130 printk(KERN_DEBUG "set_efer: 0x%llx #GP, reserved bits\n", 1117 printk(KERN_DEBUG "set_efer: 0x%llx #GP, reserved bits\n",
1131 efer); 1118 efer);
@@ -1140,16 +1127,12 @@ void set_efer(struct kvm_vcpu *vcpu, u64 efer)
1140 return; 1127 return;
1141 } 1128 }
1142 1129
1130 kvm_arch_ops->set_efer(vcpu, efer);
1131
1143 efer &= ~EFER_LMA; 1132 efer &= ~EFER_LMA;
1144 efer |= vcpu->shadow_efer & EFER_LMA; 1133 efer |= vcpu->shadow_efer & EFER_LMA;
1145 1134
1146 vcpu->shadow_efer = efer; 1135 vcpu->shadow_efer = efer;
1147
1148 msr = find_msr_entry(vcpu, MSR_EFER);
1149
1150 if (!(efer & EFER_LMA))
1151 efer &= ~EFER_LME;
1152 msr->data = efer;
1153} 1136}
1154EXPORT_SYMBOL_GPL(set_efer); 1137EXPORT_SYMBOL_GPL(set_efer);
1155 1138
diff --git a/drivers/kvm/vmx.c b/drivers/kvm/vmx.c
index fc01c4b08fd5..43622061660b 100644
--- a/drivers/kvm/vmx.c
+++ b/drivers/kvm/vmx.c
@@ -78,8 +78,6 @@ static const u32 vmx_msr_index[] = {
78}; 78};
79#define NR_VMX_MSR (sizeof(vmx_msr_index) / sizeof(*vmx_msr_index)) 79#define NR_VMX_MSR (sizeof(vmx_msr_index) / sizeof(*vmx_msr_index))
80 80
81struct vmx_msr_entry *find_msr_entry(struct kvm_vcpu *vcpu, u32 msr);
82
83static inline int is_page_fault(u32 intr_info) 81static inline int is_page_fault(u32 intr_info)
84{ 82{
85 return (intr_info & (INTR_INFO_INTR_TYPE_MASK | INTR_INFO_VECTOR_MASK | 83 return (intr_info & (INTR_INFO_INTR_TYPE_MASK | INTR_INFO_VECTOR_MASK |
@@ -93,6 +91,16 @@ static inline int is_external_interrupt(u32 intr_info)
93 == (INTR_TYPE_EXT_INTR | INTR_INFO_VALID_MASK); 91 == (INTR_TYPE_EXT_INTR | INTR_INFO_VALID_MASK);
94} 92}
95 93
94static struct vmx_msr_entry *find_msr_entry(struct kvm_vcpu *vcpu, u32 msr)
95{
96 int i;
97
98 for (i = 0; i < vcpu->nmsrs; ++i)
99 if (vcpu->guest_msrs[i].index == msr)
100 return &vcpu->guest_msrs[i];
101 return 0;
102}
103
96static void vmcs_clear(struct vmcs *vmcs) 104static void vmcs_clear(struct vmcs *vmcs)
97{ 105{
98 u64 phys_addr = __pa(vmcs); 106 u64 phys_addr = __pa(vmcs);