Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F143677619
D50116.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D50116.diff
View Options
diff --git a/usr.sbin/bhyve/aarch64/Makefile.inc b/usr.sbin/bhyve/aarch64/Makefile.inc
--- a/usr.sbin/bhyve/aarch64/Makefile.inc
+++ b/usr.sbin/bhyve/aarch64/Makefile.inc
@@ -1,5 +1,6 @@
SRCS+= \
fdt.c \
+ mem_md.c \
rtc_pl031.c \
uart_pl011.c
diff --git a/usr.sbin/bhyve/amd64/Makefile.inc b/usr.sbin/bhyve/amd64/Makefile.inc
--- a/usr.sbin/bhyve/amd64/Makefile.inc
+++ b/usr.sbin/bhyve/amd64/Makefile.inc
@@ -7,6 +7,7 @@
inout.c \
ioapic.c \
kernemu_dev.c \
+ mem_md.c \
mptbl.c \
pci_fbuf.c \
pci_gvt-d.c \
diff --git a/usr.sbin/bhyve/mem.h b/usr.sbin/bhyve/mem.h
--- a/usr.sbin/bhyve/mem.h
+++ b/usr.sbin/bhyve/mem.h
@@ -53,6 +53,8 @@
void init_mem(int ncpu);
int emulate_mem(struct vcpu *vcpu, uint64_t paddr, struct vie *vie,
struct vm_guest_paging *paging);
+int mmio_handle_non_backed_mem(struct vcpu *vcpu __unused, uint64_t paddr,
+ struct mem_range **mr_paramp);
int read_mem(struct vcpu *vpu, uint64_t gpa, uint64_t *rval, int size);
int register_mem(struct mem_range *memp);
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
@@ -33,6 +33,7 @@
*/
#include <sys/types.h>
+#define _WANT_KERNEL_ERRNO 1
#include <sys/errno.h>
#include <sys/tree.h>
#include <machine/vmm.h>
@@ -167,10 +168,13 @@
access_memory(struct vcpu *vcpu, uint64_t paddr, mem_cb_t *cb, void *arg)
{
struct mmio_rb_range *entry;
+ struct mem_range *mr;
int err, perror, immutable, vcpuid;
vcpuid = vcpu_id(vcpu);
+ mr = NULL;
pthread_rwlock_rdlock(&mmio_rwlock);
+
/*
* First check the per-vCPU cache
*/
@@ -185,14 +189,22 @@
if (mmio_rb_lookup(&mmio_rb_root, paddr, &entry) == 0) {
/* 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);
+ } else if (mmio_rb_lookup(&mmio_rb_fallback, paddr,
+ &entry) == 0) {
+ } else {
+ err = mmio_handle_non_backed_mem(vcpu, paddr, &mr);
+ if (err != 0) {
+ perror = pthread_rwlock_unlock(&mmio_rwlock);
+ assert(perror == 0);
+ return (err == EJUSTRETURN ? 0 : err);
+ }
}
}
- assert(entry != NULL);
+ if (mr == NULL) {
+ assert(entry != NULL);
+ mr = &entry->mr_param;
+ }
/*
* An 'immutable' memory range is guaranteed to be never removed
@@ -205,13 +217,13 @@
* deadlock on 'mmio_rwlock'. However by registering the extended
* config space window as 'immutable' the deadlock can be avoided.
*/
- immutable = (entry->mr_param.flags & MEM_F_IMMUTABLE);
+ immutable = (mr->flags & MEM_F_IMMUTABLE) != 0;
if (immutable) {
perror = pthread_rwlock_unlock(&mmio_rwlock);
assert(perror == 0);
}
- err = cb(vcpu, paddr, &entry->mr_param, arg);
+ err = cb(vcpu, paddr, mr, arg);
if (!immutable) {
perror = pthread_rwlock_unlock(&mmio_rwlock);
diff --git a/usr.sbin/bhyve/mem.h b/usr.sbin/bhyve/mem_md.c
copy from usr.sbin/bhyve/mem.h
copy to usr.sbin/bhyve/mem_md.c
--- a/usr.sbin/bhyve/mem.h
+++ b/usr.sbin/bhyve/mem_md.c
@@ -1,8 +1,10 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause
*
- * Copyright (c) 2012 NetApp, Inc.
- * All rights reserved.
+ * Copyright (c) 2025 The FreeBSD Foundation
+ *
+ * This software was developed by Konstantin Belousov <kib@FreeBSD.org>
+ * under sponsorship from the FreeBSD Foundation.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -13,10 +15,10 @@
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
- * THIS SOFTWARE IS PROVIDED BY NETAPP, INC ``AS IS'' AND
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL NETAPP, INC OR CONTRIBUTORS BE LIABLE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
@@ -26,38 +28,17 @@
* SUCH DAMAGE.
*/
-#ifndef _MEM_H_
-#define _MEM_H_
-
-#include <sys/linker_set.h>
-
-struct vcpu;
-
-typedef int (*mem_func_t)(struct vcpu *vcpu, int dir, uint64_t addr,
- int size, uint64_t *val, void *arg1, long arg2);
-
-struct mem_range {
- const char *name;
- int flags;
- mem_func_t handler;
- void *arg1;
- long arg2;
- uint64_t base;
- uint64_t size;
-};
-#define MEM_F_READ 0x1
-#define MEM_F_WRITE 0x2
-#define MEM_F_RW 0x3
-#define MEM_F_IMMUTABLE 0x4 /* mem_range cannot be unregistered */
-
-void init_mem(int ncpu);
-int emulate_mem(struct vcpu *vcpu, uint64_t paddr, struct vie *vie,
- struct vm_guest_paging *paging);
+#include <sys/types.h>
+#include <sys/errno.h>
+#include <sys/tree.h>
+#include <machine/vmm.h>
+#include <machine/vmm_instruction_emul.h>
-int read_mem(struct vcpu *vpu, uint64_t gpa, uint64_t *rval, int size);
-int register_mem(struct mem_range *memp);
-int register_mem_fallback(struct mem_range *memp);
-int unregister_mem(struct mem_range *memp);
-int write_mem(struct vcpu *vcpu, uint64_t gpa, uint64_t wval, int size);
+#include "mem.h"
-#endif /* _MEM_H_ */
+int
+mmio_handle_non_backed_mem(struct vcpu *vcpu __unused, uint64_t paddr __unused,
+ struct mem_range **mr_paramp __unused)
+{
+ return (ESRCH);
+}
diff --git a/usr.sbin/bhyve/riscv/Makefile.inc b/usr.sbin/bhyve/riscv/Makefile.inc
--- a/usr.sbin/bhyve/riscv/Makefile.inc
+++ b/usr.sbin/bhyve/riscv/Makefile.inc
@@ -1,5 +1,6 @@
SRCS+= \
- fdt.c
+ fdt.c \
+ mem_md.c
.PATH: ${BHYVE_SYSDIR}/sys/riscv/vmm
SRCS+= vmm_instruction_emul.c
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Feb 1, 6:11 AM (19 h, 50 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28292792
Default Alt Text
D50116.diff (5 KB)
Attached To
Mode
D50116: bhyve: when accessing non-backed gpa, emulate hw
Attached
Detach File
Event Timeline
Log In to Comment