diff options
Diffstat (limited to 'arch/x86/kvm/svm.c')
-rw-r--r-- | arch/x86/kvm/svm.c | 415 |
1 files changed, 235 insertions, 180 deletions
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 1f8510c51d6e..71510e07e69e 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include "irq.h" | 19 | #include "irq.h" |
20 | #include "mmu.h" | 20 | #include "mmu.h" |
21 | #include "kvm_cache_regs.h" | 21 | #include "kvm_cache_regs.h" |
22 | #include "x86.h" | ||
22 | 23 | ||
23 | #include <linux/module.h> | 24 | #include <linux/module.h> |
24 | #include <linux/kernel.h> | 25 | #include <linux/kernel.h> |
@@ -69,7 +70,6 @@ module_param(npt, int, S_IRUGO); | |||
69 | static int nested = 0; | 70 | static int nested = 0; |
70 | module_param(nested, int, S_IRUGO); | 71 | module_param(nested, int, S_IRUGO); |
71 | 72 | ||
72 | static void kvm_reput_irq(struct vcpu_svm *svm); | ||
73 | static void svm_flush_tlb(struct kvm_vcpu *vcpu); | 73 | static void svm_flush_tlb(struct kvm_vcpu *vcpu); |
74 | 74 | ||
75 | static int nested_svm_exit_handled(struct vcpu_svm *svm, bool kvm_override); | 75 | static int nested_svm_exit_handled(struct vcpu_svm *svm, bool kvm_override); |
@@ -132,24 +132,6 @@ static inline u32 svm_has(u32 feat) | |||
132 | return svm_features & feat; | 132 | return svm_features & feat; |
133 | } | 133 | } |
134 | 134 | ||
135 | static inline u8 pop_irq(struct kvm_vcpu *vcpu) | ||
136 | { | ||
137 | int word_index = __ffs(vcpu->arch.irq_summary); | ||
138 | int bit_index = __ffs(vcpu->arch.irq_pending[word_index]); | ||
139 | int irq = word_index * BITS_PER_LONG + bit_index; | ||
140 | |||
141 | clear_bit(bit_index, &vcpu->arch.irq_pending[word_index]); | ||
142 | if (!vcpu->arch.irq_pending[word_index]) | ||
143 | clear_bit(word_index, &vcpu->arch.irq_summary); | ||
144 | return irq; | ||
145 | } | ||
146 | |||
147 | static inline void push_irq(struct kvm_vcpu *vcpu, u8 irq) | ||
148 | { | ||
149 | set_bit(irq, vcpu->arch.irq_pending); | ||
150 | set_bit(irq / BITS_PER_LONG, &vcpu->arch.irq_summary); | ||
151 | } | ||
152 | |||
153 | static inline void clgi(void) | 135 | static inline void clgi(void) |
154 | { | 136 | { |
155 | asm volatile (__ex(SVM_CLGI)); | 137 | asm volatile (__ex(SVM_CLGI)); |
@@ -214,17 +196,31 @@ static void svm_queue_exception(struct kvm_vcpu *vcpu, unsigned nr, | |||
214 | svm->vmcb->control.event_inj_err = error_code; | 196 | svm->vmcb->control.event_inj_err = error_code; |
215 | } | 197 | } |
216 | 198 | ||
217 | static bool svm_exception_injected(struct kvm_vcpu *vcpu) | 199 | static int is_external_interrupt(u32 info) |
200 | { | ||
201 | info &= SVM_EVTINJ_TYPE_MASK | SVM_EVTINJ_VALID; | ||
202 | return info == (SVM_EVTINJ_VALID | SVM_EVTINJ_TYPE_INTR); | ||
203 | } | ||
204 | |||
205 | static u32 svm_get_interrupt_shadow(struct kvm_vcpu *vcpu, int mask) | ||
218 | { | 206 | { |
219 | struct vcpu_svm *svm = to_svm(vcpu); | 207 | struct vcpu_svm *svm = to_svm(vcpu); |
208 | u32 ret = 0; | ||
220 | 209 | ||
221 | return !(svm->vmcb->control.exit_int_info & SVM_EXITINTINFO_VALID); | 210 | if (svm->vmcb->control.int_state & SVM_INTERRUPT_SHADOW_MASK) |
211 | ret |= X86_SHADOW_INT_STI | X86_SHADOW_INT_MOV_SS; | ||
212 | return ret & mask; | ||
222 | } | 213 | } |
223 | 214 | ||
224 | static int is_external_interrupt(u32 info) | 215 | static void svm_set_interrupt_shadow(struct kvm_vcpu *vcpu, int mask) |
225 | { | 216 | { |
226 | info &= SVM_EVTINJ_TYPE_MASK | SVM_EVTINJ_VALID; | 217 | struct vcpu_svm *svm = to_svm(vcpu); |
227 | return info == (SVM_EVTINJ_VALID | SVM_EVTINJ_TYPE_INTR); | 218 | |
219 | if (mask == 0) | ||
220 | svm->vmcb->control.int_state &= ~SVM_INTERRUPT_SHADOW_MASK; | ||
221 | else | ||
222 | svm->vmcb->control.int_state |= SVM_INTERRUPT_SHADOW_MASK; | ||
223 | |||
228 | } | 224 | } |
229 | 225 | ||
230 | static void skip_emulated_instruction(struct kvm_vcpu *vcpu) | 226 | static void skip_emulated_instruction(struct kvm_vcpu *vcpu) |
@@ -232,7 +228,9 @@ static void skip_emulated_instruction(struct kvm_vcpu *vcpu) | |||
232 | struct vcpu_svm *svm = to_svm(vcpu); | 228 | struct vcpu_svm *svm = to_svm(vcpu); |
233 | 229 | ||
234 | if (!svm->next_rip) { | 230 | if (!svm->next_rip) { |
235 | printk(KERN_DEBUG "%s: NOP\n", __func__); | 231 | if (emulate_instruction(vcpu, vcpu->run, 0, 0, EMULTYPE_SKIP) != |
232 | EMULATE_DONE) | ||
233 | printk(KERN_DEBUG "%s: NOP\n", __func__); | ||
236 | return; | 234 | return; |
237 | } | 235 | } |
238 | if (svm->next_rip - kvm_rip_read(vcpu) > MAX_INST_SIZE) | 236 | if (svm->next_rip - kvm_rip_read(vcpu) > MAX_INST_SIZE) |
@@ -240,9 +238,7 @@ static void skip_emulated_instruction(struct kvm_vcpu *vcpu) | |||
240 | __func__, kvm_rip_read(vcpu), svm->next_rip); | 238 | __func__, kvm_rip_read(vcpu), svm->next_rip); |
241 | 239 | ||
242 | kvm_rip_write(vcpu, svm->next_rip); | 240 | kvm_rip_write(vcpu, svm->next_rip); |
243 | svm->vmcb->control.int_state &= ~SVM_INTERRUPT_SHADOW_MASK; | 241 | svm_set_interrupt_shadow(vcpu, 0); |
244 | |||
245 | vcpu->arch.interrupt_window_open = (svm->vcpu.arch.hflags & HF_GIF_MASK); | ||
246 | } | 242 | } |
247 | 243 | ||
248 | static int has_svm(void) | 244 | static int has_svm(void) |
@@ -830,6 +826,15 @@ static void svm_get_segment(struct kvm_vcpu *vcpu, | |||
830 | if (!var->unusable) | 826 | if (!var->unusable) |
831 | var->type |= 0x1; | 827 | var->type |= 0x1; |
832 | break; | 828 | break; |
829 | case VCPU_SREG_SS: | ||
830 | /* On AMD CPUs sometimes the DB bit in the segment | ||
831 | * descriptor is left as 1, although the whole segment has | ||
832 | * been made unusable. Clear it here to pass an Intel VMX | ||
833 | * entry check when cross vendor migrating. | ||
834 | */ | ||
835 | if (var->unusable) | ||
836 | var->db = 0; | ||
837 | break; | ||
833 | } | 838 | } |
834 | } | 839 | } |
835 | 840 | ||
@@ -960,15 +965,16 @@ static void svm_set_segment(struct kvm_vcpu *vcpu, | |||
960 | 965 | ||
961 | } | 966 | } |
962 | 967 | ||
963 | static int svm_guest_debug(struct kvm_vcpu *vcpu, struct kvm_guest_debug *dbg) | 968 | static void update_db_intercept(struct kvm_vcpu *vcpu) |
964 | { | 969 | { |
965 | int old_debug = vcpu->guest_debug; | ||
966 | struct vcpu_svm *svm = to_svm(vcpu); | 970 | struct vcpu_svm *svm = to_svm(vcpu); |
967 | 971 | ||
968 | vcpu->guest_debug = dbg->control; | ||
969 | |||
970 | svm->vmcb->control.intercept_exceptions &= | 972 | svm->vmcb->control.intercept_exceptions &= |
971 | ~((1 << DB_VECTOR) | (1 << BP_VECTOR)); | 973 | ~((1 << DB_VECTOR) | (1 << BP_VECTOR)); |
974 | |||
975 | if (vcpu->arch.singlestep) | ||
976 | svm->vmcb->control.intercept_exceptions |= (1 << DB_VECTOR); | ||
977 | |||
972 | if (vcpu->guest_debug & KVM_GUESTDBG_ENABLE) { | 978 | if (vcpu->guest_debug & KVM_GUESTDBG_ENABLE) { |
973 | if (vcpu->guest_debug & | 979 | if (vcpu->guest_debug & |
974 | (KVM_GUESTDBG_SINGLESTEP | KVM_GUESTDBG_USE_HW_BP)) | 980 | (KVM_GUESTDBG_SINGLESTEP | KVM_GUESTDBG_USE_HW_BP)) |
@@ -979,6 +985,16 @@ static int svm_guest_debug(struct kvm_vcpu *vcpu, struct kvm_guest_debug *dbg) | |||
979 | 1 << BP_VECTOR; | 985 | 1 << BP_VECTOR; |
980 | } else | 986 | } else |
981 | vcpu->guest_debug = 0; | 987 | vcpu->guest_debug = 0; |
988 | } | ||
989 | |||
990 | static int svm_guest_debug(struct kvm_vcpu *vcpu, struct kvm_guest_debug *dbg) | ||
991 | { | ||
992 | int old_debug = vcpu->guest_debug; | ||
993 | struct vcpu_svm *svm = to_svm(vcpu); | ||
994 | |||
995 | vcpu->guest_debug = dbg->control; | ||
996 | |||
997 | update_db_intercept(vcpu); | ||
982 | 998 | ||
983 | if (vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP) | 999 | if (vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP) |
984 | svm->vmcb->save.dr7 = dbg->arch.debugreg[7]; | 1000 | svm->vmcb->save.dr7 = dbg->arch.debugreg[7]; |
@@ -993,16 +1009,6 @@ static int svm_guest_debug(struct kvm_vcpu *vcpu, struct kvm_guest_debug *dbg) | |||
993 | return 0; | 1009 | return 0; |
994 | } | 1010 | } |
995 | 1011 | ||
996 | static int svm_get_irq(struct kvm_vcpu *vcpu) | ||
997 | { | ||
998 | struct vcpu_svm *svm = to_svm(vcpu); | ||
999 | u32 exit_int_info = svm->vmcb->control.exit_int_info; | ||
1000 | |||
1001 | if (is_external_interrupt(exit_int_info)) | ||
1002 | return exit_int_info & SVM_EVTINJ_VEC_MASK; | ||
1003 | return -1; | ||
1004 | } | ||
1005 | |||
1006 | static void load_host_msrs(struct kvm_vcpu *vcpu) | 1012 | static void load_host_msrs(struct kvm_vcpu *vcpu) |
1007 | { | 1013 | { |
1008 | #ifdef CONFIG_X86_64 | 1014 | #ifdef CONFIG_X86_64 |
@@ -1107,17 +1113,8 @@ static void svm_set_dr(struct kvm_vcpu *vcpu, int dr, unsigned long value, | |||
1107 | 1113 | ||
1108 | static int pf_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) | 1114 | static int pf_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) |
1109 | { | 1115 | { |
1110 | u32 exit_int_info = svm->vmcb->control.exit_int_info; | ||
1111 | struct kvm *kvm = svm->vcpu.kvm; | ||
1112 | u64 fault_address; | 1116 | u64 fault_address; |
1113 | u32 error_code; | 1117 | u32 error_code; |
1114 | bool event_injection = false; | ||
1115 | |||
1116 | if (!irqchip_in_kernel(kvm) && | ||
1117 | is_external_interrupt(exit_int_info)) { | ||
1118 | event_injection = true; | ||
1119 | push_irq(&svm->vcpu, exit_int_info & SVM_EVTINJ_VEC_MASK); | ||
1120 | } | ||
1121 | 1118 | ||
1122 | fault_address = svm->vmcb->control.exit_info_2; | 1119 | fault_address = svm->vmcb->control.exit_info_2; |
1123 | error_code = svm->vmcb->control.exit_info_1; | 1120 | error_code = svm->vmcb->control.exit_info_1; |
@@ -1137,23 +1134,40 @@ static int pf_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) | |||
1137 | */ | 1134 | */ |
1138 | if (npt_enabled) | 1135 | if (npt_enabled) |
1139 | svm_flush_tlb(&svm->vcpu); | 1136 | svm_flush_tlb(&svm->vcpu); |
1140 | 1137 | else { | |
1141 | if (!npt_enabled && event_injection) | 1138 | if (kvm_event_needs_reinjection(&svm->vcpu)) |
1142 | kvm_mmu_unprotect_page_virt(&svm->vcpu, fault_address); | 1139 | kvm_mmu_unprotect_page_virt(&svm->vcpu, fault_address); |
1140 | } | ||
1143 | return kvm_mmu_page_fault(&svm->vcpu, fault_address, error_code); | 1141 | return kvm_mmu_page_fault(&svm->vcpu, fault_address, error_code); |
1144 | } | 1142 | } |
1145 | 1143 | ||
1146 | static int db_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) | 1144 | static int db_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) |
1147 | { | 1145 | { |
1148 | if (!(svm->vcpu.guest_debug & | 1146 | if (!(svm->vcpu.guest_debug & |
1149 | (KVM_GUESTDBG_SINGLESTEP | KVM_GUESTDBG_USE_HW_BP))) { | 1147 | (KVM_GUESTDBG_SINGLESTEP | KVM_GUESTDBG_USE_HW_BP)) && |
1148 | !svm->vcpu.arch.singlestep) { | ||
1150 | kvm_queue_exception(&svm->vcpu, DB_VECTOR); | 1149 | kvm_queue_exception(&svm->vcpu, DB_VECTOR); |
1151 | return 1; | 1150 | return 1; |
1152 | } | 1151 | } |
1153 | kvm_run->exit_reason = KVM_EXIT_DEBUG; | 1152 | |
1154 | kvm_run->debug.arch.pc = svm->vmcb->save.cs.base + svm->vmcb->save.rip; | 1153 | if (svm->vcpu.arch.singlestep) { |
1155 | kvm_run->debug.arch.exception = DB_VECTOR; | 1154 | svm->vcpu.arch.singlestep = false; |
1156 | return 0; | 1155 | if (!(svm->vcpu.guest_debug & KVM_GUESTDBG_SINGLESTEP)) |
1156 | svm->vmcb->save.rflags &= | ||
1157 | ~(X86_EFLAGS_TF | X86_EFLAGS_RF); | ||
1158 | update_db_intercept(&svm->vcpu); | ||
1159 | } | ||
1160 | |||
1161 | if (svm->vcpu.guest_debug & | ||
1162 | (KVM_GUESTDBG_SINGLESTEP | KVM_GUESTDBG_USE_HW_BP)){ | ||
1163 | kvm_run->exit_reason = KVM_EXIT_DEBUG; | ||
1164 | kvm_run->debug.arch.pc = | ||
1165 | svm->vmcb->save.cs.base + svm->vmcb->save.rip; | ||
1166 | kvm_run->debug.arch.exception = DB_VECTOR; | ||
1167 | return 0; | ||
1168 | } | ||
1169 | |||
1170 | return 1; | ||
1157 | } | 1171 | } |
1158 | 1172 | ||
1159 | static int bp_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) | 1173 | static int bp_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) |
@@ -1842,17 +1856,51 @@ static int task_switch_interception(struct vcpu_svm *svm, | |||
1842 | struct kvm_run *kvm_run) | 1856 | struct kvm_run *kvm_run) |
1843 | { | 1857 | { |
1844 | u16 tss_selector; | 1858 | u16 tss_selector; |
1859 | int reason; | ||
1860 | int int_type = svm->vmcb->control.exit_int_info & | ||
1861 | SVM_EXITINTINFO_TYPE_MASK; | ||
1862 | int int_vec = svm->vmcb->control.exit_int_info & SVM_EVTINJ_VEC_MASK; | ||
1863 | uint32_t type = | ||
1864 | svm->vmcb->control.exit_int_info & SVM_EXITINTINFO_TYPE_MASK; | ||
1865 | uint32_t idt_v = | ||
1866 | svm->vmcb->control.exit_int_info & SVM_EXITINTINFO_VALID; | ||
1845 | 1867 | ||
1846 | tss_selector = (u16)svm->vmcb->control.exit_info_1; | 1868 | tss_selector = (u16)svm->vmcb->control.exit_info_1; |
1869 | |||
1847 | if (svm->vmcb->control.exit_info_2 & | 1870 | if (svm->vmcb->control.exit_info_2 & |
1848 | (1ULL << SVM_EXITINFOSHIFT_TS_REASON_IRET)) | 1871 | (1ULL << SVM_EXITINFOSHIFT_TS_REASON_IRET)) |
1849 | return kvm_task_switch(&svm->vcpu, tss_selector, | 1872 | reason = TASK_SWITCH_IRET; |
1850 | TASK_SWITCH_IRET); | 1873 | else if (svm->vmcb->control.exit_info_2 & |
1851 | if (svm->vmcb->control.exit_info_2 & | 1874 | (1ULL << SVM_EXITINFOSHIFT_TS_REASON_JMP)) |
1852 | (1ULL << SVM_EXITINFOSHIFT_TS_REASON_JMP)) | 1875 | reason = TASK_SWITCH_JMP; |
1853 | return kvm_task_switch(&svm->vcpu, tss_selector, | 1876 | else if (idt_v) |
1854 | TASK_SWITCH_JMP); | 1877 | reason = TASK_SWITCH_GATE; |
1855 | return kvm_task_switch(&svm->vcpu, tss_selector, TASK_SWITCH_CALL); | 1878 | else |
1879 | reason = TASK_SWITCH_CALL; | ||
1880 | |||
1881 | if (reason == TASK_SWITCH_GATE) { | ||
1882 | switch (type) { | ||
1883 | case SVM_EXITINTINFO_TYPE_NMI: | ||
1884 | svm->vcpu.arch.nmi_injected = false; | ||
1885 | break; | ||
1886 | case SVM_EXITINTINFO_TYPE_EXEPT: | ||
1887 | kvm_clear_exception_queue(&svm->vcpu); | ||
1888 | break; | ||
1889 | case SVM_EXITINTINFO_TYPE_INTR: | ||
1890 | kvm_clear_interrupt_queue(&svm->vcpu); | ||
1891 | break; | ||
1892 | default: | ||
1893 | break; | ||
1894 | } | ||
1895 | } | ||
1896 | |||
1897 | if (reason != TASK_SWITCH_GATE || | ||
1898 | int_type == SVM_EXITINTINFO_TYPE_SOFT || | ||
1899 | (int_type == SVM_EXITINTINFO_TYPE_EXEPT && | ||
1900 | (int_vec == OF_VECTOR || int_vec == BP_VECTOR))) | ||
1901 | skip_emulated_instruction(&svm->vcpu); | ||
1902 | |||
1903 | return kvm_task_switch(&svm->vcpu, tss_selector, reason); | ||
1856 | } | 1904 | } |
1857 | 1905 | ||
1858 | static int cpuid_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) | 1906 | static int cpuid_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) |
@@ -1862,6 +1910,14 @@ static int cpuid_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) | |||
1862 | return 1; | 1910 | return 1; |
1863 | } | 1911 | } |
1864 | 1912 | ||
1913 | static int iret_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) | ||
1914 | { | ||
1915 | ++svm->vcpu.stat.nmi_window_exits; | ||
1916 | svm->vmcb->control.intercept &= ~(1UL << INTERCEPT_IRET); | ||
1917 | svm->vcpu.arch.hflags |= HF_IRET_MASK; | ||
1918 | return 1; | ||
1919 | } | ||
1920 | |||
1865 | static int invlpg_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) | 1921 | static int invlpg_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) |
1866 | { | 1922 | { |
1867 | if (emulate_instruction(&svm->vcpu, kvm_run, 0, 0, 0) != EMULATE_DONE) | 1923 | if (emulate_instruction(&svm->vcpu, kvm_run, 0, 0, 0) != EMULATE_DONE) |
@@ -1879,8 +1935,14 @@ static int emulate_on_interception(struct vcpu_svm *svm, | |||
1879 | 1935 | ||
1880 | static int cr8_write_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) | 1936 | static int cr8_write_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) |
1881 | { | 1937 | { |
1938 | u8 cr8_prev = kvm_get_cr8(&svm->vcpu); | ||
1939 | /* instruction emulation calls kvm_set_cr8() */ | ||
1882 | emulate_instruction(&svm->vcpu, NULL, 0, 0, 0); | 1940 | emulate_instruction(&svm->vcpu, NULL, 0, 0, 0); |
1883 | if (irqchip_in_kernel(svm->vcpu.kvm)) | 1941 | if (irqchip_in_kernel(svm->vcpu.kvm)) { |
1942 | svm->vmcb->control.intercept_cr_write &= ~INTERCEPT_CR8_MASK; | ||
1943 | return 1; | ||
1944 | } | ||
1945 | if (cr8_prev <= kvm_get_cr8(&svm->vcpu)) | ||
1884 | return 1; | 1946 | return 1; |
1885 | kvm_run->exit_reason = KVM_EXIT_SET_TPR; | 1947 | kvm_run->exit_reason = KVM_EXIT_SET_TPR; |
1886 | return 0; | 1948 | return 0; |
@@ -2090,8 +2152,9 @@ static int interrupt_window_interception(struct vcpu_svm *svm, | |||
2090 | * If the user space waits to inject interrupts, exit as soon as | 2152 | * If the user space waits to inject interrupts, exit as soon as |
2091 | * possible | 2153 | * possible |
2092 | */ | 2154 | */ |
2093 | if (kvm_run->request_interrupt_window && | 2155 | if (!irqchip_in_kernel(svm->vcpu.kvm) && |
2094 | !svm->vcpu.arch.irq_summary) { | 2156 | kvm_run->request_interrupt_window && |
2157 | !kvm_cpu_has_interrupt(&svm->vcpu)) { | ||
2095 | ++svm->vcpu.stat.irq_window_exits; | 2158 | ++svm->vcpu.stat.irq_window_exits; |
2096 | kvm_run->exit_reason = KVM_EXIT_IRQ_WINDOW_OPEN; | 2159 | kvm_run->exit_reason = KVM_EXIT_IRQ_WINDOW_OPEN; |
2097 | return 0; | 2160 | return 0; |
@@ -2134,6 +2197,7 @@ static int (*svm_exit_handlers[])(struct vcpu_svm *svm, | |||
2134 | [SVM_EXIT_VINTR] = interrupt_window_interception, | 2197 | [SVM_EXIT_VINTR] = interrupt_window_interception, |
2135 | /* [SVM_EXIT_CR0_SEL_WRITE] = emulate_on_interception, */ | 2198 | /* [SVM_EXIT_CR0_SEL_WRITE] = emulate_on_interception, */ |
2136 | [SVM_EXIT_CPUID] = cpuid_interception, | 2199 | [SVM_EXIT_CPUID] = cpuid_interception, |
2200 | [SVM_EXIT_IRET] = iret_interception, | ||
2137 | [SVM_EXIT_INVD] = emulate_on_interception, | 2201 | [SVM_EXIT_INVD] = emulate_on_interception, |
2138 | [SVM_EXIT_HLT] = halt_interception, | 2202 | [SVM_EXIT_HLT] = halt_interception, |
2139 | [SVM_EXIT_INVLPG] = invlpg_interception, | 2203 | [SVM_EXIT_INVLPG] = invlpg_interception, |
@@ -2194,7 +2258,6 @@ static int handle_exit(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) | |||
2194 | } | 2258 | } |
2195 | } | 2259 | } |
2196 | 2260 | ||
2197 | kvm_reput_irq(svm); | ||
2198 | 2261 | ||
2199 | if (svm->vmcb->control.exit_code == SVM_EXIT_ERR) { | 2262 | if (svm->vmcb->control.exit_code == SVM_EXIT_ERR) { |
2200 | kvm_run->exit_reason = KVM_EXIT_FAIL_ENTRY; | 2263 | kvm_run->exit_reason = KVM_EXIT_FAIL_ENTRY; |
@@ -2205,7 +2268,7 @@ static int handle_exit(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) | |||
2205 | 2268 | ||
2206 | if (is_external_interrupt(svm->vmcb->control.exit_int_info) && | 2269 | if (is_external_interrupt(svm->vmcb->control.exit_int_info) && |
2207 | exit_code != SVM_EXIT_EXCP_BASE + PF_VECTOR && | 2270 | exit_code != SVM_EXIT_EXCP_BASE + PF_VECTOR && |
2208 | exit_code != SVM_EXIT_NPF) | 2271 | exit_code != SVM_EXIT_NPF && exit_code != SVM_EXIT_TASK_SWITCH) |
2209 | printk(KERN_ERR "%s: unexpected exit_ini_info 0x%x " | 2272 | printk(KERN_ERR "%s: unexpected exit_ini_info 0x%x " |
2210 | "exit_code 0x%x\n", | 2273 | "exit_code 0x%x\n", |
2211 | __func__, svm->vmcb->control.exit_int_info, | 2274 | __func__, svm->vmcb->control.exit_int_info, |
@@ -2242,6 +2305,15 @@ static void pre_svm_run(struct vcpu_svm *svm) | |||
2242 | new_asid(svm, svm_data); | 2305 | new_asid(svm, svm_data); |
2243 | } | 2306 | } |
2244 | 2307 | ||
2308 | static void svm_inject_nmi(struct kvm_vcpu *vcpu) | ||
2309 | { | ||
2310 | struct vcpu_svm *svm = to_svm(vcpu); | ||
2311 | |||
2312 | svm->vmcb->control.event_inj = SVM_EVTINJ_VALID | SVM_EVTINJ_TYPE_NMI; | ||
2313 | vcpu->arch.hflags |= HF_NMI_MASK; | ||
2314 | svm->vmcb->control.intercept |= (1UL << INTERCEPT_IRET); | ||
2315 | ++vcpu->stat.nmi_injections; | ||
2316 | } | ||
2245 | 2317 | ||
2246 | static inline void svm_inject_irq(struct vcpu_svm *svm, int irq) | 2318 | static inline void svm_inject_irq(struct vcpu_svm *svm, int irq) |
2247 | { | 2319 | { |
@@ -2257,134 +2329,71 @@ static inline void svm_inject_irq(struct vcpu_svm *svm, int irq) | |||
2257 | ((/*control->int_vector >> 4*/ 0xf) << V_INTR_PRIO_SHIFT); | 2329 | ((/*control->int_vector >> 4*/ 0xf) << V_INTR_PRIO_SHIFT); |
2258 | } | 2330 | } |
2259 | 2331 | ||
2260 | static void svm_set_irq(struct kvm_vcpu *vcpu, int irq) | 2332 | static void svm_queue_irq(struct kvm_vcpu *vcpu, unsigned nr) |
2261 | { | 2333 | { |
2262 | struct vcpu_svm *svm = to_svm(vcpu); | 2334 | struct vcpu_svm *svm = to_svm(vcpu); |
2263 | 2335 | ||
2264 | nested_svm_intr(svm); | 2336 | svm->vmcb->control.event_inj = nr | |
2265 | 2337 | SVM_EVTINJ_VALID | SVM_EVTINJ_TYPE_INTR; | |
2266 | svm_inject_irq(svm, irq); | ||
2267 | } | 2338 | } |
2268 | 2339 | ||
2269 | static void update_cr8_intercept(struct kvm_vcpu *vcpu) | 2340 | static void svm_set_irq(struct kvm_vcpu *vcpu) |
2270 | { | 2341 | { |
2271 | struct vcpu_svm *svm = to_svm(vcpu); | 2342 | struct vcpu_svm *svm = to_svm(vcpu); |
2272 | struct vmcb *vmcb = svm->vmcb; | ||
2273 | int max_irr, tpr; | ||
2274 | 2343 | ||
2275 | if (!irqchip_in_kernel(vcpu->kvm) || vcpu->arch.apic->vapic_addr) | 2344 | nested_svm_intr(svm); |
2276 | return; | ||
2277 | 2345 | ||
2278 | vmcb->control.intercept_cr_write &= ~INTERCEPT_CR8_MASK; | 2346 | svm_queue_irq(vcpu, vcpu->arch.interrupt.nr); |
2347 | } | ||
2279 | 2348 | ||
2280 | max_irr = kvm_lapic_find_highest_irr(vcpu); | 2349 | static void update_cr8_intercept(struct kvm_vcpu *vcpu, int tpr, int irr) |
2281 | if (max_irr == -1) | 2350 | { |
2282 | return; | 2351 | struct vcpu_svm *svm = to_svm(vcpu); |
2283 | 2352 | ||
2284 | tpr = kvm_lapic_get_cr8(vcpu) << 4; | 2353 | if (irr == -1) |
2354 | return; | ||
2285 | 2355 | ||
2286 | if (tpr >= (max_irr & 0xf0)) | 2356 | if (tpr >= irr) |
2287 | vmcb->control.intercept_cr_write |= INTERCEPT_CR8_MASK; | 2357 | svm->vmcb->control.intercept_cr_write |= INTERCEPT_CR8_MASK; |
2288 | } | 2358 | } |
2289 | 2359 | ||
2290 | static void svm_intr_assist(struct kvm_vcpu *vcpu) | 2360 | static int svm_nmi_allowed(struct kvm_vcpu *vcpu) |
2291 | { | 2361 | { |
2292 | struct vcpu_svm *svm = to_svm(vcpu); | 2362 | struct vcpu_svm *svm = to_svm(vcpu); |
2293 | struct vmcb *vmcb = svm->vmcb; | 2363 | struct vmcb *vmcb = svm->vmcb; |
2294 | int intr_vector = -1; | 2364 | return !(vmcb->control.int_state & SVM_INTERRUPT_SHADOW_MASK) && |
2295 | 2365 | !(svm->vcpu.arch.hflags & HF_NMI_MASK); | |
2296 | if ((vmcb->control.exit_int_info & SVM_EVTINJ_VALID) && | ||
2297 | ((vmcb->control.exit_int_info & SVM_EVTINJ_TYPE_MASK) == 0)) { | ||
2298 | intr_vector = vmcb->control.exit_int_info & | ||
2299 | SVM_EVTINJ_VEC_MASK; | ||
2300 | vmcb->control.exit_int_info = 0; | ||
2301 | svm_inject_irq(svm, intr_vector); | ||
2302 | goto out; | ||
2303 | } | ||
2304 | |||
2305 | if (vmcb->control.int_ctl & V_IRQ_MASK) | ||
2306 | goto out; | ||
2307 | |||
2308 | if (!kvm_cpu_has_interrupt(vcpu)) | ||
2309 | goto out; | ||
2310 | |||
2311 | if (nested_svm_intr(svm)) | ||
2312 | goto out; | ||
2313 | |||
2314 | if (!(svm->vcpu.arch.hflags & HF_GIF_MASK)) | ||
2315 | goto out; | ||
2316 | |||
2317 | if (!(vmcb->save.rflags & X86_EFLAGS_IF) || | ||
2318 | (vmcb->control.int_state & SVM_INTERRUPT_SHADOW_MASK) || | ||
2319 | (vmcb->control.event_inj & SVM_EVTINJ_VALID)) { | ||
2320 | /* unable to deliver irq, set pending irq */ | ||
2321 | svm_set_vintr(svm); | ||
2322 | svm_inject_irq(svm, 0x0); | ||
2323 | goto out; | ||
2324 | } | ||
2325 | /* Okay, we can deliver the interrupt: grab it and update PIC state. */ | ||
2326 | intr_vector = kvm_cpu_get_interrupt(vcpu); | ||
2327 | svm_inject_irq(svm, intr_vector); | ||
2328 | out: | ||
2329 | update_cr8_intercept(vcpu); | ||
2330 | } | 2366 | } |
2331 | 2367 | ||
2332 | static void kvm_reput_irq(struct vcpu_svm *svm) | 2368 | static int svm_interrupt_allowed(struct kvm_vcpu *vcpu) |
2333 | { | 2369 | { |
2334 | struct vmcb_control_area *control = &svm->vmcb->control; | 2370 | struct vcpu_svm *svm = to_svm(vcpu); |
2335 | 2371 | struct vmcb *vmcb = svm->vmcb; | |
2336 | if ((control->int_ctl & V_IRQ_MASK) | 2372 | return (vmcb->save.rflags & X86_EFLAGS_IF) && |
2337 | && !irqchip_in_kernel(svm->vcpu.kvm)) { | 2373 | !(vmcb->control.int_state & SVM_INTERRUPT_SHADOW_MASK) && |
2338 | control->int_ctl &= ~V_IRQ_MASK; | 2374 | (svm->vcpu.arch.hflags & HF_GIF_MASK); |
2339 | push_irq(&svm->vcpu, control->int_vector); | ||
2340 | } | ||
2341 | |||
2342 | svm->vcpu.arch.interrupt_window_open = | ||
2343 | !(control->int_state & SVM_INTERRUPT_SHADOW_MASK) && | ||
2344 | (svm->vcpu.arch.hflags & HF_GIF_MASK); | ||
2345 | } | 2375 | } |
2346 | 2376 | ||
2347 | static void svm_do_inject_vector(struct vcpu_svm *svm) | 2377 | static void enable_irq_window(struct kvm_vcpu *vcpu) |
2348 | { | 2378 | { |
2349 | struct kvm_vcpu *vcpu = &svm->vcpu; | 2379 | svm_set_vintr(to_svm(vcpu)); |
2350 | int word_index = __ffs(vcpu->arch.irq_summary); | 2380 | svm_inject_irq(to_svm(vcpu), 0x0); |
2351 | int bit_index = __ffs(vcpu->arch.irq_pending[word_index]); | ||
2352 | int irq = word_index * BITS_PER_LONG + bit_index; | ||
2353 | |||
2354 | clear_bit(bit_index, &vcpu->arch.irq_pending[word_index]); | ||
2355 | if (!vcpu->arch.irq_pending[word_index]) | ||
2356 | clear_bit(word_index, &vcpu->arch.irq_summary); | ||
2357 | svm_inject_irq(svm, irq); | ||
2358 | } | 2381 | } |
2359 | 2382 | ||
2360 | static void do_interrupt_requests(struct kvm_vcpu *vcpu, | 2383 | static void enable_nmi_window(struct kvm_vcpu *vcpu) |
2361 | struct kvm_run *kvm_run) | ||
2362 | { | 2384 | { |
2363 | struct vcpu_svm *svm = to_svm(vcpu); | 2385 | struct vcpu_svm *svm = to_svm(vcpu); |
2364 | struct vmcb_control_area *control = &svm->vmcb->control; | ||
2365 | |||
2366 | if (nested_svm_intr(svm)) | ||
2367 | return; | ||
2368 | 2386 | ||
2369 | svm->vcpu.arch.interrupt_window_open = | 2387 | if ((svm->vcpu.arch.hflags & (HF_NMI_MASK | HF_IRET_MASK)) |
2370 | (!(control->int_state & SVM_INTERRUPT_SHADOW_MASK) && | 2388 | == HF_NMI_MASK) |
2371 | (svm->vmcb->save.rflags & X86_EFLAGS_IF) && | 2389 | return; /* IRET will cause a vm exit */ |
2372 | (svm->vcpu.arch.hflags & HF_GIF_MASK)); | ||
2373 | 2390 | ||
2374 | if (svm->vcpu.arch.interrupt_window_open && svm->vcpu.arch.irq_summary) | 2391 | /* Something prevents NMI from been injected. Single step over |
2375 | /* | 2392 | possible problem (IRET or exception injection or interrupt |
2376 | * If interrupts enabled, and not blocked by sti or mov ss. Good. | 2393 | shadow) */ |
2377 | */ | 2394 | vcpu->arch.singlestep = true; |
2378 | svm_do_inject_vector(svm); | 2395 | svm->vmcb->save.rflags |= (X86_EFLAGS_TF | X86_EFLAGS_RF); |
2379 | 2396 | update_db_intercept(vcpu); | |
2380 | /* | ||
2381 | * Interrupts blocked. Wait for unblock. | ||
2382 | */ | ||
2383 | if (!svm->vcpu.arch.interrupt_window_open && | ||
2384 | (svm->vcpu.arch.irq_summary || kvm_run->request_interrupt_window)) | ||
2385 | svm_set_vintr(svm); | ||
2386 | else | ||
2387 | svm_clear_vintr(svm); | ||
2388 | } | 2397 | } |
2389 | 2398 | ||
2390 | static int svm_set_tss_addr(struct kvm *kvm, unsigned int addr) | 2399 | static int svm_set_tss_addr(struct kvm *kvm, unsigned int addr) |
@@ -2407,7 +2416,7 @@ static inline void sync_cr8_to_lapic(struct kvm_vcpu *vcpu) | |||
2407 | 2416 | ||
2408 | if (!(svm->vmcb->control.intercept_cr_write & INTERCEPT_CR8_MASK)) { | 2417 | if (!(svm->vmcb->control.intercept_cr_write & INTERCEPT_CR8_MASK)) { |
2409 | int cr8 = svm->vmcb->control.int_ctl & V_TPR_MASK; | 2418 | int cr8 = svm->vmcb->control.int_ctl & V_TPR_MASK; |
2410 | kvm_lapic_set_tpr(vcpu, cr8); | 2419 | kvm_set_cr8(vcpu, cr8); |
2411 | } | 2420 | } |
2412 | } | 2421 | } |
2413 | 2422 | ||
@@ -2416,14 +2425,54 @@ static inline void sync_lapic_to_cr8(struct kvm_vcpu *vcpu) | |||
2416 | struct vcpu_svm *svm = to_svm(vcpu); | 2425 | struct vcpu_svm *svm = to_svm(vcpu); |
2417 | u64 cr8; | 2426 | u64 cr8; |
2418 | 2427 | ||
2419 | if (!irqchip_in_kernel(vcpu->kvm)) | ||
2420 | return; | ||
2421 | |||
2422 | cr8 = kvm_get_cr8(vcpu); | 2428 | cr8 = kvm_get_cr8(vcpu); |
2423 | svm->vmcb->control.int_ctl &= ~V_TPR_MASK; | 2429 | svm->vmcb->control.int_ctl &= ~V_TPR_MASK; |
2424 | svm->vmcb->control.int_ctl |= cr8 & V_TPR_MASK; | 2430 | svm->vmcb->control.int_ctl |= cr8 & V_TPR_MASK; |
2425 | } | 2431 | } |
2426 | 2432 | ||
2433 | static void svm_complete_interrupts(struct vcpu_svm *svm) | ||
2434 | { | ||
2435 | u8 vector; | ||
2436 | int type; | ||
2437 | u32 exitintinfo = svm->vmcb->control.exit_int_info; | ||
2438 | |||
2439 | if (svm->vcpu.arch.hflags & HF_IRET_MASK) | ||
2440 | svm->vcpu.arch.hflags &= ~(HF_NMI_MASK | HF_IRET_MASK); | ||
2441 | |||
2442 | svm->vcpu.arch.nmi_injected = false; | ||
2443 | kvm_clear_exception_queue(&svm->vcpu); | ||
2444 | kvm_clear_interrupt_queue(&svm->vcpu); | ||
2445 | |||
2446 | if (!(exitintinfo & SVM_EXITINTINFO_VALID)) | ||
2447 | return; | ||
2448 | |||
2449 | vector = exitintinfo & SVM_EXITINTINFO_VEC_MASK; | ||
2450 | type = exitintinfo & SVM_EXITINTINFO_TYPE_MASK; | ||
2451 | |||
2452 | switch (type) { | ||
2453 | case SVM_EXITINTINFO_TYPE_NMI: | ||
2454 | svm->vcpu.arch.nmi_injected = true; | ||
2455 | break; | ||
2456 | case SVM_EXITINTINFO_TYPE_EXEPT: | ||
2457 | /* In case of software exception do not reinject an exception | ||
2458 | vector, but re-execute and instruction instead */ | ||
2459 | if (kvm_exception_is_soft(vector)) | ||
2460 | break; | ||
2461 | if (exitintinfo & SVM_EXITINTINFO_VALID_ERR) { | ||
2462 | u32 err = svm->vmcb->control.exit_int_info_err; | ||
2463 | kvm_queue_exception_e(&svm->vcpu, vector, err); | ||
2464 | |||
2465 | } else | ||
2466 | kvm_queue_exception(&svm->vcpu, vector); | ||
2467 | break; | ||
2468 | case SVM_EXITINTINFO_TYPE_INTR: | ||
2469 | kvm_queue_interrupt(&svm->vcpu, vector, false); | ||
2470 | break; | ||
2471 | default: | ||
2472 | break; | ||
2473 | } | ||
2474 | } | ||
2475 | |||
2427 | #ifdef CONFIG_X86_64 | 2476 | #ifdef CONFIG_X86_64 |
2428 | #define R "r" | 2477 | #define R "r" |
2429 | #else | 2478 | #else |
@@ -2552,6 +2601,8 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
2552 | sync_cr8_to_lapic(vcpu); | 2601 | sync_cr8_to_lapic(vcpu); |
2553 | 2602 | ||
2554 | svm->next_rip = 0; | 2603 | svm->next_rip = 0; |
2604 | |||
2605 | svm_complete_interrupts(svm); | ||
2555 | } | 2606 | } |
2556 | 2607 | ||
2557 | #undef R | 2608 | #undef R |
@@ -2617,7 +2668,7 @@ static int get_npt_level(void) | |||
2617 | #endif | 2668 | #endif |
2618 | } | 2669 | } |
2619 | 2670 | ||
2620 | static int svm_get_mt_mask_shift(void) | 2671 | static u64 svm_get_mt_mask(struct kvm_vcpu *vcpu, gfn_t gfn, bool is_mmio) |
2621 | { | 2672 | { |
2622 | return 0; | 2673 | return 0; |
2623 | } | 2674 | } |
@@ -2667,17 +2718,21 @@ static struct kvm_x86_ops svm_x86_ops = { | |||
2667 | .run = svm_vcpu_run, | 2718 | .run = svm_vcpu_run, |
2668 | .handle_exit = handle_exit, | 2719 | .handle_exit = handle_exit, |
2669 | .skip_emulated_instruction = skip_emulated_instruction, | 2720 | .skip_emulated_instruction = skip_emulated_instruction, |
2721 | .set_interrupt_shadow = svm_set_interrupt_shadow, | ||
2722 | .get_interrupt_shadow = svm_get_interrupt_shadow, | ||
2670 | .patch_hypercall = svm_patch_hypercall, | 2723 | .patch_hypercall = svm_patch_hypercall, |
2671 | .get_irq = svm_get_irq, | ||
2672 | .set_irq = svm_set_irq, | 2724 | .set_irq = svm_set_irq, |
2725 | .set_nmi = svm_inject_nmi, | ||
2673 | .queue_exception = svm_queue_exception, | 2726 | .queue_exception = svm_queue_exception, |
2674 | .exception_injected = svm_exception_injected, | 2727 | .interrupt_allowed = svm_interrupt_allowed, |
2675 | .inject_pending_irq = svm_intr_assist, | 2728 | .nmi_allowed = svm_nmi_allowed, |
2676 | .inject_pending_vectors = do_interrupt_requests, | 2729 | .enable_nmi_window = enable_nmi_window, |
2730 | .enable_irq_window = enable_irq_window, | ||
2731 | .update_cr8_intercept = update_cr8_intercept, | ||
2677 | 2732 | ||
2678 | .set_tss_addr = svm_set_tss_addr, | 2733 | .set_tss_addr = svm_set_tss_addr, |
2679 | .get_tdp_level = get_npt_level, | 2734 | .get_tdp_level = get_npt_level, |
2680 | .get_mt_mask_shift = svm_get_mt_mask_shift, | 2735 | .get_mt_mask = svm_get_mt_mask, |
2681 | }; | 2736 | }; |
2682 | 2737 | ||
2683 | static int __init svm_init(void) | 2738 | static int __init svm_init(void) |