Module Name: src Committed By: maxv Date: Sat Feb 23 12:27:00 UTC 2019
Modified Files: src/sys/dev/nvmm: nvmm_internal.h src/sys/dev/nvmm/x86: nvmm_x86.h nvmm_x86_svm.c nvmm_x86_vmx.c src/sys/modules/nvmm: Makefile Added Files: src/sys/dev/nvmm/x86: nvmm_x86.c Log Message: Install the x86 RESET state at VCPU creation time, for convenience, so that the libnvmm users can expect a functional VCPU right away. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/sys/dev/nvmm/nvmm_internal.h cvs rdiff -u -r0 -r1.1 src/sys/dev/nvmm/x86/nvmm_x86.c cvs rdiff -u -r1.5 -r1.6 src/sys/dev/nvmm/x86/nvmm_x86.h cvs rdiff -u -r1.30 -r1.31 src/sys/dev/nvmm/x86/nvmm_x86_svm.c cvs rdiff -u -r1.13 -r1.14 src/sys/dev/nvmm/x86/nvmm_x86_vmx.c cvs rdiff -u -r1.3 -r1.4 src/sys/modules/nvmm/Makefile Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/nvmm/nvmm_internal.h diff -u src/sys/dev/nvmm/nvmm_internal.h:1.5 src/sys/dev/nvmm/nvmm_internal.h:1.6 --- src/sys/dev/nvmm/nvmm_internal.h:1.5 Wed Feb 13 16:03:16 2019 +++ src/sys/dev/nvmm/nvmm_internal.h Sat Feb 23 12:27:00 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: nvmm_internal.h,v 1.5 2019/02/13 16:03:16 maxv Exp $ */ +/* $NetBSD: nvmm_internal.h,v 1.6 2019/02/23 12:27:00 maxv Exp $ */ /* * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -97,7 +97,7 @@ struct nvmm_impl { int (*vcpu_create)(struct nvmm_machine *, struct nvmm_cpu *); void (*vcpu_destroy)(struct nvmm_machine *, struct nvmm_cpu *); - void (*vcpu_setstate)(struct nvmm_cpu *, void *, uint64_t); + void (*vcpu_setstate)(struct nvmm_cpu *, const void *, uint64_t); void (*vcpu_getstate)(struct nvmm_cpu *, void *, uint64_t); int (*vcpu_inject)(struct nvmm_machine *, struct nvmm_cpu *, struct nvmm_event *); Index: src/sys/dev/nvmm/x86/nvmm_x86.h diff -u src/sys/dev/nvmm/x86/nvmm_x86.h:1.5 src/sys/dev/nvmm/x86/nvmm_x86.h:1.6 --- src/sys/dev/nvmm/x86/nvmm_x86.h:1.5 Thu Feb 14 14:30:20 2019 +++ src/sys/dev/nvmm/x86/nvmm_x86.h Sat Feb 23 12:27:00 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: nvmm_x86.h,v 1.5 2019/02/14 14:30:20 maxv Exp $ */ +/* $NetBSD: nvmm_x86.h,v 1.6 2019/02/23 12:27:00 maxv Exp $ */ /* * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -173,6 +173,10 @@ struct nvmm_x86_conf_cpuid { } del; }; +#ifdef _KERNEL +extern const struct nvmm_x64_state nvmm_x86_reset_state; +#endif + #endif /* ASM_NVMM */ #endif /* _NVMM_X86_H_ */ Index: src/sys/dev/nvmm/x86/nvmm_x86_svm.c diff -u src/sys/dev/nvmm/x86/nvmm_x86_svm.c:1.30 src/sys/dev/nvmm/x86/nvmm_x86_svm.c:1.31 --- src/sys/dev/nvmm/x86/nvmm_x86_svm.c:1.30 Sat Feb 23 08:19:16 2019 +++ src/sys/dev/nvmm/x86/nvmm_x86_svm.c Sat Feb 23 12:27:00 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: nvmm_x86_svm.c,v 1.30 2019/02/23 08:19:16 maxv Exp $ */ +/* $NetBSD: nvmm_x86_svm.c,v 1.31 2019/02/23 12:27:00 maxv Exp $ */ /* * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_svm.c,v 1.30 2019/02/23 08:19:16 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_svm.c,v 1.31 2019/02/23 12:27:00 maxv Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -1539,7 +1539,7 @@ svm_state_tlb_flush(const struct vmcb *v } static void -svm_vcpu_setstate(struct nvmm_cpu *vcpu, void *data, uint64_t flags) +svm_vcpu_setstate(struct nvmm_cpu *vcpu, const void *data, uint64_t flags) { const struct nvmm_x64_state *state = data; struct svm_cpudata *cpudata = vcpu->cpudata; @@ -1924,10 +1924,6 @@ svm_vcpu_init(struct nvmm_machine *mach, vmcb->ctrl.enable1 = VMCB_CTRL_ENABLE_NP; vmcb->ctrl.n_cr3 = mach->vm->vm_map.pmap->pm_pdirpa[0]; - /* Must always be set. */ - vmcb->state.efer = EFER_SVME; - cpudata->gxcr0 = XCR0_X87; - /* Init XSAVE header. */ cpudata->gfpu.xsh_xstate_bv = svm_xcr0_mask; cpudata->gfpu.xsh_xcomp_bv = 0; @@ -1940,6 +1936,9 @@ svm_vcpu_init(struct nvmm_machine *mach, cpudata->lstar = rdmsr(MSR_LSTAR); cpudata->cstar = rdmsr(MSR_CSTAR); cpudata->sfmask = rdmsr(MSR_SFMASK); + + /* Install the RESET state. */ + svm_vcpu_setstate(vcpu, &nvmm_x86_reset_state, NVMM_X64_STATE_ALL); } static int Index: src/sys/dev/nvmm/x86/nvmm_x86_vmx.c diff -u src/sys/dev/nvmm/x86/nvmm_x86_vmx.c:1.13 src/sys/dev/nvmm/x86/nvmm_x86_vmx.c:1.14 --- src/sys/dev/nvmm/x86/nvmm_x86_vmx.c:1.13 Sat Feb 23 10:43:36 2019 +++ src/sys/dev/nvmm/x86/nvmm_x86_vmx.c Sat Feb 23 12:27:00 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: nvmm_x86_vmx.c,v 1.13 2019/02/23 10:43:36 maxv Exp $ */ +/* $NetBSD: nvmm_x86_vmx.c,v 1.14 2019/02/23 12:27:00 maxv Exp $ */ /* * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_vmx.c,v 1.13 2019/02/23 10:43:36 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_vmx.c,v 1.14 2019/02/23 12:27:00 maxv Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -2026,7 +2026,7 @@ vmx_state_tlb_flush(const struct nvmm_x6 } static void -vmx_vcpu_setstate(struct nvmm_cpu *vcpu, void *data, uint64_t flags) +vmx_vcpu_setstate(struct nvmm_cpu *vcpu, const void *data, uint64_t flags) { const struct nvmm_x64_state *state = data; struct vmx_cpudata *cpudata = vcpu->cpudata; @@ -2409,11 +2409,6 @@ vmx_vcpu_init(struct nvmm_machine *mach, cpudata->gmsr_misc_enable |= (IA32_MISC_BTS_UNAVAIL|IA32_MISC_PEBS_UNAVAIL); - /* Must always be set. */ - vmx_vmwrite(VMCS_GUEST_CR4, CR4_VMXE); - vmx_vmwrite(VMCS_GUEST_CR0, CR0_NE); - cpudata->gxcr0 = XCR0_X87; - /* Init XSAVE header. */ cpudata->gfpu.xsh_xstate_bv = vmx_xcr0_mask; cpudata->gfpu.xsh_xcomp_bv = 0; @@ -2426,6 +2421,9 @@ vmx_vcpu_init(struct nvmm_machine *mach, cpudata->cstar = rdmsr(MSR_CSTAR); cpudata->sfmask = rdmsr(MSR_SFMASK); + /* Install the RESET state. */ + vmx_vcpu_setstate(vcpu, &nvmm_x86_reset_state, NVMM_X64_STATE_ALL); + vmx_vmcs_leave(vcpu); } Index: src/sys/modules/nvmm/Makefile diff -u src/sys/modules/nvmm/Makefile:1.3 src/sys/modules/nvmm/Makefile:1.4 --- src/sys/modules/nvmm/Makefile:1.3 Sun Feb 17 04:05:55 2019 +++ src/sys/modules/nvmm/Makefile Sat Feb 23 12:27:00 2019 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.3 2019/02/17 04:05:55 rin Exp $ +# $NetBSD: Makefile,v 1.4 2019/02/23 12:27:00 maxv Exp $ .include "../Makefile.inc" .include "../Makefile.assym" @@ -13,6 +13,7 @@ IOCONF= nvmm.ioconf SRCS= nvmm.c .if ${MACHINE_ARCH} == "x86_64" +SRCS+= nvmm_x86.c SRCS+= nvmm_x86_svm.c nvmm_x86_svmfunc.S SRCS+= nvmm_x86_vmx.c nvmm_x86_vmxfunc.S .endif Added files: Index: src/sys/dev/nvmm/x86/nvmm_x86.c diff -u /dev/null src/sys/dev/nvmm/x86/nvmm_x86.c:1.1 --- /dev/null Sat Feb 23 12:27:00 2019 +++ src/sys/dev/nvmm/x86/nvmm_x86.c Sat Feb 23 12:27:00 2019 @@ -0,0 +1,218 @@ +/* $NetBSD: nvmm_x86.c,v 1.1 2019/02/23 12:27:00 maxv Exp $ */ + +/* + * Copyright (c) 2018-2019 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Maxime Villard. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: nvmm_x86.c,v 1.1 2019/02/23 12:27:00 maxv Exp $"); + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/cpu.h> + +#include <uvm/uvm.h> +#include <uvm/uvm_page.h> + +#include <x86/cputypes.h> +#include <x86/specialreg.h> +#include <x86/pmap.h> + +#include <dev/nvmm/nvmm.h> +#include <dev/nvmm/nvmm_internal.h> +#include <dev/nvmm/x86/nvmm_x86.h> + +/* + * Code shared between x86-SVM and x86-VMX. + */ + +const struct nvmm_x64_state nvmm_x86_reset_state = { + .segs = { + [NVMM_X64_SEG_CS] = { + .selector = 0xF000, + .base = 0xFFFF0000, + .limit = 0xFFFF, + .attrib = { + .type = SDT_MEMRWA, + .p = 1, + } + }, + [NVMM_X64_SEG_DS] = { + .selector = 0x0000, + .base = 0x00000000, + .limit = 0xFFFF, + .attrib = { + .type = SDT_MEMRWA, + .p = 1, + } + }, + [NVMM_X64_SEG_ES] = { + .selector = 0x0000, + .base = 0x00000000, + .limit = 0xFFFF, + .attrib = { + .type = SDT_MEMRWA, + .p = 1, + } + }, + [NVMM_X64_SEG_FS] = { + .selector = 0x0000, + .base = 0x00000000, + .limit = 0xFFFF, + .attrib = { + .type = SDT_MEMRWA, + .p = 1, + } + }, + [NVMM_X64_SEG_GS] = { + .selector = 0x0000, + .base = 0x00000000, + .limit = 0xFFFF, + .attrib = { + .type = SDT_MEMRWA, + .p = 1, + } + }, + [NVMM_X64_SEG_SS] = { + .selector = 0x0000, + .base = 0x00000000, + .limit = 0xFFFF, + .attrib = { + .type = SDT_MEMRWA, + .p = 1, + } + }, + [NVMM_X64_SEG_GDT] = { + .selector = 0x0000, + .base = 0x00000000, + .limit = 0xFFFF, + .attrib = { + .type = SDT_MEMRW, + .p = 1, + } + }, + [NVMM_X64_SEG_IDT] = { + .selector = 0x0000, + .base = 0x00000000, + .limit = 0xFFFF, + .attrib = { + .type = SDT_MEMRW, + .p = 1, + } + }, + [NVMM_X64_SEG_LDT] = { + .selector = 0x0000, + .base = 0x00000000, + .limit = 0xFFFF, + .attrib = { + .type = SDT_SYSLDT, + .p = 1, + } + }, + [NVMM_X64_SEG_TR] = { + .selector = 0x0000, + .base = 0x00000000, + .limit = 0xFFFF, + .attrib = { + .type = SDT_SYS286BSY, + .p = 1, + } + }, + }, + + .gprs = { + [NVMM_X64_GPR_RAX] = 0x00000000, + [NVMM_X64_GPR_RCX] = 0x00000000, + [NVMM_X64_GPR_RDX] = 0x00000600, + [NVMM_X64_GPR_RBX] = 0x00000000, + [NVMM_X64_GPR_RSP] = 0x00000000, + [NVMM_X64_GPR_RBP] = 0x00000000, + [NVMM_X64_GPR_RSI] = 0x00000000, + [NVMM_X64_GPR_RDI] = 0x00000000, + [NVMM_X64_GPR_R8] = 0x00000000, + [NVMM_X64_GPR_R9] = 0x00000000, + [NVMM_X64_GPR_R10] = 0x00000000, + [NVMM_X64_GPR_R11] = 0x00000000, + [NVMM_X64_GPR_R12] = 0x00000000, + [NVMM_X64_GPR_R13] = 0x00000000, + [NVMM_X64_GPR_R14] = 0x00000000, + [NVMM_X64_GPR_R15] = 0x00000000, + [NVMM_X64_GPR_RIP] = 0x0000FFF0, + [NVMM_X64_GPR_RFLAGS] = 0x00000002, + }, + + .crs = { + [NVMM_X64_CR_CR0] = 0x60000010, + [NVMM_X64_CR_CR2] = 0x00000000, + [NVMM_X64_CR_CR3] = 0x00000000, + [NVMM_X64_CR_CR4] = 0x00000000, + [NVMM_X64_CR_CR8] = 0x00000000, + [NVMM_X64_CR_XCR0] = 0x00000001, + }, + + .drs = { + [NVMM_X64_DR_DR0] = 0x00000000, + [NVMM_X64_DR_DR1] = 0x00000000, + [NVMM_X64_DR_DR2] = 0x00000000, + [NVMM_X64_DR_DR3] = 0x00000000, + [NVMM_X64_DR_DR6] = 0xFFFF0FF0, + [NVMM_X64_DR_DR7] = 0x00000400, + }, + + .msrs = { + [NVMM_X64_MSR_EFER] = 0x00000000, + [NVMM_X64_MSR_STAR] = 0x00000000, + [NVMM_X64_MSR_LSTAR] = 0x00000000, + [NVMM_X64_MSR_CSTAR] = 0x00000000, + [NVMM_X64_MSR_SFMASK] = 0x00000000, + [NVMM_X64_MSR_KERNELGSBASE] = 0x00000000, + [NVMM_X64_MSR_SYSENTER_CS] = 0x00000000, + [NVMM_X64_MSR_SYSENTER_ESP] = 0x00000000, + [NVMM_X64_MSR_SYSENTER_EIP] = 0x00000000, + [NVMM_X64_MSR_PAT] = + PATENTRY(0, PAT_WB) | PATENTRY(1, PAT_WT) | + PATENTRY(2, PAT_UCMINUS) | PATENTRY(3, PAT_UC) | + PATENTRY(4, PAT_WB) | PATENTRY(5, PAT_WT) | + PATENTRY(6, PAT_UCMINUS) | PATENTRY(7, PAT_UC), + }, + + .misc = { + [NVMM_X64_MISC_INT_SHADOW] = 0, + [NVMM_X64_MISC_INT_WINDOW_EXIT] = 0, + [NVMM_X64_MISC_NMI_WINDOW_EXIT] = 0, + }, + + .fpu = { + .fx_cw = 0x0040, + .fx_sw = 0x0000, + .fx_tw = 0x55, + .fx_zero = 0x55, + .fx_mxcsr = 0x1F80, + } +};