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 > > > > Reviewed-by: Alexey Kardashevskiy > > 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