Skip to content

Commit

Permalink
hv: vioapic: refine vioapic mmio access related code
Browse files Browse the repository at this point in the history
1, Remove vioapic_mmio_read/vioapic_mmio_write, and combine them to
vioapic_mmio_rw.

2, The vioapic_read/write are used for emulate the ioapic indirect
access logic. So change their name with vioapic_indirect as the prefix.

Signed-off-by: Yu Wang <yu1.wang@intel.com>
Acked-by: Anthony Xu <anthony.xu@intel.com>
  • Loading branch information
ywan170 authored and lijinxia committed Aug 6, 2018
1 parent 66814d8 commit fc41629
Showing 1 changed file with 14 additions and 31 deletions.
45 changes: 14 additions & 31 deletions hypervisor/arch/x86/guest/vioapic.c
Expand Up @@ -230,7 +230,7 @@ vioapic_update_tmr(struct vcpu *vcpu)
}

static uint32_t
vioapic_read(struct vioapic *vioapic, uint32_t addr)
vioapic_indirect_read(struct vioapic *vioapic, uint32_t addr)
{
uint32_t regnum;
uint8_t pin, pincount = vioapic_pincount(vioapic->vm);
Expand Down Expand Up @@ -305,7 +305,7 @@ vioapic_write_eoi(struct vioapic *vioapic, uint32_t vector)
* VIOAPIC_UNLOCK(vioapic) by caller.
*/
static void
vioapic_write(struct vioapic *vioapic, uint32_t addr, uint32_t data)
vioapic_indirect_write(struct vioapic *vioapic, uint32_t addr, uint32_t data)
{
union ioapic_rte last, new;
uint64_t changed;
Expand Down Expand Up @@ -465,33 +465,16 @@ vioapic_mmio_rw(struct vioapic *vioapic, uint64_t gpa,
}
} else {
if (doread) {
*data = vioapic_read(vioapic, vioapic->ioregsel);
*data = vioapic_indirect_read(vioapic,
vioapic->ioregsel);
} else {
vioapic_write(vioapic, vioapic->ioregsel,
vioapic_indirect_write(vioapic, vioapic->ioregsel,
*data);
}
}
VIOAPIC_UNLOCK(vioapic);
}

void
vioapic_mmio_read(struct vm *vm, uint64_t gpa, uint32_t *rval)
{
struct vioapic *vioapic;

vioapic = vm_ioapic(vm);
vioapic_mmio_rw(vioapic, gpa, rval, true);
}

void
vioapic_mmio_write(struct vm *vm, uint64_t gpa, uint32_t wval)
{
struct vioapic *vioapic;

vioapic = vm_ioapic(vm);
vioapic_mmio_rw(vioapic, gpa, &wval, false);
}

void
vioapic_process_eoi(struct vm *vm, uint32_t vector)
{
Expand Down Expand Up @@ -600,26 +583,26 @@ int vioapic_mmio_access_handler(struct vcpu *vcpu, struct io_request *io_req,
__unused void *handler_private_data)
{
struct vm *vm = vcpu->vm;
struct vioapic *vioapic;
struct mmio_request *mmio = &io_req->reqs.mmio;
uint64_t gpa = mmio->address;
int ret = 0;

vioapic = vm_ioapic(vm);

/* Note all RW to IOAPIC are 32-Bit in size */
if (mmio->size == 4UL) {
uint32_t data = (uint32_t)mmio->value;

if (mmio->direction == REQUEST_READ) {
vioapic_mmio_read(vm,
gpa,
&data);
vioapic_mmio_rw(vioapic, gpa, &data, true);
mmio->value = (uint64_t)data;

} else if (mmio->direction == REQUEST_WRITE) {
vioapic_mmio_write(vm,
gpa,
data);
} else {
/* Can never happen due to the range of direction. */
}
vioapic_mmio_rw(vioapic, gpa, &data, false);

} else
ret = -EINVAL;
} else {
pr_err("All RW to IOAPIC must be 32-bits in size");
ret = -EINVAL;
Expand Down

0 comments on commit fc41629

Please sign in to comment.