On Mon, Oct 24, 2016 at 04:17:05PM +1100, Alexey Kardashevskiy wrote: > On 21/10/16 13:56, David Gibson wrote: > > spapr_finalize_fdt() both finishes building the device tree for the guest > > and loads it into guest memory. For future cleanups, it's going to be > > more convenient to do these two things separately. The loading portion is > > pretty trivial, so we move it inline into the caller, ppc_spapr_reset(). > > > > We also rename spapr_finalize_fdt(), because the current name is going to > > become inaccurate. > > > > Signed-off-by: David Gibson <[email protected]> > > > > Reviewed-by: Alexey Kardashevskiy <[email protected]> > > with a small nit, grep finds "spapr_finalize_fdt" in a comment: > > hw/ppc/spapr_cpu_core.c:187: * coldplugged CPUs DT entries are setup in > spapr_finalize_fdt().
Thanks, will fix.
>
>
>
> > ---
> > hw/ppc/spapr.c | 42 +++++++++++++++++++++++-------------------
> > 1 file changed, 23 insertions(+), 19 deletions(-)
> >
> > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> > index ddb7438..0864411 100644
> > --- a/hw/ppc/spapr.c
> > +++ b/hw/ppc/spapr.c
> > @@ -900,10 +900,9 @@ int spapr_h_cas_compose_response(sPAPRMachineState
> > *spapr,
> > return 0;
> > }
> >
> > -static void spapr_finalize_fdt(sPAPRMachineState *spapr,
> > - hwaddr fdt_addr,
> > - hwaddr rtas_addr,
> > - hwaddr rtas_size)
> > +static void *spapr_build_fdt(sPAPRMachineState *spapr,
> > + hwaddr rtas_addr,
> > + hwaddr rtas_size)
> > {
> > MachineState *machine = MACHINE(qdev_get_machine());
> > MachineClass *mc = MACHINE_GET_CLASS(machine);
> > @@ -999,19 +998,8 @@ static void spapr_finalize_fdt(sPAPRMachineState
> > *spapr,
> > }
> > }
> >
> > - _FDT((fdt_pack(fdt)));
> > -
> > - if (fdt_totalsize(fdt) > FDT_MAX_SIZE) {
> > - error_report("FDT too big ! 0x%x bytes (max is 0x%x)",
> > - fdt_totalsize(fdt), FDT_MAX_SIZE);
> > - exit(1);
> > - }
> > -
> > - qemu_fdt_dumpdtb(fdt, fdt_totalsize(fdt));
> > - cpu_physical_memory_write(fdt_addr, fdt, fdt_totalsize(fdt));
> > -
> > g_free(bootlist);
> > - g_free(fdt);
> > + return fdt;
> > }
> >
> > static uint64_t translate_kernel_address(void *opaque, uint64_t addr)
> > @@ -1147,6 +1135,8 @@ static void ppc_spapr_reset(void)
> > sPAPRMachineState *spapr = SPAPR_MACHINE(machine);
> > PowerPCCPU *first_ppc_cpu;
> > uint32_t rtas_limit;
> > + void *fdt;
> > + int rc;
> >
> > /* Check for unknown sysbus devices */
> > foreach_dynamic_sysbus_device(find_unknown_sysbus_device, NULL);
> > @@ -1173,14 +1163,28 @@ static void ppc_spapr_reset(void)
> > spapr->rtas_addr = rtas_limit - RTAS_MAX_SIZE;
> > spapr->fdt_addr = spapr->rtas_addr - FDT_MAX_SIZE;
> >
> > - /* Load the fdt */
> > - spapr_finalize_fdt(spapr, spapr->fdt_addr, spapr->rtas_addr,
> > - spapr->rtas_size);
> > + fdt = spapr_build_fdt(spapr, spapr->rtas_addr, spapr->rtas_size);
> >
> > /* Copy RTAS over */
> > cpu_physical_memory_write(spapr->rtas_addr, spapr->rtas_blob,
> > spapr->rtas_size);
> >
> > + rc = fdt_pack(fdt);
> > +
> > + /* Should only fail if we've built a corrupted tree */
> > + assert(rc == 0);
> > +
> > + if (fdt_totalsize(fdt) > FDT_MAX_SIZE) {
> > + error_report("FDT too big ! 0x%x bytes (max is 0x%x)",
> > + fdt_totalsize(fdt), FDT_MAX_SIZE);
> > + exit(1);
> > + }
> > +
> > + /* Load the fdt */
> > + qemu_fdt_dumpdtb(fdt, fdt_totalsize(fdt));
> > + cpu_physical_memory_write(spapr->fdt_addr, fdt, fdt_totalsize(fdt));
> > + g_free(fdt);
> > +
> > /* Set up the entry state */
> > first_ppc_cpu = POWERPC_CPU(first_cpu);
> > first_ppc_cpu->env.gpr[3] = spapr->fdt_addr;
> >
>
>
--
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
