| @@ -1,14 +1,14 @@ | | | @@ -1,14 +1,14 @@ |
1 | /* $NetBSD: nvmm_x86_svm.c,v 1.66 2020/08/05 10:31:37 maxv Exp $ */ | | 1 | /* $NetBSD: nvmm_x86_svm.c,v 1.67 2020/08/05 15:22:25 maxv Exp $ */ |
2 | | | 2 | |
3 | /* | | 3 | /* |
4 | * Copyright (c) 2018-2020 The NetBSD Foundation, Inc. | | 4 | * Copyright (c) 2018-2020 The NetBSD Foundation, Inc. |
5 | * All rights reserved. | | 5 | * All rights reserved. |
6 | * | | 6 | * |
7 | * This code is derived from software contributed to The NetBSD Foundation | | 7 | * This code is derived from software contributed to The NetBSD Foundation |
8 | * by Maxime Villard. | | 8 | * by Maxime Villard. |
9 | * | | 9 | * |
10 | * Redistribution and use in source and binary forms, with or without | | 10 | * Redistribution and use in source and binary forms, with or without |
11 | * modification, are permitted provided that the following conditions | | 11 | * modification, are permitted provided that the following conditions |
12 | * are met: | | 12 | * are met: |
13 | * 1. Redistributions of source code must retain the above copyright | | 13 | * 1. Redistributions of source code must retain the above copyright |
14 | * notice, this list of conditions and the following disclaimer. | | 14 | * notice, this list of conditions and the following disclaimer. |
| @@ -20,27 +20,27 @@ | | | @@ -20,27 +20,27 @@ |
20 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | | 20 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
21 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | | 21 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
22 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS | | 22 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS |
23 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | | 23 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
24 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | | 24 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
25 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | | 25 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
26 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | | 26 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
27 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | | 27 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
28 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | | 28 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
29 | * POSSIBILITY OF SUCH DAMAGE. | | 29 | * POSSIBILITY OF SUCH DAMAGE. |
30 | */ | | 30 | */ |
31 | | | 31 | |
32 | #include <sys/cdefs.h> | | 32 | #include <sys/cdefs.h> |
33 | __KERNEL_RCSID(0, "$NetBSD: nvmm_x86_svm.c,v 1.66 2020/08/05 10:31:37 maxv Exp $"); | | 33 | __KERNEL_RCSID(0, "$NetBSD: nvmm_x86_svm.c,v 1.67 2020/08/05 15:22:25 maxv Exp $"); |
34 | | | 34 | |
35 | #include <sys/param.h> | | 35 | #include <sys/param.h> |
36 | #include <sys/systm.h> | | 36 | #include <sys/systm.h> |
37 | #include <sys/kernel.h> | | 37 | #include <sys/kernel.h> |
38 | #include <sys/kmem.h> | | 38 | #include <sys/kmem.h> |
39 | #include <sys/cpu.h> | | 39 | #include <sys/cpu.h> |
40 | #include <sys/xcall.h> | | 40 | #include <sys/xcall.h> |
41 | #include <sys/mman.h> | | 41 | #include <sys/mman.h> |
42 | | | 42 | |
43 | #include <uvm/uvm.h> | | 43 | #include <uvm/uvm.h> |
44 | #include <uvm/uvm_page.h> | | 44 | #include <uvm/uvm_page.h> |
45 | | | 45 | |
46 | #include <x86/cputypes.h> | | 46 | #include <x86/cputypes.h> |
| @@ -222,31 +222,36 @@ svm_stgi(void) | | | @@ -222,31 +222,36 @@ svm_stgi(void) |
222 | #define VMCB_EXITCODE_CR3_WRITE_TRAP 0x0093 | | 222 | #define VMCB_EXITCODE_CR3_WRITE_TRAP 0x0093 |
223 | #define VMCB_EXITCODE_CR4_WRITE_TRAP 0x0094 | | 223 | #define VMCB_EXITCODE_CR4_WRITE_TRAP 0x0094 |
224 | #define VMCB_EXITCODE_CR5_WRITE_TRAP 0x0095 | | 224 | #define VMCB_EXITCODE_CR5_WRITE_TRAP 0x0095 |
225 | #define VMCB_EXITCODE_CR6_WRITE_TRAP 0x0096 | | 225 | #define VMCB_EXITCODE_CR6_WRITE_TRAP 0x0096 |
226 | #define VMCB_EXITCODE_CR7_WRITE_TRAP 0x0097 | | 226 | #define VMCB_EXITCODE_CR7_WRITE_TRAP 0x0097 |
227 | #define VMCB_EXITCODE_CR8_WRITE_TRAP 0x0098 | | 227 | #define VMCB_EXITCODE_CR8_WRITE_TRAP 0x0098 |
228 | #define VMCB_EXITCODE_CR9_WRITE_TRAP 0x0099 | | 228 | #define VMCB_EXITCODE_CR9_WRITE_TRAP 0x0099 |
229 | #define VMCB_EXITCODE_CR10_WRITE_TRAP 0x009A | | 229 | #define VMCB_EXITCODE_CR10_WRITE_TRAP 0x009A |
230 | #define VMCB_EXITCODE_CR11_WRITE_TRAP 0x009B | | 230 | #define VMCB_EXITCODE_CR11_WRITE_TRAP 0x009B |
231 | #define VMCB_EXITCODE_CR12_WRITE_TRAP 0x009C | | 231 | #define VMCB_EXITCODE_CR12_WRITE_TRAP 0x009C |
232 | #define VMCB_EXITCODE_CR13_WRITE_TRAP 0x009D | | 232 | #define VMCB_EXITCODE_CR13_WRITE_TRAP 0x009D |
233 | #define VMCB_EXITCODE_CR14_WRITE_TRAP 0x009E | | 233 | #define VMCB_EXITCODE_CR14_WRITE_TRAP 0x009E |
234 | #define VMCB_EXITCODE_CR15_WRITE_TRAP 0x009F | | 234 | #define VMCB_EXITCODE_CR15_WRITE_TRAP 0x009F |
| | | 235 | #define VMCB_EXITCODE_INVLPGB 0x00A0 |
| | | 236 | #define VMCB_EXITCODE_INVLPGB_ILLEGAL 0x00A1 |
| | | 237 | #define VMCB_EXITCODE_INVPCID 0x00A2 |
235 | #define VMCB_EXITCODE_MCOMMIT 0x00A3 | | 238 | #define VMCB_EXITCODE_MCOMMIT 0x00A3 |
| | | 239 | #define VMCB_EXITCODE_TLBSYNC 0x00A4 |
236 | #define VMCB_EXITCODE_NPF 0x0400 | | 240 | #define VMCB_EXITCODE_NPF 0x0400 |
237 | #define VMCB_EXITCODE_AVIC_INCOMP_IPI 0x0401 | | 241 | #define VMCB_EXITCODE_AVIC_INCOMP_IPI 0x0401 |
238 | #define VMCB_EXITCODE_AVIC_NOACCEL 0x0402 | | 242 | #define VMCB_EXITCODE_AVIC_NOACCEL 0x0402 |
239 | #define VMCB_EXITCODE_VMGEXIT 0x0403 | | 243 | #define VMCB_EXITCODE_VMGEXIT 0x0403 |
| | | 244 | #define VMCB_EXITCODE_BUSY -2ULL |
240 | #define VMCB_EXITCODE_INVALID -1ULL | | 245 | #define VMCB_EXITCODE_INVALID -1ULL |
241 | | | 246 | |
242 | /* -------------------------------------------------------------------------- */ | | 247 | /* -------------------------------------------------------------------------- */ |
243 | | | 248 | |
244 | struct vmcb_ctrl { | | 249 | struct vmcb_ctrl { |
245 | uint32_t intercept_cr; | | 250 | uint32_t intercept_cr; |
246 | #define VMCB_CTRL_INTERCEPT_RCR(x) __BIT( 0 + x) | | 251 | #define VMCB_CTRL_INTERCEPT_RCR(x) __BIT( 0 + x) |
247 | #define VMCB_CTRL_INTERCEPT_WCR(x) __BIT(16 + x) | | 252 | #define VMCB_CTRL_INTERCEPT_WCR(x) __BIT(16 + x) |
248 | | | 253 | |
249 | uint32_t intercept_dr; | | 254 | uint32_t intercept_dr; |
250 | #define VMCB_CTRL_INTERCEPT_RDR(x) __BIT( 0 + x) | | 255 | #define VMCB_CTRL_INTERCEPT_RDR(x) __BIT( 0 + x) |
251 | #define VMCB_CTRL_INTERCEPT_WDR(x) __BIT(16 + x) | | 256 | #define VMCB_CTRL_INTERCEPT_WDR(x) __BIT(16 + x) |
252 | | | 257 | |
| @@ -297,27 +302,31 @@ struct vmcb_ctrl { | | | @@ -297,27 +302,31 @@ struct vmcb_ctrl { |
297 | #define VMCB_CTRL_INTERCEPT_SKINIT __BIT(6) | | 302 | #define VMCB_CTRL_INTERCEPT_SKINIT __BIT(6) |
298 | #define VMCB_CTRL_INTERCEPT_RDTSCP __BIT(7) | | 303 | #define VMCB_CTRL_INTERCEPT_RDTSCP __BIT(7) |
299 | #define VMCB_CTRL_INTERCEPT_ICEBP __BIT(8) | | 304 | #define VMCB_CTRL_INTERCEPT_ICEBP __BIT(8) |
300 | #define VMCB_CTRL_INTERCEPT_WBINVD __BIT(9) | | 305 | #define VMCB_CTRL_INTERCEPT_WBINVD __BIT(9) |
301 | #define VMCB_CTRL_INTERCEPT_MONITOR __BIT(10) | | 306 | #define VMCB_CTRL_INTERCEPT_MONITOR __BIT(10) |
302 | #define VMCB_CTRL_INTERCEPT_MWAIT __BIT(11) | | 307 | #define VMCB_CTRL_INTERCEPT_MWAIT __BIT(11) |
303 | #define VMCB_CTRL_INTERCEPT_MWAIT_ARMED __BIT(12) | | 308 | #define VMCB_CTRL_INTERCEPT_MWAIT_ARMED __BIT(12) |
304 | #define VMCB_CTRL_INTERCEPT_XSETBV __BIT(13) | | 309 | #define VMCB_CTRL_INTERCEPT_XSETBV __BIT(13) |
305 | #define VMCB_CTRL_INTERCEPT_RDPRU __BIT(14) | | 310 | #define VMCB_CTRL_INTERCEPT_RDPRU __BIT(14) |
306 | #define VMCB_CTRL_INTERCEPT_EFER_SPEC __BIT(15) | | 311 | #define VMCB_CTRL_INTERCEPT_EFER_SPEC __BIT(15) |
307 | #define VMCB_CTRL_INTERCEPT_WCR_SPEC(x) __BIT(16 + x) | | 312 | #define VMCB_CTRL_INTERCEPT_WCR_SPEC(x) __BIT(16 + x) |
308 | | | 313 | |
309 | uint32_t intercept_misc3; | | 314 | uint32_t intercept_misc3; |
| | | 315 | #define VMCB_CTRL_INTERCEPT_INVLPGB_ALL __BIT(0) |
| | | 316 | #define VMCB_CTRL_INTERCEPT_INVLPGB_ILL __BIT(1) |
| | | 317 | #define VMCB_CTRL_INTERCEPT_PCID __BIT(2) |
310 | #define VMCB_CTRL_INTERCEPT_MCOMMIT __BIT(3) | | 318 | #define VMCB_CTRL_INTERCEPT_MCOMMIT __BIT(3) |
| | | 319 | #define VMCB_CTRL_INTERCEPT_TLBSYNC __BIT(4) |
311 | | | 320 | |
312 | uint8_t rsvd1[36]; | | 321 | uint8_t rsvd1[36]; |
313 | uint16_t pause_filt_thresh; | | 322 | uint16_t pause_filt_thresh; |
314 | uint16_t pause_filt_cnt; | | 323 | uint16_t pause_filt_cnt; |
315 | uint64_t iopm_base_pa; | | 324 | uint64_t iopm_base_pa; |
316 | uint64_t msrpm_base_pa; | | 325 | uint64_t msrpm_base_pa; |
317 | uint64_t tsc_offset; | | 326 | uint64_t tsc_offset; |
318 | uint32_t guest_asid; | | 327 | uint32_t guest_asid; |
319 | | | 328 | |
320 | uint32_t tlb_ctrl; | | 329 | uint32_t tlb_ctrl; |
321 | #define VMCB_CTRL_TLB_CTRL_FLUSH_ALL 0x01 | | 330 | #define VMCB_CTRL_TLB_CTRL_FLUSH_ALL 0x01 |
322 | #define VMCB_CTRL_TLB_CTRL_FLUSH_GUEST 0x03 | | 331 | #define VMCB_CTRL_TLB_CTRL_FLUSH_GUEST 0x03 |
323 | #define VMCB_CTRL_TLB_CTRL_FLUSH_GUEST_NONGLOBAL 0x07 | | 332 | #define VMCB_CTRL_TLB_CTRL_FLUSH_GUEST_NONGLOBAL 0x07 |
| @@ -325,26 +334,27 @@ struct vmcb_ctrl { | | | @@ -325,26 +334,27 @@ struct vmcb_ctrl { |
325 | uint64_t v; | | 334 | uint64_t v; |
326 | #define VMCB_CTRL_V_TPR __BITS(3,0) | | 335 | #define VMCB_CTRL_V_TPR __BITS(3,0) |
327 | #define VMCB_CTRL_V_IRQ __BIT(8) | | 336 | #define VMCB_CTRL_V_IRQ __BIT(8) |
328 | #define VMCB_CTRL_V_VGIF __BIT(9) | | 337 | #define VMCB_CTRL_V_VGIF __BIT(9) |
329 | #define VMCB_CTRL_V_INTR_PRIO __BITS(19,16) | | 338 | #define VMCB_CTRL_V_INTR_PRIO __BITS(19,16) |
330 | #define VMCB_CTRL_V_IGN_TPR __BIT(20) | | 339 | #define VMCB_CTRL_V_IGN_TPR __BIT(20) |
331 | #define VMCB_CTRL_V_INTR_MASKING __BIT(24) | | 340 | #define VMCB_CTRL_V_INTR_MASKING __BIT(24) |
332 | #define VMCB_CTRL_V_GUEST_VGIF __BIT(25) | | 341 | #define VMCB_CTRL_V_GUEST_VGIF __BIT(25) |
333 | #define VMCB_CTRL_V_AVIC_EN __BIT(31) | | 342 | #define VMCB_CTRL_V_AVIC_EN __BIT(31) |
334 | #define VMCB_CTRL_V_INTR_VECTOR __BITS(39,32) | | 343 | #define VMCB_CTRL_V_INTR_VECTOR __BITS(39,32) |
335 | | | 344 | |
336 | uint64_t intr; | | 345 | uint64_t intr; |
337 | #define VMCB_CTRL_INTR_SHADOW __BIT(0) | | 346 | #define VMCB_CTRL_INTR_SHADOW __BIT(0) |
| | | 347 | #define VMCB_CTRL_INTR_MASK __BIT(1) |
338 | | | 348 | |
339 | uint64_t exitcode; | | 349 | uint64_t exitcode; |
340 | uint64_t exitinfo1; | | 350 | uint64_t exitinfo1; |
341 | uint64_t exitinfo2; | | 351 | uint64_t exitinfo2; |
342 | | | 352 | |
343 | uint64_t exitintinfo; | | 353 | uint64_t exitintinfo; |
344 | #define VMCB_CTRL_EXITINTINFO_VECTOR __BITS(7,0) | | 354 | #define VMCB_CTRL_EXITINTINFO_VECTOR __BITS(7,0) |
345 | #define VMCB_CTRL_EXITINTINFO_TYPE __BITS(10,8) | | 355 | #define VMCB_CTRL_EXITINTINFO_TYPE __BITS(10,8) |
346 | #define VMCB_CTRL_EXITINTINFO_EV __BIT(11) | | 356 | #define VMCB_CTRL_EXITINTINFO_EV __BIT(11) |
347 | #define VMCB_CTRL_EXITINTINFO_V __BIT(31) | | 357 | #define VMCB_CTRL_EXITINTINFO_V __BIT(31) |
348 | #define VMCB_CTRL_EXITINTINFO_ERRORCODE __BITS(63,32) | | 358 | #define VMCB_CTRL_EXITINTINFO_ERRORCODE __BITS(63,32) |
349 | | | 359 | |
350 | uint64_t enable1; | | 360 | uint64_t enable1; |
| @@ -389,27 +399,27 @@ struct vmcb_ctrl { | | | @@ -389,27 +399,27 @@ struct vmcb_ctrl { |
389 | uint32_t rsvd2; | | 399 | uint32_t rsvd2; |
390 | uint64_t nrip; | | 400 | uint64_t nrip; |
391 | uint8_t inst_len; | | 401 | uint8_t inst_len; |
392 | uint8_t inst_bytes[15]; | | 402 | uint8_t inst_bytes[15]; |
393 | uint64_t avic_abpp; | | 403 | uint64_t avic_abpp; |
394 | uint64_t rsvd3; | | 404 | uint64_t rsvd3; |
395 | uint64_t avic_ltp; | | 405 | uint64_t avic_ltp; |
396 | | | 406 | |
397 | uint64_t avic_phys; | | 407 | uint64_t avic_phys; |
398 | #define VMCB_CTRL_AVIC_PHYS_TABLE_PTR __BITS(51,12) | | 408 | #define VMCB_CTRL_AVIC_PHYS_TABLE_PTR __BITS(51,12) |
399 | #define VMCB_CTRL_AVIC_PHYS_MAX_INDEX __BITS(7,0) | | 409 | #define VMCB_CTRL_AVIC_PHYS_MAX_INDEX __BITS(7,0) |
400 | | | 410 | |
401 | uint64_t rsvd4; | | 411 | uint64_t rsvd4; |
402 | uint64_t vmcb_ptr; | | 412 | uint64_t vmsa_ptr; |
403 | | | 413 | |
404 | uint8_t pad[752]; | | 414 | uint8_t pad[752]; |
405 | } __packed; | | 415 | } __packed; |
406 | | | 416 | |
407 | CTASSERT(sizeof(struct vmcb_ctrl) == 1024); | | 417 | CTASSERT(sizeof(struct vmcb_ctrl) == 1024); |
408 | | | 418 | |
409 | struct vmcb_segment { | | 419 | struct vmcb_segment { |
410 | uint16_t selector; | | 420 | uint16_t selector; |
411 | uint16_t attrib; /* hidden */ | | 421 | uint16_t attrib; /* hidden */ |
412 | uint32_t limit; /* hidden */ | | 422 | uint32_t limit; /* hidden */ |
413 | uint64_t base; /* hidden */ | | 423 | uint64_t base; /* hidden */ |
414 | } __packed; | | 424 | } __packed; |
415 | | | 425 | |
| @@ -1439,26 +1449,31 @@ svm_vcpu_run(struct nvmm_machine *mach, | | | @@ -1439,26 +1449,31 @@ svm_vcpu_run(struct nvmm_machine *mach, |
1439 | exit->reason = NVMM_VCPU_EXIT_SHUTDOWN; | | 1449 | exit->reason = NVMM_VCPU_EXIT_SHUTDOWN; |
1440 | break; | | 1450 | break; |
1441 | case VMCB_EXITCODE_RDPMC: | | 1451 | case VMCB_EXITCODE_RDPMC: |
1442 | case VMCB_EXITCODE_RSM: | | 1452 | case VMCB_EXITCODE_RSM: |
1443 | case VMCB_EXITCODE_INVLPGA: | | 1453 | case VMCB_EXITCODE_INVLPGA: |
1444 | case VMCB_EXITCODE_VMRUN: | | 1454 | case VMCB_EXITCODE_VMRUN: |
1445 | case VMCB_EXITCODE_VMMCALL: | | 1455 | case VMCB_EXITCODE_VMMCALL: |
1446 | case VMCB_EXITCODE_VMLOAD: | | 1456 | case VMCB_EXITCODE_VMLOAD: |
1447 | case VMCB_EXITCODE_VMSAVE: | | 1457 | case VMCB_EXITCODE_VMSAVE: |
1448 | case VMCB_EXITCODE_STGI: | | 1458 | case VMCB_EXITCODE_STGI: |
1449 | case VMCB_EXITCODE_CLGI: | | 1459 | case VMCB_EXITCODE_CLGI: |
1450 | case VMCB_EXITCODE_SKINIT: | | 1460 | case VMCB_EXITCODE_SKINIT: |
1451 | case VMCB_EXITCODE_RDTSCP: | | 1461 | case VMCB_EXITCODE_RDTSCP: |
| | | 1462 | case VMCB_EXITCODE_RDPRU: |
| | | 1463 | case VMCB_EXITCODE_INVLPGB: |
| | | 1464 | case VMCB_EXITCODE_INVPCID: |
| | | 1465 | case VMCB_EXITCODE_MCOMMIT: |
| | | 1466 | case VMCB_EXITCODE_TLBSYNC: |
1452 | svm_inject_ud(vcpu); | | 1467 | svm_inject_ud(vcpu); |
1453 | exit->reason = NVMM_VCPU_EXIT_NONE; | | 1468 | exit->reason = NVMM_VCPU_EXIT_NONE; |
1454 | break; | | 1469 | break; |
1455 | case VMCB_EXITCODE_MONITOR: | | 1470 | case VMCB_EXITCODE_MONITOR: |
1456 | svm_exit_insn(vmcb, exit, NVMM_VCPU_EXIT_MONITOR); | | 1471 | svm_exit_insn(vmcb, exit, NVMM_VCPU_EXIT_MONITOR); |
1457 | break; | | 1472 | break; |
1458 | case VMCB_EXITCODE_MWAIT: | | 1473 | case VMCB_EXITCODE_MWAIT: |
1459 | case VMCB_EXITCODE_MWAIT_CONDITIONAL: | | 1474 | case VMCB_EXITCODE_MWAIT_CONDITIONAL: |
1460 | svm_exit_insn(vmcb, exit, NVMM_VCPU_EXIT_MWAIT); | | 1475 | svm_exit_insn(vmcb, exit, NVMM_VCPU_EXIT_MWAIT); |
1461 | break; | | 1476 | break; |
1462 | case VMCB_EXITCODE_XSETBV: | | 1477 | case VMCB_EXITCODE_XSETBV: |
1463 | svm_exit_xsetbv(mach, vcpu, exit); | | 1478 | svm_exit_xsetbv(mach, vcpu, exit); |
1464 | break; | | 1479 | break; |
| @@ -2032,27 +2047,37 @@ svm_vcpu_init(struct nvmm_machine *mach, | | | @@ -2032,27 +2047,37 @@ svm_vcpu_init(struct nvmm_machine *mach, |
2032 | * Intercept the rest below. | | 2047 | * Intercept the rest below. |
2033 | */ | | 2048 | */ |
2034 | vmcb->ctrl.intercept_misc2 = | | 2049 | vmcb->ctrl.intercept_misc2 = |
2035 | VMCB_CTRL_INTERCEPT_VMRUN | | | 2050 | VMCB_CTRL_INTERCEPT_VMRUN | |
2036 | VMCB_CTRL_INTERCEPT_VMMCALL | | | 2051 | VMCB_CTRL_INTERCEPT_VMMCALL | |
2037 | VMCB_CTRL_INTERCEPT_VMLOAD | | | 2052 | VMCB_CTRL_INTERCEPT_VMLOAD | |
2038 | VMCB_CTRL_INTERCEPT_VMSAVE | | | 2053 | VMCB_CTRL_INTERCEPT_VMSAVE | |
2039 | VMCB_CTRL_INTERCEPT_STGI | | | 2054 | VMCB_CTRL_INTERCEPT_STGI | |
2040 | VMCB_CTRL_INTERCEPT_CLGI | | | 2055 | VMCB_CTRL_INTERCEPT_CLGI | |
2041 | VMCB_CTRL_INTERCEPT_SKINIT | | | 2056 | VMCB_CTRL_INTERCEPT_SKINIT | |
2042 | VMCB_CTRL_INTERCEPT_RDTSCP | | | 2057 | VMCB_CTRL_INTERCEPT_RDTSCP | |
2043 | VMCB_CTRL_INTERCEPT_MONITOR | | | 2058 | VMCB_CTRL_INTERCEPT_MONITOR | |
2044 | VMCB_CTRL_INTERCEPT_MWAIT | | | 2059 | VMCB_CTRL_INTERCEPT_MWAIT | |
2045 | VMCB_CTRL_INTERCEPT_XSETBV; | | 2060 | VMCB_CTRL_INTERCEPT_XSETBV | |
| | | 2061 | VMCB_CTRL_INTERCEPT_RDPRU; |
| | | 2062 | |
| | | 2063 | /* |
| | | 2064 | * Intercept everything. |
| | | 2065 | */ |
| | | 2066 | vmcb->ctrl.intercept_misc3 = |
| | | 2067 | VMCB_CTRL_INTERCEPT_INVLPGB_ALL | |
| | | 2068 | VMCB_CTRL_INTERCEPT_PCID | |
| | | 2069 | VMCB_CTRL_INTERCEPT_MCOMMIT | |
| | | 2070 | VMCB_CTRL_INTERCEPT_TLBSYNC; |
2046 | | | 2071 | |
2047 | /* Intercept all I/O accesses. */ | | 2072 | /* Intercept all I/O accesses. */ |
2048 | memset(cpudata->iobm, 0xFF, IOBM_SIZE); | | 2073 | memset(cpudata->iobm, 0xFF, IOBM_SIZE); |
2049 | vmcb->ctrl.iopm_base_pa = cpudata->iobm_pa; | | 2074 | vmcb->ctrl.iopm_base_pa = cpudata->iobm_pa; |
2050 | | | 2075 | |
2051 | /* Allow direct access to certain MSRs. */ | | 2076 | /* Allow direct access to certain MSRs. */ |
2052 | memset(cpudata->msrbm, 0xFF, MSRBM_SIZE); | | 2077 | memset(cpudata->msrbm, 0xFF, MSRBM_SIZE); |
2053 | svm_vcpu_msr_allow(cpudata->msrbm, MSR_EFER, true, false); | | 2078 | svm_vcpu_msr_allow(cpudata->msrbm, MSR_EFER, true, false); |
2054 | svm_vcpu_msr_allow(cpudata->msrbm, MSR_STAR, true, true); | | 2079 | svm_vcpu_msr_allow(cpudata->msrbm, MSR_STAR, true, true); |
2055 | svm_vcpu_msr_allow(cpudata->msrbm, MSR_LSTAR, true, true); | | 2080 | svm_vcpu_msr_allow(cpudata->msrbm, MSR_LSTAR, true, true); |
2056 | svm_vcpu_msr_allow(cpudata->msrbm, MSR_CSTAR, true, true); | | 2081 | svm_vcpu_msr_allow(cpudata->msrbm, MSR_CSTAR, true, true); |
2057 | svm_vcpu_msr_allow(cpudata->msrbm, MSR_SFMASK, true, true); | | 2082 | svm_vcpu_msr_allow(cpudata->msrbm, MSR_SFMASK, true, true); |
2058 | svm_vcpu_msr_allow(cpudata->msrbm, MSR_KERNELGSBASE, true, true); | | 2083 | svm_vcpu_msr_allow(cpudata->msrbm, MSR_KERNELGSBASE, true, true); |