|
@@ -300,6 +300,15 @@ static void set_guest_esr(struct kvm_vcpu *vcpu, u32 esr)
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
+static unsigned long get_guest_epr(struct kvm_vcpu *vcpu)
|
|
|
+{
|
|
|
+#ifdef CONFIG_KVM_BOOKE_HV
|
|
|
+ return mfspr(SPRN_GEPR);
|
|
|
+#else
|
|
|
+ return vcpu->arch.epr;
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
/* Deliver the interrupt of the corresponding priority, if possible. */
|
|
|
static int kvmppc_booke_irqprio_deliver(struct kvm_vcpu *vcpu,
|
|
|
unsigned int priority)
|
|
@@ -1405,6 +1414,11 @@ int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
|
|
|
&vcpu->arch.dbg_reg.dac[dac], sizeof(u64));
|
|
|
break;
|
|
|
}
|
|
|
+ case KVM_REG_PPC_EPR: {
|
|
|
+ u32 epr = get_guest_epr(vcpu);
|
|
|
+ r = put_user(epr, (u32 __user *)(long)reg->addr);
|
|
|
+ break;
|
|
|
+ }
|
|
|
#if defined(CONFIG_64BIT)
|
|
|
case KVM_REG_PPC_EPCR:
|
|
|
r = put_user(vcpu->arch.epcr, (u32 __user *)(long)reg->addr);
|
|
@@ -1437,6 +1451,13 @@ int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
|
|
|
(u64 __user *)(long)reg->addr, sizeof(u64));
|
|
|
break;
|
|
|
}
|
|
|
+ case KVM_REG_PPC_EPR: {
|
|
|
+ u32 new_epr;
|
|
|
+ r = get_user(new_epr, (u32 __user *)(long)reg->addr);
|
|
|
+ if (!r)
|
|
|
+ kvmppc_set_epr(vcpu, new_epr);
|
|
|
+ break;
|
|
|
+ }
|
|
|
#if defined(CONFIG_64BIT)
|
|
|
case KVM_REG_PPC_EPCR: {
|
|
|
u32 new_epcr;
|