summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeel Natu <neel@FreeBSD.org>2015-06-22 00:30:34 +0000
committerNeel Natu <neel@FreeBSD.org>2015-06-22 00:30:34 +0000
commit36e8356e992987191f85cec408f88adecadf3103 (patch)
treed092e84ad09a1df861972f2ca7939d375ee672b7
parent0f20a3cdd8ce01eb7aacd3fba3153af0907f6209 (diff)
Notes
-rw-r--r--lib/libvmmapi/vmmapi.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/lib/libvmmapi/vmmapi.c b/lib/libvmmapi/vmmapi.c
index d5f387aec682f..e87efc96ff053 100644
--- a/lib/libvmmapi/vmmapi.c
+++ b/lib/libvmmapi/vmmapi.c
@@ -415,19 +415,28 @@ vm_setup_memory(struct vmctx *ctx, size_t memsize, enum vm_mmap_style vms)
return (0);
}
+/*
+ * Returns a non-NULL pointer if [gaddr, gaddr+len) is entirely contained in
+ * the lowmem or highmem regions.
+ *
+ * In particular return NULL if [gaddr, gaddr+len) falls in guest MMIO region.
+ * The instruction emulation code depends on this behavior.
+ */
void *
vm_map_gpa(struct vmctx *ctx, vm_paddr_t gaddr, size_t len)
{
- vm_paddr_t start, end, mapend;
- start = gaddr;
- end = gaddr + len;
- mapend = ctx->highmem ? 4*GB + ctx->highmem : ctx->lowmem;
+ if (ctx->lowmem > 0) {
+ if (gaddr < ctx->lowmem && gaddr + len <= ctx->lowmem)
+ return (ctx->baseaddr + gaddr);
+ }
- if (start <= end && end <= mapend)
- return (ctx->baseaddr + start);
- else
- return (NULL);
+ if (ctx->highmem > 0) {
+ if (gaddr >= 4*GB && gaddr + len <= 4*GB + ctx->highmem)
+ return (ctx->baseaddr + gaddr);
+ }
+
+ return (NULL);
}
size_t