diff options
| author | maxv <maxv@NetBSD.org> | 2020-08-26 16:33:03 +0000 |
|---|---|---|
| committer | maxv <maxv@NetBSD.org> | 2020-08-26 16:33:03 +0000 |
| commit | e60f781b0ca5e2604c6e4c23069391f514b8ef3f (patch) | |
| tree | ee6ce22f05108cc6859c7301ee3cfdd4328b5af1 /sys/dev/nvmm | |
| parent | 8cd5276c420df229abbb0071ec85ec0b46e31132 (diff) | |
nvmm-x86-svm: improve the handling of MSR_EFER
Intercept reads of it as well, just to mask EFER_SVME, which the guest
doesn't need to see.
Diffstat (limited to 'sys/dev/nvmm')
| -rw-r--r-- | sys/dev/nvmm/x86/nvmm_x86_svm.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/sys/dev/nvmm/x86/nvmm_x86_svm.c b/sys/dev/nvmm/x86/nvmm_x86_svm.c index b16c2501281..a8aa358bfd5 100644 --- a/sys/dev/nvmm/x86/nvmm_x86_svm.c +++ b/sys/dev/nvmm/x86/nvmm_x86_svm.c @@ -1,4 +1,4 @@ -/* $NetBSD: nvmm_x86_svm.c,v 1.73 2020/08/26 16:32:02 maxv Exp $ */ +/* $NetBSD: nvmm_x86_svm.c,v 1.74 2020/08/26 16:33:03 maxv Exp $ */ /* * Copyright (c) 2018-2020 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_svm.c,v 1.73 2020/08/26 16:32:02 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_svm.c,v 1.74 2020/08/26 16:33:03 maxv Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -1170,6 +1170,12 @@ svm_inkernel_handle_msr(struct nvmm_machine *mach, struct nvmm_cpu *vcpu, size_t i; if (exit->reason == NVMM_VCPU_EXIT_RDMSR) { + if (exit->u.rdmsr.msr == MSR_EFER) { + val = vmcb->state.efer & ~EFER_SVME; + vmcb->state.rax = (val & 0xFFFFFFFF); + cpudata->gprs[NVMM_X64_GPR_RDX] = (val >> 32); + goto handled; + } if (exit->u.rdmsr.msr == MSR_NB_CFG) { val = NB_CFG_INITAPICCPUIDLO; vmcb->state.rax = (val & 0xFFFFFFFF); @@ -2195,7 +2201,6 @@ svm_vcpu_init(struct nvmm_machine *mach, struct nvmm_cpu *vcpu) /* Allow direct access to certain MSRs. */ memset(cpudata->msrbm, 0xFF, MSRBM_SIZE); - svm_vcpu_msr_allow(cpudata->msrbm, MSR_EFER, true, false); svm_vcpu_msr_allow(cpudata->msrbm, MSR_STAR, true, true); svm_vcpu_msr_allow(cpudata->msrbm, MSR_LSTAR, true, true); svm_vcpu_msr_allow(cpudata->msrbm, MSR_CSTAR, true, true); |
