[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PATCHv3 01/12] pseries: Split device tree construction from
From: |
David Gibson |
Subject: |
[Qemu-ppc] [PATCHv3 01/12] pseries: Split device tree construction from device tree load |
Date: |
Mon, 24 Oct 2016 16:04:32 +1100 |
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 <address@hidden>
---
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;
--
2.7.4
- [Qemu-ppc] [PATCHv3 00/12] pseries: Consolidate guest device tree construction, David Gibson, 2016/10/24
- [Qemu-ppc] [PATCHv3 01/12] pseries: Split device tree construction from device tree load,
David Gibson <=
- [Qemu-ppc] [PATCHv3 05/12] pseries: Consolidate RTAS loading, David Gibson, 2016/10/24
- [Qemu-ppc] [PATCHv3 12/12] pseries: Remove spapr_create_fdt_skel(), David Gibson, 2016/10/24
- [Qemu-ppc] [PATCHv3 04/12] pseries: Move adding of fdt reserve map entries, David Gibson, 2016/10/24
- [Qemu-ppc] [PATCHv3 03/12] pseries: Make spapr_create_fdt_skel() get information from machine state, David Gibson, 2016/10/24
- [Qemu-ppc] [PATCHv3 09/12] pseries: Move /event-sources construction to spapr_build_fdt(), David Gibson, 2016/10/24
- [Qemu-ppc] [PATCHv3 10/12] pseries: Move /hypervisor node construction to fdt_build_fdt(), David Gibson, 2016/10/24
- [Qemu-ppc] [PATCHv3 08/12] pseries: Consolidate construction of /rtas device tree node, David Gibson, 2016/10/24
- [Qemu-ppc] [PATCHv3 02/12] pseries: Remove rtas_addr and fdt_addr fields from machinestate, David Gibson, 2016/10/24