summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormlarkin <mlarkin@openbsd.org>2017-03-25 22:36:53 +0000
committermlarkin <mlarkin@openbsd.org>2017-03-25 22:36:53 +0000
commitb966d91a0c4c148f4a70f543b2f2de3db0cdb93a (patch)
tree9fe8363a215f92e1dd28bf7cba779d0ae4bbd666
parentRecognise vmm in dmesg to install "vmm-firmware" (the SeaBIOS package). (diff)
downloadwireguard-openbsd-b966d91a0c4c148f4a70f543b2f2de3db0cdb93a.tar.xz
wireguard-openbsd-b966d91a0c4c148f4a70f543b2f2de3db0cdb93a.zip
Last bits needed to get seabios + alpine linux working. This is enough
to get started and let more people help finding and fixing bugs. ok kettenis, deraadt
-rw-r--r--usr.sbin/vmd/i8253.c4
-rw-r--r--usr.sbin/vmd/i8259.c6
-rw-r--r--usr.sbin/vmd/mc146818.c4
-rw-r--r--usr.sbin/vmd/pci.c29
-rw-r--r--usr.sbin/vmd/virtio.c22
-rw-r--r--usr.sbin/vmd/vm.c26
-rw-r--r--usr.sbin/vmd/vmm.h2
7 files changed, 70 insertions, 23 deletions
diff --git a/usr.sbin/vmd/i8253.c b/usr.sbin/vmd/i8253.c
index 2979d492a93..46533b18498 100644
--- a/usr.sbin/vmd/i8253.c
+++ b/usr.sbin/vmd/i8253.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: i8253.c,v 1.10 2017/03/25 07:46:24 mlarkin Exp $ */
+/* $OpenBSD: i8253.c,v 1.11 2017/03/25 22:36:53 mlarkin Exp $ */
/*
* Copyright (c) 2016 Mike Larkin <mlarkin@openbsd.org>
*
@@ -133,7 +133,7 @@ vcpu_exit_i8253(struct vm_run_params *vrp)
struct timeval now, delta;
union vm_exit *vei = vrp->vrp_exit;
- out_data = get_input_data(vei);
+ get_input_data(vei, &out_data);
if (vei->vei.vei_port == TIMER_CTRL) {
if (vei->vei.vei_dir == VEI_DIR_OUT) { /* OUT instruction */
diff --git a/usr.sbin/vmd/i8259.c b/usr.sbin/vmd/i8259.c
index 61229d79b6f..a38f0660e10 100644
--- a/usr.sbin/vmd/i8259.c
+++ b/usr.sbin/vmd/i8259.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: i8259.c,v 1.11 2017/03/25 07:46:24 mlarkin Exp $ */
+/* $OpenBSD: i8259.c,v 1.12 2017/03/25 22:36:53 mlarkin Exp $ */
/*
* Copyright (c) 2016 Mike Larkin <mlarkin@openbsd.org>
*
@@ -556,9 +556,11 @@ static void
i8259_io_write(union vm_exit *vei)
{
uint16_t port = vei->vei.vei_port;
- uint8_t data = get_input_data(vei);
+ uint32_t data;
uint8_t n = 0;
+ get_input_data(vei, &data);
+
switch (port) {
case IO_ICU1:
case IO_ICU1 + 1:
diff --git a/usr.sbin/vmd/mc146818.c b/usr.sbin/vmd/mc146818.c
index 5c265457dde..16f1a31afaf 100644
--- a/usr.sbin/vmd/mc146818.c
+++ b/usr.sbin/vmd/mc146818.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mc146818.c,v 1.9 2017/03/25 07:46:24 mlarkin Exp $ */
+/* $OpenBSD: mc146818.c,v 1.10 2017/03/25 22:36:53 mlarkin Exp $ */
/*
* Copyright (c) 2016 Mike Larkin <mlarkin@openbsd.org>
*
@@ -251,7 +251,7 @@ vcpu_exit_mc146818(struct vm_run_params *vrp)
uint8_t dir = vei->vei.vei_dir;
uint32_t data;
- data = get_input_data(vei);
+ get_input_data(vei, &data);
if (port == IO_RTC) {
/* Discard NMI bit */
diff --git a/usr.sbin/vmd/pci.c b/usr.sbin/vmd/pci.c
index f106747b8de..5bc1c5eedfd 100644
--- a/usr.sbin/vmd/pci.c
+++ b/usr.sbin/vmd/pci.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pci.c,v 1.14 2017/03/25 15:47:37 mlarkin Exp $ */
+/* $OpenBSD: pci.c,v 1.15 2017/03/25 22:36:53 mlarkin Exp $ */
/*
* Copyright (c) 2015 Mike Larkin <mlarkin@openbsd.org>
@@ -215,7 +215,7 @@ pci_handle_address_reg(struct vm_run_params *vrp)
* The guest wrote to the address register.
*/
if (vei->vei.vei_dir == VEI_DIR_OUT) {
- pci.pci_addr_reg = get_input_data(vei);
+ get_input_data(vei, &pci.pci_addr_reg);
} else {
/*
* vei_dir == VEI_DIR_IN : in instruction
@@ -346,8 +346,7 @@ pci_handle_data_reg(struct vm_run_params *vrp)
/* XXX - discard writes to reassign IRQs / pins */
if (o != 0x3c)
- pci.pci_devices[d].pd_cfg_space[o / 4] =
- get_input_data(vei);
+ get_input_data(vei, &pci.pci_devices[d].pd_cfg_space[o / 4]);
/* IOBAR registers must have bit 0 set */
if (o == 0x10)
@@ -360,6 +359,26 @@ pci_handle_data_reg(struct vm_run_params *vrp)
* The guest read from the config space location determined by
* the current value in the address register.
*/
- set_return_data(vei, pci.pci_devices[d].pd_cfg_space[o / 4]);
+ if (d > pci.pci_dev_ct || b > 0 || f > 0)
+ set_return_data(vei, 0xFFFFFFFF);
+ else {
+ switch (sz) {
+ case 4:
+ set_return_data(vei, pci.pci_devices[d].pd_cfg_space[o / 4]);
+ break;
+ case 2:
+ if (ofs == 0)
+ set_return_data(vei,
+ pci.pci_devices[d].pd_cfg_space[o / 4]);
+ else
+ set_return_data(vei,
+ pci.pci_devices[d].pd_cfg_space[o / 4] >> 16);
+ break;
+ case 1:
+ set_return_data(vei,
+ pci.pci_devices[d].pd_cfg_space[o / 4] >> (ofs * 3));
+ break;
+ }
+ }
}
}
diff --git a/usr.sbin/vmd/virtio.c b/usr.sbin/vmd/virtio.c
index ae2019f9b6c..c07ab568e8c 100644
--- a/usr.sbin/vmd/virtio.c
+++ b/usr.sbin/vmd/virtio.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: virtio.c,v 1.38 2017/03/25 16:34:26 mlarkin Exp $ */
+/* $OpenBSD: virtio.c,v 1.39 2017/03/25 22:36:53 mlarkin Exp $ */
/*
* Copyright (c) 2015 Mike Larkin <mlarkin@openbsd.org>
@@ -750,7 +750,15 @@ virtio_blk_io(int dir, uint16_t reg, uint32_t *data, uint8_t *intr,
*data = dev->cfg.queue_address;
break;
case VIRTIO_CONFIG_QUEUE_SIZE:
- *data = dev->cfg.queue_size;
+ if (sz == 4)
+ *data = dev->cfg.queue_size;
+ else if (sz == 2) {
+ *data &= 0xFFFF0000;
+ *data |= (uint16_t)dev->cfg.queue_size;
+ } else if (sz == 1) {
+ *data &= 0xFFFFFF00;
+ *data |= (uint8_t)dev->cfg.queue_size;
+ }
break;
case VIRTIO_CONFIG_QUEUE_SELECT:
*data = dev->cfg.queue_select;
@@ -759,7 +767,15 @@ virtio_blk_io(int dir, uint16_t reg, uint32_t *data, uint8_t *intr,
*data = dev->cfg.queue_notify;
break;
case VIRTIO_CONFIG_DEVICE_STATUS:
- *data = dev->cfg.device_status;
+ if (sz == 4)
+ *data = dev->cfg.device_status;
+ else if (sz == 2) {
+ *data &= 0xFFFF0000;
+ *data |= (uint16_t)dev->cfg.device_status;
+ } else if (sz == 1) {
+ *data &= 0xFFFFFF00;
+ *data |= (uint8_t)dev->cfg.device_status;
+ }
break;
case VIRTIO_CONFIG_ISR_STATUS:
*data = dev->cfg.isr_status;
diff --git a/usr.sbin/vmd/vm.c b/usr.sbin/vmd/vm.c
index 37b62959fd2..89696447a84 100644
--- a/usr.sbin/vmd/vm.c
+++ b/usr.sbin/vmd/vm.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vm.c,v 1.9 2017/03/25 16:28:25 reyk Exp $ */
+/* $OpenBSD: vm.c,v 1.10 2017/03/25 22:36:53 mlarkin Exp $ */
/*
* Copyright (c) 2015 Mike Larkin <mlarkin@openbsd.org>
@@ -1426,16 +1426,26 @@ set_return_data(union vm_exit *vei, uint32_t data)
*
* Parameters:
* vei: exit information
+ * data: location to store the result
*/
-uint32_t
-get_input_data(union vm_exit *vei)
+void
+get_input_data(union vm_exit *vei, uint32_t *data)
{
switch (vei->vei.vei_size) {
- case 1: return vei->vei.vei_data & 0xFF;
- case 2: return vei->vei.vei_data & 0xFFFF;
- case 4: return vei->vei.vei_data;
+ case 1:
+ *data &= 0xFFFFFF00;
+ *data |= (uint8_t)vei->vei.vei_data;
+ break;
+ case 2:
+ *data &= 0xFFFF0000;
+ *data |= (uint16_t)vei->vei.vei_data;
+ break;
+ case 4:
+ *data = vei->vei.vei_data;
+ break;
+ default:
+ log_warnx("%s: invalid i/o size %d", __func__,
+ vei->vei.vei_size);
}
- log_warnx("%s: invalid i/o size %d", __func__, vei->vei.vei_size);
- return 0;
}
diff --git a/usr.sbin/vmd/vmm.h b/usr.sbin/vmd/vmm.h
index 5e5bb50dceb..fd94125c9df 100644
--- a/usr.sbin/vmd/vmm.h
+++ b/usr.sbin/vmd/vmm.h
@@ -20,4 +20,4 @@ typedef uint8_t (*io_fn_t)(struct vm_run_params *);
void vcpu_assert_pic_irq(uint32_t, uint32_t, int);
void set_return_data(union vm_exit *, uint32_t);
-uint32_t get_input_data(union vm_exit *);
+void get_input_data(union vm_exit *, uint32_t *);