summaryrefslogtreecommitdiff
path: root/usr/src/uts/i86pc/io/vmm/vmm_sol_vm.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/i86pc/io/vmm/vmm_sol_vm.c')
-rw-r--r--usr/src/uts/i86pc/io/vmm/vmm_sol_vm.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/usr/src/uts/i86pc/io/vmm/vmm_sol_vm.c b/usr/src/uts/i86pc/io/vmm/vmm_sol_vm.c
index 9bd55c41f2..bedc338474 100644
--- a/usr/src/uts/i86pc/io/vmm/vmm_sol_vm.c
+++ b/usr/src/uts/i86pc/io/vmm/vmm_sol_vm.c
@@ -12,6 +12,7 @@
/*
* Copyright 2019 Joyent, Inc.
+ * Copyright 2020 Oxide Computer Company
*/
#include <sys/param.h>
@@ -894,12 +895,15 @@ vm_map_wire(vm_map_t map, vm_offset_t start, vm_offset_t end, int flags)
/* Provided custom for bhyve 'devmem' segment mapping */
int
-vm_segmap_obj(struct vmspace *vms, vm_object_t vmo, struct as *as,
+vm_segmap_obj(vm_object_t vmo, off_t map_off, size_t size, struct as *as,
caddr_t *addrp, uint_t prot, uint_t maxprot, uint_t flags)
{
- const size_t size = vmo->vmo_size;
int err;
+ VERIFY(map_off >= 0);
+ VERIFY(size <= vmo->vmo_size);
+ VERIFY((size + map_off) <= vmo->vmo_size);
+
if (vmo->vmo_type != OBJT_DEFAULT) {
/* Only support default objects for now */
return (ENOTSUP);
@@ -911,7 +915,7 @@ vm_segmap_obj(struct vmspace *vms, vm_object_t vmo, struct as *as,
if (err == 0) {
segvmm_crargs_t svma;
- svma.kaddr = vmo->vmo_data;
+ svma.kaddr = (caddr_t)vmo->vmo_data + map_off;
svma.prot = prot;
svma.cookie = vmo;
svma.hold = (segvmm_holdfn_t)vm_object_reference;