diff options
author | Neel Natu <neel@FreeBSD.org> | 2015-06-22 00:30:34 +0000 |
---|---|---|
committer | Neel Natu <neel@FreeBSD.org> | 2015-06-22 00:30:34 +0000 |
commit | 36e8356e992987191f85cec408f88adecadf3103 (patch) | |
tree | d092e84ad09a1df861972f2ca7939d375ee672b7 | |
parent | 0f20a3cdd8ce01eb7aacd3fba3153af0907f6209 (diff) |
Notes
-rw-r--r-- | lib/libvmmapi/vmmapi.c | 25 |
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 |