[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PULL 34/73] pseries: Split device tree construction from dev
From: |
David Gibson |
Subject: |
[Qemu-ppc] [PULL 34/73] pseries: Split device tree construction from device tree load |
Date: |
Fri, 28 Oct 2016 12:37:35 +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>
Reviewed-by: Michael Roth <address@hidden>
Reviewed-by: Alexey Kardashevskiy <address@hidden>
---
hw/ppc/spapr.c | 42 +++++++++++++++++++++++-------------------
hw/ppc/spapr_cpu_core.c | 2 +-
2 files changed, 24 insertions(+), 20 deletions(-)
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 486f57d..874f53d 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;
diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
index bc922bc..e0c14f6 100644
--- a/hw/ppc/spapr_cpu_core.c
+++ b/hw/ppc/spapr_cpu_core.c
@@ -184,7 +184,7 @@ void spapr_core_plug(HotplugHandler *hotplug_dev,
DeviceState *dev,
/*
* Setup CPU DT entries only for hotplugged CPUs. For boot time or
- * coldplugged CPUs DT entries are setup in spapr_finalize_fdt().
+ * coldplugged CPUs DT entries are setup in spapr_build_fdt().
*/
if (dev->hotplugged) {
fdt = spapr_populate_hotplug_cpu_dt(cs, &fdt_offset, spapr);
--
2.7.4
- [Qemu-ppc] [PULL 06/73] tests: rename target_big_endian() as qvirtio_is_big_endian(), (continued)
- [Qemu-ppc] [PULL 06/73] tests: rename target_big_endian() as qvirtio_is_big_endian(), David Gibson, 2016/10/27
- [Qemu-ppc] [PULL 15/73] target-ppc: implement xxbr[qdwh] instruction, David Gibson, 2016/10/27
- [Qemu-ppc] [PULL 13/73] nvram: Rename openbios_firmware_abi.h into sun_nvram.h, David Gibson, 2016/10/27
- [Qemu-ppc] [PULL 12/73] nvram: Move the remaining CHRP NVRAM related code to chrp_nvram.[ch], David Gibson, 2016/10/27
- [Qemu-ppc] [PULL 20/73] pseries: Remove unused callbacks from sPAPR VIO bus state, David Gibson, 2016/10/27
- [Qemu-ppc] [PULL 27/73] ppc/pnv: add a PIR handler to PnvChip, David Gibson, 2016/10/27
- [Qemu-ppc] [PULL 18/73] ppc/xics: change the icp_ routines API to use an 'ICPState *' argument, David Gibson, 2016/10/27
- [Qemu-ppc] [PULL 17/73] ppc/xics: add a XICSState backlink in ICPState, David Gibson, 2016/10/27
- [Qemu-ppc] [PULL 07/73] tests: use qtest_pc_boot()/qtest_shutdown() in virtio tests, David Gibson, 2016/10/27
- [Qemu-ppc] [PULL 23/73] configure, ppc64: Copy skiboot.lid to build directory when configuring, David Gibson, 2016/10/27
- [Qemu-ppc] [PULL 34/73] pseries: Split device tree construction from device tree load,
David Gibson <=
- [Qemu-ppc] [PULL 40/73] pseries: Consolidate construction of /chosen device tree node, David Gibson, 2016/10/27
- [Qemu-ppc] [PULL 25/73] ppc/pnv: add a PnvChip object, David Gibson, 2016/10/27
- [Qemu-ppc] [PULL 38/73] pseries: Consolidate RTAS loading, David Gibson, 2016/10/27
- [Qemu-ppc] [PULL 46/73] spapr_ovec: initial implementation of option vector helpers, David Gibson, 2016/10/27
- [Qemu-ppc] [PULL 28/73] ppc/pnv: add a PnvCore object, David Gibson, 2016/10/27
- [Qemu-ppc] [PULL 41/73] pseries: Consolidate construction of /rtas device tree node, David Gibson, 2016/10/27
- [Qemu-ppc] [PULL 44/73] pseries: Consolidate construction of /vdevice device tree node, David Gibson, 2016/10/27
- [Qemu-ppc] [PULL 21/73] ppc: Fix single step with gdb stub, David Gibson, 2016/10/27
- [Qemu-ppc] [PULL 35/73] pseries: Remove rtas_addr and fdt_addr fields from machinestate, David Gibson, 2016/10/27
- [Qemu-ppc] [PULL 42/73] pseries: Move /event-sources construction to spapr_build_fdt(), David Gibson, 2016/10/27