[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:
commit de
CQ bot account: commit-bot@chromium.org
pai
b0a8a698ed
commit
d555308f58
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Referência em uma Nova Issue
Bloquear um usuário