diff options
author | mlarkin <mlarkin@openbsd.org> | 2017-03-25 22:36:53 +0000 |
---|---|---|
committer | mlarkin <mlarkin@openbsd.org> | 2017-03-25 22:36:53 +0000 |
commit | b966d91a0c4c148f4a70f543b2f2de3db0cdb93a (patch) | |
tree | 9fe8363a215f92e1dd28bf7cba779d0ae4bbd666 | |
parent | Recognise vmm in dmesg to install "vmm-firmware" (the SeaBIOS package). (diff) | |
download | wireguard-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.c | 4 | ||||
-rw-r--r-- | usr.sbin/vmd/i8259.c | 6 | ||||
-rw-r--r-- | usr.sbin/vmd/mc146818.c | 4 | ||||
-rw-r--r-- | usr.sbin/vmd/pci.c | 29 | ||||
-rw-r--r-- | usr.sbin/vmd/virtio.c | 22 | ||||
-rw-r--r-- | usr.sbin/vmd/vm.c | 26 | ||||
-rw-r--r-- | usr.sbin/vmd/vmm.h | 2 |
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 *); |