On Thu, 3 Aug 2017 16:28:27 +1000 Sam Bobroff <[email protected]> wrote:
> The unicast case in h_signal_sys_reset() seems to be broken: > rather than selecting the target CPU, it looks like it will pick > either the first CPU or fail to find one at all. > > Fix it by using the search function rather than open coding the > search. > Heh the open coded search is using cpu where it should have been using POWERPC_CPU(cs) => it can only succeed if a the vCPU is signalling itself. > This was found by inspection; the code appears to be unused because > the Linux kernel only uses the broadcast target. > > Signed-off-by: Sam Bobroff <[email protected]> Reviewed-by: Greg Kurz <[email protected]> > --- > hw/ppc/spapr_hcall.c | 9 ++++----- > 1 file changed, 4 insertions(+), 5 deletions(-) > > diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c > index 72ea5a8247..07b3da8dc4 100644 > --- a/hw/ppc/spapr_hcall.c > +++ b/hw/ppc/spapr_hcall.c > @@ -1431,11 +1431,10 @@ static target_ulong h_signal_sys_reset(PowerPCCPU > *cpu, > > } else { > /* Unicast */ > - CPU_FOREACH(cs) { > - if (cpu->cpu_dt_id == target) { > - run_on_cpu(cs, spapr_do_system_reset_on_cpu, > RUN_ON_CPU_NULL); > - return H_SUCCESS; > - } > + cs = CPU(ppc_get_vcpu_by_dt_id(target)); > + if (cs) { > + run_on_cpu(cs, spapr_do_system_reset_on_cpu, RUN_ON_CPU_NULL); > + return H_SUCCESS; > } > return H_PARAMETER; > }
pgpq5cuSUf09x.pgp
Description: OpenPGP digital signature
