diff --git a/usr.sbin/bhyve/mem.c b/usr.sbin/bhyve/mem.c --- a/usr.sbin/bhyve/mem.c +++ b/usr.sbin/bhyve/mem.c @@ -45,6 +45,7 @@ #include #include +#include "debug.h" #include "mem.h" struct mmio_rb_range { @@ -163,6 +164,35 @@ return (error); } +static int +no_mem_handler(struct vcpu *vcpu __unused, int dir, uint64_t addr __unused, + int size, uint64_t *val, void *arg1 __unused, long arg2 __unused) +{ + if (dir == MEM_F_READ) { + switch (size) { + case 1: + *val = 0xff; + break; + case 2: + *val = 0xffff; + break; + case 4: + *val = 0xffffffff; + break; + case 8: + *val = 0xffffffffffffffff; + break; + } + } + return (0); +} + +static struct mmio_rb_range fb_entry = { + .mr_param.handler = no_mem_handler, + .mr_param.base = 0, + .mr_param.size = 0xffffffffffffffff, +}; + static int access_memory(struct vcpu *vcpu, uint64_t paddr, mem_cb_t *cb, void *arg) { @@ -186,9 +216,10 @@ /* Update the per-vCPU cache */ mmio_hint[vcpuid] = entry; } else if (mmio_rb_lookup(&mmio_rb_fallback, paddr, &entry)) { - perror = pthread_rwlock_unlock(&mmio_rwlock); - assert(perror == 0); - return (ESRCH); + entry = &fb_entry; + EPRINTLN( + "Emulating access to non-existent address to %#lx\n", + paddr); } }