qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Daniel Henrique Barboza <danielhb413@gmail.com>
To: David Gibson <david@gibson.dropbear.id.au>
Cc: qemu-devel@nongnu.org, alistair.francis@wdc.com,
	Peter Maydell <peter.maydell@linaro.org>,
	qemu-arm@nongnu.org
Subject: Re: [PATCH for-7.2 v2 01/20] hw/arm: do not free machine->fdt in arm_load_dtb()
Date: Fri, 12 Aug 2022 19:03:26 -0300	[thread overview]
Message-ID: <2414971c-5e65-96f2-26ee-6d0a35823bdd@gmail.com> (raw)
In-Reply-To: <YvCBwE200sVzMixz@yekko>

David,

On 8/8/22 00:23, David Gibson wrote:
> On Fri, Aug 05, 2022 at 06:39:29AM -0300, Daniel Henrique Barboza wrote:
>> At this moment, arm_load_dtb() can free machine->fdt when
>> binfo->dtb_filename is NULL. If there's no 'dtb_filename', 'fdt' will be
>> retrieved by binfo->get_dtb(). If get_dtb() returns machine->fdt, as is
>> the case of machvirt_dtb() from hw/arm/virt.c, fdt now has a pointer to
>> machine->fdt. And, in that case, the existing g_free(fdt) at the end of
>> arm_load_dtb() will make machine->fdt point to an invalid memory region.
>>
>> This is not an issue right now because there's no code that access
>> machine->fdt after arm_load_dtb(), but we're going to add a couple do
>> FDT HMP commands that will rely on machine->fdt being valid.
>>
>> Instead of freeing 'fdt' at the end of arm_load_dtb(), assign it to
>> machine->fdt. This will allow the FDT of ARM machines that relies on
>> arm_load_dtb() to be accessed later on.
>>
>> Since all ARM machines allocates the FDT only once, we don't need to
>> worry about leaking the existing FDT during a machine reset (which is
>> something that other machines have to look after, e.g. the ppc64 pSeries
>> machine).
>>
>> Cc: Peter Maydell <peter.maydell@linaro.org>
>> Cc: qemu-arm@nongnu.org
>> Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
>> ---
>>   hw/arm/boot.c | 8 +++++++-
>>   1 file changed, 7 insertions(+), 1 deletion(-)
>>
>> diff --git a/hw/arm/boot.c b/hw/arm/boot.c
>> index ada2717f76..9f5ceb62d2 100644
>> --- a/hw/arm/boot.c
>> +++ b/hw/arm/boot.c
>> @@ -684,7 +684,13 @@ int arm_load_dtb(hwaddr addr, const struct arm_boot_info *binfo,
>>        */
>>       rom_add_blob_fixed_as("dtb", fdt, size, addr, as);
>>   
>> -    g_free(fdt);
>> +    /*
>> +     * Update the ms->fdt pointer to enable support for 'dumpdtb'
>> +     * and 'info fdt' commands. Use fdt_pack() to shrink the blob
>> +     * size we're going to store.
>> +     */
>> +    fdt_pack(fdt);
>> +    ms->fdt = fdt;
>>   
>>       return size;
> 
> fdt_pack() could change (reduce) the effective size of the dtb blob,
> so returning a 'size' value from above rather than the new value of
> fdt_totalsize(fdt) doesn't see right.

After some thought I think executing fdt_pack() like I'm doing here is not
a good idea. The first problem is that I'm not returning the updated size,
as you've said.

But I can't just amend a 'return fdt_totalsize(fdt);' either. I'm packing the
FDT **after** the machine store it in the guest physical memory. If I return
the packed size, but the machine isn't packing the FDT before a
cpu_physical_memory_write(), I'll be under-reporting the FDT size written.

Machines such as e500 (patch 4) uses this returned value to put more stuff in
the guest memory. In that case, returning a smaller size that what was actually
written can cause the machine to overwrite the FDT by accident. In fact, only
a handful of machines (ppc/pseries, ppc/pvn, riscv, oepenrisc) is doing a
fdt_pack() before a cpu_physical_memory_write(). So this change would be
potentially harmful to a lot of people.

One alternative would be to do a fdt_pack() before the machine writes the
FDT in the guest memory, but that is too intrusive to do because I can't say
if each of these machines will be OK with that. I have a hunch that it would
be OK, but a hunch isn't going to cut it.

I'll just drop the fdt_pack() for each of these patches. If the machine code
is already packing it, fine. If not, that's fine too. Each maintainer can
assess whether packing the FDT is worth it or not.


Thanks,


Daniel


> 
> I believe some of the other patches in the series have similar concerns.
> 


  parent reply	other threads:[~2022-08-12 22:04 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-05  9:39 [PATCH for-7.2 v2 00/20] QMP/HMP: add 'dumpdtb' and 'info fdt' commands Daniel Henrique Barboza
2022-08-05  9:39 ` [PATCH for-7.2 v2 01/20] hw/arm: do not free machine->fdt in arm_load_dtb() Daniel Henrique Barboza
2022-08-08  3:23   ` David Gibson
2022-08-08 23:00     ` Daniel Henrique Barboza
2022-08-12 22:03     ` Daniel Henrique Barboza [this message]
2022-08-15  2:36       ` David Gibson
2022-08-05  9:39 ` [PATCH for-7.2 v2 02/20] hw/microblaze: set machine->fdt in microblaze_load_dtb() Daniel Henrique Barboza
2022-08-05  9:39 ` [PATCH for-7.2 v2 03/20] hw/nios2: set machine->fdt in nios2_load_dtb() Daniel Henrique Barboza
2022-08-05  9:39 ` [PATCH for-7.2 v2 04/20] hw/ppc: set machine->fdt in ppce500_load_device_tree() Daniel Henrique Barboza
2022-08-05  9:39 ` [PATCH for-7.2 v2 05/20] hw/ppc: set machine->fdt in bamboo_load_device_tree() Daniel Henrique Barboza
2022-08-05  9:39 ` [PATCH for-7.2 v2 06/20] hw/ppc: set machine->fdt in sam460ex_load_device_tree() Daniel Henrique Barboza
2022-08-05  9:39 ` [PATCH for-7.2 v2 07/20] hw/ppc: set machine->fdt in xilinx_load_device_tree() Daniel Henrique Barboza
2022-08-05  9:39 ` [PATCH for-7.2 v2 08/20] hw/ppc: set machine->fdt in pegasos2_machine_reset() Daniel Henrique Barboza
2022-08-05  9:39 ` [PATCH for-7.2 v2 09/20] hw/ppc: set machine->fdt in pnv_reset() Daniel Henrique Barboza
2022-08-05 11:03   ` Frederic Barrat
2022-08-05 12:31     ` Daniel Henrique Barboza
2022-08-08  3:25       ` David Gibson
2022-08-08  6:47   ` Cédric Le Goater
2022-08-08  7:13     ` Cédric Le Goater
2022-08-10 19:30       ` Daniel Henrique Barboza
2022-08-05  9:39 ` [PATCH for-7.2 v2 10/20] hw/ppc: set machine->fdt in spapr machine Daniel Henrique Barboza
2022-08-08  3:26   ` David Gibson
2022-08-12 22:23     ` Daniel Henrique Barboza
2022-08-15  2:37       ` David Gibson
2022-08-19  2:11   ` Alexey Kardashevskiy
2022-08-19  2:33     ` David Gibson
2022-08-19  9:42     ` Daniel Henrique Barboza
2022-08-22  3:05       ` David Gibson
2022-08-22  3:29         ` Alexey Kardashevskiy
2022-08-22 10:30           ` Daniel Henrique Barboza
2022-08-23  8:58             ` Alexey Kardashevskiy
2022-08-23 18:09               ` Daniel Henrique Barboza
2022-09-01  1:57             ` David Gibson
2022-08-05  9:39 ` [PATCH for-7.2 v2 11/20] hw/riscv: set machine->fdt in sifive_u_machine_init() Daniel Henrique Barboza
2022-08-07 22:46   ` Alistair Francis
2022-08-05  9:39 ` [PATCH for-7.2 v2 12/20] hw/riscv: set machine->fdt in spike_board_init() Daniel Henrique Barboza
2022-08-07 22:46   ` Alistair Francis
2022-08-05  9:39 ` [PATCH for-7.2 v2 13/20] hw/xtensa: set machine->fdt in xtfpga_init() Daniel Henrique Barboza
2022-08-05  9:39 ` [PATCH for-7.2 v2 14/20] qmp/hmp, device_tree.c: introduce dumpdtb Daniel Henrique Barboza
2022-08-07 23:02   ` Alistair Francis
2022-08-08  3:30   ` David Gibson
2022-08-15 17:36     ` Daniel Henrique Barboza
2022-08-15 18:31       ` Dr. David Alan Gilbert
2022-08-15 19:20         ` Daniel Henrique Barboza
2022-08-05  9:39 ` [PATCH for-7.2 v2 15/20] qmp/hmp, device_tree.c: introduce 'info fdt' command Daniel Henrique Barboza
2022-08-08  4:21   ` David Gibson
2022-08-15 22:48     ` Daniel Henrique Barboza
2022-08-18  2:46       ` David Gibson
2022-08-05  9:39 ` [PATCH for-7.2 v2 16/20] device_tree.c: support string props in fdt_format_node() Daniel Henrique Barboza
2022-08-08  4:36   ` David Gibson
2022-08-10 19:40     ` Daniel Henrique Barboza
2022-08-11  4:09       ` David Gibson
2022-08-05  9:39 ` [PATCH for-7.2 v2 17/20] device_tree.c: support remaining FDT prop types Daniel Henrique Barboza
2022-08-08  4:40   ` David Gibson
2022-08-05  9:39 ` [PATCH for-7.2 v2 18/20] device_node.c: enable 'info fdt' to print subnodes Daniel Henrique Barboza
2022-08-05  9:39 ` [PATCH for-7.2 v2 19/20] device_tree.c: add fdt_format_property() helper Daniel Henrique Barboza
2022-08-05  9:39 ` [PATCH for-7.2 v2 20/20] hmp, device_tree.c: add 'info fdt <property>' support Daniel Henrique Barboza
2022-08-15 18:38   ` Dr. David Alan Gilbert

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=2414971c-5e65-96f2-26ee-6d0a35823bdd@gmail.com \
    --to=danielhb413@gmail.com \
    --cc=alistair.francis@wdc.com \
    --cc=david@gibson.dropbear.id.au \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-arm@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).