Commit e32edf4f authored by Nikolay Nikolaev's avatar Nikolay Nikolaev Committed by Marc Zyngier

KVM: Redesign kvm_io_bus_ API to pass VCPU structure to the callbacks.

This is needed in e.g. ARM vGIC emulation, where the MMIO handling
depends on the VCPU that does the access.
Signed-off-by: default avatarNikolay Nikolaev <n.nikolaev@virtualopensystems.com>
Signed-off-by: default avatarAndre Przywara <andre.przywara@arm.com>
Acked-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Acked-by: default avatarChristoffer Dall <christoffer.dall@linaro.org>
Reviewed-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
parent 1a748478
...@@ -1374,8 +1374,9 @@ static int kvm_mpic_write_internal(struct openpic *opp, gpa_t addr, u32 val) ...@@ -1374,8 +1374,9 @@ static int kvm_mpic_write_internal(struct openpic *opp, gpa_t addr, u32 val)
return -ENXIO; return -ENXIO;
} }
static int kvm_mpic_read(struct kvm_io_device *this, gpa_t addr, static int kvm_mpic_read(struct kvm_vcpu *vcpu,
int len, void *ptr) struct kvm_io_device *this,
gpa_t addr, int len, void *ptr)
{ {
struct openpic *opp = container_of(this, struct openpic, mmio); struct openpic *opp = container_of(this, struct openpic, mmio);
int ret; int ret;
...@@ -1415,8 +1416,9 @@ static int kvm_mpic_read(struct kvm_io_device *this, gpa_t addr, ...@@ -1415,8 +1416,9 @@ static int kvm_mpic_read(struct kvm_io_device *this, gpa_t addr,
return ret; return ret;
} }
static int kvm_mpic_write(struct kvm_io_device *this, gpa_t addr, static int kvm_mpic_write(struct kvm_vcpu *vcpu,
int len, const void *ptr) struct kvm_io_device *this,
gpa_t addr, int len, const void *ptr)
{ {
struct openpic *opp = container_of(this, struct openpic, mmio); struct openpic *opp = container_of(this, struct openpic, mmio);
int ret; int ret;
......
...@@ -807,7 +807,7 @@ int kvmppc_handle_load(struct kvm_run *run, struct kvm_vcpu *vcpu, ...@@ -807,7 +807,7 @@ int kvmppc_handle_load(struct kvm_run *run, struct kvm_vcpu *vcpu,
idx = srcu_read_lock(&vcpu->kvm->srcu); idx = srcu_read_lock(&vcpu->kvm->srcu);
ret = kvm_io_bus_read(vcpu->kvm, KVM_MMIO_BUS, run->mmio.phys_addr, ret = kvm_io_bus_read(vcpu, KVM_MMIO_BUS, run->mmio.phys_addr,
bytes, &run->mmio.data); bytes, &run->mmio.data);
srcu_read_unlock(&vcpu->kvm->srcu, idx); srcu_read_unlock(&vcpu->kvm->srcu, idx);
...@@ -880,7 +880,7 @@ int kvmppc_handle_store(struct kvm_run *run, struct kvm_vcpu *vcpu, ...@@ -880,7 +880,7 @@ int kvmppc_handle_store(struct kvm_run *run, struct kvm_vcpu *vcpu,
idx = srcu_read_lock(&vcpu->kvm->srcu); idx = srcu_read_lock(&vcpu->kvm->srcu);
ret = kvm_io_bus_write(vcpu->kvm, KVM_MMIO_BUS, run->mmio.phys_addr, ret = kvm_io_bus_write(vcpu, KVM_MMIO_BUS, run->mmio.phys_addr,
bytes, &run->mmio.data); bytes, &run->mmio.data);
srcu_read_unlock(&vcpu->kvm->srcu, idx); srcu_read_unlock(&vcpu->kvm->srcu, idx);
......
...@@ -213,7 +213,7 @@ static int __diag_virtio_hypercall(struct kvm_vcpu *vcpu) ...@@ -213,7 +213,7 @@ static int __diag_virtio_hypercall(struct kvm_vcpu *vcpu)
* - gpr 3 contains the virtqueue index (passed as datamatch) * - gpr 3 contains the virtqueue index (passed as datamatch)
* - gpr 4 contains the index on the bus (optionally) * - gpr 4 contains the index on the bus (optionally)
*/ */
ret = kvm_io_bus_write_cookie(vcpu->kvm, KVM_VIRTIO_CCW_NOTIFY_BUS, ret = kvm_io_bus_write_cookie(vcpu, KVM_VIRTIO_CCW_NOTIFY_BUS,
vcpu->run->s.regs.gprs[2] & 0xffffffff, vcpu->run->s.regs.gprs[2] & 0xffffffff,
8, &vcpu->run->s.regs.gprs[3], 8, &vcpu->run->s.regs.gprs[3],
vcpu->run->s.regs.gprs[4]); vcpu->run->s.regs.gprs[4]);
......
...@@ -443,7 +443,8 @@ static inline int pit_in_range(gpa_t addr) ...@@ -443,7 +443,8 @@ static inline int pit_in_range(gpa_t addr)
(addr < KVM_PIT_BASE_ADDRESS + KVM_PIT_MEM_LENGTH)); (addr < KVM_PIT_BASE_ADDRESS + KVM_PIT_MEM_LENGTH));
} }
static int pit_ioport_write(struct kvm_io_device *this, static int pit_ioport_write(struct kvm_vcpu *vcpu,
struct kvm_io_device *this,
gpa_t addr, int len, const void *data) gpa_t addr, int len, const void *data)
{ {
struct kvm_pit *pit = dev_to_pit(this); struct kvm_pit *pit = dev_to_pit(this);
...@@ -519,7 +520,8 @@ static int pit_ioport_write(struct kvm_io_device *this, ...@@ -519,7 +520,8 @@ static int pit_ioport_write(struct kvm_io_device *this,
return 0; return 0;
} }
static int pit_ioport_read(struct kvm_io_device *this, static int pit_ioport_read(struct kvm_vcpu *vcpu,
struct kvm_io_device *this,
gpa_t addr, int len, void *data) gpa_t addr, int len, void *data)
{ {
struct kvm_pit *pit = dev_to_pit(this); struct kvm_pit *pit = dev_to_pit(this);
...@@ -589,7 +591,8 @@ static int pit_ioport_read(struct kvm_io_device *this, ...@@ -589,7 +591,8 @@ static int pit_ioport_read(struct kvm_io_device *this,
return 0; return 0;
} }
static int speaker_ioport_write(struct kvm_io_device *this, static int speaker_ioport_write(struct kvm_vcpu *vcpu,
struct kvm_io_device *this,
gpa_t addr, int len, const void *data) gpa_t addr, int len, const void *data)
{ {
struct kvm_pit *pit = speaker_to_pit(this); struct kvm_pit *pit = speaker_to_pit(this);
...@@ -606,8 +609,9 @@ static int speaker_ioport_write(struct kvm_io_device *this, ...@@ -606,8 +609,9 @@ static int speaker_ioport_write(struct kvm_io_device *this,
return 0; return 0;
} }
static int speaker_ioport_read(struct kvm_io_device *this, static int speaker_ioport_read(struct kvm_vcpu *vcpu,
gpa_t addr, int len, void *data) struct kvm_io_device *this,
gpa_t addr, int len, void *data)
{ {
struct kvm_pit *pit = speaker_to_pit(this); struct kvm_pit *pit = speaker_to_pit(this);
struct kvm_kpit_state *pit_state = &pit->pit_state; struct kvm_kpit_state *pit_state = &pit->pit_state;
......
...@@ -528,42 +528,42 @@ static int picdev_read(struct kvm_pic *s, ...@@ -528,42 +528,42 @@ static int picdev_read(struct kvm_pic *s,
return 0; return 0;
} }
static int picdev_master_write(struct kvm_io_device *dev, static int picdev_master_write(struct kvm_vcpu *vcpu, struct kvm_io_device *dev,
gpa_t addr, int len, const void *val) gpa_t addr, int len, const void *val)
{ {
return picdev_write(container_of(dev, struct kvm_pic, dev_master), return picdev_write(container_of(dev, struct kvm_pic, dev_master),
addr, len, val); addr, len, val);
} }
static int picdev_master_read(struct kvm_io_device *dev, static int picdev_master_read(struct kvm_vcpu *vcpu, struct kvm_io_device *dev,
gpa_t addr, int len, void *val) gpa_t addr, int len, void *val)
{ {
return picdev_read(container_of(dev, struct kvm_pic, dev_master), return picdev_read(container_of(dev, struct kvm_pic, dev_master),
addr, len, val); addr, len, val);
} }
static int picdev_slave_write(struct kvm_io_device *dev, static int picdev_slave_write(struct kvm_vcpu *vcpu, struct kvm_io_device *dev,
gpa_t addr, int len, const void *val) gpa_t addr, int len, const void *val)
{ {
return picdev_write(container_of(dev, struct kvm_pic, dev_slave), return picdev_write(container_of(dev, struct kvm_pic, dev_slave),
addr, len, val); addr, len, val);
} }
static int picdev_slave_read(struct kvm_io_device *dev, static int picdev_slave_read(struct kvm_vcpu *vcpu, struct kvm_io_device *dev,
gpa_t addr, int len, void *val) gpa_t addr, int len, void *val)
{ {
return picdev_read(container_of(dev, struct kvm_pic, dev_slave), return picdev_read(container_of(dev, struct kvm_pic, dev_slave),
addr, len, val); addr, len, val);
} }
static int picdev_eclr_write(struct kvm_io_device *dev, static int picdev_eclr_write(struct kvm_vcpu *vcpu, struct kvm_io_device *dev,
gpa_t addr, int len, const void *val) gpa_t addr, int len, const void *val)
{ {
return picdev_write(container_of(dev, struct kvm_pic, dev_eclr), return picdev_write(container_of(dev, struct kvm_pic, dev_eclr),
addr, len, val); addr, len, val);
} }
static int picdev_eclr_read(struct kvm_io_device *dev, static int picdev_eclr_read(struct kvm_vcpu *vcpu, struct kvm_io_device *dev,
gpa_t addr, int len, void *val) gpa_t addr, int len, void *val)
{ {
return picdev_read(container_of(dev, struct kvm_pic, dev_eclr), return picdev_read(container_of(dev, struct kvm_pic, dev_eclr),
......
...@@ -498,8 +498,8 @@ static inline int ioapic_in_range(struct kvm_ioapic *ioapic, gpa_t addr) ...@@ -498,8 +498,8 @@ static inline int ioapic_in_range(struct kvm_ioapic *ioapic, gpa_t addr)
(addr < ioapic->base_address + IOAPIC_MEM_LENGTH))); (addr < ioapic->base_address + IOAPIC_MEM_LENGTH)));
} }
static int ioapic_mmio_read(struct kvm_io_device *this, gpa_t addr, int len, static int ioapic_mmio_read(struct kvm_vcpu *vcpu, struct kvm_io_device *this,
void *val) gpa_t addr, int len, void *val)
{ {
struct kvm_ioapic *ioapic = to_ioapic(this); struct kvm_ioapic *ioapic = to_ioapic(this);
u32 result; u32 result;
...@@ -541,8 +541,8 @@ static int ioapic_mmio_read(struct kvm_io_device *this, gpa_t addr, int len, ...@@ -541,8 +541,8 @@ static int ioapic_mmio_read(struct kvm_io_device *this, gpa_t addr, int len,
return 0; return 0;
} }
static int ioapic_mmio_write(struct kvm_io_device *this, gpa_t addr, int len, static int ioapic_mmio_write(struct kvm_vcpu *vcpu, struct kvm_io_device *this,
const void *val) gpa_t addr, int len, const void *val)
{ {
struct kvm_ioapic *ioapic = to_ioapic(this); struct kvm_ioapic *ioapic = to_ioapic(this);
u32 data; u32 data;
......
...@@ -1038,7 +1038,7 @@ static int apic_mmio_in_range(struct kvm_lapic *apic, gpa_t addr) ...@@ -1038,7 +1038,7 @@ static int apic_mmio_in_range(struct kvm_lapic *apic, gpa_t addr)
addr < apic->base_address + LAPIC_MMIO_LENGTH; addr < apic->base_address + LAPIC_MMIO_LENGTH;
} }
static int apic_mmio_read(struct kvm_io_device *this, static int apic_mmio_read(struct kvm_vcpu *vcpu, struct kvm_io_device *this,
gpa_t address, int len, void *data) gpa_t address, int len, void *data)
{ {
struct kvm_lapic *apic = to_lapic(this); struct kvm_lapic *apic = to_lapic(this);
...@@ -1358,7 +1358,7 @@ static int apic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val) ...@@ -1358,7 +1358,7 @@ static int apic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val)
return ret; return ret;
} }
static int apic_mmio_write(struct kvm_io_device *this, static int apic_mmio_write(struct kvm_vcpu *vcpu, struct kvm_io_device *this,
gpa_t address, int len, const void *data) gpa_t address, int len, const void *data)
{ {
struct kvm_lapic *apic = to_lapic(this); struct kvm_lapic *apic = to_lapic(this);
......
...@@ -5822,7 +5822,7 @@ static int handle_ept_misconfig(struct kvm_vcpu *vcpu) ...@@ -5822,7 +5822,7 @@ static int handle_ept_misconfig(struct kvm_vcpu *vcpu)
gpa_t gpa; gpa_t gpa;
gpa = vmcs_read64(GUEST_PHYSICAL_ADDRESS); gpa = vmcs_read64(GUEST_PHYSICAL_ADDRESS);
if (!kvm_io_bus_write(vcpu->kvm, KVM_FAST_MMIO_BUS, gpa, 0, NULL)) { if (!kvm_io_bus_write(vcpu, KVM_FAST_MMIO_BUS, gpa, 0, NULL)) {
skip_emulated_instruction(vcpu); skip_emulated_instruction(vcpu);
return 1; return 1;
} }
......
...@@ -4115,8 +4115,8 @@ static int vcpu_mmio_write(struct kvm_vcpu *vcpu, gpa_t addr, int len, ...@@ -4115,8 +4115,8 @@ static int vcpu_mmio_write(struct kvm_vcpu *vcpu, gpa_t addr, int len,
do { do {
n = min(len, 8); n = min(len, 8);
if (!(vcpu->arch.apic && if (!(vcpu->arch.apic &&
!kvm_iodevice_write(&vcpu->arch.apic->dev, addr, n, v)) !kvm_iodevice_write(vcpu, &vcpu->arch.apic->dev, addr, n, v))
&& kvm_io_bus_write(vcpu->kvm, KVM_MMIO_BUS, addr, n, v)) && kvm_io_bus_write(vcpu, KVM_MMIO_BUS, addr, n, v))
break; break;
handled += n; handled += n;
addr += n; addr += n;
...@@ -4135,8 +4135,9 @@ static int vcpu_mmio_read(struct kvm_vcpu *vcpu, gpa_t addr, int len, void *v) ...@@ -4135,8 +4135,9 @@ static int vcpu_mmio_read(struct kvm_vcpu *vcpu, gpa_t addr, int len, void *v)
do { do {
n = min(len, 8); n = min(len, 8);
if (!(vcpu->arch.apic && if (!(vcpu->arch.apic &&
!kvm_iodevice_read(&vcpu->arch.apic->dev, addr, n, v)) !kvm_iodevice_read(vcpu, &vcpu->arch.apic->dev,
&& kvm_io_bus_read(vcpu->kvm, KVM_MMIO_BUS, addr, n, v)) addr, n, v))
&& kvm_io_bus_read(vcpu, KVM_MMIO_BUS, addr, n, v))
break; break;
trace_kvm_mmio(KVM_TRACE_MMIO_READ, n, addr, *(u64 *)v); trace_kvm_mmio(KVM_TRACE_MMIO_READ, n, addr, *(u64 *)v);
handled += n; handled += n;
...@@ -4630,10 +4631,10 @@ static int kernel_pio(struct kvm_vcpu *vcpu, void *pd) ...@@ -4630,10 +4631,10 @@ static int kernel_pio(struct kvm_vcpu *vcpu, void *pd)
int r; int r;
if (vcpu->arch.pio.in) if (vcpu->arch.pio.in)
r = kvm_io_bus_read(vcpu->kvm, KVM_PIO_BUS, vcpu->arch.pio.port, r = kvm_io_bus_read(vcpu, KVM_PIO_BUS, vcpu->arch.pio.port,
vcpu->arch.pio.size, pd); vcpu->arch.pio.size, pd);
else else
r = kvm_io_bus_write(vcpu->kvm, KVM_PIO_BUS, r = kvm_io_bus_write(vcpu, KVM_PIO_BUS,
vcpu->arch.pio.port, vcpu->arch.pio.size, vcpu->arch.pio.port, vcpu->arch.pio.size,
pd); pd);
return r; return r;
......
...@@ -165,12 +165,12 @@ enum kvm_bus { ...@@ -165,12 +165,12 @@ enum kvm_bus {
KVM_NR_BUSES KVM_NR_BUSES
}; };
int kvm_io_bus_write(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, int kvm_io_bus_write(struct kvm_vcpu *vcpu, enum kvm_bus bus_idx, gpa_t addr,
int len, const void *val); int len, const void *val);
int kvm_io_bus_write_cookie(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, int kvm_io_bus_write_cookie(struct kvm_vcpu *vcpu, enum kvm_bus bus_idx,
int len, const void *val, long cookie); gpa_t addr, int len, const void *val, long cookie);
int kvm_io_bus_read(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, int len, int kvm_io_bus_read(struct kvm_vcpu *vcpu, enum kvm_bus bus_idx, gpa_t addr,
void *val); int len, void *val);
int kvm_io_bus_register_dev(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, int kvm_io_bus_register_dev(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr,
int len, struct kvm_io_device *dev); int len, struct kvm_io_device *dev);
int kvm_io_bus_unregister_dev(struct kvm *kvm, enum kvm_bus bus_idx, int kvm_io_bus_unregister_dev(struct kvm *kvm, enum kvm_bus bus_idx,
......
...@@ -60,8 +60,9 @@ static int coalesced_mmio_has_room(struct kvm_coalesced_mmio_dev *dev) ...@@ -60,8 +60,9 @@ static int coalesced_mmio_has_room(struct kvm_coalesced_mmio_dev *dev)
return 1; return 1;
} }
static int coalesced_mmio_write(struct kvm_io_device *this, static int coalesced_mmio_write(struct kvm_vcpu *vcpu,
gpa_t addr, int len, const void *val) struct kvm_io_device *this, gpa_t addr,
int len, const void *val)
{ {
struct kvm_coalesced_mmio_dev *dev = to_mmio(this); struct kvm_coalesced_mmio_dev *dev = to_mmio(this);
struct kvm_coalesced_mmio_ring *ring = dev->kvm->coalesced_mmio_ring; struct kvm_coalesced_mmio_ring *ring = dev->kvm->coalesced_mmio_ring;
......
...@@ -715,8 +715,8 @@ ioeventfd_in_range(struct _ioeventfd *p, gpa_t addr, int len, const void *val) ...@@ -715,8 +715,8 @@ ioeventfd_in_range(struct _ioeventfd *p, gpa_t addr, int len, const void *val)
/* MMIO/PIO writes trigger an event if the addr/val match */ /* MMIO/PIO writes trigger an event if the addr/val match */
static int static int
ioeventfd_write(struct kvm_io_device *this, gpa_t addr, int len, ioeventfd_write(struct kvm_vcpu *vcpu, struct kvm_io_device *this, gpa_t addr,
const void *val) int len, const void *val)
{ {
struct _ioeventfd *p = to_ioeventfd(this); struct _ioeventfd *p = to_ioeventfd(this);
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include <asm/errno.h> #include <asm/errno.h>
struct kvm_io_device; struct kvm_io_device;
struct kvm_vcpu;
/** /**
* kvm_io_device_ops are called under kvm slots_lock. * kvm_io_device_ops are called under kvm slots_lock.
...@@ -27,11 +28,13 @@ struct kvm_io_device; ...@@ -27,11 +28,13 @@ struct kvm_io_device;
* or non-zero to have it passed to the next device. * or non-zero to have it passed to the next device.
**/ **/
struct kvm_io_device_ops { struct kvm_io_device_ops {
int (*read)(struct kvm_io_device *this, int (*read)(struct kvm_vcpu *vcpu,
struct kvm_io_device *this,
gpa_t addr, gpa_t addr,
int len, int len,
void *val); void *val);
int (*write)(struct kvm_io_device *this, int (*write)(struct kvm_vcpu *vcpu,
struct kvm_io_device *this,
gpa_t addr, gpa_t addr,
int len, int len,
const void *val); const void *val);
...@@ -49,16 +52,20 @@ static inline void kvm_iodevice_init(struct kvm_io_device *dev, ...@@ -49,16 +52,20 @@ static inline void kvm_iodevice_init(struct kvm_io_device *dev,
dev->ops = ops; dev->ops = ops;
} }
static inline int kvm_iodevice_read(struct kvm_io_device *dev, static inline int kvm_iodevice_read(struct kvm_vcpu *vcpu,
gpa_t addr, int l, void *v) struct kvm_io_device *dev, gpa_t addr,
int l, void *v)
{ {
return dev->ops->read ? dev->ops->read(dev, addr, l, v) : -EOPNOTSUPP; return dev->ops->read ? dev->ops->read(vcpu, dev, addr, l, v)
: -EOPNOTSUPP;
} }
static inline int kvm_iodevice_write(struct kvm_io_device *dev, static inline int kvm_iodevice_write(struct kvm_vcpu *vcpu,
gpa_t addr, int l, const void *v) struct kvm_io_device *dev, gpa_t addr,
int l, const void *v)
{ {
return dev->ops->write ? dev->ops->write(dev, addr, l, v) : -EOPNOTSUPP; return dev->ops->write ? dev->ops->write(vcpu, dev, addr, l, v)
: -EOPNOTSUPP;
} }
static inline void kvm_iodevice_destructor(struct kvm_io_device *dev) static inline void kvm_iodevice_destructor(struct kvm_io_device *dev)
......
...@@ -2997,7 +2997,7 @@ static int kvm_io_bus_get_first_dev(struct kvm_io_bus *bus, ...@@ -2997,7 +2997,7 @@ static int kvm_io_bus_get_first_dev(struct kvm_io_bus *bus,
return off; return off;
} }
static int __kvm_io_bus_write(struct kvm_io_bus *bus, static int __kvm_io_bus_write(struct kvm_vcpu *vcpu, struct kvm_io_bus *bus,
struct kvm_io_range *range, const void *val) struct kvm_io_range *range, const void *val)
{ {
int idx; int idx;
...@@ -3008,7 +3008,7 @@ static int __kvm_io_bus_write(struct kvm_io_bus *bus, ...@@ -3008,7 +3008,7 @@ static int __kvm_io_bus_write(struct kvm_io_bus *bus,
while (idx < bus->dev_count && while (idx < bus->dev_count &&
kvm_io_bus_cmp(range, &bus->range[idx]) == 0) { kvm_io_bus_cmp(range, &bus->range[idx]) == 0) {
if (!kvm_iodevice_write(bus->range[idx].dev, range->addr, if (!kvm_iodevice_write(vcpu, bus->range[idx].dev, range->addr,
range->len, val)) range->len, val))
return idx; return idx;
idx++; idx++;
...@@ -3018,7 +3018,7 @@ static int __kvm_io_bus_write(struct kvm_io_bus *bus, ...@@ -3018,7 +3018,7 @@ static int __kvm_io_bus_write(struct kvm_io_bus *bus,
} }
/* kvm_io_bus_write - called under kvm->slots_lock */ /* kvm_io_bus_write - called under kvm->slots_lock */
int kvm_io_bus_write(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, int kvm_io_bus_write(struct kvm_vcpu *vcpu, enum kvm_bus bus_idx, gpa_t addr,
int len, const void *val) int len, const void *val)
{ {
struct kvm_io_bus *bus; struct kvm_io_bus *bus;
...@@ -3030,14 +3030,14 @@ int kvm_io_bus_write(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, ...@@ -3030,14 +3030,14 @@ int kvm_io_bus_write(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr,
.len = len, .len = len,
}; };
bus = srcu_dereference(kvm->buses[bus_idx], &kvm->srcu); bus = srcu_dereference(vcpu->kvm->buses[bus_idx], &vcpu->kvm->srcu);
r = __kvm_io_bus_write(bus, &range, val); r = __kvm_io_bus_write(vcpu, bus, &range, val);
return r < 0 ? r : 0; return r < 0 ? r : 0;
} }
/* kvm_io_bus_write_cookie - called under kvm->slots_lock */ /* kvm_io_bus_write_cookie - called under kvm->slots_lock */
int kvm_io_bus_write_cookie(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, int kvm_io_bus_write_cookie(struct kvm_vcpu *vcpu, enum kvm_bus bus_idx,
int len, const void *val, long cookie) gpa_t addr, int len, const void *val, long cookie)
{ {
struct kvm_io_bus *bus; struct kvm_io_bus *bus;
struct kvm_io_range range; struct kvm_io_range range;
...@@ -3047,12 +3047,12 @@ int kvm_io_bus_write_cookie(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, ...@@ -3047,12 +3047,12 @@ int kvm_io_bus_write_cookie(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr,
.len = len, .len = len,
}; };
bus = srcu_dereference(kvm->buses[bus_idx], &kvm->srcu); bus = srcu_dereference(vcpu->kvm->buses[bus_idx], &vcpu->kvm->srcu);
/* First try the device referenced by cookie. */ /* First try the device referenced by cookie. */
if ((cookie >= 0) && (cookie < bus->dev_count) && if ((cookie >= 0) && (cookie < bus->dev_count) &&
(kvm_io_bus_cmp(&range, &bus->range[cookie]) == 0)) (kvm_io_bus_cmp(&range, &bus->range[cookie]) == 0))
if (!kvm_iodevice_write(bus->range[cookie].dev, addr, len, if (!kvm_iodevice_write(vcpu, bus->range[cookie].dev, addr, len,
val)) val))
return cookie; return cookie;
...@@ -3060,11 +3060,11 @@ int kvm_io_bus_write_cookie(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, ...@@ -3060,11 +3060,11 @@ int kvm_io_bus_write_cookie(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr,
* cookie contained garbage; fall back to search and return the * cookie contained garbage; fall back to search and return the
* correct cookie value. * correct cookie value.
*/ */
return __kvm_io_bus_write(bus, &range, val); return __kvm_io_bus_write(vcpu, bus, &range, val);
} }
static int __kvm_io_bus_read(struct kvm_io_bus *bus, struct kvm_io_range *range, static int __kvm_io_bus_read(struct kvm_vcpu *vcpu, struct kvm_io_bus *bus,
void *val) struct kvm_io_range *range, void *val)
{ {
int idx; int idx;
...@@ -3074,7 +3074,7 @@ static int __kvm_io_bus_read(struct kvm_io_bus *bus, struct kvm_io_range *range, ...@@ -3074,7 +3074,7 @@ static int __kvm_io_bus_read(struct kvm_io_bus *bus, struct kvm_io_range *range,
while (idx < bus->dev_count && while (idx < bus->dev_count &&
kvm_io_bus_cmp(range, &bus->range[idx]) == 0) { kvm_io_bus_cmp(range, &bus->range[idx]) == 0) {
if (!kvm_iodevice_read(bus->range[idx].dev, range->addr, if (!kvm_iodevice_read(vcpu, bus->range[idx].dev, range->addr,
range->len, val)) range->len, val))
return idx; return idx;
idx++; idx++;
...@@ -3085,7 +3085,7 @@ static int __kvm_io_bus_read(struct kvm_io_bus *bus, struct kvm_io_range *range, ...@@ -3085,7 +3085,7 @@ static int __kvm_io_bus_read(struct kvm_io_bus *bus, struct kvm_io_range *range,
EXPORT_SYMBOL_GPL(kvm_io_bus_write); EXPORT_SYMBOL_GPL(kvm_io_bus_write);
/* kvm_io_bus_read - called under kvm->slots_lock */ /* kvm_io_bus_read - called under kvm->slots_lock */
int kvm_io_bus_read(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, int kvm_io_bus_read(struct kvm_vcpu *vcpu, enum kvm_bus bus_idx, gpa_t addr,
int len, void *val) int len, void *val)
{ {
struct kvm_io_bus *bus; struct kvm_io_bus *bus;
...@@ -3097,8 +3097,8 @@ int kvm_io_bus_read(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, ...@@ -3097,8 +3097,8 @@ int kvm_io_bus_read(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr,
.len = len, .len = len,
}; };
bus = srcu_dereference(kvm->buses[bus_idx], &kvm->srcu); bus = srcu_dereference(vcpu->kvm->buses[bus_idx], &vcpu->kvm->srcu);
r = __kvm_io_bus_read(bus, &range, val); r = __kvm_io_bus_read(vcpu, bus, &range, val);
return r < 0 ? r : 0; return r < 0 ? r : 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment