Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/netbsd-9]: src/sys/dev/nvmm Pull up following revision(s) (requested by ...
details: https://anonhg.NetBSD.org/src/rev/a4e99cadeef6
branches: netbsd-9
changeset: 964098:a4e99cadeef6
user: martin <martin%NetBSD.org@localhost>
date: Sat Aug 29 17:00:28 2020 +0000
description:
Pull up following revision(s) (requested by maxv in ticket #1068):
sys/dev/nvmm/x86/nvmm_x86_svm.c: revision 1.71
sys/dev/nvmm/nvmm.c: revision 1.34
sys/dev/nvmm/x86/nvmm_x86_svm.c: revision 1.72
sys/dev/nvmm/nvmm.c: revision 1.35
sys/dev/nvmm/nvmm.c: revision 1.36
sys/dev/nvmm/x86/nvmm_x86_svmfunc.S: revision 1.5
sys/dev/nvmm/nvmm.c: revision 1.37
sys/dev/nvmm/x86/nvmm_x86_vmxfunc.S: revision 1.5
sys/dev/nvmm/x86/nvmm_x86_vmx.c: revision 1.70
sys/dev/nvmm/x86/nvmm_x86_svm.c: revision 1.68
sys/dev/nvmm/x86/nvmm_x86.c: revision 1.15
sys/dev/nvmm/nvmm_ioctl.h: revision 1.10
Micro-optimize: use pushq instead of pushw. To avoid LCP stalls and
unaligned stack accesses.
nvmm-x86: also flush the guest TLB when CR4.{PCIDE,SMEP} changes
nvmm: localify a variable that doesn't need to be global
nvmm: use relaxed atomics to read nmachines
nvmm-x86-svm: dedup code
nvmm-x86: hide more CPUID flags, mostly related to perf monitors
nvmm: misc improvements
- use mach->ncpus to get the number of vcpus, now that we have it
- don't forget to decrement mach->ncpus when a machine gets killed
- add more __predict_false()
nvmm-x86-svm: don't forget to intercept INVD
INVD executed in the guest can be dangerous for the host, due to CPU
caches being flushed without write-back.
nvmm: slightly clarify
nvmm: explicitly include atomic.h
diffstat:
sys/dev/nvmm/nvmm.c | 33 +++++++++++++--------------------
sys/dev/nvmm/nvmm_ioctl.h | 7 ++++---
sys/dev/nvmm/x86/nvmm_x86.c | 26 +++++++++++++-------------
sys/dev/nvmm/x86/nvmm_x86_svm.c | 17 +++++------------
sys/dev/nvmm/x86/nvmm_x86_svmfunc.S | 10 +++++-----
sys/dev/nvmm/x86/nvmm_x86_vmx.c | 6 +++---
sys/dev/nvmm/x86/nvmm_x86_vmxfunc.S | 6 +++---
7 files changed, 46 insertions(+), 59 deletions(-)
diffs (truncated from 365 to 300 lines):
diff -r 611b4ad998a3 -r a4e99cadeef6 sys/dev/nvmm/nvmm.c
--- a/sys/dev/nvmm/nvmm.c Fri Aug 28 19:37:37 2020 +0000
+++ b/sys/dev/nvmm/nvmm.c Sat Aug 29 17:00:28 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: nvmm.c,v 1.22.2.6 2020/08/18 09:29:52 martin Exp $ */
+/* $NetBSD: nvmm.c,v 1.22.2.7 2020/08/29 17:00:28 martin Exp $ */
/*
* Copyright (c) 2018-2020 The NetBSD Foundation, Inc.
@@ -30,12 +30,13 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nvmm.c,v 1.22.2.6 2020/08/18 09:29:52 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nvmm.c,v 1.22.2.7 2020/08/29 17:00:28 martin Exp $");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
+#include <sys/atomic.h>
#include <sys/cpu.h>
#include <sys/conf.h>
#include <sys/kmem.h>
@@ -112,17 +113,17 @@
struct nvmm_machine *mach;
krw_t op = writer ? RW_WRITER : RW_READER;
- if (machid >= NVMM_MAX_MACHINES) {
+ if (__predict_false(machid >= NVMM_MAX_MACHINES)) {
return EINVAL;
}
mach = &machines[machid];
rw_enter(&mach->lock, op);
- if (!mach->present) {
+ if (__predict_false(!mach->present)) {
rw_exit(&mach->lock);
return ENOENT;
}
- if (owner != &root_owner && mach->owner != owner) {
+ if (__predict_false(mach->owner != owner && owner != &root_owner)) {
rw_exit(&mach->lock);
return EPERM;
}
@@ -179,13 +180,13 @@
{
struct nvmm_cpu *vcpu;
- if (cpuid >= NVMM_MAX_VCPUS) {
+ if (__predict_false(cpuid >= NVMM_MAX_VCPUS)) {
return EINVAL;
}
vcpu = &mach->cpus[cpuid];
mutex_enter(&vcpu->lock);
- if (!vcpu->present) {
+ if (__predict_false(!vcpu->present)) {
mutex_exit(&vcpu->lock);
return ENOENT;
}
@@ -227,6 +228,7 @@
(*nvmm_impl->vcpu_destroy)(mach, vcpu);
nvmm_vcpu_free(mach, vcpu);
nvmm_vcpu_put(vcpu);
+ atomic_dec_uint(&mach->ncpus);
}
(*nvmm_impl->machine_destroy)(mach);
uvmspace_free(mach->vm);
@@ -314,6 +316,7 @@
(*nvmm_impl->vcpu_destroy)(mach, vcpu);
nvmm_vcpu_free(mach, vcpu);
nvmm_vcpu_put(vcpu);
+ atomic_dec_uint(&mach->ncpus);
}
(*nvmm_impl->machine_destroy)(mach);
@@ -414,7 +417,6 @@
}
nvmm_vcpu_put(vcpu);
-
atomic_inc_uint(&mach->ncpus);
out:
@@ -440,7 +442,6 @@
(*nvmm_impl->vcpu_destroy)(mach, vcpu);
nvmm_vcpu_free(mach, vcpu);
nvmm_vcpu_put(vcpu);
-
atomic_dec_uint(&mach->ncpus);
out:
@@ -907,7 +908,6 @@
{
struct nvmm_ctl_mach_info ctl;
struct nvmm_machine *mach;
- struct nvmm_cpu *vcpu;
int error;
size_t i;
@@ -921,14 +921,7 @@
if (error)
return error;
- ctl.nvcpus = 0;
- for (i = 0; i < NVMM_MAX_VCPUS; i++) {
- error = nvmm_vcpu_get(mach, i, &vcpu);
- if (error)
- continue;
- ctl.nvcpus++;
- nvmm_vcpu_put(vcpu);
- }
+ ctl.nvcpus = mach->ncpus;
ctl.nram = 0;
for (i = 0; i < NVMM_MAX_HMAPPINGS; i++) {
@@ -1040,7 +1033,7 @@
static int nvmm_mmap(file_t *, off_t *, size_t, int, int *, int *,
struct uvm_object **, int *);
-const struct fileops nvmm_fileops = {
+static const struct fileops nvmm_fileops = {
.fo_read = fbadop_read,
.fo_write = fbadop_write,
.fo_ioctl = nvmm_ioctl,
@@ -1218,7 +1211,7 @@
static int
nvmm_detach(device_t self, int flags)
{
- if (nmachines > 0)
+ if (atomic_load_relaxed(&nmachines) > 0)
return EBUSY;
nvmm_fini();
return 0;
diff -r 611b4ad998a3 -r a4e99cadeef6 sys/dev/nvmm/nvmm_ioctl.h
--- a/sys/dev/nvmm/nvmm_ioctl.h Fri Aug 28 19:37:37 2020 +0000
+++ b/sys/dev/nvmm/nvmm_ioctl.h Sat Aug 29 17:00:28 2020 +0000
@@ -1,7 +1,7 @@
-/* $NetBSD: nvmm_ioctl.h,v 1.7.4.1 2019/11/10 12:58:30 martin Exp $ */
+/* $NetBSD: nvmm_ioctl.h,v 1.7.4.2 2020/08/29 17:00:28 martin Exp $ */
/*
- * Copyright (c) 2018-2019 The NetBSD Foundation, Inc.
+ * Copyright (c) 2018-2020 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -121,7 +121,9 @@
};
struct nvmm_ctl_mach_info {
+ /* input */
nvmm_machid_t machid;
+ /* output */
uint32_t nvcpus;
uint64_t nram;
pid_t pid;
@@ -151,7 +153,6 @@
#define NVMM_IOC_GPA_UNMAP _IOW ('N', 12, struct nvmm_ioc_gpa_unmap)
#define NVMM_IOC_HVA_MAP _IOW ('N', 13, struct nvmm_ioc_hva_map)
#define NVMM_IOC_HVA_UNMAP _IOW ('N', 14, struct nvmm_ioc_hva_unmap)
-
#define NVMM_IOC_CTL _IOW ('N', 20, struct nvmm_ioc_ctl)
#endif /* _NVMM_IOCTL_H_ */
diff -r 611b4ad998a3 -r a4e99cadeef6 sys/dev/nvmm/x86/nvmm_x86.c
--- a/sys/dev/nvmm/x86/nvmm_x86.c Fri Aug 28 19:37:37 2020 +0000
+++ b/sys/dev/nvmm/x86/nvmm_x86.c Sat Aug 29 17:00:28 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: nvmm_x86.c,v 1.7.4.4 2020/08/26 17:55:49 martin Exp $ */
+/* $NetBSD: nvmm_x86.c,v 1.7.4.5 2020/08/29 17:00:28 martin Exp $ */
/*
* Copyright (c) 2018-2020 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nvmm_x86.c,v 1.7.4.4 2020/08/26 17:55:49 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nvmm_x86.c,v 1.7.4.5 2020/08/29 17:00:28 martin Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -389,22 +389,22 @@
CPUID_MISALIGNSSE |
CPUID_3DNOWPF |
/* CPUID_OSVW excluded */
- CPUID_IBS |
+ /* CPUID_IBS excluded */
CPUID_XOP |
/* CPUID_SKINIT excluded */
- CPUID_WDT |
- CPUID_LWP |
+ /* CPUID_WDT excluded */
+ /* CPUID_LWP excluded */
CPUID_FMA4 |
CPUID_TCE |
- CPUID_NODEID |
+ /* CPUID_NODEID excluded */
CPUID_TBM |
- CPUID_TOPOEXT |
- CPUID_PCEC |
- CPUID_PCENB |
- CPUID_SPM |
- CPUID_DBE |
- CPUID_PTSC |
- CPUID_L2IPERFC,
+ CPUID_TOPOEXT,
+ /* CPUID_PCEC excluded */
+ /* CPUID_PCENB excluded */
+ /* CPUID_SPM excluded */
+ /* CPUID_DBE excluded */
+ /* CPUID_PTSC excluded */
+ /* CPUID_L2IPERFC excluded */
/* CPUID_MWAITX excluded */
.edx =
CPUID_SYSCALL |
diff -r 611b4ad998a3 -r a4e99cadeef6 sys/dev/nvmm/x86/nvmm_x86_svm.c
--- a/sys/dev/nvmm/x86/nvmm_x86_svm.c Fri Aug 28 19:37:37 2020 +0000
+++ b/sys/dev/nvmm/x86/nvmm_x86_svm.c Sat Aug 29 17:00:28 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: nvmm_x86_svm.c,v 1.46.4.9 2020/08/26 17:55:48 martin Exp $ */
+/* $NetBSD: nvmm_x86_svm.c,v 1.46.4.10 2020/08/29 17:00:28 martin Exp $ */
/*
* Copyright (c) 2018-2019 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_svm.c,v 1.46.4.9 2020/08/26 17:55:48 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_svm.c,v 1.46.4.10 2020/08/29 17:00:28 martin Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -509,7 +509,7 @@
#define CR0_TLB_FLUSH \
(CR0_PG|CR0_WP|CR0_CD|CR0_NW)
#define CR4_TLB_FLUSH \
- (CR4_PGE|CR4_PAE|CR4_PSE)
+ (CR4_PSE|CR4_PAE|CR4_PGE|CR4_PCIDE|CR4_SMEP)
/* -------------------------------------------------------------------------- */
@@ -1012,18 +1012,11 @@
struct svm_cpudata *cpudata = vcpu->cpudata;
struct nvmm_vcpu_conf_cpuid *cpuid;
uint64_t eax, ecx;
- u_int descs[4];
size_t i;
eax = cpudata->vmcb->state.rax;
ecx = cpudata->gprs[NVMM_X64_GPR_RCX];
- x86_cpuid2(eax, ecx, descs);
-
- cpudata->vmcb->state.rax = descs[0];
- cpudata->gprs[NVMM_X64_GPR_RBX] = descs[1];
- cpudata->gprs[NVMM_X64_GPR_RCX] = descs[2];
- cpudata->gprs[NVMM_X64_GPR_RDX] = descs[3];
-
+ svm_inkernel_exec_cpuid(cpudata, eax, ecx);
svm_inkernel_handle_cpuid(vcpu, eax, ecx);
for (i = 0; i < SVM_NCPUIDS; i++) {
@@ -2118,7 +2111,6 @@
* - POPF [popf instruction]
* - IRET [iret instruction]
* - INTN [int $n instructions]
- * - INVD [invd instruction]
* - PAUSE [pause instruction]
* - INVLPG [invplg instruction]
* - TASKSW [task switches]
@@ -2132,6 +2124,7 @@
VMCB_CTRL_INTERCEPT_RDPMC |
VMCB_CTRL_INTERCEPT_CPUID |
VMCB_CTRL_INTERCEPT_RSM |
+ VMCB_CTRL_INTERCEPT_INVD |
VMCB_CTRL_INTERCEPT_HLT |
VMCB_CTRL_INTERCEPT_INVLPGA |
VMCB_CTRL_INTERCEPT_IOIO_PROT |
diff -r 611b4ad998a3 -r a4e99cadeef6 sys/dev/nvmm/x86/nvmm_x86_svmfunc.S
--- a/sys/dev/nvmm/x86/nvmm_x86_svmfunc.S Fri Aug 28 19:37:37 2020 +0000
+++ b/sys/dev/nvmm/x86/nvmm_x86_svmfunc.S Sat Aug 29 17:00:28 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: nvmm_x86_svmfunc.S,v 1.3 2019/04/24 18:45:15 maxv Exp $ */
+/* $NetBSD: nvmm_x86_svmfunc.S,v 1.3.4.1 2020/08/29 17:00:28 martin Exp $ */
/*
* Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -75,10 +75,10 @@
#define HOST_SAVE_TR \
strw %ax ;\
- pushw %ax
+ pushq %rax
#define HOST_RESTORE_TR \
- popw %ax ;\
+ popq %rax ;\
Home |
Main Index |
Thread Index |
Old Index