[hypervisor] Normalize types for IO operations.

Most of these functions don't care if the access is caused by a memory
trap or an IO instruction. This change normalizes on the mx_vcpu_io_t
structure for IO handlers as it's the simplest structure to describe a
sized value.

Change-Id: I9286dc03e55f3c9e25acac0c11567d8bfbce8f39
Esse commit está contido em:
Tim Detwiler
2017-09-08 13:20:45 -07:00
commit de CQ bot account: commit-bot@chromium.org
commit d555308f58
9 arquivos alterados com 20 adições e 19 exclusões
+1 -1
Ver Arquivo
@@ -139,7 +139,7 @@ static mx_status_t balloon_read(const virtio_device_t* device, uint16_t port, ui
}
static mx_status_t balloon_write(virtio_device_t* device, uint16_t port,
const mx_packet_guest_io_t* io) {
const mx_vcpu_io_t* io) {
balloon_t* balloon = virtio_device_to_balloon(device);
fbl::AutoLock lock(&balloon->mutex);
+1 -1
Ver Arquivo
@@ -35,7 +35,7 @@ static mx_status_t block_read(const virtio_device_t* device, uint16_t port, uint
}
static mx_status_t block_write(virtio_device_t* device, uint16_t port,
const mx_packet_guest_io_t* io) {
const mx_vcpu_io_t* io) {
// No device fields are writable.
return MX_ERR_NOT_SUPPORTED;
}
+1 -1
Ver Arquivo
@@ -60,7 +60,7 @@ typedef struct pci_device_ops {
// Write to a region mapped by a BAR register.
mx_status_t (*write_bar)(pci_device_t* device, uint8_t bar, uint16_t port,
const mx_packet_guest_io_t* io);
const mx_vcpu_io_t* io);
} pci_device_ops_t;
/* PCI capability structure.
@@ -24,7 +24,6 @@ struct vring_avail;
struct vring_used;
typedef struct io_apic io_apic_t;
typedef struct mx_packet_guest_io mx_packet_guest_io_t;
typedef struct mx_vcpu_io mx_vcpu_io_t;
typedef struct virtio_device virtio_device_t;
typedef struct virtio_queue virtio_queue_t;
@@ -36,7 +35,7 @@ typedef struct virtio_device_ops {
mx_vcpu_io_t* vcpu_io);
// Write a device configuration field.
mx_status_t (*write)(virtio_device_t* device, uint16_t port, const mx_packet_guest_io_t* io);
mx_status_t (*write)(virtio_device_t* device, uint16_t port, const mx_vcpu_io_t* io);
// Handle notify events for one of this devices queues.
mx_status_t (*queue_notify)(virtio_device_t* device, uint16_t queue_sel);
+9 -7
Ver Arquivo
@@ -50,7 +50,7 @@ static mx_status_t pci_bar_read_unsupported(const pci_device_t* device, uint8_t
}
static mx_status_t pci_bar_write_unsupported(pci_device_t* device, uint8_t bar, uint16_t port,
const mx_packet_guest_io_t* io) {
const mx_vcpu_io_t* io) {
return MX_ERR_NOT_SUPPORTED;
}
@@ -564,16 +564,18 @@ uint16_t pci_bar_size(pci_bar_t* bar) {
static mx_status_t pci_handler(mx_port_packet_t* packet, void* ctx) {
pci_device_t* pci_device = static_cast<pci_device_t*>(ctx);
mx_packet_guest_io_t* io = &packet->guest_io;
if (packet->key > UINT8_MAX)
return MX_ERR_OUT_OF_RANGE;
// We provide the bar number as the trap key.
if (packet->key > UINT8_MAX)
return MX_ERR_OUT_OF_RANGE;
uint8_t bar = static_cast<uint8_t>(packet->key);
mx_vcpu_io_t io;
io.access_size = packet->guest_io.access_size;
io.u32 = packet->guest_io.u32;
uint32_t bar_base = pci_bar_base(&pci_device->bar[bar]);
uint16_t device_port = static_cast<uint16_t>(io->port - bar_base);
return pci_device->ops->write_bar(pci_device, bar, device_port, io);
uint16_t device_port = static_cast<uint16_t>(packet->guest_io.port - bar_base);
return pci_device->ops->write_bar(pci_device, bar, device_port, &io);
}
mx_status_t pci_device_async(pci_device_t* device, mx_handle_t guest) {
+1 -1
Ver Arquivo
@@ -291,7 +291,7 @@ mx_status_t virtio_device_config_read(const virtio_device_t* device, void* confi
}
mx_status_t virtio_device_config_write(const virtio_device_t* device, void* config, uint16_t port,
const mx_packet_guest_io_t* io) {
const mx_vcpu_io_t* io) {
switch (io->access_size) {
case 1: {
uint8_t* buf = reinterpret_cast<uint8_t*>(config);
+3 -3
Ver Arquivo
@@ -252,7 +252,7 @@ static void virtio_queue_update_addr(virtio_queue_t* queue) {
* Virtio 1.0 Section 4.1.4.3.
*/
static mx_status_t virtio_pci_common_cfg_write(pci_device_t* pci_device, uint16_t port,
const mx_packet_guest_io_t* io) {
const mx_vcpu_io_t* io) {
virtio_device_t* device = pci_device_to_virtio(pci_device);
switch (port) {
@@ -342,7 +342,7 @@ static mx_status_t virtio_pci_common_cfg_write(pci_device_t* pci_device, uint16_
}
static mx_status_t virtio_pci_write(pci_device_t* pci_device, uint8_t bar, uint16_t port,
const mx_packet_guest_io_t* io) {
const mx_vcpu_io_t* io) {
if (bar != VirtioPciBar::MODERN)
return MX_ERR_NOT_SUPPORTED;
@@ -368,7 +368,7 @@ static mx_status_t virtio_pci_write(pci_device_t* pci_device, uint8_t bar, uint1
}
static mx_status_t virtio_pci_transitional_write(pci_device_t* pci_device, uint8_t bar,
uint16_t port, const mx_packet_guest_io_t* io) {
uint16_t port, const mx_vcpu_io_t* io) {
if (bar == VirtioPciBar::LEGACY)
return virtio_pci_legacy_write(pci_device, bar, port, io);
+1 -1
Ver Arquivo
@@ -105,7 +105,7 @@ mx_status_t virtio_pci_legacy_read(const pci_device_t* pci_device, uint8_t bar,
}
mx_status_t virtio_pci_legacy_write(pci_device_t* pci_device, uint8_t bar, uint16_t port,
const mx_packet_guest_io_t* io) {
const mx_vcpu_io_t* io) {
if (bar != 0)
return MX_ERR_NOT_SUPPORTED;
+2 -2
Ver Arquivo
@@ -22,7 +22,7 @@ enum class VirtioPciMode {
/* Legacy PCI device functions. */
mx_status_t virtio_pci_legacy_write(pci_device_t* pci_device, uint8_t bar, uint16_t port,
const mx_packet_guest_io_t* io);
const mx_vcpu_io_t* io);
mx_status_t virtio_pci_legacy_read(const pci_device_t* pci_device, uint8_t bar, uint16_t port,
uint8_t access_size, mx_vcpu_io_t* vcpu_io);
@@ -41,4 +41,4 @@ mx_status_t virtio_device_config_read(const virtio_device_t* device, void* confi
* that will be addressed by software.
*/
mx_status_t virtio_device_config_write(const virtio_device_t* device, void* config, uint16_t port,
const mx_packet_guest_io_t* io);
const mx_vcpu_io_t* io);