114
118
for (i = 0; i < KVM_MAX_NUM_MEM_REGIONS ; ++i) {
115
119
if (slots[i].len && slots[i].phys_addr <= phys_addr &&
116
(slots[i].phys_addr + slots[i].len) >= phys_addr)
120
(slots[i].phys_addr + slots[i].len-1) >= phys_addr)
579
582
if (phys_start != slots[slot].phys_addr) {
581
"WARNING: %s: phys_start is 0x%lx expecting 0x%llx\n",
582
__FUNCTION__, phys_start, mem->guest_phys_addr);
583
phys_start = mem->guest_phys_addr;
584
"WARNING: %s: phys_start is 0x%lx expecting 0x%lx\n",
585
__FUNCTION__, phys_start, slots[slot].phys_addr);
586
phys_start = slots[slot].phys_addr;
585
588
kvm_create_phys_mem(kvm, phys_start, 0, 0, 0);
827
830
unsigned long addr = kvm_run->mmio.phys_addr;
828
831
void *data = kvm_run->mmio.data;
831
/* hack: Red Hat 7.1 generates these wierd accesses. */
832
if (addr == 0xa0000 && kvm_run->mmio.len == 3)
833
/* hack: Red Hat 7.1 generates these weird accesses. */
834
if ((addr > 0xa0000-4 && addr <= 0xa0000) && kvm_run->mmio.len == 3)
835
if (kvm_run->mmio.is_write) {
836
switch (kvm_run->mmio.len) {
838
r = kvm->callbacks->writeb(kvm->opaque, addr, *(uint8_t *)data);
841
r = kvm->callbacks->writew(kvm->opaque, addr, *(uint16_t *)data);
844
r = kvm->callbacks->writel(kvm->opaque, addr, *(uint32_t *)data);
847
r = kvm->callbacks->writeq(kvm->opaque, addr, *(uint64_t *)data);
851
switch (kvm_run->mmio.len) {
853
r = kvm->callbacks->readb(kvm->opaque, addr, (uint8_t *)data);
856
r = kvm->callbacks->readw(kvm->opaque, addr, (uint16_t *)data);
859
r = kvm->callbacks->readl(kvm->opaque, addr, (uint32_t *)data);
862
r = kvm->callbacks->readq(kvm->opaque, addr, (uint64_t *)data);
837
if (kvm_run->mmio.is_write)
838
return kvm->callbacks->mmio_write(kvm->opaque, addr, data,
841
return kvm->callbacks->mmio_read(kvm->opaque, addr, data,
869
845
int handle_io_window(kvm_context_t kvm)