mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-07 09:43:56 -06:00
hw/mips/boston: Support dumpdtb monitor commands
The boston machine doesn't set MachineState::fdt to the DTB blob that it has loaded or created, which means that the QMP/HMP dumpdtb monitor commands don't work. Setting MachineState::fdt is easy in the non-FIT codepath: we can simply do so immediately before loading the DTB into guest memory. The FIT codepath is a bit more awkward as currently the FIT loader throws away the memory that the FDT was in after it loads it into guest memory. So we add a void *pfdt argument to load_fit() for it to store the FDT pointer into. There is some readjustment required of the pointer handling in loader-fit.c, so that it applies 'const' only where it should (e.g. the data pointer we get back from fdt_getprop() is const, because it's into the middle of the input FDT data, but the pointer that fit_load_image_alloc() should not be const, because it's freshly allocated memory that the caller can change if it likes). Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-id: 20250206151214.2947842-5-peter.maydell@linaro.org
This commit is contained in:
parent
dfd0de7186
commit
db0dd33559
3 changed files with 46 additions and 24 deletions
|
@ -358,8 +358,8 @@ static void gen_firmware(void *p, hwaddr kernel_entry, hwaddr fdt_addr)
|
|||
kernel_entry);
|
||||
}
|
||||
|
||||
static const void *boston_fdt_filter(void *opaque, const void *fdt_orig,
|
||||
const void *match_data, hwaddr *load_addr)
|
||||
static void *boston_fdt_filter(void *opaque, const void *fdt_orig,
|
||||
const void *match_data, hwaddr *load_addr)
|
||||
{
|
||||
BostonState *s = BOSTON(opaque);
|
||||
MachineState *machine = s->mach;
|
||||
|
@ -797,7 +797,7 @@ static void boston_mach_init(MachineState *machine)
|
|||
if (kernel_size > 0) {
|
||||
int dt_size;
|
||||
g_autofree const void *dtb_file_data = NULL;
|
||||
g_autofree const void *dtb_load_data = NULL;
|
||||
void *dtb_load_data = NULL;
|
||||
hwaddr dtb_paddr = QEMU_ALIGN_UP(kernel_high, 64 * KiB);
|
||||
hwaddr dtb_vaddr = cpu_mips_phys_to_kseg0(NULL, dtb_paddr);
|
||||
|
||||
|
@ -815,6 +815,8 @@ static void boston_mach_init(MachineState *machine)
|
|||
exit(1);
|
||||
}
|
||||
|
||||
machine->fdt = dtb_load_data;
|
||||
|
||||
/* Calculate real fdt size after filter */
|
||||
dt_size = fdt_totalsize(dtb_load_data);
|
||||
rom_add_blob_fixed("dtb", dtb_load_data, dt_size, dtb_paddr);
|
||||
|
@ -822,7 +824,8 @@ static void boston_mach_init(MachineState *machine)
|
|||
rom_ptr(dtb_paddr, dt_size));
|
||||
} else {
|
||||
/* Try to load file as FIT */
|
||||
fit_err = load_fit(&boston_fit_loader, machine->kernel_filename, s);
|
||||
fit_err = load_fit(&boston_fit_loader, machine->kernel_filename,
|
||||
&machine->fdt, s);
|
||||
if (fit_err) {
|
||||
error_report("unable to load kernel image");
|
||||
exit(1);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue