On Tue, 17 Apr 2018 17:17:19 +1000 David Gibson <da...@gibson.dropbear.id.au> wrote:
> Under PAPR, only the boot CPU is active when the system starts. Other cpus > must be explicitly activated using an RTAS call. The entry state for the > boot and secondary cpus isn't identical, but it has some things in common. > We're going to add a bit more common setup later, too, so to simplify > make a helper which sets up the common entry state for both boot and > secondary cpu threads. > > Signed-off-by: David Gibson <da...@gibson.dropbear.id.au> > --- Reviewed-by: Greg Kurz <gr...@kaod.org> > hw/ppc/spapr.c | 4 +--- > hw/ppc/spapr_cpu_core.c | 9 +++++++++ > hw/ppc/spapr_rtas.c | 6 +++--- > include/hw/ppc/spapr_cpu_core.h | 3 +++ > 4 files changed, 16 insertions(+), 6 deletions(-) > > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c > index fbb2c6752c..e0cabfa6ee 100644 > --- a/hw/ppc/spapr.c > +++ b/hw/ppc/spapr.c > @@ -1536,10 +1536,8 @@ static void spapr_machine_reset(void) > g_free(fdt); > > /* Set up the entry state */ > - first_ppc_cpu->env.gpr[3] = fdt_addr; > + spapr_cpu_set_entry_state(first_ppc_cpu, SPAPR_ENTRY_POINT, fdt_addr); > first_ppc_cpu->env.gpr[5] = 0; > - first_cpu->halted = 0; > - first_ppc_cpu->env.nip = SPAPR_ENTRY_POINT; > > spapr->cas_reboot = false; > } > diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c > index b1c3cf11f0..ecd40dbf03 100644 > --- a/hw/ppc/spapr_cpu_core.c > +++ b/hw/ppc/spapr_cpu_core.c > @@ -80,6 +80,15 @@ static void spapr_cpu_reset(void *opaque) > env->spr[SPR_AMOR] = 0xffffffffffffffffull; > } > > +void spapr_cpu_set_entry_state(PowerPCCPU *cpu, target_ulong nip, > target_ulong r3) > +{ > + CPUPPCState *env = &cpu->env; > + > + env->nip = SPAPR_ENTRY_POINT; > + env->gpr[3] = r3; > + CPU(cpu)->halted = 0; > +} > + > static void spapr_cpu_destroy(PowerPCCPU *cpu) > { > qemu_unregister_reset(spapr_cpu_reset, cpu); > diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c > index 0ec5fa4cfe..d79aa44467 100644 > --- a/hw/ppc/spapr_rtas.c > +++ b/hw/ppc/spapr_rtas.c > @@ -37,6 +37,7 @@ > #include "hw/ppc/spapr.h" > #include "hw/ppc/spapr_vio.h" > #include "hw/ppc/spapr_rtas.h" > +#include "hw/ppc/spapr_cpu_core.h" > #include "hw/ppc/ppc.h" > #include "hw/boards.h" > > @@ -173,14 +174,13 @@ static void rtas_start_cpu(PowerPCCPU *cpu_, > sPAPRMachineState *spapr, > * new cpu enters */ > kvm_cpu_synchronize_state(cs); > > + spapr_cpu_set_entry_state(cpu, start, r3); > + > env->msr = (1ULL << MSR_SF) | (1ULL << MSR_ME); > > /* Enable Power-saving mode Exit Cause exceptions for the new CPU */ > env->spr[SPR_LPCR] |= pcc->lpcr_pm; > > - env->nip = start; > - env->gpr[3] = r3; > - cs->halted = 0; > spapr_cpu_set_endianness(cpu); > spapr_cpu_update_tb_offset(cpu); > > diff --git a/include/hw/ppc/spapr_cpu_core.h b/include/hw/ppc/spapr_cpu_core.h > index 1a38544706..11cab30838 100644 > --- a/include/hw/ppc/spapr_cpu_core.h > +++ b/include/hw/ppc/spapr_cpu_core.h > @@ -12,6 +12,7 @@ > #include "hw/qdev.h" > #include "hw/cpu/core.h" > #include "target/ppc/cpu-qom.h" > +#include "target/ppc/cpu.h" > > #define TYPE_SPAPR_CPU_CORE "spapr-cpu-core" > #define SPAPR_CPU_CORE(obj) \ > @@ -40,4 +41,6 @@ typedef struct sPAPRCPUCoreClass { > const char *spapr_get_cpu_core_type(const char *cpu_type); > void spapr_cpu_core_reset(sPAPRCPUCore *sc); > > +void spapr_cpu_set_entry_state(PowerPCCPU *cpu, target_ulong nip, > target_ulong r3); > + > #endif