Message ID | 20220215214148.1848266-4-farosas@linux.ibm.com |
---|---|
State | Superseded |
Headers | show |
Series | target/ppc: SPR registration cleanups | expand |
On Tue, Feb 15, 2022 at 06:41:24PM -0300, Fabiano Rosas wrote: > The top level init_proc calls register_generic_sprs but also registers > some other SPRs outside of that function. Let's group everything into > a single place. > > Signed-off-by: Fabiano Rosas <farosas@linux.ibm.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Of course the SVR probably doesn't belong in this generic function, but that can be a later cleanup. > --- > target/ppc/cpu_init.c | 58 ++++++++++++++++++++++++------------------- > 1 file changed, 32 insertions(+), 26 deletions(-) > > diff --git a/target/ppc/cpu_init.c b/target/ppc/cpu_init.c > index 7488001385..5dc097f2fc 100644 > --- a/target/ppc/cpu_init.c > +++ b/target/ppc/cpu_init.c > @@ -150,8 +150,11 @@ static void _spr_register(CPUPPCState *env, int num, const char *name, > oea_read, oea_write, 0, ival) > > /* Generic PowerPC SPRs */ > -static void register_generic_sprs(CPUPPCState *env) > +static void register_generic_sprs(PowerPCCPU *cpu) > { > + PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu); > + CPUPPCState *env = &cpu->env; > + > /* Integer processing */ > spr_register(env, SPR_XER, "XER", > &spr_read_xer, &spr_write_xer, > @@ -192,6 +195,32 @@ static void register_generic_sprs(CPUPPCState *env) > SPR_NOACCESS, SPR_NOACCESS, > &spr_read_generic, &spr_write_generic, > 0x00000000); > + > + spr_register(env, SPR_PVR, "PVR", > + /* Linux permits userspace to read PVR */ > +#if defined(CONFIG_LINUX_USER) > + &spr_read_generic, > +#else > + SPR_NOACCESS, > +#endif > + SPR_NOACCESS, > + &spr_read_generic, SPR_NOACCESS, > + pcc->pvr); > + > + /* Register SVR if it's defined to anything else than POWERPC_SVR_NONE */ > + if (pcc->svr != POWERPC_SVR_NONE) { > + if (pcc->svr & POWERPC_SVR_E500) { > + spr_register(env, SPR_E500_SVR, "SVR", > + SPR_NOACCESS, SPR_NOACCESS, > + &spr_read_generic, SPR_NOACCESS, > + pcc->svr & ~POWERPC_SVR_E500); > + } else { > + spr_register(env, SPR_SVR, "SVR", > + SPR_NOACCESS, SPR_NOACCESS, > + &spr_read_generic, SPR_NOACCESS, > + pcc->svr); > + } > + } > } > > /* SPR common to all non-embedded PowerPC, including 601 */ > @@ -7241,31 +7270,8 @@ static void init_ppc_proc(PowerPCCPU *cpu) > env->tlb_type = TLB_NONE; > #endif > /* Register SPR common to all PowerPC implementations */ > - register_generic_sprs(env); > - spr_register(env, SPR_PVR, "PVR", > - /* Linux permits userspace to read PVR */ > -#if defined(CONFIG_LINUX_USER) > - &spr_read_generic, > -#else > - SPR_NOACCESS, > -#endif > - SPR_NOACCESS, > - &spr_read_generic, SPR_NOACCESS, > - pcc->pvr); > - /* Register SVR if it's defined to anything else than POWERPC_SVR_NONE */ > - if (pcc->svr != POWERPC_SVR_NONE) { > - if (pcc->svr & POWERPC_SVR_E500) { > - spr_register(env, SPR_E500_SVR, "SVR", > - SPR_NOACCESS, SPR_NOACCESS, > - &spr_read_generic, SPR_NOACCESS, > - pcc->svr & ~POWERPC_SVR_E500); > - } else { > - spr_register(env, SPR_SVR, "SVR", > - SPR_NOACCESS, SPR_NOACCESS, > - &spr_read_generic, SPR_NOACCESS, > - pcc->svr); > - } > - } > + register_generic_sprs(cpu); > + > /* PowerPC implementation specific initialisations (SPRs, timers, ...) */ > (*pcc->init_proc)(env); >
diff --git a/target/ppc/cpu_init.c b/target/ppc/cpu_init.c index 7488001385..5dc097f2fc 100644 --- a/target/ppc/cpu_init.c +++ b/target/ppc/cpu_init.c @@ -150,8 +150,11 @@ static void _spr_register(CPUPPCState *env, int num, const char *name, oea_read, oea_write, 0, ival) /* Generic PowerPC SPRs */ -static void register_generic_sprs(CPUPPCState *env) +static void register_generic_sprs(PowerPCCPU *cpu) { + PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu); + CPUPPCState *env = &cpu->env; + /* Integer processing */ spr_register(env, SPR_XER, "XER", &spr_read_xer, &spr_write_xer, @@ -192,6 +195,32 @@ static void register_generic_sprs(CPUPPCState *env) SPR_NOACCESS, SPR_NOACCESS, &spr_read_generic, &spr_write_generic, 0x00000000); + + spr_register(env, SPR_PVR, "PVR", + /* Linux permits userspace to read PVR */ +#if defined(CONFIG_LINUX_USER) + &spr_read_generic, +#else + SPR_NOACCESS, +#endif + SPR_NOACCESS, + &spr_read_generic, SPR_NOACCESS, + pcc->pvr); + + /* Register SVR if it's defined to anything else than POWERPC_SVR_NONE */ + if (pcc->svr != POWERPC_SVR_NONE) { + if (pcc->svr & POWERPC_SVR_E500) { + spr_register(env, SPR_E500_SVR, "SVR", + SPR_NOACCESS, SPR_NOACCESS, + &spr_read_generic, SPR_NOACCESS, + pcc->svr & ~POWERPC_SVR_E500); + } else { + spr_register(env, SPR_SVR, "SVR", + SPR_NOACCESS, SPR_NOACCESS, + &spr_read_generic, SPR_NOACCESS, + pcc->svr); + } + } } /* SPR common to all non-embedded PowerPC, including 601 */ @@ -7241,31 +7270,8 @@ static void init_ppc_proc(PowerPCCPU *cpu) env->tlb_type = TLB_NONE; #endif /* Register SPR common to all PowerPC implementations */ - register_generic_sprs(env); - spr_register(env, SPR_PVR, "PVR", - /* Linux permits userspace to read PVR */ -#if defined(CONFIG_LINUX_USER) - &spr_read_generic, -#else - SPR_NOACCESS, -#endif - SPR_NOACCESS, - &spr_read_generic, SPR_NOACCESS, - pcc->pvr); - /* Register SVR if it's defined to anything else than POWERPC_SVR_NONE */ - if (pcc->svr != POWERPC_SVR_NONE) { - if (pcc->svr & POWERPC_SVR_E500) { - spr_register(env, SPR_E500_SVR, "SVR", - SPR_NOACCESS, SPR_NOACCESS, - &spr_read_generic, SPR_NOACCESS, - pcc->svr & ~POWERPC_SVR_E500); - } else { - spr_register(env, SPR_SVR, "SVR", - SPR_NOACCESS, SPR_NOACCESS, - &spr_read_generic, SPR_NOACCESS, - pcc->svr); - } - } + register_generic_sprs(cpu); + /* PowerPC implementation specific initialisations (SPRs, timers, ...) */ (*pcc->init_proc)(env);
The top level init_proc calls register_generic_sprs but also registers some other SPRs outside of that function. Let's group everything into a single place. Signed-off-by: Fabiano Rosas <farosas@linux.ibm.com> --- target/ppc/cpu_init.c | 58 ++++++++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 26 deletions(-)