Skip to content

Commit

Permalink
spapr: Remove unhelpful helpers from rtas_start_cpu()
Browse files Browse the repository at this point in the history
rtas_start_cpu() calls spapr_cpu_update_tb_offset() and
spapr_cpu_set_endianness() to initialize certain things in the new cpu's
state.  This is the only caller of those helpers, and they're each only
a few lines long, so we might as well just fold them into the caller.

In addition, those helpers initialize state on the new cpu to match that of
the first cpu.  That will generally work, but might be at least logically
incorrect if the first cpu has been set offline by the guest.  So, instead
base the state on that of the cpu invoking the RTAS call, which is
obviously active already.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Reviewed-by: Cédric Le Goater <clg@kaod.org>
Tested-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: Greg Kurz <groug@kaod.org>
  • Loading branch information
dgibson committed May 4, 2018
1 parent cf116ad commit 9824891
Showing 1 changed file with 14 additions and 24 deletions.
38 changes: 14 additions & 24 deletions hw/ppc/spapr_rtas.c
Expand Up @@ -120,27 +120,6 @@ static void rtas_query_cpu_stopped_state(PowerPCCPU *cpu_,
rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR);
}

/*
* Set the timebase offset of the CPU to that of first CPU.
* This helps hotplugged CPU to have the correct timebase offset.
*/
static void spapr_cpu_update_tb_offset(PowerPCCPU *cpu)
{
PowerPCCPU *fcpu = POWERPC_CPU(first_cpu);

cpu->env.tb_env->tb_offset = fcpu->env.tb_env->tb_offset;
}

static void spapr_cpu_set_endianness(PowerPCCPU *cpu)
{
PowerPCCPU *fcpu = POWERPC_CPU(first_cpu);
PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(fcpu);

if (!pcc->interrupts_big_endian(fcpu)) {
cpu->env.spr[SPR_LPCR] |= LPCR_ILE;
}
}

static void rtas_start_cpu(PowerPCCPU *callcpu, sPAPRMachineState *spapr,
uint32_t token, uint32_t nargs,
target_ulong args,
Expand All @@ -150,6 +129,7 @@ static void rtas_start_cpu(PowerPCCPU *callcpu, sPAPRMachineState *spapr,
PowerPCCPU *newcpu;
CPUPPCState *env;
PowerPCCPUClass *pcc;
target_ulong lpcr;

if (nargs != 3 || nret != 1) {
rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR);
Expand Down Expand Up @@ -178,10 +158,20 @@ static void rtas_start_cpu(PowerPCCPU *callcpu, sPAPRMachineState *spapr,
cpu_synchronize_state(CPU(newcpu));

env->msr = (1ULL << MSR_SF) | (1ULL << MSR_ME);
spapr_cpu_set_endianness(newcpu);
spapr_cpu_update_tb_offset(newcpu);

/* Enable Power-saving mode Exit Cause exceptions for the new CPU */
ppc_store_lpcr(newcpu, env->spr[SPR_LPCR] | pcc->lpcr_pm);
lpcr = env->spr[SPR_LPCR] | pcc->lpcr_pm;
if (!pcc->interrupts_big_endian(callcpu)) {
lpcr |= LPCR_ILE;
}
ppc_store_lpcr(newcpu, lpcr);

/*
* Set the timebase offset of the new CPU to that of the invoking
* CPU. This helps hotplugged CPU to have the correct timebase
* offset.
*/
newcpu->env.tb_env->tb_offset = callcpu->env.tb_env->tb_offset;

env->nip = start;
env->gpr[3] = r3;
Expand Down

0 comments on commit 9824891

Please sign in to comment.