Message ID | 20220826141150.7201-11-danielhb413@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | QMP/HMP: add 'dumpdtb' and 'info fdt' commands | expand |
On Fri, Aug 26, 2022 at 11:11:39AM -0300, Daniel Henrique Barboza wrote: > The pSeries machine never bothered with the common machine->fdt > attribute. We do all the FDT related work using spapr->fdt_blob. > > We're going to introduce HMP commands to read and save the FDT, which > will rely on setting machine->fdt properly to work across all machine > archs/types. > > Let's set machine->fdt in two places where we manipulate the FDT: > spapr_machine_reset() and CAS. There are other places where the FDT is > manipulated in the pSeries machines, most notably the hotplug/unplug > path. For now we'll acknowledge that we won't have the most accurate > representation of the FDT, depending on the current machine state, when > using these QMP/HMP fdt commands. Making the internal FDT representation > always match the actual FDT representation that the guest is using is a > problem for another day. > > spapr->fdt_blob is left untouched for now. To replace it with > machine->fdt, since we're migrating spapr->fdt_blob, we would need to > migrate machine->fdt as well. This is something that we would like to to > do keep our code simpler but it's also a work we'll leave for later. As discussed elswhere, this doesn't give a full picture of the "runtime" device tree, which can get modified later. For now, I think that's ok - we can define the fdt property / dumpdtb etc. as describing specifically the boot time DT before guest firmware or OS does any further mangling of it. That's effectively what it means for all the other embedded cases, though in those cases the firmware usually doesn't need to do further modifications, unlike a "full OF" environment like spapr. Reviewed-by: David Gibson <david@gibson.dropbear.id.au> > > Cc: Cédric Le Goater <clg@kaod.org> > Cc: qemu-ppc@nongnu.org > Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com> > --- > hw/ppc/spapr.c | 6 ++++++ > hw/ppc/spapr_hcall.c | 8 ++++++++ > 2 files changed, 14 insertions(+) > > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c > index bc9ba6e6dc..7031cf964a 100644 > --- a/hw/ppc/spapr.c > +++ b/hw/ppc/spapr.c > @@ -1713,6 +1713,12 @@ static void spapr_machine_reset(MachineState *machine) > spapr->fdt_initial_size = spapr->fdt_size; > spapr->fdt_blob = fdt; > > + /* > + * Set the common machine->fdt pointer to enable support > + * for 'dumpdtb' and 'info fdt' QMP/HMP commands. > + */ > + machine->fdt = fdt; > + > /* Set up the entry state */ > first_ppc_cpu->env.gpr[5] = 0; > > diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c > index a8d4a6bcf0..a53bfd76f4 100644 > --- a/hw/ppc/spapr_hcall.c > +++ b/hw/ppc/spapr_hcall.c > @@ -1256,6 +1256,14 @@ target_ulong do_client_architecture_support(PowerPCCPU *cpu, > spapr->fdt_initial_size = spapr->fdt_size; > spapr->fdt_blob = fdt; > > + /* > + * Set the machine->fdt pointer again since we just freed > + * it above (by freeing spapr->fdt_blob). We set this > + * pointer to enable support for 'dumpdtb' and 'info fdt' > + * QMP/HMP commands. > + */ > + MACHINE(spapr)->fdt = fdt; > + > return H_SUCCESS; > } >
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index bc9ba6e6dc..7031cf964a 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -1713,6 +1713,12 @@ static void spapr_machine_reset(MachineState *machine) spapr->fdt_initial_size = spapr->fdt_size; spapr->fdt_blob = fdt; + /* + * Set the common machine->fdt pointer to enable support + * for 'dumpdtb' and 'info fdt' QMP/HMP commands. + */ + machine->fdt = fdt; + /* Set up the entry state */ first_ppc_cpu->env.gpr[5] = 0; diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c index a8d4a6bcf0..a53bfd76f4 100644 --- a/hw/ppc/spapr_hcall.c +++ b/hw/ppc/spapr_hcall.c @@ -1256,6 +1256,14 @@ target_ulong do_client_architecture_support(PowerPCCPU *cpu, spapr->fdt_initial_size = spapr->fdt_size; spapr->fdt_blob = fdt; + /* + * Set the machine->fdt pointer again since we just freed + * it above (by freeing spapr->fdt_blob). We set this + * pointer to enable support for 'dumpdtb' and 'info fdt' + * QMP/HMP commands. + */ + MACHINE(spapr)->fdt = fdt; + return H_SUCCESS; }
The pSeries machine never bothered with the common machine->fdt attribute. We do all the FDT related work using spapr->fdt_blob. We're going to introduce HMP commands to read and save the FDT, which will rely on setting machine->fdt properly to work across all machine archs/types. Let's set machine->fdt in two places where we manipulate the FDT: spapr_machine_reset() and CAS. There are other places where the FDT is manipulated in the pSeries machines, most notably the hotplug/unplug path. For now we'll acknowledge that we won't have the most accurate representation of the FDT, depending on the current machine state, when using these QMP/HMP fdt commands. Making the internal FDT representation always match the actual FDT representation that the guest is using is a problem for another day. spapr->fdt_blob is left untouched for now. To replace it with machine->fdt, since we're migrating spapr->fdt_blob, we would need to migrate machine->fdt as well. This is something that we would like to to do keep our code simpler but it's also a work we'll leave for later. Cc: Cédric Le Goater <clg@kaod.org> Cc: qemu-ppc@nongnu.org Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com> --- hw/ppc/spapr.c | 6 ++++++ hw/ppc/spapr_hcall.c | 8 ++++++++ 2 files changed, 14 insertions(+)