On Mon, Jan 28, 2019 at 10:46:17AM +0100, Cédric Le Goater wrote: > From: Benjamin Herrenschmidt <b...@kernel.crashing.org> > > This moves the code to handle waking up from the 0x100 vector > from powerpc_excp() to a separate function, as the former is > already way too big as it is. > > No functional change. > > Signed-off-by: Benjamin Herrenschmidt <b...@kernel.crashing.org> > Signed-off-by: Cédric Le Goater <c...@kaod.org>
Reviewed-by: David Gibson <da...@gibson.dropbear.id.au> > --- > target/ppc/excp_helper.c | 75 ++++++++++++++++++++++------------------ > 1 file changed, 41 insertions(+), 34 deletions(-) > > diff --git a/target/ppc/excp_helper.c b/target/ppc/excp_helper.c > index 97503193ef43..489a54f51b90 100644 > --- a/target/ppc/excp_helper.c > +++ b/target/ppc/excp_helper.c > @@ -65,6 +65,46 @@ static inline void dump_syscall(CPUPPCState *env) > ppc_dump_gpr(env, 6), env->nip); > } > > +static int powerpc_reset_wakeup(CPUState *cs, CPUPPCState *env, int excp, > + target_ulong *msr) > +{ > + /* We no longer are in a PM state */ > + env->in_pm_state = false; > + > + /* Pretend to be returning from doze always as we don't lose state */ > + *msr |= (0x1ull << (63 - 47)); > + > + /* Machine checks are sent normally */ > + if (excp == POWERPC_EXCP_MCHECK) { > + return excp; > + } > + switch (excp) { > + case POWERPC_EXCP_RESET: > + *msr |= 0x4ull << (63 - 45); > + break; > + case POWERPC_EXCP_EXTERNAL: > + *msr |= 0x8ull << (63 - 45); > + break; > + case POWERPC_EXCP_DECR: > + *msr |= 0x6ull << (63 - 45); > + break; > + case POWERPC_EXCP_SDOOR: > + *msr |= 0x5ull << (63 - 45); > + break; > + case POWERPC_EXCP_SDOOR_HV: > + *msr |= 0x3ull << (63 - 45); > + break; > + case POWERPC_EXCP_HV_MAINT: > + *msr |= 0xaull << (63 - 45); > + break; > + default: > + cpu_abort(cs, "Unsupported exception %d in Power Save mode\n", > + excp); > + } > + return POWERPC_EXCP_RESET; > +} > + > + > /* Note that this function should be greatly optimized > * when called with a constant excp, from ppc_hw_interrupt > */ > @@ -102,40 +142,7 @@ static inline void powerpc_excp(PowerPCCPU *cpu, int > excp_model, int excp) > * P7/P8/P9 > */ > if (env->in_pm_state) { > - env->in_pm_state = false; > - > - /* Pretend to be returning from doze always as we don't lose state */ > - msr |= (0x1ull << (63 - 47)); > - > - /* Non-machine check are routed to 0x100 with a wakeup cause > - * encoded in SRR1 > - */ > - if (excp != POWERPC_EXCP_MCHECK) { > - switch (excp) { > - case POWERPC_EXCP_RESET: > - msr |= 0x4ull << (63 - 45); > - break; > - case POWERPC_EXCP_EXTERNAL: > - msr |= 0x8ull << (63 - 45); > - break; > - case POWERPC_EXCP_DECR: > - msr |= 0x6ull << (63 - 45); > - break; > - case POWERPC_EXCP_SDOOR: > - msr |= 0x5ull << (63 - 45); > - break; > - case POWERPC_EXCP_SDOOR_HV: > - msr |= 0x3ull << (63 - 45); > - break; > - case POWERPC_EXCP_HV_MAINT: > - msr |= 0xaull << (63 - 45); > - break; > - default: > - cpu_abort(cs, "Unsupported exception %d in Power Save > mode\n", > - excp); > - } > - excp = POWERPC_EXCP_RESET; > - } > + excp = powerpc_reset_wakeup(cs, env, excp, &msr); > } > > /* Exception targetting modifiers -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson
signature.asc
Description: PGP signature