Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src Make it possible for an emulator to set the protection of th...
details: https://anonhg.NetBSD.org/src/rev/3c86b913aa95
branches: trunk
changeset: 840085:3c86b913aa95
user: maxv <maxv%NetBSD.org@localhost>
date: Thu Mar 21 20:21:40 2019 +0000
description:
Make it possible for an emulator to set the protection of the guest pages.
For some reason I had initially concluded that it wasn't doable; verily it
is, so let's do it.
The reserved 'flags' argument of nvmm_gpa_map() becomes 'prot' and takes
mmap-like protection codes.
diffstat:
lib/libnvmm/libnvmm.3 | 6 +++---
lib/libnvmm/libnvmm.c | 6 +++---
sys/dev/nvmm/nvmm.c | 14 ++++++++++----
sys/dev/nvmm/nvmm.h | 10 ++--------
sys/dev/nvmm/nvmm_ioctl.h | 4 ++--
sys/dev/nvmm/x86/nvmm_x86_svm.c | 11 ++++++-----
sys/dev/nvmm/x86/nvmm_x86_vmx.c | 11 ++++++-----
tests/lib/libnvmm/h_io_assist.c | 27 ++++++++++++++++++++-------
tests/lib/libnvmm/h_mem_assist.c | 22 ++++++++++++++++------
9 files changed, 68 insertions(+), 43 deletions(-)
diffs (truncated from 340 to 300 lines):
diff -r 5e668f4efbd6 -r 3c86b913aa95 lib/libnvmm/libnvmm.3
--- a/lib/libnvmm/libnvmm.3 Thu Mar 21 17:40:36 2019 +0000
+++ b/lib/libnvmm/libnvmm.3 Thu Mar 21 20:21:40 2019 +0000
@@ -1,4 +1,4 @@
-.\" $NetBSD: libnvmm.3,v 1.11 2019/02/05 15:03:35 wiz Exp $
+.\" $NetBSD: libnvmm.3,v 1.12 2019/03/21 20:21:40 maxv Exp $
.\"
.\" Copyright (c) 2018, 2019 The NetBSD Foundation, Inc.
.\" All rights reserved.
@@ -27,7 +27,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd February 5, 2019
+.Dd March 19, 2019
.Dt LIBNVMM 3
.Os
.Sh NAME
@@ -68,7 +68,7 @@
.Fn nvmm_hva_unmap "struct nvmm_machine *mach" "uintptr_t hva" "size_t size"
.Ft int
.Fn nvmm_gpa_map "struct nvmm_machine *mach" "uintptr_t hva" "gpaddr_t gpa" \
- "size_t size" "int flags"
+ "size_t size" "int prot"
.Ft int
.Fn nvmm_gpa_unmap "struct nvmm_machine *mach" "uintptr_t hva" "gpaddr_t gpa" \
"size_t size"
diff -r 5e668f4efbd6 -r 3c86b913aa95 lib/libnvmm/libnvmm.c
--- a/lib/libnvmm/libnvmm.c Thu Mar 21 17:40:36 2019 +0000
+++ b/lib/libnvmm/libnvmm.c Thu Mar 21 20:21:40 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: libnvmm.c,v 1.6 2018/12/27 07:22:31 maxv Exp $ */
+/* $NetBSD: libnvmm.c,v 1.7 2019/03/21 20:21:40 maxv Exp $ */
/*
* Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -374,7 +374,7 @@
int
nvmm_gpa_map(struct nvmm_machine *mach, uintptr_t hva, gpaddr_t gpa,
- size_t size, int flags)
+ size_t size, int prot)
{
struct nvmm_ioc_gpa_map args;
int ret;
@@ -391,7 +391,7 @@
args.hva = hva;
args.gpa = gpa;
args.size = size;
- args.flags = flags;
+ args.prot = prot;
ret = ioctl(nvmm_fd, NVMM_IOC_GPA_MAP, &args);
if (ret == -1) {
diff -r 5e668f4efbd6 -r 3c86b913aa95 sys/dev/nvmm/nvmm.c
--- a/sys/dev/nvmm/nvmm.c Thu Mar 21 17:40:36 2019 +0000
+++ b/sys/dev/nvmm/nvmm.c Thu Mar 21 20:21:40 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: nvmm.c,v 1.10 2019/03/14 19:10:27 maxv Exp $ */
+/* $NetBSD: nvmm.c,v 1.11 2019/03/21 20:21:40 maxv Exp $ */
/*
* Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nvmm.c,v 1.10 2019/03/14 19:10:27 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nvmm.c,v 1.11 2019/03/21 20:21:40 maxv Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -41,6 +41,7 @@
#include <sys/kmem.h>
#include <sys/module.h>
#include <sys/proc.h>
+#include <sys/mman.h>
#include <uvm/uvm.h>
#include <uvm/uvm_page.h>
@@ -493,7 +494,7 @@
if (exit->u.mem.gpa >= mach->gpa_end) {
break;
}
- if (uvm_fault(&vm->vm_map, exit->u.mem.gpa, VM_PROT_ALL)) {
+ if (uvm_fault(&vm->vm_map, exit->u.mem.gpa, exit->u.mem.prot)) {
break;
}
}
@@ -706,6 +707,11 @@
if (error)
return error;
+ if ((args->prot & ~(PROT_READ|PROT_WRITE|PROT_EXEC)) != 0) {
+ error = EINVAL;
+ goto out;
+ }
+
if ((args->gpa % PAGE_SIZE) != 0 || (args->size % PAGE_SIZE) != 0 ||
(args->hva % PAGE_SIZE) != 0) {
error = EINVAL;
@@ -740,7 +746,7 @@
/* Map the uobj into the machine address space, as pageable. */
error = uvm_map(&mach->vm->vm_map, &gpa, args->size, uobj, off, 0,
- UVM_MAPFLAG(UVM_PROT_RWX, UVM_PROT_RWX, UVM_INH_NONE,
+ UVM_MAPFLAG(args->prot, UVM_PROT_RWX, UVM_INH_NONE,
UVM_ADV_RANDOM, UVM_FLAG_FIXED|UVM_FLAG_UNMAP));
if (error) {
uao_detach(uobj);
diff -r 5e668f4efbd6 -r 3c86b913aa95 sys/dev/nvmm/nvmm.h
--- a/sys/dev/nvmm/nvmm.h Thu Mar 21 17:40:36 2019 +0000
+++ b/sys/dev/nvmm/nvmm.h Thu Mar 21 20:21:40 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: nvmm.h,v 1.4 2019/01/26 15:12:20 maxv Exp $ */
+/* $NetBSD: nvmm.h,v 1.5 2019/03/21 20:21:40 maxv Exp $ */
/*
* Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -64,14 +64,8 @@
NVMM_EXIT_INVALID = 0xFFFFFFFFFFFFFFFF
};
-enum nvmm_exit_memory_perm {
- NVMM_EXIT_MEMORY_READ,
- NVMM_EXIT_MEMORY_WRITE,
- NVMM_EXIT_MEMORY_EXEC
-};
-
struct nvmm_exit_memory {
- enum nvmm_exit_memory_perm perm;
+ int prot;
gpaddr_t gpa;
uint8_t inst_len;
uint8_t inst_bytes[15];
diff -r 5e668f4efbd6 -r 3c86b913aa95 sys/dev/nvmm/nvmm_ioctl.h
--- a/sys/dev/nvmm/nvmm_ioctl.h Thu Mar 21 17:40:36 2019 +0000
+++ b/sys/dev/nvmm/nvmm_ioctl.h Thu Mar 21 20:21:40 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: nvmm_ioctl.h,v 1.3 2019/01/08 07:29:46 maxv Exp $ */
+/* $NetBSD: nvmm_ioctl.h,v 1.4 2019/03/21 20:21:40 maxv Exp $ */
/*
* Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -109,7 +109,7 @@
uintptr_t hva;
gpaddr_t gpa;
size_t size;
- int flags;
+ int prot;
};
struct nvmm_ioc_gpa_unmap {
diff -r 5e668f4efbd6 -r 3c86b913aa95 sys/dev/nvmm/x86/nvmm_x86_svm.c
--- a/sys/dev/nvmm/x86/nvmm_x86_svm.c Thu Mar 21 17:40:36 2019 +0000
+++ b/sys/dev/nvmm/x86/nvmm_x86_svm.c Thu Mar 21 20:21:40 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: nvmm_x86_svm.c,v 1.34 2019/03/14 19:15:26 maxv Exp $ */
+/* $NetBSD: nvmm_x86_svm.c,v 1.35 2019/03/21 20:21:41 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.34 2019/03/14 19:15:26 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_svm.c,v 1.35 2019/03/21 20:21:41 maxv Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -38,6 +38,7 @@
#include <sys/kmem.h>
#include <sys/cpu.h>
#include <sys/xcall.h>
+#include <sys/mman.h>
#include <uvm/uvm.h>
#include <uvm/uvm_page.h>
@@ -1066,11 +1067,11 @@
exit->reason = NVMM_EXIT_MEMORY;
if (cpudata->vmcb->ctrl.exitinfo1 & PGEX_W)
- exit->u.mem.perm = NVMM_EXIT_MEMORY_WRITE;
+ exit->u.mem.prot = PROT_WRITE;
else if (cpudata->vmcb->ctrl.exitinfo1 & PGEX_X)
- exit->u.mem.perm = NVMM_EXIT_MEMORY_EXEC;
+ exit->u.mem.prot = PROT_EXEC;
else
- exit->u.mem.perm = NVMM_EXIT_MEMORY_READ;
+ exit->u.mem.prot = PROT_READ;
exit->u.mem.gpa = gpa;
exit->u.mem.inst_len = cpudata->vmcb->ctrl.inst_len;
memcpy(exit->u.mem.inst_bytes, cpudata->vmcb->ctrl.inst_bytes,
diff -r 5e668f4efbd6 -r 3c86b913aa95 sys/dev/nvmm/x86/nvmm_x86_vmx.c
--- a/sys/dev/nvmm/x86/nvmm_x86_vmx.c Thu Mar 21 17:40:36 2019 +0000
+++ b/sys/dev/nvmm/x86/nvmm_x86_vmx.c Thu Mar 21 20:21:40 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: nvmm_x86_vmx.c,v 1.19 2019/03/14 20:29:53 maxv Exp $ */
+/* $NetBSD: nvmm_x86_vmx.c,v 1.20 2019/03/21 20:21:41 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.19 2019/03/14 20:29:53 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_vmx.c,v 1.20 2019/03/21 20:21:41 maxv Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -38,6 +38,7 @@
#include <sys/kmem.h>
#include <sys/cpu.h>
#include <sys/xcall.h>
+#include <sys/mman.h>
#include <uvm/uvm.h>
#include <uvm/uvm_page.h>
@@ -1600,11 +1601,11 @@
exit->reason = NVMM_EXIT_MEMORY;
vmx_vmread(VMCS_EXIT_QUALIFICATION, &perm);
if (perm & VMX_EPT_VIOLATION_WRITE)
- exit->u.mem.perm = NVMM_EXIT_MEMORY_WRITE;
+ exit->u.mem.prot = PROT_WRITE;
else if (perm & VMX_EPT_VIOLATION_EXECUTE)
- exit->u.mem.perm = NVMM_EXIT_MEMORY_EXEC;
+ exit->u.mem.prot = PROT_EXEC;
else
- exit->u.mem.perm = NVMM_EXIT_MEMORY_READ;
+ exit->u.mem.prot = PROT_READ;
exit->u.mem.gpa = gpa;
exit->u.mem.inst_len = 0;
}
diff -r 5e668f4efbd6 -r 3c86b913aa95 tests/lib/libnvmm/h_io_assist.c
--- a/tests/lib/libnvmm/h_io_assist.c Thu Mar 21 17:40:36 2019 +0000
+++ b/tests/lib/libnvmm/h_io_assist.c Thu Mar 21 20:21:40 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: h_io_assist.c,v 1.4 2019/03/19 19:23:39 maxv Exp $ */
+/* $NetBSD: h_io_assist.c,v 1.5 2019/03/21 20:21:41 maxv Exp $ */
/*
* Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -126,6 +126,7 @@
map_pages(struct nvmm_machine *mach)
{
pt_entry_t *L4, *L3, *L2, *L1;
+ int ret;
instbuf = mmap(NULL, PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE,
-1, 0);
@@ -140,9 +141,13 @@
err(errno, "nvmm_hva_map");
if (nvmm_hva_map(mach, (uintptr_t)databuf, PAGE_SIZE) == -1)
err(errno, "nvmm_hva_map");
- if (nvmm_gpa_map(mach, (uintptr_t)instbuf, 0x2000, PAGE_SIZE, 0) == -1)
+ ret = nvmm_gpa_map(mach, (uintptr_t)instbuf, 0x2000, PAGE_SIZE,
+ PROT_READ|PROT_EXEC);
+ if (ret == -1)
err(errno, "nvmm_gpa_map");
- if (nvmm_gpa_map(mach, (uintptr_t)databuf, 0x1000, PAGE_SIZE, 0) == -1)
+ ret = nvmm_gpa_map(mach, (uintptr_t)databuf, 0x1000, PAGE_SIZE,
+ PROT_READ|PROT_WRITE);
+ if (ret == -1)
err(errno, "nvmm_gpa_map");
L4 = mmap(NULL, PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE,
@@ -171,13 +176,21 @@
if (nvmm_hva_map(mach, (uintptr_t)L1, PAGE_SIZE) == -1)
err(errno, "nvmm_hva_map");
- if (nvmm_gpa_map(mach, (uintptr_t)L4, 0x3000, PAGE_SIZE, 0) == -1)
+ ret = nvmm_gpa_map(mach, (uintptr_t)L4, 0x3000, PAGE_SIZE,
+ PROT_READ|PROT_WRITE);
+ if (ret == -1)
err(errno, "nvmm_gpa_map");
- if (nvmm_gpa_map(mach, (uintptr_t)L3, 0x4000, PAGE_SIZE, 0) == -1)
+ ret = nvmm_gpa_map(mach, (uintptr_t)L3, 0x4000, PAGE_SIZE,
+ PROT_READ|PROT_WRITE);
+ if (ret == -1)
err(errno, "nvmm_gpa_map");
- if (nvmm_gpa_map(mach, (uintptr_t)L2, 0x5000, PAGE_SIZE, 0) == -1)
+ ret = nvmm_gpa_map(mach, (uintptr_t)L2, 0x5000, PAGE_SIZE,
+ PROT_READ|PROT_WRITE);
+ if (ret == -1)
err(errno, "nvmm_gpa_map");
- if (nvmm_gpa_map(mach, (uintptr_t)L1, 0x6000, PAGE_SIZE, 0) == -1)
+ ret = nvmm_gpa_map(mach, (uintptr_t)L1, 0x6000, PAGE_SIZE,
+ if (ret == -1)
+ PROT_READ|PROT_WRITE);
err(errno, "nvmm_gpa_map");
memset(L4, 0, PAGE_SIZE);
diff -r 5e668f4efbd6 -r 3c86b913aa95 tests/lib/libnvmm/h_mem_assist.c
--- a/tests/lib/libnvmm/h_mem_assist.c Thu Mar 21 17:40:36 2019 +0000
+++ b/tests/lib/libnvmm/h_mem_assist.c Thu Mar 21 20:21:40 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: h_mem_assist.c,v 1.7 2019/03/19 19:23:39 maxv Exp $ */
+/* $NetBSD: h_mem_assist.c,v 1.8 2019/03/21 20:21:41 maxv Exp $ */
Home |
Main Index |
Thread Index |
Old Index