[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PULL 33/49] pseries: Split device tree construction from dev
From: |
David Gibson |
Subject: |
[Qemu-ppc] [PULL 33/49] pseries: Split device tree construction from device tree load |
Date: |
Wed, 26 Oct 2016 22:42:37 +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 21/49] ppc: Fix single step with gdb stub, (continued)
- [Qemu-ppc] [PULL 21/49] ppc: Fix single step with gdb stub, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 11/49] sparc: Use the new common NVRAM functions for system and free space partition, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 14/49] target-ppc: implement vnegw/d instructions, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 20/49] pseries: Remove unused callbacks from sPAPR VIO bus state, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 12/49] nvram: Move the remaining CHRP NVRAM related code to chrp_nvram.[ch], David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 07/49] tests: use qtest_pc_boot()/qtest_shutdown() in virtio tests, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 18/49] ppc/xics: change the icp_ routines API to use an 'ICPState *' argument, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 35/49] pseries: Make spapr_create_fdt_skel() get information from machine state, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 05/49] tests: move QVirtioBus pointer into QVirtioDevice, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 24/49] ppc/pnv: add a PnvChip object, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 33/49] pseries: Split device tree construction from device tree load,
David Gibson <=
- [Qemu-ppc] [PULL 31/49] ppc/pnv: add a ISA bus, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 37/49] pseries: Consolidate RTAS loading, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 16/49] ppc/xics: add a xics_set_nr_servers common routine, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 13/49] nvram: Rename openbios_firmware_abi.h into sun_nvram.h, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 17/49] ppc/xics: add a XICSState backlink in ICPState, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 15/49] target-ppc: implement xxbr[qdwh] instruction, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 29/49] ppc/pnv: add XSCOM handlers to PnvCore, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 34/49] pseries: Remove rtas_addr and fdt_addr fields from machinestate, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 32/49] target-ppc: add vmul10[u, eu, cu, ecu]q instructions, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 42/49] pseries: Move /hypervisor node construction to fdt_build_fdt(), David Gibson, 2016/10/26