hc
2024-01-31 f9004dbfff8a3fbbd7e2a88c8a4327c7f2f8e5b2
kernel/arch/x86/kvm/emulate.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /******************************************************************************
23 * emulate.c
34 *
....@@ -14,16 +15,14 @@
1415 * Avi Kivity <avi@qumranet.com>
1516 * Yaniv Kamay <yaniv@qumranet.com>
1617 *
17
- * This work is licensed under the terms of the GNU GPL, version 2. See
18
- * the COPYING file in the top-level directory.
19
- *
2018 * From: xen-unstable 10676:af9809f51f81a3c43f276f00c81a52ef558afda4
2119 */
2220
2321 #include <linux/kvm_host.h>
2422 #include "kvm_cache_regs.h"
25
-#include <asm/kvm_emulate.h>
23
+#include "kvm_emulate.h"
2624 #include <linux/stringify.h>
25
+#include <asm/fpu/api.h>
2726 #include <asm/debugreg.h>
2827 #include <asm/nospec-branch.h>
2928
....@@ -189,28 +188,6 @@
189188 #define X8(x...) X4(x), X4(x)
190189 #define X16(x...) X8(x), X8(x)
191190
192
-#define NR_FASTOP (ilog2(sizeof(ulong)) + 1)
193
-#define FASTOP_SIZE 8
194
-
195
-/*
196
- * fastop functions have a special calling convention:
197
- *
198
- * dst: rax (in/out)
199
- * src: rdx (in/out)
200
- * src2: rcx (in)
201
- * flags: rflags (in/out)
202
- * ex: rsi (in:fastop pointer, out:zero if exception)
203
- *
204
- * Moreover, they are all exactly FASTOP_SIZE bytes long, so functions for
205
- * different operand sizes can be reached by calculation, rather than a jump
206
- * table (which would be bigger than the code).
207
- *
208
- * fastop functions are declared as taking a never-defined fastop parameter,
209
- * so they can't be called from C directly.
210
- */
211
-
212
-struct fastop;
213
-
214191 struct opcode {
215192 u64 flags : 56;
216193 u64 intercept : 8;
....@@ -312,31 +289,65 @@
312289 #define ON64(x)
313290 #endif
314291
315
-static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *));
292
+/*
293
+ * fastop functions have a special calling convention:
294
+ *
295
+ * dst: rax (in/out)
296
+ * src: rdx (in/out)
297
+ * src2: rcx (in)
298
+ * flags: rflags (in/out)
299
+ * ex: rsi (in:fastop pointer, out:zero if exception)
300
+ *
301
+ * Moreover, they are all exactly FASTOP_SIZE bytes long, so functions for
302
+ * different operand sizes can be reached by calculation, rather than a jump
303
+ * table (which would be bigger than the code).
304
+ *
305
+ * The 16 byte alignment, considering 5 bytes for the RET thunk, 3 for ENDBR
306
+ * and 1 for the straight line speculation INT3, leaves 7 bytes for the
307
+ * body of the function. Currently none is larger than 4.
308
+ */
309
+static int fastop(struct x86_emulate_ctxt *ctxt, fastop_t fop);
316310
317
-#define FOP_FUNC(name) \
311
+#define FASTOP_SIZE 16
312
+
313
+#define __FOP_FUNC(name) \
318314 ".align " __stringify(FASTOP_SIZE) " \n\t" \
319315 ".type " name ", @function \n\t" \
320316 name ":\n\t"
321317
322
-#define FOP_RET "ret \n\t"
318
+#define FOP_FUNC(name) \
319
+ __FOP_FUNC(#name)
323320
324
-#define FOP_START(op) \
321
+#define __FOP_RET(name) \
322
+ ASM_RET \
323
+ ".size " name ", .-" name "\n\t"
324
+
325
+#define FOP_RET(name) \
326
+ __FOP_RET(#name)
327
+
328
+#define __FOP_START(op, align) \
325329 extern void em_##op(struct fastop *fake); \
326330 asm(".pushsection .text, \"ax\" \n\t" \
327331 ".global em_" #op " \n\t" \
328
- FOP_FUNC("em_" #op)
332
+ ".align " __stringify(align) " \n\t" \
333
+ "em_" #op ":\n\t"
334
+
335
+#define FOP_START(op) __FOP_START(op, FASTOP_SIZE)
329336
330337 #define FOP_END \
331338 ".popsection")
332339
340
+#define __FOPNOP(name) \
341
+ __FOP_FUNC(name) \
342
+ __FOP_RET(name)
343
+
333344 #define FOPNOP() \
334
- FOP_FUNC(__stringify(__UNIQUE_ID(nop))) \
335
- FOP_RET
345
+ __FOPNOP(__stringify(__UNIQUE_ID(nop)))
336346
337347 #define FOP1E(op, dst) \
338
- FOP_FUNC(#op "_" #dst) \
339
- "10: " #op " %" #dst " \n\t" FOP_RET
348
+ __FOP_FUNC(#op "_" #dst) \
349
+ "10: " #op " %" #dst " \n\t" \
350
+ __FOP_RET(#op "_" #dst)
340351
341352 #define FOP1EEX(op, dst) \
342353 FOP1E(op, dst) _ASM_EXTABLE(10b, kvm_fastop_exception)
....@@ -368,8 +379,9 @@
368379 FOP_END
369380
370381 #define FOP2E(op, dst, src) \
371
- FOP_FUNC(#op "_" #dst "_" #src) \
372
- #op " %" #src ", %" #dst " \n\t" FOP_RET
382
+ __FOP_FUNC(#op "_" #dst "_" #src) \
383
+ #op " %" #src ", %" #dst " \n\t" \
384
+ __FOP_RET(#op "_" #dst "_" #src)
373385
374386 #define FASTOP2(op) \
375387 FOP_START(op) \
....@@ -407,8 +419,9 @@
407419 FOP_END
408420
409421 #define FOP3E(op, dst, src, src2) \
410
- FOP_FUNC(#op "_" #dst "_" #src "_" #src2) \
411
- #op " %" #src2 ", %" #src ", %" #dst " \n\t" FOP_RET
422
+ __FOP_FUNC(#op "_" #dst "_" #src "_" #src2) \
423
+ #op " %" #src2 ", %" #src ", %" #dst " \n\t"\
424
+ __FOP_RET(#op "_" #dst "_" #src "_" #src2)
412425
413426 /* 3-operand, word-only, src2=cl */
414427 #define FASTOP3WCL(op) \
....@@ -420,19 +433,29 @@
420433 FOP_END
421434
422435 /* Special case for SETcc - 1 instruction per cc */
436
+
437
+/*
438
+ * Depending on .config the SETcc functions look like:
439
+ *
440
+ * SETcc %al [3 bytes]
441
+ * RET | JMP __x86_return_thunk [1,5 bytes; CONFIG_RETHUNK]
442
+ * INT3 [1 byte; CONFIG_SLS]
443
+ */
444
+#define SETCC_ALIGN 16
445
+
423446 #define FOP_SETCC(op) \
424
- ".align 4 \n\t" \
447
+ ".align " __stringify(SETCC_ALIGN) " \n\t" \
425448 ".type " #op ", @function \n\t" \
426449 #op ": \n\t" \
427450 #op " %al \n\t" \
428
- FOP_RET
451
+ __FOP_RET(#op) \
452
+ ".skip " __stringify(SETCC_ALIGN) " - (.-" #op "), 0xcc \n\t"
429453
430454 asm(".pushsection .fixup, \"ax\"\n"
431
- ".global kvm_fastop_exception \n"
432
- "kvm_fastop_exception: xor %esi, %esi; ret\n"
455
+ "kvm_fastop_exception: xor %esi, %esi; " ASM_RET
433456 ".popsection");
434457
435
-FOP_START(setcc)
458
+__FOP_START(setcc, SETCC_ALIGN)
436459 FOP_SETCC(seto)
437460 FOP_SETCC(setno)
438461 FOP_SETCC(setc)
....@@ -451,7 +474,10 @@
451474 FOP_SETCC(setnle)
452475 FOP_END;
453476
454
-FOP_START(salc) "pushf; sbb %al, %al; popf \n\t" FOP_RET
477
+FOP_START(salc)
478
+FOP_FUNC(salc)
479
+"pushf; sbb %al, %al; popf \n\t"
480
+FOP_RET(salc)
455481 FOP_END;
456482
457483 /*
....@@ -654,6 +680,17 @@
654680 ctxt->ops->set_segment(ctxt, selector, &desc, base3, seg);
655681 }
656682
683
+static inline u8 ctxt_virt_addr_bits(struct x86_emulate_ctxt *ctxt)
684
+{
685
+ return (ctxt->ops->get_cr(ctxt, 4) & X86_CR4_LA57) ? 57 : 48;
686
+}
687
+
688
+static inline bool emul_is_noncanonical_address(u64 la,
689
+ struct x86_emulate_ctxt *ctxt)
690
+{
691
+ return get_canonical(la, ctxt_virt_addr_bits(ctxt)) != la;
692
+}
693
+
657694 /*
658695 * x86 defines three classes of vector instructions: explicitly
659696 * aligned, explicitly unaligned, and the rest, which change behaviour
....@@ -759,8 +796,7 @@
759796 ctxt->mode, linear);
760797 }
761798
762
-static inline int assign_eip(struct x86_emulate_ctxt *ctxt, ulong dst,
763
- enum x86emul_mode mode)
799
+static inline int assign_eip(struct x86_emulate_ctxt *ctxt, ulong dst)
764800 {
765801 ulong linear;
766802 int rc;
....@@ -770,41 +806,71 @@
770806
771807 if (ctxt->op_bytes != sizeof(unsigned long))
772808 addr.ea = dst & ((1UL << (ctxt->op_bytes << 3)) - 1);
773
- rc = __linearize(ctxt, addr, &max_size, 1, false, true, mode, &linear);
809
+ rc = __linearize(ctxt, addr, &max_size, 1, false, true, ctxt->mode, &linear);
774810 if (rc == X86EMUL_CONTINUE)
775811 ctxt->_eip = addr.ea;
776812 return rc;
777813 }
778814
779
-static inline int assign_eip_near(struct x86_emulate_ctxt *ctxt, ulong dst)
815
+static inline int emulator_recalc_and_set_mode(struct x86_emulate_ctxt *ctxt)
780816 {
781
- return assign_eip(ctxt, dst, ctxt->mode);
817
+ u64 efer;
818
+ struct desc_struct cs;
819
+ u16 selector;
820
+ u32 base3;
821
+
822
+ ctxt->ops->get_msr(ctxt, MSR_EFER, &efer);
823
+
824
+ if (!(ctxt->ops->get_cr(ctxt, 0) & X86_CR0_PE)) {
825
+ /* Real mode. cpu must not have long mode active */
826
+ if (efer & EFER_LMA)
827
+ return X86EMUL_UNHANDLEABLE;
828
+ ctxt->mode = X86EMUL_MODE_REAL;
829
+ return X86EMUL_CONTINUE;
830
+ }
831
+
832
+ if (ctxt->eflags & X86_EFLAGS_VM) {
833
+ /* Protected/VM86 mode. cpu must not have long mode active */
834
+ if (efer & EFER_LMA)
835
+ return X86EMUL_UNHANDLEABLE;
836
+ ctxt->mode = X86EMUL_MODE_VM86;
837
+ return X86EMUL_CONTINUE;
838
+ }
839
+
840
+ if (!ctxt->ops->get_segment(ctxt, &selector, &cs, &base3, VCPU_SREG_CS))
841
+ return X86EMUL_UNHANDLEABLE;
842
+
843
+ if (efer & EFER_LMA) {
844
+ if (cs.l) {
845
+ /* Proper long mode */
846
+ ctxt->mode = X86EMUL_MODE_PROT64;
847
+ } else if (cs.d) {
848
+ /* 32 bit compatibility mode*/
849
+ ctxt->mode = X86EMUL_MODE_PROT32;
850
+ } else {
851
+ ctxt->mode = X86EMUL_MODE_PROT16;
852
+ }
853
+ } else {
854
+ /* Legacy 32 bit / 16 bit mode */
855
+ ctxt->mode = cs.d ? X86EMUL_MODE_PROT32 : X86EMUL_MODE_PROT16;
856
+ }
857
+
858
+ return X86EMUL_CONTINUE;
782859 }
783860
784
-static int assign_eip_far(struct x86_emulate_ctxt *ctxt, ulong dst,
785
- const struct desc_struct *cs_desc)
861
+static inline int assign_eip_near(struct x86_emulate_ctxt *ctxt, ulong dst)
786862 {
787
- enum x86emul_mode mode = ctxt->mode;
788
- int rc;
863
+ return assign_eip(ctxt, dst);
864
+}
789865
790
-#ifdef CONFIG_X86_64
791
- if (ctxt->mode >= X86EMUL_MODE_PROT16) {
792
- if (cs_desc->l) {
793
- u64 efer = 0;
866
+static int assign_eip_far(struct x86_emulate_ctxt *ctxt, ulong dst)
867
+{
868
+ int rc = emulator_recalc_and_set_mode(ctxt);
794869
795
- ctxt->ops->get_msr(ctxt, MSR_EFER, &efer);
796
- if (efer & EFER_LMA)
797
- mode = X86EMUL_MODE_PROT64;
798
- } else
799
- mode = X86EMUL_MODE_PROT32; /* temporary value */
800
- }
801
-#endif
802
- if (mode == X86EMUL_MODE_PROT16 || mode == X86EMUL_MODE_PROT32)
803
- mode = cs_desc->d ? X86EMUL_MODE_PROT32 : X86EMUL_MODE_PROT16;
804
- rc = assign_eip(ctxt, dst, mode);
805
- if (rc == X86EMUL_CONTINUE)
806
- ctxt->mode = mode;
807
- return rc;
870
+ if (rc != X86EMUL_CONTINUE)
871
+ return rc;
872
+
873
+ return assign_eip(ctxt, dst);
808874 }
809875
810876 static inline int jmp_rel(struct x86_emulate_ctxt *ctxt, int rel)
....@@ -1033,7 +1099,7 @@
10331099 static __always_inline u8 test_cc(unsigned int condition, unsigned long flags)
10341100 {
10351101 u8 rc;
1036
- void (*fop)(void) = (void *)em_setcc + 4 * (condition & 0xf);
1102
+ void (*fop)(void) = (void *)em_setcc + SETCC_ALIGN * (condition & 0xf);
10371103
10381104 flags = (flags & EFLAGS_MASK) | X86_EFLAGS_IF;
10391105 asm("push %[flags]; popf; " CALL_NOSPEC
....@@ -1059,8 +1125,23 @@
10591125 }
10601126 }
10611127
1062
-static void read_sse_reg(struct x86_emulate_ctxt *ctxt, sse128_t *data, int reg)
1128
+static void emulator_get_fpu(void)
10631129 {
1130
+ fpregs_lock();
1131
+
1132
+ fpregs_assert_state_consistent();
1133
+ if (test_thread_flag(TIF_NEED_FPU_LOAD))
1134
+ switch_fpu_return();
1135
+}
1136
+
1137
+static void emulator_put_fpu(void)
1138
+{
1139
+ fpregs_unlock();
1140
+}
1141
+
1142
+static void read_sse_reg(sse128_t *data, int reg)
1143
+{
1144
+ emulator_get_fpu();
10641145 switch (reg) {
10651146 case 0: asm("movdqa %%xmm0, %0" : "=m"(*data)); break;
10661147 case 1: asm("movdqa %%xmm1, %0" : "=m"(*data)); break;
....@@ -1082,11 +1163,12 @@
10821163 #endif
10831164 default: BUG();
10841165 }
1166
+ emulator_put_fpu();
10851167 }
10861168
1087
-static void write_sse_reg(struct x86_emulate_ctxt *ctxt, sse128_t *data,
1088
- int reg)
1169
+static void write_sse_reg(sse128_t *data, int reg)
10891170 {
1171
+ emulator_get_fpu();
10901172 switch (reg) {
10911173 case 0: asm("movdqa %0, %%xmm0" : : "m"(*data)); break;
10921174 case 1: asm("movdqa %0, %%xmm1" : : "m"(*data)); break;
....@@ -1108,10 +1190,12 @@
11081190 #endif
11091191 default: BUG();
11101192 }
1193
+ emulator_put_fpu();
11111194 }
11121195
1113
-static void read_mmx_reg(struct x86_emulate_ctxt *ctxt, u64 *data, int reg)
1196
+static void read_mmx_reg(u64 *data, int reg)
11141197 {
1198
+ emulator_get_fpu();
11151199 switch (reg) {
11161200 case 0: asm("movq %%mm0, %0" : "=m"(*data)); break;
11171201 case 1: asm("movq %%mm1, %0" : "=m"(*data)); break;
....@@ -1123,10 +1207,12 @@
11231207 case 7: asm("movq %%mm7, %0" : "=m"(*data)); break;
11241208 default: BUG();
11251209 }
1210
+ emulator_put_fpu();
11261211 }
11271212
1128
-static void write_mmx_reg(struct x86_emulate_ctxt *ctxt, u64 *data, int reg)
1213
+static void write_mmx_reg(u64 *data, int reg)
11291214 {
1215
+ emulator_get_fpu();
11301216 switch (reg) {
11311217 case 0: asm("movq %0, %%mm0" : : "m"(*data)); break;
11321218 case 1: asm("movq %0, %%mm1" : : "m"(*data)); break;
....@@ -1138,6 +1224,7 @@
11381224 case 7: asm("movq %0, %%mm7" : : "m"(*data)); break;
11391225 default: BUG();
11401226 }
1227
+ emulator_put_fpu();
11411228 }
11421229
11431230 static int em_fninit(struct x86_emulate_ctxt *ctxt)
....@@ -1145,7 +1232,9 @@
11451232 if (ctxt->ops->get_cr(ctxt, 0) & (X86_CR0_TS | X86_CR0_EM))
11461233 return emulate_nm(ctxt);
11471234
1235
+ emulator_get_fpu();
11481236 asm volatile("fninit");
1237
+ emulator_put_fpu();
11491238 return X86EMUL_CONTINUE;
11501239 }
11511240
....@@ -1156,7 +1245,9 @@
11561245 if (ctxt->ops->get_cr(ctxt, 0) & (X86_CR0_TS | X86_CR0_EM))
11571246 return emulate_nm(ctxt);
11581247
1248
+ emulator_get_fpu();
11591249 asm volatile("fnstcw %0": "+m"(fcw));
1250
+ emulator_put_fpu();
11601251
11611252 ctxt->dst.val = fcw;
11621253
....@@ -1170,7 +1261,9 @@
11701261 if (ctxt->ops->get_cr(ctxt, 0) & (X86_CR0_TS | X86_CR0_EM))
11711262 return emulate_nm(ctxt);
11721263
1264
+ emulator_get_fpu();
11731265 asm volatile("fnstsw %0": "+m"(fsw));
1266
+ emulator_put_fpu();
11741267
11751268 ctxt->dst.val = fsw;
11761269
....@@ -1189,7 +1282,7 @@
11891282 op->type = OP_XMM;
11901283 op->bytes = 16;
11911284 op->addr.xmm = reg;
1192
- read_sse_reg(ctxt, &op->vec_val, reg);
1285
+ read_sse_reg(&op->vec_val, reg);
11931286 return;
11941287 }
11951288 if (ctxt->d & Mmx) {
....@@ -1240,7 +1333,7 @@
12401333 op->type = OP_XMM;
12411334 op->bytes = 16;
12421335 op->addr.xmm = ctxt->modrm_rm;
1243
- read_sse_reg(ctxt, &op->vec_val, ctxt->modrm_rm);
1336
+ read_sse_reg(&op->vec_val, ctxt->modrm_rm);
12441337 return rc;
12451338 }
12461339 if (ctxt->d & Mmx) {
....@@ -1509,7 +1602,7 @@
15091602 return emulate_gp(ctxt, index << 3 | 0x2);
15101603
15111604 addr = dt.address + index * 8;
1512
- return linear_read_system(ctxt, addr, desc, sizeof *desc);
1605
+ return linear_read_system(ctxt, addr, desc, sizeof(*desc));
15131606 }
15141607
15151608 static void get_descriptor_table_ptr(struct x86_emulate_ctxt *ctxt,
....@@ -1522,7 +1615,7 @@
15221615 struct desc_struct desc;
15231616 u16 sel;
15241617
1525
- memset (dt, 0, sizeof *dt);
1618
+ memset(dt, 0, sizeof(*dt));
15261619 if (!ops->get_segment(ctxt, &sel, &desc, &base3,
15271620 VCPU_SREG_LDTR))
15281621 return;
....@@ -1586,7 +1679,7 @@
15861679 if (rc != X86EMUL_CONTINUE)
15871680 return rc;
15881681
1589
- return linear_write_system(ctxt, addr, desc, sizeof *desc);
1682
+ return linear_write_system(ctxt, addr, desc, sizeof(*desc));
15901683 }
15911684
15921685 static int __load_segment_descriptor(struct x86_emulate_ctxt *ctxt,
....@@ -1604,7 +1697,7 @@
16041697 u16 dummy;
16051698 u32 base3 = 0;
16061699
1607
- memset(&seg_desc, 0, sizeof seg_desc);
1700
+ memset(&seg_desc, 0, sizeof(seg_desc));
16081701
16091702 if (ctxt->mode == X86EMUL_MODE_REAL) {
16101703 /* set real mode segment descriptor (keep limit etc. for
....@@ -1669,11 +1762,6 @@
16691762 goto exception;
16701763 }
16711764
1672
- if (!seg_desc.p) {
1673
- err_vec = (seg == VCPU_SREG_SS) ? SS_VECTOR : NP_VECTOR;
1674
- goto exception;
1675
- }
1676
-
16771765 dpl = seg_desc.dpl;
16781766
16791767 switch (seg) {
....@@ -1713,12 +1801,6 @@
17131801 case VCPU_SREG_TR:
17141802 if (seg_desc.s || (seg_desc.type != 1 && seg_desc.type != 9))
17151803 goto exception;
1716
- old_desc = seg_desc;
1717
- seg_desc.type |= 2; /* busy */
1718
- ret = ctxt->ops->cmpxchg_emulated(ctxt, desc_addr, &old_desc, &seg_desc,
1719
- sizeof(seg_desc), &ctxt->exception);
1720
- if (ret != X86EMUL_CONTINUE)
1721
- return ret;
17221804 break;
17231805 case VCPU_SREG_LDTR:
17241806 if (seg_desc.s || seg_desc.type != 2)
....@@ -1737,6 +1819,11 @@
17371819 break;
17381820 }
17391821
1822
+ if (!seg_desc.p) {
1823
+ err_vec = (seg == VCPU_SREG_SS) ? SS_VECTOR : NP_VECTOR;
1824
+ goto exception;
1825
+ }
1826
+
17401827 if (seg_desc.s) {
17411828 /* mark segment as accessed */
17421829 if (!(seg_desc.type & 1)) {
....@@ -1751,8 +1838,17 @@
17511838 if (ret != X86EMUL_CONTINUE)
17521839 return ret;
17531840 if (emul_is_noncanonical_address(get_desc_base(&seg_desc) |
1754
- ((u64)base3 << 32), ctxt))
1755
- return emulate_gp(ctxt, 0);
1841
+ ((u64)base3 << 32), ctxt))
1842
+ return emulate_gp(ctxt, err_code);
1843
+ }
1844
+
1845
+ if (seg == VCPU_SREG_TR) {
1846
+ old_desc = seg_desc;
1847
+ seg_desc.type |= 2; /* busy */
1848
+ ret = ctxt->ops->cmpxchg_emulated(ctxt, desc_addr, &old_desc, &seg_desc,
1849
+ sizeof(seg_desc), &ctxt->exception);
1850
+ if (ret != X86EMUL_CONTINUE)
1851
+ return ret;
17561852 }
17571853 load:
17581854 ctxt->ops->set_segment(ctxt, selector, &seg_desc, base3, seg);
....@@ -1817,10 +1913,10 @@
18171913 op->bytes * op->count);
18181914 break;
18191915 case OP_XMM:
1820
- write_sse_reg(ctxt, &op->vec_val, op->addr.xmm);
1916
+ write_sse_reg(&op->vec_val, op->addr.xmm);
18211917 break;
18221918 case OP_MM:
1823
- write_mmx_reg(ctxt, &op->mm_val, op->addr.mm);
1919
+ write_mmx_reg(&op->mm_val, op->addr.mm);
18241920 break;
18251921 case OP_NONE:
18261922 /* no writeback */
....@@ -1972,7 +2068,7 @@
19722068 if (rc != X86EMUL_CONTINUE)
19732069 return rc;
19742070
1975
- if (ctxt->modrm_reg == VCPU_SREG_SS)
2071
+ if (seg == VCPU_SREG_SS)
19762072 ctxt->interruptibility = KVM_X86_SHADOW_INT_MOV_SS;
19772073 if (ctxt->op_bytes > 2)
19782074 rsp_increment(ctxt, ctxt->op_bytes - 2);
....@@ -2189,7 +2285,7 @@
21892285 if (rc != X86EMUL_CONTINUE)
21902286 return rc;
21912287
2192
- rc = assign_eip_far(ctxt, ctxt->src.val, &new_desc);
2288
+ rc = assign_eip_far(ctxt, ctxt->src.val);
21932289 /* Error handling is not implemented. */
21942290 if (rc != X86EMUL_CONTINUE)
21952291 return X86EMUL_UNHANDLEABLE;
....@@ -2270,7 +2366,7 @@
22702366 &new_desc);
22712367 if (rc != X86EMUL_CONTINUE)
22722368 return rc;
2273
- rc = assign_eip_far(ctxt, eip, &new_desc);
2369
+ rc = assign_eip_far(ctxt, eip);
22742370 /* Error handling is not implemented. */
22752371 if (rc != X86EMUL_CONTINUE)
22762372 return X86EMUL_UNHANDLEABLE;
....@@ -2332,26 +2428,11 @@
23322428 static int emulator_has_longmode(struct x86_emulate_ctxt *ctxt)
23332429 {
23342430 #ifdef CONFIG_X86_64
2335
- u32 eax, ebx, ecx, edx;
2336
-
2337
- eax = 0x80000001;
2338
- ecx = 0;
2339
- ctxt->ops->get_cpuid(ctxt, &eax, &ebx, &ecx, &edx, false);
2340
- return edx & bit(X86_FEATURE_LM);
2431
+ return ctxt->ops->guest_has_long_mode(ctxt);
23412432 #else
23422433 return false;
23432434 #endif
23442435 }
2345
-
2346
-#define GET_SMSTATE(type, smbase, offset) \
2347
- ({ \
2348
- type __val; \
2349
- int r = ctxt->ops->read_phys(ctxt, smbase + offset, &__val, \
2350
- sizeof(__val)); \
2351
- if (r != X86EMUL_CONTINUE) \
2352
- return X86EMUL_UNHANDLEABLE; \
2353
- __val; \
2354
- })
23552436
23562437 static void rsm_set_desc_flags(struct desc_struct *desc, u32 flags)
23572438 {
....@@ -2365,28 +2446,30 @@
23652446 desc->type = (flags >> 8) & 15;
23662447 }
23672448
2368
-static int rsm_load_seg_32(struct x86_emulate_ctxt *ctxt, u64 smbase, int n)
2449
+static int rsm_load_seg_32(struct x86_emulate_ctxt *ctxt, const char *smstate,
2450
+ int n)
23692451 {
23702452 struct desc_struct desc;
23712453 int offset;
23722454 u16 selector;
23732455
2374
- selector = GET_SMSTATE(u32, smbase, 0x7fa8 + n * 4);
2456
+ selector = GET_SMSTATE(u32, smstate, 0x7fa8 + n * 4);
23752457
23762458 if (n < 3)
23772459 offset = 0x7f84 + n * 12;
23782460 else
23792461 offset = 0x7f2c + (n - 3) * 12;
23802462
2381
- set_desc_base(&desc, GET_SMSTATE(u32, smbase, offset + 8));
2382
- set_desc_limit(&desc, GET_SMSTATE(u32, smbase, offset + 4));
2383
- rsm_set_desc_flags(&desc, GET_SMSTATE(u32, smbase, offset));
2463
+ set_desc_base(&desc, GET_SMSTATE(u32, smstate, offset + 8));
2464
+ set_desc_limit(&desc, GET_SMSTATE(u32, smstate, offset + 4));
2465
+ rsm_set_desc_flags(&desc, GET_SMSTATE(u32, smstate, offset));
23842466 ctxt->ops->set_segment(ctxt, selector, &desc, 0, n);
23852467 return X86EMUL_CONTINUE;
23862468 }
23872469
23882470 #ifdef CONFIG_X86_64
2389
-static int rsm_load_seg_64(struct x86_emulate_ctxt *ctxt, u64 smbase, int n)
2471
+static int rsm_load_seg_64(struct x86_emulate_ctxt *ctxt, const char *smstate,
2472
+ int n)
23902473 {
23912474 struct desc_struct desc;
23922475 int offset;
....@@ -2395,11 +2478,11 @@
23952478
23962479 offset = 0x7e00 + n * 16;
23972480
2398
- selector = GET_SMSTATE(u16, smbase, offset);
2399
- rsm_set_desc_flags(&desc, GET_SMSTATE(u16, smbase, offset + 2) << 8);
2400
- set_desc_limit(&desc, GET_SMSTATE(u32, smbase, offset + 4));
2401
- set_desc_base(&desc, GET_SMSTATE(u32, smbase, offset + 8));
2402
- base3 = GET_SMSTATE(u32, smbase, offset + 12);
2481
+ selector = GET_SMSTATE(u16, smstate, offset);
2482
+ rsm_set_desc_flags(&desc, GET_SMSTATE(u16, smstate, offset + 2) << 8);
2483
+ set_desc_limit(&desc, GET_SMSTATE(u32, smstate, offset + 4));
2484
+ set_desc_base(&desc, GET_SMSTATE(u32, smstate, offset + 8));
2485
+ base3 = GET_SMSTATE(u32, smstate, offset + 12);
24032486
24042487 ctxt->ops->set_segment(ctxt, selector, &desc, base3, n);
24052488 return X86EMUL_CONTINUE;
....@@ -2451,7 +2534,8 @@
24512534 return X86EMUL_CONTINUE;
24522535 }
24532536
2454
-static int rsm_load_state_32(struct x86_emulate_ctxt *ctxt, u64 smbase)
2537
+static int rsm_load_state_32(struct x86_emulate_ctxt *ctxt,
2538
+ const char *smstate)
24552539 {
24562540 struct desc_struct desc;
24572541 struct desc_ptr dt;
....@@ -2459,54 +2543,60 @@
24592543 u32 val, cr0, cr3, cr4;
24602544 int i;
24612545
2462
- cr0 = GET_SMSTATE(u32, smbase, 0x7ffc);
2463
- cr3 = GET_SMSTATE(u32, smbase, 0x7ff8);
2464
- ctxt->eflags = GET_SMSTATE(u32, smbase, 0x7ff4) | X86_EFLAGS_FIXED;
2465
- ctxt->_eip = GET_SMSTATE(u32, smbase, 0x7ff0);
2546
+ cr0 = GET_SMSTATE(u32, smstate, 0x7ffc);
2547
+ cr3 = GET_SMSTATE(u32, smstate, 0x7ff8);
2548
+ ctxt->eflags = GET_SMSTATE(u32, smstate, 0x7ff4) | X86_EFLAGS_FIXED;
2549
+ ctxt->_eip = GET_SMSTATE(u32, smstate, 0x7ff0);
24662550
24672551 for (i = 0; i < 8; i++)
2468
- *reg_write(ctxt, i) = GET_SMSTATE(u32, smbase, 0x7fd0 + i * 4);
2552
+ *reg_write(ctxt, i) = GET_SMSTATE(u32, smstate, 0x7fd0 + i * 4);
24692553
2470
- val = GET_SMSTATE(u32, smbase, 0x7fcc);
2471
- ctxt->ops->set_dr(ctxt, 6, (val & DR6_VOLATILE) | DR6_FIXED_1);
2472
- val = GET_SMSTATE(u32, smbase, 0x7fc8);
2473
- ctxt->ops->set_dr(ctxt, 7, (val & DR7_VOLATILE) | DR7_FIXED_1);
2554
+ val = GET_SMSTATE(u32, smstate, 0x7fcc);
24742555
2475
- selector = GET_SMSTATE(u32, smbase, 0x7fc4);
2476
- set_desc_base(&desc, GET_SMSTATE(u32, smbase, 0x7f64));
2477
- set_desc_limit(&desc, GET_SMSTATE(u32, smbase, 0x7f60));
2478
- rsm_set_desc_flags(&desc, GET_SMSTATE(u32, smbase, 0x7f5c));
2556
+ if (ctxt->ops->set_dr(ctxt, 6, (val & DR6_VOLATILE) | DR6_FIXED_1))
2557
+ return X86EMUL_UNHANDLEABLE;
2558
+
2559
+ val = GET_SMSTATE(u32, smstate, 0x7fc8);
2560
+
2561
+ if (ctxt->ops->set_dr(ctxt, 7, (val & DR7_VOLATILE) | DR7_FIXED_1))
2562
+ return X86EMUL_UNHANDLEABLE;
2563
+
2564
+ selector = GET_SMSTATE(u32, smstate, 0x7fc4);
2565
+ set_desc_base(&desc, GET_SMSTATE(u32, smstate, 0x7f64));
2566
+ set_desc_limit(&desc, GET_SMSTATE(u32, smstate, 0x7f60));
2567
+ rsm_set_desc_flags(&desc, GET_SMSTATE(u32, smstate, 0x7f5c));
24792568 ctxt->ops->set_segment(ctxt, selector, &desc, 0, VCPU_SREG_TR);
24802569
2481
- selector = GET_SMSTATE(u32, smbase, 0x7fc0);
2482
- set_desc_base(&desc, GET_SMSTATE(u32, smbase, 0x7f80));
2483
- set_desc_limit(&desc, GET_SMSTATE(u32, smbase, 0x7f7c));
2484
- rsm_set_desc_flags(&desc, GET_SMSTATE(u32, smbase, 0x7f78));
2570
+ selector = GET_SMSTATE(u32, smstate, 0x7fc0);
2571
+ set_desc_base(&desc, GET_SMSTATE(u32, smstate, 0x7f80));
2572
+ set_desc_limit(&desc, GET_SMSTATE(u32, smstate, 0x7f7c));
2573
+ rsm_set_desc_flags(&desc, GET_SMSTATE(u32, smstate, 0x7f78));
24852574 ctxt->ops->set_segment(ctxt, selector, &desc, 0, VCPU_SREG_LDTR);
24862575
2487
- dt.address = GET_SMSTATE(u32, smbase, 0x7f74);
2488
- dt.size = GET_SMSTATE(u32, smbase, 0x7f70);
2576
+ dt.address = GET_SMSTATE(u32, smstate, 0x7f74);
2577
+ dt.size = GET_SMSTATE(u32, smstate, 0x7f70);
24892578 ctxt->ops->set_gdt(ctxt, &dt);
24902579
2491
- dt.address = GET_SMSTATE(u32, smbase, 0x7f58);
2492
- dt.size = GET_SMSTATE(u32, smbase, 0x7f54);
2580
+ dt.address = GET_SMSTATE(u32, smstate, 0x7f58);
2581
+ dt.size = GET_SMSTATE(u32, smstate, 0x7f54);
24932582 ctxt->ops->set_idt(ctxt, &dt);
24942583
24952584 for (i = 0; i < 6; i++) {
2496
- int r = rsm_load_seg_32(ctxt, smbase, i);
2585
+ int r = rsm_load_seg_32(ctxt, smstate, i);
24972586 if (r != X86EMUL_CONTINUE)
24982587 return r;
24992588 }
25002589
2501
- cr4 = GET_SMSTATE(u32, smbase, 0x7f14);
2590
+ cr4 = GET_SMSTATE(u32, smstate, 0x7f14);
25022591
2503
- ctxt->ops->set_smbase(ctxt, GET_SMSTATE(u32, smbase, 0x7ef8));
2592
+ ctxt->ops->set_smbase(ctxt, GET_SMSTATE(u32, smstate, 0x7ef8));
25042593
25052594 return rsm_enter_protected_mode(ctxt, cr0, cr3, cr4);
25062595 }
25072596
25082597 #ifdef CONFIG_X86_64
2509
-static int rsm_load_state_64(struct x86_emulate_ctxt *ctxt, u64 smbase)
2598
+static int rsm_load_state_64(struct x86_emulate_ctxt *ctxt,
2599
+ const char *smstate)
25102600 {
25112601 struct desc_struct desc;
25122602 struct desc_ptr dt;
....@@ -2516,43 +2606,50 @@
25162606 int i, r;
25172607
25182608 for (i = 0; i < 16; i++)
2519
- *reg_write(ctxt, i) = GET_SMSTATE(u64, smbase, 0x7ff8 - i * 8);
2609
+ *reg_write(ctxt, i) = GET_SMSTATE(u64, smstate, 0x7ff8 - i * 8);
25202610
2521
- ctxt->_eip = GET_SMSTATE(u64, smbase, 0x7f78);
2522
- ctxt->eflags = GET_SMSTATE(u32, smbase, 0x7f70) | X86_EFLAGS_FIXED;
2611
+ ctxt->_eip = GET_SMSTATE(u64, smstate, 0x7f78);
2612
+ ctxt->eflags = GET_SMSTATE(u32, smstate, 0x7f70) | X86_EFLAGS_FIXED;
25232613
2524
- val = GET_SMSTATE(u32, smbase, 0x7f68);
2525
- ctxt->ops->set_dr(ctxt, 6, (val & DR6_VOLATILE) | DR6_FIXED_1);
2526
- val = GET_SMSTATE(u32, smbase, 0x7f60);
2527
- ctxt->ops->set_dr(ctxt, 7, (val & DR7_VOLATILE) | DR7_FIXED_1);
2614
+ val = GET_SMSTATE(u64, smstate, 0x7f68);
25282615
2529
- cr0 = GET_SMSTATE(u64, smbase, 0x7f58);
2530
- cr3 = GET_SMSTATE(u64, smbase, 0x7f50);
2531
- cr4 = GET_SMSTATE(u64, smbase, 0x7f48);
2532
- ctxt->ops->set_smbase(ctxt, GET_SMSTATE(u32, smbase, 0x7f00));
2533
- val = GET_SMSTATE(u64, smbase, 0x7ed0);
2534
- ctxt->ops->set_msr(ctxt, MSR_EFER, val & ~EFER_LMA);
2616
+ if (ctxt->ops->set_dr(ctxt, 6, (val & DR6_VOLATILE) | DR6_FIXED_1))
2617
+ return X86EMUL_UNHANDLEABLE;
25352618
2536
- selector = GET_SMSTATE(u32, smbase, 0x7e90);
2537
- rsm_set_desc_flags(&desc, GET_SMSTATE(u32, smbase, 0x7e92) << 8);
2538
- set_desc_limit(&desc, GET_SMSTATE(u32, smbase, 0x7e94));
2539
- set_desc_base(&desc, GET_SMSTATE(u32, smbase, 0x7e98));
2540
- base3 = GET_SMSTATE(u32, smbase, 0x7e9c);
2619
+ val = GET_SMSTATE(u64, smstate, 0x7f60);
2620
+
2621
+ if (ctxt->ops->set_dr(ctxt, 7, (val & DR7_VOLATILE) | DR7_FIXED_1))
2622
+ return X86EMUL_UNHANDLEABLE;
2623
+
2624
+ cr0 = GET_SMSTATE(u64, smstate, 0x7f58);
2625
+ cr3 = GET_SMSTATE(u64, smstate, 0x7f50);
2626
+ cr4 = GET_SMSTATE(u64, smstate, 0x7f48);
2627
+ ctxt->ops->set_smbase(ctxt, GET_SMSTATE(u32, smstate, 0x7f00));
2628
+ val = GET_SMSTATE(u64, smstate, 0x7ed0);
2629
+
2630
+ if (ctxt->ops->set_msr(ctxt, MSR_EFER, val & ~EFER_LMA))
2631
+ return X86EMUL_UNHANDLEABLE;
2632
+
2633
+ selector = GET_SMSTATE(u32, smstate, 0x7e90);
2634
+ rsm_set_desc_flags(&desc, GET_SMSTATE(u32, smstate, 0x7e92) << 8);
2635
+ set_desc_limit(&desc, GET_SMSTATE(u32, smstate, 0x7e94));
2636
+ set_desc_base(&desc, GET_SMSTATE(u32, smstate, 0x7e98));
2637
+ base3 = GET_SMSTATE(u32, smstate, 0x7e9c);
25412638 ctxt->ops->set_segment(ctxt, selector, &desc, base3, VCPU_SREG_TR);
25422639
2543
- dt.size = GET_SMSTATE(u32, smbase, 0x7e84);
2544
- dt.address = GET_SMSTATE(u64, smbase, 0x7e88);
2640
+ dt.size = GET_SMSTATE(u32, smstate, 0x7e84);
2641
+ dt.address = GET_SMSTATE(u64, smstate, 0x7e88);
25452642 ctxt->ops->set_idt(ctxt, &dt);
25462643
2547
- selector = GET_SMSTATE(u32, smbase, 0x7e70);
2548
- rsm_set_desc_flags(&desc, GET_SMSTATE(u32, smbase, 0x7e72) << 8);
2549
- set_desc_limit(&desc, GET_SMSTATE(u32, smbase, 0x7e74));
2550
- set_desc_base(&desc, GET_SMSTATE(u32, smbase, 0x7e78));
2551
- base3 = GET_SMSTATE(u32, smbase, 0x7e7c);
2644
+ selector = GET_SMSTATE(u32, smstate, 0x7e70);
2645
+ rsm_set_desc_flags(&desc, GET_SMSTATE(u32, smstate, 0x7e72) << 8);
2646
+ set_desc_limit(&desc, GET_SMSTATE(u32, smstate, 0x7e74));
2647
+ set_desc_base(&desc, GET_SMSTATE(u32, smstate, 0x7e78));
2648
+ base3 = GET_SMSTATE(u32, smstate, 0x7e7c);
25522649 ctxt->ops->set_segment(ctxt, selector, &desc, base3, VCPU_SREG_LDTR);
25532650
2554
- dt.size = GET_SMSTATE(u32, smbase, 0x7e64);
2555
- dt.address = GET_SMSTATE(u64, smbase, 0x7e68);
2651
+ dt.size = GET_SMSTATE(u32, smstate, 0x7e64);
2652
+ dt.address = GET_SMSTATE(u64, smstate, 0x7e68);
25562653 ctxt->ops->set_gdt(ctxt, &dt);
25572654
25582655 r = rsm_enter_protected_mode(ctxt, cr0, cr3, cr4);
....@@ -2560,7 +2657,7 @@
25602657 return r;
25612658
25622659 for (i = 0; i < 6; i++) {
2563
- r = rsm_load_seg_64(ctxt, smbase, i);
2660
+ r = rsm_load_seg_64(ctxt, smstate, i);
25642661 if (r != X86EMUL_CONTINUE)
25652662 return r;
25662663 }
....@@ -2572,11 +2669,24 @@
25722669 static int em_rsm(struct x86_emulate_ctxt *ctxt)
25732670 {
25742671 unsigned long cr0, cr4, efer;
2672
+ char buf[512];
25752673 u64 smbase;
25762674 int ret;
25772675
25782676 if ((ctxt->ops->get_hflags(ctxt) & X86EMUL_SMM_MASK) == 0)
25792677 return emulate_ud(ctxt);
2678
+
2679
+ smbase = ctxt->ops->get_smbase(ctxt);
2680
+
2681
+ ret = ctxt->ops->read_phys(ctxt, smbase + 0xfe00, buf, sizeof(buf));
2682
+ if (ret != X86EMUL_CONTINUE)
2683
+ return X86EMUL_UNHANDLEABLE;
2684
+
2685
+ if ((ctxt->ops->get_hflags(ctxt) & X86EMUL_SMM_INSIDE_NMI_MASK) == 0)
2686
+ ctxt->ops->set_nmi_mask(ctxt, false);
2687
+
2688
+ ctxt->ops->set_hflags(ctxt, ctxt->ops->get_hflags(ctxt) &
2689
+ ~(X86EMUL_SMM_INSIDE_NMI_MASK | X86EMUL_SMM_MASK));
25802690
25812691 /*
25822692 * Get back to real mode, to prepare a safe state in which to load
....@@ -2614,33 +2724,28 @@
26142724 ctxt->ops->set_msr(ctxt, MSR_EFER, efer);
26152725 }
26162726
2617
- smbase = ctxt->ops->get_smbase(ctxt);
2618
-
26192727 /*
26202728 * Give pre_leave_smm() a chance to make ISA-specific changes to the
26212729 * vCPU state (e.g. enter guest mode) before loading state from the SMM
26222730 * state-save area.
26232731 */
2624
- if (ctxt->ops->pre_leave_smm(ctxt, smbase))
2732
+ if (ctxt->ops->pre_leave_smm(ctxt, buf))
26252733 return X86EMUL_UNHANDLEABLE;
26262734
26272735 #ifdef CONFIG_X86_64
26282736 if (emulator_has_longmode(ctxt))
2629
- ret = rsm_load_state_64(ctxt, smbase + 0x8000);
2737
+ ret = rsm_load_state_64(ctxt, buf);
26302738 else
26312739 #endif
2632
- ret = rsm_load_state_32(ctxt, smbase + 0x8000);
2740
+ ret = rsm_load_state_32(ctxt, buf);
26332741
26342742 if (ret != X86EMUL_CONTINUE) {
26352743 /* FIXME: should triple fault */
26362744 return X86EMUL_UNHANDLEABLE;
26372745 }
26382746
2639
- if ((ctxt->ops->get_hflags(ctxt) & X86EMUL_SMM_INSIDE_NMI_MASK) == 0)
2640
- ctxt->ops->set_nmi_mask(ctxt, false);
2747
+ ctxt->ops->post_leave_smm(ctxt);
26412748
2642
- ctxt->ops->set_hflags(ctxt, ctxt->ops->get_hflags(ctxt) &
2643
- ~(X86EMUL_SMM_INSIDE_NMI_MASK | X86EMUL_SMM_MASK));
26442749 return X86EMUL_CONTINUE;
26452750 }
26462751
....@@ -2676,10 +2781,8 @@
26762781 u32 eax, ebx, ecx, edx;
26772782
26782783 eax = ecx = 0;
2679
- ctxt->ops->get_cpuid(ctxt, &eax, &ebx, &ecx, &edx, false);
2680
- return ebx == X86EMUL_CPUID_VENDOR_GenuineIntel_ebx
2681
- && ecx == X86EMUL_CPUID_VENDOR_GenuineIntel_ecx
2682
- && edx == X86EMUL_CPUID_VENDOR_GenuineIntel_edx;
2784
+ ctxt->ops->get_cpuid(ctxt, &eax, &ebx, &ecx, &edx, true);
2785
+ return is_guest_vendor_intel(ebx, ecx, edx);
26832786 }
26842787
26852788 static bool em_syscall_is_enabled(struct x86_emulate_ctxt *ctxt)
....@@ -2696,33 +2799,24 @@
26962799
26972800 eax = 0x00000000;
26982801 ecx = 0x00000000;
2699
- ops->get_cpuid(ctxt, &eax, &ebx, &ecx, &edx, false);
2802
+ ops->get_cpuid(ctxt, &eax, &ebx, &ecx, &edx, true);
27002803 /*
2701
- * Intel ("GenuineIntel")
2702
- * remark: Intel CPUs only support "syscall" in 64bit
2703
- * longmode. Also an 64bit guest with a
2704
- * 32bit compat-app running will #UD !! While this
2705
- * behaviour can be fixed (by emulating) into AMD
2706
- * response - CPUs of AMD can't behave like Intel.
2804
+ * remark: Intel CPUs only support "syscall" in 64bit longmode. Also a
2805
+ * 64bit guest with a 32bit compat-app running will #UD !! While this
2806
+ * behaviour can be fixed (by emulating) into AMD response - CPUs of
2807
+ * AMD can't behave like Intel.
27072808 */
2708
- if (ebx == X86EMUL_CPUID_VENDOR_GenuineIntel_ebx &&
2709
- ecx == X86EMUL_CPUID_VENDOR_GenuineIntel_ecx &&
2710
- edx == X86EMUL_CPUID_VENDOR_GenuineIntel_edx)
2809
+ if (is_guest_vendor_intel(ebx, ecx, edx))
27112810 return false;
27122811
2713
- /* AMD ("AuthenticAMD") */
2714
- if (ebx == X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx &&
2715
- ecx == X86EMUL_CPUID_VENDOR_AuthenticAMD_ecx &&
2716
- edx == X86EMUL_CPUID_VENDOR_AuthenticAMD_edx)
2812
+ if (is_guest_vendor_amd(ebx, ecx, edx) ||
2813
+ is_guest_vendor_hygon(ebx, ecx, edx))
27172814 return true;
27182815
2719
- /* AMD ("AMDisbetter!") */
2720
- if (ebx == X86EMUL_CPUID_VENDOR_AMDisbetterI_ebx &&
2721
- ecx == X86EMUL_CPUID_VENDOR_AMDisbetterI_ecx &&
2722
- edx == X86EMUL_CPUID_VENDOR_AMDisbetterI_edx)
2723
- return true;
2724
-
2725
- /* default: (not Intel, not AMD), apply Intel's stricter rules... */
2816
+ /*
2817
+ * default: (not Intel, not AMD, not Hygon), apply Intel's
2818
+ * stricter rules...
2819
+ */
27262820 return false;
27272821 }
27282822
....@@ -2743,11 +2837,10 @@
27432837 return emulate_ud(ctxt);
27442838
27452839 ops->get_msr(ctxt, MSR_EFER, &efer);
2746
- setup_syscalls_segments(ctxt, &cs, &ss);
2747
-
27482840 if (!(efer & EFER_SCE))
27492841 return emulate_ud(ctxt);
27502842
2843
+ setup_syscalls_segments(ctxt, &cs, &ss);
27512844 ops->get_msr(ctxt, MSR_STAR, &msr_data);
27522845 msr_data >>= 32;
27532846 cs_sel = (u16)(msr_data & 0xfffc);
....@@ -2811,12 +2904,11 @@
28112904 if (ctxt->mode == X86EMUL_MODE_PROT64)
28122905 return X86EMUL_UNHANDLEABLE;
28132906
2814
- setup_syscalls_segments(ctxt, &cs, &ss);
2815
-
28162907 ops->get_msr(ctxt, MSR_IA32_SYSENTER_CS, &msr_data);
28172908 if ((msr_data & 0xfffc) == 0x0)
28182909 return emulate_gp(ctxt, 0);
28192910
2911
+ setup_syscalls_segments(ctxt, &cs, &ss);
28202912 ctxt->eflags &= ~(X86_EFLAGS_VM | X86_EFLAGS_IF);
28212913 cs_sel = (u16)msr_data & ~SEGMENT_RPL_MASK;
28222914 ss_sel = cs_sel + 8;
....@@ -2834,6 +2926,8 @@
28342926 ops->get_msr(ctxt, MSR_IA32_SYSENTER_ESP, &msr_data);
28352927 *reg_write(ctxt, VCPU_REGS_RSP) = (efer & EFER_LMA) ? msr_data :
28362928 (u32)msr_data;
2929
+ if (efer & EFER_LMA)
2930
+ ctxt->mode = X86EMUL_MODE_PROT64;
28372931
28382932 return X86EMUL_CONTINUE;
28392933 }
....@@ -2892,6 +2986,7 @@
28922986 ops->set_segment(ctxt, ss_sel, &ss, 0, VCPU_SREG_SS);
28932987
28942988 ctxt->_eip = rdx;
2989
+ ctxt->mode = usermode;
28952990 *reg_write(ctxt, VCPU_REGS_RSP) = rcx;
28962991
28972992 return X86EMUL_CONTINUE;
....@@ -2983,7 +3078,7 @@
29833078 case 0xa4: /* movsb */
29843079 case 0xa5: /* movsd/w */
29853080 *reg_rmw(ctxt, VCPU_REGS_RSI) &= (u32)-1;
2986
- /* fall through */
3081
+ fallthrough;
29873082 case 0xaa: /* stosb */
29883083 case 0xab: /* stosd/w */
29893084 *reg_rmw(ctxt, VCPU_REGS_RDI) &= (u32)-1;
....@@ -3077,17 +3172,17 @@
30773172 int ret;
30783173 u32 new_tss_base = get_desc_base(new_desc);
30793174
3080
- ret = linear_read_system(ctxt, old_tss_base, &tss_seg, sizeof tss_seg);
3175
+ ret = linear_read_system(ctxt, old_tss_base, &tss_seg, sizeof(tss_seg));
30813176 if (ret != X86EMUL_CONTINUE)
30823177 return ret;
30833178
30843179 save_state_to_tss16(ctxt, &tss_seg);
30853180
3086
- ret = linear_write_system(ctxt, old_tss_base, &tss_seg, sizeof tss_seg);
3181
+ ret = linear_write_system(ctxt, old_tss_base, &tss_seg, sizeof(tss_seg));
30873182 if (ret != X86EMUL_CONTINUE)
30883183 return ret;
30893184
3090
- ret = linear_read_system(ctxt, new_tss_base, &tss_seg, sizeof tss_seg);
3185
+ ret = linear_read_system(ctxt, new_tss_base, &tss_seg, sizeof(tss_seg));
30913186 if (ret != X86EMUL_CONTINUE)
30923187 return ret;
30933188
....@@ -3096,7 +3191,7 @@
30963191
30973192 ret = linear_write_system(ctxt, new_tss_base,
30983193 &tss_seg.prev_task_link,
3099
- sizeof tss_seg.prev_task_link);
3194
+ sizeof(tss_seg.prev_task_link));
31003195 if (ret != X86EMUL_CONTINUE)
31013196 return ret;
31023197 }
....@@ -3218,7 +3313,7 @@
32183313 u32 eip_offset = offsetof(struct tss_segment_32, eip);
32193314 u32 ldt_sel_offset = offsetof(struct tss_segment_32, ldt_selector);
32203315
3221
- ret = linear_read_system(ctxt, old_tss_base, &tss_seg, sizeof tss_seg);
3316
+ ret = linear_read_system(ctxt, old_tss_base, &tss_seg, sizeof(tss_seg));
32223317 if (ret != X86EMUL_CONTINUE)
32233318 return ret;
32243319
....@@ -3230,7 +3325,7 @@
32303325 if (ret != X86EMUL_CONTINUE)
32313326 return ret;
32323327
3233
- ret = linear_read_system(ctxt, new_tss_base, &tss_seg, sizeof tss_seg);
3328
+ ret = linear_read_system(ctxt, new_tss_base, &tss_seg, sizeof(tss_seg));
32343329 if (ret != X86EMUL_CONTINUE)
32353330 return ret;
32363331
....@@ -3239,7 +3334,7 @@
32393334
32403335 ret = linear_write_system(ctxt, new_tss_base,
32413336 &tss_seg.prev_task_link,
3242
- sizeof tss_seg.prev_task_link);
3337
+ sizeof(tss_seg.prev_task_link));
32433338 if (ret != X86EMUL_CONTINUE)
32443339 return ret;
32453340 }
....@@ -3488,7 +3583,7 @@
34883583 if (rc != X86EMUL_CONTINUE)
34893584 return rc;
34903585
3491
- rc = assign_eip_far(ctxt, ctxt->src.val, &new_desc);
3586
+ rc = assign_eip_far(ctxt, ctxt->src.val);
34923587 if (rc != X86EMUL_CONTINUE)
34933588 goto fail;
34943589
....@@ -3560,8 +3655,10 @@
35603655 {
35613656 u64 tsc_aux = 0;
35623657
3563
- if (ctxt->ops->get_msr(ctxt, MSR_TSC_AUX, &tsc_aux))
3658
+ if (!ctxt->ops->guest_has_rdpid(ctxt))
35643659 return emulate_ud(ctxt);
3660
+
3661
+ ctxt->ops->get_msr(ctxt, MSR_TSC_AUX, &tsc_aux);
35653662 ctxt->dst.val = tsc_aux;
35663663 return X86EMUL_CONTINUE;
35673664 }
....@@ -3593,18 +3690,11 @@
35933690 return X86EMUL_CONTINUE;
35943691 }
35953692
3596
-#define FFL(x) bit(X86_FEATURE_##x)
3597
-
35983693 static int em_movbe(struct x86_emulate_ctxt *ctxt)
35993694 {
3600
- u32 ebx, ecx, edx, eax = 1;
36013695 u16 tmp;
36023696
3603
- /*
3604
- * Check MOVBE is set in the guest-visible CPUID leaf.
3605
- */
3606
- ctxt->ops->get_cpuid(ctxt, &eax, &ebx, &ecx, &edx, false);
3607
- if (!(ecx & FFL(MOVBE)))
3697
+ if (!ctxt->ops->guest_has_movbe(ctxt))
36083698 return emulate_ud(ctxt);
36093699
36103700 switch (ctxt->op_bytes) {
....@@ -3635,11 +3725,25 @@
36353725
36363726 static int em_cr_write(struct x86_emulate_ctxt *ctxt)
36373727 {
3638
- if (ctxt->ops->set_cr(ctxt, ctxt->modrm_reg, ctxt->src.val))
3728
+ int cr_num = ctxt->modrm_reg;
3729
+ int r;
3730
+
3731
+ if (ctxt->ops->set_cr(ctxt, cr_num, ctxt->src.val))
36393732 return emulate_gp(ctxt, 0);
36403733
36413734 /* Disable writeback. */
36423735 ctxt->dst.type = OP_NONE;
3736
+
3737
+ if (cr_num == 0) {
3738
+ /*
3739
+ * CR0 write might have updated CR0.PE and/or CR0.PG
3740
+ * which can affect the cpu's execution mode.
3741
+ */
3742
+ r = emulator_recalc_and_set_mode(ctxt);
3743
+ if (r != X86EMUL_CONTINUE)
3744
+ return r;
3745
+ }
3746
+
36433747 return X86EMUL_CONTINUE;
36443748 }
36453749
....@@ -3663,21 +3767,35 @@
36633767
36643768 static int em_wrmsr(struct x86_emulate_ctxt *ctxt)
36653769 {
3770
+ u64 msr_index = reg_read(ctxt, VCPU_REGS_RCX);
36663771 u64 msr_data;
3772
+ int r;
36673773
36683774 msr_data = (u32)reg_read(ctxt, VCPU_REGS_RAX)
36693775 | ((u64)reg_read(ctxt, VCPU_REGS_RDX) << 32);
3670
- if (ctxt->ops->set_msr(ctxt, reg_read(ctxt, VCPU_REGS_RCX), msr_data))
3776
+ r = ctxt->ops->set_msr(ctxt, msr_index, msr_data);
3777
+
3778
+ if (r == X86EMUL_IO_NEEDED)
3779
+ return r;
3780
+
3781
+ if (r > 0)
36713782 return emulate_gp(ctxt, 0);
36723783
3673
- return X86EMUL_CONTINUE;
3784
+ return r < 0 ? X86EMUL_UNHANDLEABLE : X86EMUL_CONTINUE;
36743785 }
36753786
36763787 static int em_rdmsr(struct x86_emulate_ctxt *ctxt)
36773788 {
3789
+ u64 msr_index = reg_read(ctxt, VCPU_REGS_RCX);
36783790 u64 msr_data;
3791
+ int r;
36793792
3680
- if (ctxt->ops->get_msr(ctxt, reg_read(ctxt, VCPU_REGS_RCX), &msr_data))
3793
+ r = ctxt->ops->get_msr(ctxt, msr_index, &msr_data);
3794
+
3795
+ if (r == X86EMUL_IO_NEEDED)
3796
+ return r;
3797
+
3798
+ if (r)
36813799 return emulate_gp(ctxt, 0);
36823800
36833801 *reg_write(ctxt, VCPU_REGS_RAX) = (u32)msr_data;
....@@ -3945,7 +4063,7 @@
39454063
39464064 eax = reg_read(ctxt, VCPU_REGS_RAX);
39474065 ecx = reg_read(ctxt, VCPU_REGS_RCX);
3948
- ctxt->ops->get_cpuid(ctxt, &eax, &ebx, &ecx, &edx, true);
4066
+ ctxt->ops->get_cpuid(ctxt, &eax, &ebx, &ecx, &edx, false);
39494067 *reg_write(ctxt, VCPU_REGS_RAX) = eax;
39504068 *reg_write(ctxt, VCPU_REGS_RBX) = ebx;
39514069 *reg_write(ctxt, VCPU_REGS_RCX) = ecx;
....@@ -4008,10 +4126,7 @@
40084126
40094127 static int check_fxsr(struct x86_emulate_ctxt *ctxt)
40104128 {
4011
- u32 eax = 1, ebx, ecx = 0, edx;
4012
-
4013
- ctxt->ops->get_cpuid(ctxt, &eax, &ebx, &ecx, &edx, false);
4014
- if (!(edx & FFL(FXSR)))
4129
+ if (!ctxt->ops->guest_has_fxsr(ctxt))
40154130 return emulate_ud(ctxt);
40164131
40174132 if (ctxt->ops->get_cr(ctxt, 0) & (X86_CR0_TS | X86_CR0_EM))
....@@ -4073,7 +4188,11 @@
40734188 if (rc != X86EMUL_CONTINUE)
40744189 return rc;
40754190
4191
+ emulator_get_fpu();
4192
+
40764193 rc = asm_safe("fxsave %[fx]", , [fx] "+m"(fx_state));
4194
+
4195
+ emulator_put_fpu();
40774196
40784197 if (rc != X86EMUL_CONTINUE)
40794198 return rc;
....@@ -4117,6 +4236,8 @@
41174236 if (rc != X86EMUL_CONTINUE)
41184237 return rc;
41194238
4239
+ emulator_get_fpu();
4240
+
41204241 if (size < __fxstate_size(16)) {
41214242 rc = fxregs_fixup(&fx_state, size);
41224243 if (rc != X86EMUL_CONTINUE)
....@@ -4132,7 +4253,23 @@
41324253 rc = asm_safe("fxrstor %[fx]", : [fx] "m"(fx_state));
41334254
41344255 out:
4256
+ emulator_put_fpu();
4257
+
41354258 return rc;
4259
+}
4260
+
4261
+static int em_xsetbv(struct x86_emulate_ctxt *ctxt)
4262
+{
4263
+ u32 eax, ecx, edx;
4264
+
4265
+ eax = reg_read(ctxt, VCPU_REGS_RAX);
4266
+ edx = reg_read(ctxt, VCPU_REGS_RDX);
4267
+ ecx = reg_read(ctxt, VCPU_REGS_RCX);
4268
+
4269
+ if (ctxt->ops->set_xcr(ctxt, ecx, ((u64)edx << 32) | eax))
4270
+ return emulate_gp(ctxt, 0);
4271
+
4272
+ return X86EMUL_CONTINUE;
41364273 }
41374274
41384275 static bool valid_cr(int nr)
....@@ -4147,84 +4284,10 @@
41474284 }
41484285 }
41494286
4150
-static int check_cr_read(struct x86_emulate_ctxt *ctxt)
4287
+static int check_cr_access(struct x86_emulate_ctxt *ctxt)
41514288 {
41524289 if (!valid_cr(ctxt->modrm_reg))
41534290 return emulate_ud(ctxt);
4154
-
4155
- return X86EMUL_CONTINUE;
4156
-}
4157
-
4158
-static int check_cr_write(struct x86_emulate_ctxt *ctxt)
4159
-{
4160
- u64 new_val = ctxt->src.val64;
4161
- int cr = ctxt->modrm_reg;
4162
- u64 efer = 0;
4163
-
4164
- static u64 cr_reserved_bits[] = {
4165
- 0xffffffff00000000ULL,
4166
- 0, 0, 0, /* CR3 checked later */
4167
- CR4_RESERVED_BITS,
4168
- 0, 0, 0,
4169
- CR8_RESERVED_BITS,
4170
- };
4171
-
4172
- if (!valid_cr(cr))
4173
- return emulate_ud(ctxt);
4174
-
4175
- if (new_val & cr_reserved_bits[cr])
4176
- return emulate_gp(ctxt, 0);
4177
-
4178
- switch (cr) {
4179
- case 0: {
4180
- u64 cr4;
4181
- if (((new_val & X86_CR0_PG) && !(new_val & X86_CR0_PE)) ||
4182
- ((new_val & X86_CR0_NW) && !(new_val & X86_CR0_CD)))
4183
- return emulate_gp(ctxt, 0);
4184
-
4185
- cr4 = ctxt->ops->get_cr(ctxt, 4);
4186
- ctxt->ops->get_msr(ctxt, MSR_EFER, &efer);
4187
-
4188
- if ((new_val & X86_CR0_PG) && (efer & EFER_LME) &&
4189
- !(cr4 & X86_CR4_PAE))
4190
- return emulate_gp(ctxt, 0);
4191
-
4192
- break;
4193
- }
4194
- case 3: {
4195
- u64 rsvd = 0;
4196
-
4197
- ctxt->ops->get_msr(ctxt, MSR_EFER, &efer);
4198
- if (efer & EFER_LMA) {
4199
- u64 maxphyaddr;
4200
- u32 eax, ebx, ecx, edx;
4201
-
4202
- eax = 0x80000008;
4203
- ecx = 0;
4204
- if (ctxt->ops->get_cpuid(ctxt, &eax, &ebx, &ecx,
4205
- &edx, false))
4206
- maxphyaddr = eax & 0xff;
4207
- else
4208
- maxphyaddr = 36;
4209
- rsvd = rsvd_bits(maxphyaddr, 63);
4210
- if (ctxt->ops->get_cr(ctxt, 4) & X86_CR4_PCIDE)
4211
- rsvd &= ~X86_CR3_PCID_NOFLUSH;
4212
- }
4213
-
4214
- if (new_val & rsvd)
4215
- return emulate_gp(ctxt, 0);
4216
-
4217
- break;
4218
- }
4219
- case 4: {
4220
- ctxt->ops->get_msr(ctxt, MSR_EFER, &efer);
4221
-
4222
- if ((efer & EFER_LMA) && !(new_val & X86_CR4_PAE))
4223
- return emulate_gp(ctxt, 0);
4224
-
4225
- break;
4226
- }
4227
- }
42284291
42294292 return X86EMUL_CONTINUE;
42304293 }
....@@ -4255,7 +4318,7 @@
42554318 ulong dr6;
42564319
42574320 ctxt->ops->get_dr(ctxt, 6, &dr6);
4258
- dr6 &= ~15;
4321
+ dr6 &= ~DR_TRAP_BITS;
42594322 dr6 |= DR6_BD | DR6_RTM;
42604323 ctxt->ops->set_dr(ctxt, 6, dr6);
42614324 return emulate_db(ctxt);
....@@ -4388,6 +4451,12 @@
43884451 N, N, N, N, N, N,
43894452 };
43904453
4454
+static const struct opcode group7_rm2[] = {
4455
+ N,
4456
+ II(ImplicitOps | Priv, em_xsetbv, xsetbv),
4457
+ N, N, N, N, N, N,
4458
+};
4459
+
43914460 static const struct opcode group7_rm3[] = {
43924461 DIP(SrcNone | Prot | Priv, vmrun, check_svme_pa),
43934462 II(SrcNone | Prot | EmulateOnUD, em_hypercall, vmmcall),
....@@ -4477,7 +4546,8 @@
44774546 }, {
44784547 EXT(0, group7_rm0),
44794548 EXT(0, group7_rm1),
4480
- N, EXT(0, group7_rm3),
4549
+ EXT(0, group7_rm2),
4550
+ EXT(0, group7_rm3),
44814551 II(SrcNone | DstMem | Mov, em_smsw, smsw), N,
44824552 II(SrcMem16 | Mov | Priv, em_lmsw, lmsw),
44834553 EXT(0, group7_rm7),
....@@ -4496,7 +4566,7 @@
44964566 * from the register case of group9.
44974567 */
44984568 static const struct gprefix pfx_0f_c7_7 = {
4499
- N, N, N, II(DstMem | ModRM | Op3264 | EmulateOnUD, em_rdpid, rdtscp),
4569
+ N, N, N, II(DstMem | ModRM | Op3264 | EmulateOnUD, em_rdpid, rdpid),
45004570 };
45014571
45024572
....@@ -4754,13 +4824,17 @@
47544824 GP(ModRM | DstReg | SrcMem | Mov | Sse, &pfx_0f_10_0f_11),
47554825 GP(ModRM | DstMem | SrcReg | Mov | Sse, &pfx_0f_10_0f_11),
47564826 N, N, N, N, N, N,
4757
- D(ImplicitOps | ModRM | SrcMem | NoAccess),
4758
- N, N, N, N, N, N, D(ImplicitOps | ModRM | SrcMem | NoAccess),
4827
+ D(ImplicitOps | ModRM | SrcMem | NoAccess), /* 4 * prefetch + 4 * reserved NOP */
4828
+ D(ImplicitOps | ModRM | SrcMem | NoAccess), N, N,
4829
+ D(ImplicitOps | ModRM | SrcMem | NoAccess), /* 8 * reserved NOP */
4830
+ D(ImplicitOps | ModRM | SrcMem | NoAccess), /* 8 * reserved NOP */
4831
+ D(ImplicitOps | ModRM | SrcMem | NoAccess), /* 8 * reserved NOP */
4832
+ D(ImplicitOps | ModRM | SrcMem | NoAccess), /* NOP + 7 * reserved NOP */
47594833 /* 0x20 - 0x2F */
4760
- DIP(ModRM | DstMem | Priv | Op3264 | NoMod, cr_read, check_cr_read),
4834
+ DIP(ModRM | DstMem | Priv | Op3264 | NoMod, cr_read, check_cr_access),
47614835 DIP(ModRM | DstMem | Priv | Op3264 | NoMod, dr_read, check_dr_read),
47624836 IIP(ModRM | SrcMem | Priv | Op3264 | NoMod, em_cr_write, cr_write,
4763
- check_cr_write),
4837
+ check_cr_access),
47644838 IIP(ModRM | SrcMem | Priv | Op3264 | NoMod, em_dr_write, dr_write,
47654839 check_dr_write),
47664840 N, N, N, N,
....@@ -5124,7 +5198,7 @@
51245198 else {
51255199 rc = __do_insn_fetch_bytes(ctxt, 1);
51265200 if (rc != X86EMUL_CONTINUE)
5127
- return rc;
5201
+ goto done;
51285202 }
51295203
51305204 switch (mode) {
....@@ -5426,7 +5500,9 @@
54265500 {
54275501 int rc;
54285502
5503
+ emulator_get_fpu();
54295504 rc = asm_safe("fwait");
5505
+ emulator_put_fpu();
54305506
54315507 if (unlikely(rc != X86EMUL_CONTINUE))
54325508 return emulate_exception(ctxt, MF_VECTOR, 0, false);
....@@ -5434,14 +5510,13 @@
54345510 return X86EMUL_CONTINUE;
54355511 }
54365512
5437
-static void fetch_possible_mmx_operand(struct x86_emulate_ctxt *ctxt,
5438
- struct operand *op)
5513
+static void fetch_possible_mmx_operand(struct operand *op)
54395514 {
54405515 if (op->type == OP_MM)
5441
- read_mmx_reg(ctxt, &op->mm_val, op->addr.mm);
5516
+ read_mmx_reg(&op->mm_val, op->addr.mm);
54425517 }
54435518
5444
-static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *))
5519
+static int fastop(struct x86_emulate_ctxt *ctxt, fastop_t fop)
54455520 {
54465521 ulong flags = (ctxt->eflags & EFLAGS_MASK) | X86_EFLAGS_IF;
54475522
....@@ -5517,10 +5592,10 @@
55175592 * Now that we know the fpu is exception safe, we can fetch
55185593 * operands from it.
55195594 */
5520
- fetch_possible_mmx_operand(ctxt, &ctxt->src);
5521
- fetch_possible_mmx_operand(ctxt, &ctxt->src2);
5595
+ fetch_possible_mmx_operand(&ctxt->src);
5596
+ fetch_possible_mmx_operand(&ctxt->src2);
55225597 if (!(ctxt->d & Mov))
5523
- fetch_possible_mmx_operand(ctxt, &ctxt->dst);
5598
+ fetch_possible_mmx_operand(&ctxt->dst);
55245599 }
55255600
55265601 if (unlikely(emul_flags & X86EMUL_GUEST_MASK) && ctxt->intercept) {
....@@ -5619,14 +5694,10 @@
56195694 ctxt->eflags &= ~X86_EFLAGS_RF;
56205695
56215696 if (ctxt->execute) {
5622
- if (ctxt->d & Fastop) {
5623
- void (*fop)(struct fastop *) = (void *)ctxt->execute;
5624
- rc = fastop(ctxt, fop);
5625
- if (rc != X86EMUL_CONTINUE)
5626
- goto done;
5627
- goto writeback;
5628
- }
5629
- rc = ctxt->execute(ctxt);
5697
+ if (ctxt->d & Fastop)
5698
+ rc = fastop(ctxt, ctxt->fop);
5699
+ else
5700
+ rc = ctxt->execute(ctxt);
56305701 if (rc != X86EMUL_CONTINUE)
56315702 goto done;
56325703 goto writeback;
....@@ -5755,6 +5826,8 @@
57555826 }
57565827
57575828 ctxt->eip = ctxt->_eip;
5829
+ if (ctxt->mode != X86EMUL_MODE_PROT64)
5830
+ ctxt->eip = (u32)ctxt->_eip;
57585831
57595832 done:
57605833 if (rc == X86EMUL_PROPAGATE_FAULT) {