Wed Aug 5 15:22:25 2020 UTC ()
Add new field definitions, and intercept everything, for future-proofness.


(maxv)
diff -r1.66 -r1.67 src/sys/dev/nvmm/x86/nvmm_x86_svm.c

cvs diff -r1.66 -r1.67 src/sys/dev/nvmm/x86/nvmm_x86_svm.c (expand / switch to unified diff)

--- src/sys/dev/nvmm/x86/nvmm_x86_svm.c 2020/08/05 10:31:37 1.66
+++ src/sys/dev/nvmm/x86/nvmm_x86_svm.c 2020/08/05 15:22:25 1.67
@@ -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
244struct vmcb_ctrl { 249struct 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
407CTASSERT(sizeof(struct vmcb_ctrl) == 1024); 417CTASSERT(sizeof(struct vmcb_ctrl) == 1024);
408 418
409struct vmcb_segment { 419struct 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);