summaryrefslogtreecommitdiff
path: root/usr/src/lib
diff options
context:
space:
mode:
authorPatrick Mooney <pmooney@pfmooney.com>2020-08-03 23:23:51 +0000
committerPatrick Mooney <pmooney@oxide.computer>2020-08-10 22:55:03 +0000
commitc3d209cab1511045e9bb1a521f1bd85995d4fd7e (patch)
tree71b9a13bff494830762679bb3e0584f30ea463d7 /usr/src/lib
parent40ae3b8f7394f061252c31a21b854ae328f6f269 (diff)
downloadillumos-joyent-c3d209cab1511045e9bb1a521f1bd85995d4fd7e.tar.gz
13008 bhyve devmem could match better
13009 mdb-bhyve mishandles memseg offsets 13010 bhyve should not exit when VM debugged Reviewed by: Andy Fiddaman <andy@omniosce.org> Reviewed by: Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org> Approved by: Robert Mustacchi <rm@fingolfin.org>
Diffstat (limited to 'usr/src/lib')
-rw-r--r--usr/src/lib/libvmm/libvmm.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/usr/src/lib/libvmm/libvmm.c b/usr/src/lib/libvmm/libvmm.c
index dc552a8de0..df3d8ec99f 100644
--- a/usr/src/lib/libvmm/libvmm.c
+++ b/usr/src/lib/libvmm/libvmm.c
@@ -11,6 +11,7 @@
/*
* Copyright 2019 Joyent, Inc.
+ * Copyright 2020 Oxide Computer Company
*/
/*
@@ -199,12 +200,31 @@ vmm_map(vmm_t *vmm, boolean_t writable)
for (ms = list_head(&vmm->vmm_memlist);
ms != NULL;
ms = list_next(&vmm->vmm_memlist, ms)) {
- off_t mapoff = ms->vms_gpa;
+ off_t mapoff;
+
+ if ((ms->vms_flags & VMM_MEMSEG_DEVMEM) == 0) {
+ /*
+ * sysmem segments will be located at an offset
+ * equivalent to their GPA.
+ */
+ mapoff = ms->vms_gpa;
+ } else {
+ /*
+ * devmem segments are located in a special region away
+ * from the normal GPA space.
+ */
+ if (vm_get_devmem_offset(vmm->vmm_ctx, ms->vms_segid,
+ &mapoff) != 0) {
+ goto fail;
+ }
+ }
- if ((ms->vms_flags & VMM_MEMSEG_DEVMEM) &&
- vm_get_devmem_offset(vmm->vmm_ctx, ms->vms_segid, &mapoff)
- != 0)
- goto fail;
+ /*
+ * While 'mapoff' points to the front of the segment, the actual
+ * mapping may be at some offset beyond that.
+ */
+ VERIFY(ms->vms_segoff >= 0);
+ mapoff += ms->vms_segoff;
vmm->vmm_memsize += ms->vms_maplen;