Page MenuHomeFreeBSD

D50116.id154698.diff
No OneTemporary

D50116.id154698.diff

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
@@ -43,8 +43,10 @@
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include <vmmapi.h>
+#include "debug.h"
#include "mem.h"
struct mmio_rb_range {
@@ -163,10 +165,34 @@
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 int
access_memory(struct vcpu *vcpu, uint64_t paddr, mem_cb_t *cb, void *arg)
{
struct mmio_rb_range *entry;
+ struct mmio_rb_range fb_entry;
int err, perror, immutable, vcpuid;
vcpuid = vcpu_id(vcpu);
@@ -186,9 +212,14 @@
/* 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);
+ memset(&fb_entry, 0, sizeof(fb_entry));
+ fb_entry.mr_param.handler = no_mem_handler;
+ fb_entry.mr_param.base = 0;
+ fb_entry.mr_param.size = 0xffffffffffffffff;
+ entry = &fb_entry;
+ EPRINTLN(
+ "Emulating non-existing memory access to %#lx\n",
+ paddr);
}
}

File Metadata

Mime Type
text/plain
Expires
Mon, Feb 9, 7:46 AM (10 h, 9 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28555259
Default Alt Text
D50116.id154698.diff (1 KB)

Event Timeline