qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] device_tree: Add qemu_fdt_totalsize function


From: Peter Maydell
Subject: Re: [Qemu-devel] [PATCH] device_tree: Add qemu_fdt_totalsize function
Date: Sat, 5 May 2018 11:44:25 +0100

cc'ing David -- is this the best way to do this?

(It would be nicer if libfdt would just dynamically
reallocate the buffer as needed, and then tell you
the final size, rather than having to specify a
maximum buffer size up front, but given the API we
have a "tell me how big this thing actually is"
function seems reasonable. I'm just surprised we
need to know so much about the DT internals to do it.)

thanks
-- PMM

On 4 May 2018 at 02:19, Michael Clark <address@hidden> wrote:
> Currently the device-tree create_device_tree function
> returns the size of the allocated device tree buffer
> however there is no way to get the actual amount of
> buffer space used by the device-tree.
>
> 14ec3cbd7c1e31dca4d23f028100c8f43e156573 increases
> the FDT_MAX_SIZE to 1 MiB. This creates an issue
> for boards that have less than 1 MiB in their ROM
> for device tree. While cpu_physical_memory_write
> will not write past the end of a buffer there is
> and a board is aware of its ROM buffer size, so
> can use min(fdt_size,rom_size); this provides no
> indication as to whether the device-tree may be
> truncated. qemu_fdt_totalsize allows a board to
> check that a dynamically created device tree will
> fit within its alloted ROM space.
>
> Add qemu_fdt_totalsize which uses the logic and
> public APIs from libfdt to calculate the device
> size: struct_offset + struct_size + strings_size
> + terminator.
>
> Cc: Peter Crosthwaite <address@hidden>
> Cc: Alexander Graf <address@hidden>
> Cc: Alistair Francis <address@hidden>
> Cc: Peter Maydell <address@hidden>
> ---
>  device_tree.c                | 6 ++++++
>  include/sysemu/device_tree.h | 6 ++++++
>  2 files changed, 12 insertions(+)
>
> diff --git a/device_tree.c b/device_tree.c
> index 52c3358a5583..3a2166d61f37 100644
> --- a/device_tree.c
> +++ b/device_tree.c
> @@ -215,6 +215,12 @@ void *load_device_tree_from_sysfs(void)
>
>  #endif /* CONFIG_LINUX */
>
> +size_t qemu_fdt_totalsize(void *fdt)
> +{
> +    return fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt) +
> +           fdt_size_dt_strings(fdt) + sizeof(uint32_t) /* terminator */;
> +}
> +
>  static int findnode_nofail(void *fdt, const char *node_path)
>  {
>      int offset;
> diff --git a/include/sysemu/device_tree.h b/include/sysemu/device_tree.h
> index e22e5bec9c3f..4af232dfdc65 100644
> --- a/include/sysemu/device_tree.h
> +++ b/include/sysemu/device_tree.h
> @@ -26,6 +26,12 @@ void *load_device_tree_from_sysfs(void);
>  #endif
>
>  /**
> + * qemu_fdt_total_size: returns the size required to store the current
> + * device tree versus the buffer size returned by create_device_tree
> + */
> +size_t qemu_fdt_totalsize(void *fdt);
> +
> +/**
>   * qemu_fdt_node_path: return the paths of nodes matching a given
>   * name and compat string
>   * @fdt: pointer to the dt blob
> --
> 2.7.0



reply via email to

[Prev in Thread] Current Thread [Next in Thread]