diff options
-rw-r--r-- | drivers/kvm/kvm_main.c | 21 | ||||
-rw-r--r-- | drivers/kvm/vmx.c | 12 |
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 | ||
75 | struct 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 | } | ||
84 | EXPORT_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. |
88 | struct segment_descriptor_64 { | 77 | struct segment_descriptor_64 { |
@@ -1124,8 +1113,6 @@ static int get_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata) | |||
1124 | 1113 | ||
1125 | void set_efer(struct kvm_vcpu *vcpu, u64 efer) | 1114 | void 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 | } |
1154 | EXPORT_SYMBOL_GPL(set_efer); | 1137 | EXPORT_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 | ||
81 | struct vmx_msr_entry *find_msr_entry(struct kvm_vcpu *vcpu, u32 msr); | ||
82 | |||
83 | static inline int is_page_fault(u32 intr_info) | 81 | static 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 | ||
94 | static 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 | |||
96 | static void vmcs_clear(struct vmcs *vmcs) | 104 | static void vmcs_clear(struct vmcs *vmcs) |
97 | { | 105 | { |
98 | u64 phys_addr = __pa(vmcs); | 106 | u64 phys_addr = __pa(vmcs); |