|
@@ -314,6 +314,7 @@ int kvm_dev_ioctl_check_extension(long ext)
|
|
|
case KVM_CAP_PPC_IRQ_LEVEL:
|
|
|
case KVM_CAP_ENABLE_CAP:
|
|
|
case KVM_CAP_ONE_REG:
|
|
|
+ case KVM_CAP_IOEVENTFD:
|
|
|
r = 1;
|
|
|
break;
|
|
|
#ifndef CONFIG_KVM_BOOK3S_64_HV
|
|
@@ -618,6 +619,13 @@ int kvmppc_handle_load(struct kvm_run *run, struct kvm_vcpu *vcpu,
|
|
|
vcpu->mmio_is_write = 0;
|
|
|
vcpu->arch.mmio_sign_extend = 0;
|
|
|
|
|
|
+ if (!kvm_io_bus_read(vcpu->kvm, KVM_MMIO_BUS, run->mmio.phys_addr,
|
|
|
+ bytes, &run->mmio.data)) {
|
|
|
+ kvmppc_complete_mmio_load(vcpu, run);
|
|
|
+ vcpu->mmio_needed = 0;
|
|
|
+ return EMULATE_DONE;
|
|
|
+ }
|
|
|
+
|
|
|
return EMULATE_DO_MMIO;
|
|
|
}
|
|
|
|
|
@@ -627,8 +635,8 @@ int kvmppc_handle_loads(struct kvm_run *run, struct kvm_vcpu *vcpu,
|
|
|
{
|
|
|
int r;
|
|
|
|
|
|
- r = kvmppc_handle_load(run, vcpu, rt, bytes, is_bigendian);
|
|
|
vcpu->arch.mmio_sign_extend = 1;
|
|
|
+ r = kvmppc_handle_load(run, vcpu, rt, bytes, is_bigendian);
|
|
|
|
|
|
return r;
|
|
|
}
|
|
@@ -666,6 +674,13 @@ int kvmppc_handle_store(struct kvm_run *run, struct kvm_vcpu *vcpu,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if (!kvm_io_bus_write(vcpu->kvm, KVM_MMIO_BUS, run->mmio.phys_addr,
|
|
|
+ bytes, &run->mmio.data)) {
|
|
|
+ kvmppc_complete_mmio_load(vcpu, run);
|
|
|
+ vcpu->mmio_needed = 0;
|
|
|
+ return EMULATE_DONE;
|
|
|
+ }
|
|
|
+
|
|
|
return EMULATE_DO_MMIO;
|
|
|
}
|
|
|
|