mirror of https://gitee.com/openkylin/linux.git
KVM: PPC: BookE: Add EPR ONE_REG sync
We need to be able to read and write the contents of the EPR register from user space. This patch implements that logic through the ONE_REG API and declares its (never implemented) SREGS counterpart as deprecated. Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
1c81063655
commit
324b3e6316
|
@ -1774,6 +1774,7 @@ registers, find a list below:
|
||||||
PPC | KVM_REG_PPC_VPA_SLB | 128
|
PPC | KVM_REG_PPC_VPA_SLB | 128
|
||||||
PPC | KVM_REG_PPC_VPA_DTL | 128
|
PPC | KVM_REG_PPC_VPA_DTL | 128
|
||||||
PPC | KVM_REG_PPC_EPCR | 32
|
PPC | KVM_REG_PPC_EPCR | 32
|
||||||
|
PPC | KVM_REG_PPC_EPR | 32
|
||||||
|
|
||||||
4.69 KVM_GET_ONE_REG
|
4.69 KVM_GET_ONE_REG
|
||||||
|
|
||||||
|
|
|
@ -114,7 +114,10 @@ struct kvm_regs {
|
||||||
/* Embedded Floating Point (SPE) -- IVOR32-34 if KVM_SREGS_E_IVOR */
|
/* Embedded Floating Point (SPE) -- IVOR32-34 if KVM_SREGS_E_IVOR */
|
||||||
#define KVM_SREGS_E_SPE (1 << 9)
|
#define KVM_SREGS_E_SPE (1 << 9)
|
||||||
|
|
||||||
/* External Proxy (EXP) -- EPR */
|
/*
|
||||||
|
* DEPRECATED! USE ONE_REG FOR THIS ONE!
|
||||||
|
* External Proxy (EXP) -- EPR
|
||||||
|
*/
|
||||||
#define KVM_SREGS_EXP (1 << 10)
|
#define KVM_SREGS_EXP (1 << 10)
|
||||||
|
|
||||||
/* External PID (E.PD) -- EPSC/EPLC */
|
/* External PID (E.PD) -- EPSC/EPLC */
|
||||||
|
@ -412,5 +415,6 @@ struct kvm_get_htab_header {
|
||||||
#define KVM_REG_PPC_VPA_DTL (KVM_REG_PPC | KVM_REG_SIZE_U128 | 0x84)
|
#define KVM_REG_PPC_VPA_DTL (KVM_REG_PPC | KVM_REG_SIZE_U128 | 0x84)
|
||||||
|
|
||||||
#define KVM_REG_PPC_EPCR (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x85)
|
#define KVM_REG_PPC_EPCR (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x85)
|
||||||
|
#define KVM_REG_PPC_EPR (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x86)
|
||||||
|
|
||||||
#endif /* __LINUX_KVM_POWERPC_H */
|
#endif /* __LINUX_KVM_POWERPC_H */
|
||||||
|
|
|
@ -300,6 +300,15 @@ static void set_guest_esr(struct kvm_vcpu *vcpu, u32 esr)
|
||||||
#endif
|
#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. */
|
/* Deliver the interrupt of the corresponding priority, if possible. */
|
||||||
static int kvmppc_booke_irqprio_deliver(struct kvm_vcpu *vcpu,
|
static int kvmppc_booke_irqprio_deliver(struct kvm_vcpu *vcpu,
|
||||||
unsigned int priority)
|
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));
|
&vcpu->arch.dbg_reg.dac[dac], sizeof(u64));
|
||||||
break;
|
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)
|
#if defined(CONFIG_64BIT)
|
||||||
case KVM_REG_PPC_EPCR:
|
case KVM_REG_PPC_EPCR:
|
||||||
r = put_user(vcpu->arch.epcr, (u32 __user *)(long)reg->addr);
|
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));
|
(u64 __user *)(long)reg->addr, sizeof(u64));
|
||||||
break;
|
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)
|
#if defined(CONFIG_64BIT)
|
||||||
case KVM_REG_PPC_EPCR: {
|
case KVM_REG_PPC_EPCR: {
|
||||||
u32 new_epcr;
|
u32 new_epcr;
|
||||||
|
|
Loading…
Reference in New Issue