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 <crosthwaite.pe...@gmail.com> Cc: Alexander Graf <ag...@suse.de> Cc: Alistair Francis <alistair.fran...@wdc.com> Cc: Peter Maydell <peter.mayd...@linaro.org> --- 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