Message ID | 1404989882-17362-4-git-send-email-Bharat.Bhushan@freescale.com |
---|---|
State | New |
Headers | show |
On 10.07.14 12:57, Bharat Bhushan wrote: > This patch synchronizes env->excp_vectors[] with env->iovr[]. > This is required for using the existing interrupt injection mechanism > for kvm. > > Signed-off-by: Bharat Bhushan <Bharat.Bhushan@freescale.com> > --- > v5->v6 > - new patch > > target-ppc/kvm.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 44 insertions(+) > > diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c > index 673c369..329a38b 100644 > --- a/target-ppc/kvm.c > +++ b/target-ppc/kvm.c > @@ -1008,35 +1008,79 @@ int kvm_arch_get_registers(CPUState *cs) > > if (sregs.u.e.features & KVM_SREGS_E_IVOR) { > env->spr[SPR_BOOKE_IVOR0] = sregs.u.e.ivor_low[0]; > + env->excp_vectors[POWERPC_EXCP_CRITICAL] = > + env->spr[SPR_BOOKE_IVOR0] + env->spr[SPR_BOOKE_IVPR]; This is quite hard to read. How about static void kvm_sync_excp(CPUPPCState *env, int vector, int ivor) { env->excp_vectors[vector] = env->spr[ivor] + env->spr[SPR_BOOKE_IVPR]; } kvm_sync_excp(env, POWERPC_EXCP_CRITICAL, SPR_BOOKE_IVOR0); Alex > env->spr[SPR_BOOKE_IVOR1] = sregs.u.e.ivor_low[1]; > + env->excp_vectors[POWERPC_EXCP_MCHECK] = > + env->spr[SPR_BOOKE_IVOR1] + env->spr[SPR_BOOKE_IVPR]; > env->spr[SPR_BOOKE_IVOR2] = sregs.u.e.ivor_low[2]; > + env->excp_vectors[POWERPC_EXCP_DSI] = > + env->spr[SPR_BOOKE_IVOR2] + env->spr[SPR_BOOKE_IVPR]; > env->spr[SPR_BOOKE_IVOR3] = sregs.u.e.ivor_low[3]; > + env->excp_vectors[POWERPC_EXCP_ISI] = > + env->spr[SPR_BOOKE_IVOR3] + env->spr[SPR_BOOKE_IVPR]; > env->spr[SPR_BOOKE_IVOR4] = sregs.u.e.ivor_low[4]; > + env->excp_vectors[POWERPC_EXCP_EXTERNAL] = > + env->spr[SPR_BOOKE_IVOR4] + env->spr[SPR_BOOKE_IVPR]; > env->spr[SPR_BOOKE_IVOR5] = sregs.u.e.ivor_low[5]; > + env->excp_vectors[POWERPC_EXCP_ALIGN] = > + env->spr[SPR_BOOKE_IVOR5] + env->spr[SPR_BOOKE_IVPR]; > env->spr[SPR_BOOKE_IVOR6] = sregs.u.e.ivor_low[6]; > + env->excp_vectors[POWERPC_EXCP_PROGRAM] = > + env->spr[SPR_BOOKE_IVOR6] + env->spr[SPR_BOOKE_IVPR]; > env->spr[SPR_BOOKE_IVOR7] = sregs.u.e.ivor_low[7]; > + env->excp_vectors[POWERPC_EXCP_FPU] = > + env->spr[SPR_BOOKE_IVOR7] + env->spr[SPR_BOOKE_IVPR]; > env->spr[SPR_BOOKE_IVOR8] = sregs.u.e.ivor_low[8]; > + env->excp_vectors[POWERPC_EXCP_SYSCALL] = > + env->spr[SPR_BOOKE_IVOR8] + env->spr[SPR_BOOKE_IVPR]; > env->spr[SPR_BOOKE_IVOR9] = sregs.u.e.ivor_low[9]; > + env->excp_vectors[POWERPC_EXCP_APU] = > + env->spr[SPR_BOOKE_IVOR9] + env->spr[SPR_BOOKE_IVPR]; > env->spr[SPR_BOOKE_IVOR10] = sregs.u.e.ivor_low[10]; > + env->excp_vectors[POWERPC_EXCP_DECR] = > + env->spr[SPR_BOOKE_IVOR10] + env->spr[SPR_BOOKE_IVPR]; > env->spr[SPR_BOOKE_IVOR11] = sregs.u.e.ivor_low[11]; > + env->excp_vectors[POWERPC_EXCP_FIT] = > + env->spr[SPR_BOOKE_IVOR11] + env->spr[SPR_BOOKE_IVPR]; > env->spr[SPR_BOOKE_IVOR12] = sregs.u.e.ivor_low[12]; > + env->excp_vectors[POWERPC_EXCP_WDT] = > + env->spr[SPR_BOOKE_IVOR12] + env->spr[SPR_BOOKE_IVPR]; > env->spr[SPR_BOOKE_IVOR13] = sregs.u.e.ivor_low[13]; > + env->excp_vectors[POWERPC_EXCP_DTLB] = > + env->spr[SPR_BOOKE_IVOR13] + env->spr[SPR_BOOKE_IVPR]; > env->spr[SPR_BOOKE_IVOR14] = sregs.u.e.ivor_low[14]; > + env->excp_vectors[POWERPC_EXCP_ITLB] = > + env->spr[SPR_BOOKE_IVOR14] + env->spr[SPR_BOOKE_IVPR]; > env->spr[SPR_BOOKE_IVOR15] = sregs.u.e.ivor_low[15]; > + env->excp_vectors[POWERPC_EXCP_DEBUG] = > + env->spr[SPR_BOOKE_IVOR15] + env->spr[SPR_BOOKE_IVPR]; > > if (sregs.u.e.features & KVM_SREGS_E_SPE) { > env->spr[SPR_BOOKE_IVOR32] = sregs.u.e.ivor_high[0]; > + env->excp_vectors[POWERPC_EXCP_SPEU] = > + env->spr[SPR_BOOKE_IVOR32] + env->spr[SPR_BOOKE_IVPR]; > env->spr[SPR_BOOKE_IVOR33] = sregs.u.e.ivor_high[1]; > + env->excp_vectors[POWERPC_EXCP_EFPDI] = > + env->spr[SPR_BOOKE_IVOR33] + env->spr[SPR_BOOKE_IVPR]; > env->spr[SPR_BOOKE_IVOR34] = sregs.u.e.ivor_high[2]; > + env->excp_vectors[POWERPC_EXCP_EFPRI] = > + env->spr[SPR_BOOKE_IVOR34] + env->spr[SPR_BOOKE_IVPR]; > } > > if (sregs.u.e.features & KVM_SREGS_E_PM) { > env->spr[SPR_BOOKE_IVOR35] = sregs.u.e.ivor_high[3]; > + env->excp_vectors[POWERPC_EXCP_EPERFM] = > + env->spr[SPR_BOOKE_IVOR35] + env->spr[SPR_BOOKE_IVPR]; > } > > if (sregs.u.e.features & KVM_SREGS_E_PC) { > env->spr[SPR_BOOKE_IVOR36] = sregs.u.e.ivor_high[4]; > + env->excp_vectors[POWERPC_EXCP_DOORI] = > + env->spr[SPR_BOOKE_IVOR36] + env->spr[SPR_BOOKE_IVPR]; > env->spr[SPR_BOOKE_IVOR37] = sregs.u.e.ivor_high[5]; > + env->excp_vectors[POWERPC_EXCP_DOORCI] = > + env->spr[SPR_BOOKE_IVOR37] + env->spr[SPR_BOOKE_IVPR]; > } > } >
diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c index 673c369..329a38b 100644 --- a/target-ppc/kvm.c +++ b/target-ppc/kvm.c @@ -1008,35 +1008,79 @@ int kvm_arch_get_registers(CPUState *cs) if (sregs.u.e.features & KVM_SREGS_E_IVOR) { env->spr[SPR_BOOKE_IVOR0] = sregs.u.e.ivor_low[0]; + env->excp_vectors[POWERPC_EXCP_CRITICAL] = + env->spr[SPR_BOOKE_IVOR0] + env->spr[SPR_BOOKE_IVPR]; env->spr[SPR_BOOKE_IVOR1] = sregs.u.e.ivor_low[1]; + env->excp_vectors[POWERPC_EXCP_MCHECK] = + env->spr[SPR_BOOKE_IVOR1] + env->spr[SPR_BOOKE_IVPR]; env->spr[SPR_BOOKE_IVOR2] = sregs.u.e.ivor_low[2]; + env->excp_vectors[POWERPC_EXCP_DSI] = + env->spr[SPR_BOOKE_IVOR2] + env->spr[SPR_BOOKE_IVPR]; env->spr[SPR_BOOKE_IVOR3] = sregs.u.e.ivor_low[3]; + env->excp_vectors[POWERPC_EXCP_ISI] = + env->spr[SPR_BOOKE_IVOR3] + env->spr[SPR_BOOKE_IVPR]; env->spr[SPR_BOOKE_IVOR4] = sregs.u.e.ivor_low[4]; + env->excp_vectors[POWERPC_EXCP_EXTERNAL] = + env->spr[SPR_BOOKE_IVOR4] + env->spr[SPR_BOOKE_IVPR]; env->spr[SPR_BOOKE_IVOR5] = sregs.u.e.ivor_low[5]; + env->excp_vectors[POWERPC_EXCP_ALIGN] = + env->spr[SPR_BOOKE_IVOR5] + env->spr[SPR_BOOKE_IVPR]; env->spr[SPR_BOOKE_IVOR6] = sregs.u.e.ivor_low[6]; + env->excp_vectors[POWERPC_EXCP_PROGRAM] = + env->spr[SPR_BOOKE_IVOR6] + env->spr[SPR_BOOKE_IVPR]; env->spr[SPR_BOOKE_IVOR7] = sregs.u.e.ivor_low[7]; + env->excp_vectors[POWERPC_EXCP_FPU] = + env->spr[SPR_BOOKE_IVOR7] + env->spr[SPR_BOOKE_IVPR]; env->spr[SPR_BOOKE_IVOR8] = sregs.u.e.ivor_low[8]; + env->excp_vectors[POWERPC_EXCP_SYSCALL] = + env->spr[SPR_BOOKE_IVOR8] + env->spr[SPR_BOOKE_IVPR]; env->spr[SPR_BOOKE_IVOR9] = sregs.u.e.ivor_low[9]; + env->excp_vectors[POWERPC_EXCP_APU] = + env->spr[SPR_BOOKE_IVOR9] + env->spr[SPR_BOOKE_IVPR]; env->spr[SPR_BOOKE_IVOR10] = sregs.u.e.ivor_low[10]; + env->excp_vectors[POWERPC_EXCP_DECR] = + env->spr[SPR_BOOKE_IVOR10] + env->spr[SPR_BOOKE_IVPR]; env->spr[SPR_BOOKE_IVOR11] = sregs.u.e.ivor_low[11]; + env->excp_vectors[POWERPC_EXCP_FIT] = + env->spr[SPR_BOOKE_IVOR11] + env->spr[SPR_BOOKE_IVPR]; env->spr[SPR_BOOKE_IVOR12] = sregs.u.e.ivor_low[12]; + env->excp_vectors[POWERPC_EXCP_WDT] = + env->spr[SPR_BOOKE_IVOR12] + env->spr[SPR_BOOKE_IVPR]; env->spr[SPR_BOOKE_IVOR13] = sregs.u.e.ivor_low[13]; + env->excp_vectors[POWERPC_EXCP_DTLB] = + env->spr[SPR_BOOKE_IVOR13] + env->spr[SPR_BOOKE_IVPR]; env->spr[SPR_BOOKE_IVOR14] = sregs.u.e.ivor_low[14]; + env->excp_vectors[POWERPC_EXCP_ITLB] = + env->spr[SPR_BOOKE_IVOR14] + env->spr[SPR_BOOKE_IVPR]; env->spr[SPR_BOOKE_IVOR15] = sregs.u.e.ivor_low[15]; + env->excp_vectors[POWERPC_EXCP_DEBUG] = + env->spr[SPR_BOOKE_IVOR15] + env->spr[SPR_BOOKE_IVPR]; if (sregs.u.e.features & KVM_SREGS_E_SPE) { env->spr[SPR_BOOKE_IVOR32] = sregs.u.e.ivor_high[0]; + env->excp_vectors[POWERPC_EXCP_SPEU] = + env->spr[SPR_BOOKE_IVOR32] + env->spr[SPR_BOOKE_IVPR]; env->spr[SPR_BOOKE_IVOR33] = sregs.u.e.ivor_high[1]; + env->excp_vectors[POWERPC_EXCP_EFPDI] = + env->spr[SPR_BOOKE_IVOR33] + env->spr[SPR_BOOKE_IVPR]; env->spr[SPR_BOOKE_IVOR34] = sregs.u.e.ivor_high[2]; + env->excp_vectors[POWERPC_EXCP_EFPRI] = + env->spr[SPR_BOOKE_IVOR34] + env->spr[SPR_BOOKE_IVPR]; } if (sregs.u.e.features & KVM_SREGS_E_PM) { env->spr[SPR_BOOKE_IVOR35] = sregs.u.e.ivor_high[3]; + env->excp_vectors[POWERPC_EXCP_EPERFM] = + env->spr[SPR_BOOKE_IVOR35] + env->spr[SPR_BOOKE_IVPR]; } if (sregs.u.e.features & KVM_SREGS_E_PC) { env->spr[SPR_BOOKE_IVOR36] = sregs.u.e.ivor_high[4]; + env->excp_vectors[POWERPC_EXCP_DOORI] = + env->spr[SPR_BOOKE_IVOR36] + env->spr[SPR_BOOKE_IVPR]; env->spr[SPR_BOOKE_IVOR37] = sregs.u.e.ivor_high[5]; + env->excp_vectors[POWERPC_EXCP_DOORCI] = + env->spr[SPR_BOOKE_IVOR37] + env->spr[SPR_BOOKE_IVPR]; } }
This patch synchronizes env->excp_vectors[] with env->iovr[]. This is required for using the existing interrupt injection mechanism for kvm. Signed-off-by: Bharat Bhushan <Bharat.Bhushan@freescale.com> --- v5->v6 - new patch target-ppc/kvm.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+)