Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F137924916
D38333.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
1 KB
Referenced Files
None
Subscribers
None
D38333.diff
View Options
diff --git a/usr.sbin/bhyve/qemu_fwcfg.h b/usr.sbin/bhyve/qemu_fwcfg.h
--- a/usr.sbin/bhyve/qemu_fwcfg.h
+++ b/usr.sbin/bhyve/qemu_fwcfg.h
@@ -9,4 +9,12 @@
#include <vmmapi.h>
+#define QEMU_FWCFG_MAX_ARCHS 0x2
+#define QEMU_FWCFG_MAX_ENTRIES 0x4000
+
+struct qemu_fwcfg_item {
+ uint32_t size;
+ uint8_t *data;
+};
+
int qemu_fwcfg_init(struct vmctx *const ctx);
diff --git a/usr.sbin/bhyve/qemu_fwcfg.c b/usr.sbin/bhyve/qemu_fwcfg.c
--- a/usr.sbin/bhyve/qemu_fwcfg.c
+++ b/usr.sbin/bhyve/qemu_fwcfg.c
@@ -56,6 +56,8 @@
uint32_t data_offset;
union qemu_fwcfg_selector selector;
+ struct qemu_fwcfg_item items[QEMU_FWCFG_MAX_ARCHS]
+ [QEMU_FWCFG_MAX_ENTRIES];
};
static struct qemu_fwcfg_softc fwcfg_sc;
@@ -87,6 +89,44 @@
const int port __unused, const int bytes, uint32_t *const eax,
void *const arg __unused)
{
+ if (bytes != sizeof(uint8_t)) {
+ warnx("%s: invalid size (%d) of IO port access", __func__,
+ bytes);
+ return (-1);
+ }
+
+ if (!in) {
+ warnx("%s: Writes to qemu fwcfg data port aren't allowed",
+ __func__);
+ return (-1);
+ }
+
+ /* get fwcfg item */
+ struct qemu_fwcfg_item *const item =
+ &fwcfg_sc.items[fwcfg_sc.selector.architecture]
+ [fwcfg_sc.selector.index];
+ if (item->data == NULL) {
+ warnx(
+ "%s: qemu fwcfg item doesn't exist (architecture %s index 0x%x)",
+ __func__,
+ fwcfg_sc.selector.architecture ? "specific" : "generic",
+ fwcfg_sc.selector.index);
+ *eax = 0x00;
+ return (0);
+ } else if (fwcfg_sc.data_offset >= item->size) {
+ warnx(
+ "%s: qemu fwcfg item read exceeds size (architecture %s index 0x%x size 0x%x offset 0x%x)",
+ __func__,
+ fwcfg_sc.selector.architecture ? "specific" : "generic",
+ fwcfg_sc.selector.index, item->size, fwcfg_sc.data_offset);
+ *eax = 0x00;
+ return (0);
+ }
+
+ /* return item data */
+ *eax = item->data[fwcfg_sc.data_offset];
+ fwcfg_sc.data_offset++;
+
return (0);
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Nov 28, 7:45 AM (9 h, 18 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
26272666
Default Alt Text
D38333.diff (1 KB)
Attached To
Mode
D38333: bhyve: add emulation for qemu's fwcfg data port
Attached
Detach File
Event Timeline
Log In to Comment