mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-28 12:53:14 +01:00
kho: fix kho_in_debugfs_init() to handle non-FDT blobs
kho_in_debugfs_init() calls fdt_totalsize() to determine blob sizes, which assumes all blobs are FDTs. This breaks for non-FDT blobs like struct kho_kexec_metadata. Fix this by reading the "blob-size" property from the FDT (persisted by kho_add_subtree()) instead of calling fdt_totalsize(). Also rename local variables from fdt_phys/sub_fdt to blob_phys/blob for consistency with the non-FDT-specific naming. Link: https://lore.kernel.org/[email protected] Signed-off-by: Breno Leitao <[email protected]> Reviewed-by: Pratyush Yadav <[email protected]> Cc: Alexander Graf <[email protected]> Cc: David Hildenbrand <[email protected]> Cc: Jonathan Corbet <[email protected]> Cc: "Liam R. Howlett" <[email protected]> Cc: Lorenzo Stoakes <[email protected]> Cc: Michal Hocko <[email protected]> Cc: Mike Rapoport (Microsoft) <[email protected]> Cc: Pasha Tatashin <[email protected]> Cc: SeongJae Park <[email protected]> Cc: Shuah Khan <[email protected]> Cc: Suren Baghdasaryan <[email protected]> Cc: Vlastimil Babka <[email protected]> Signed-off-by: Andrew Morton <[email protected]>
This commit is contained in:
1 parent
85e4139282
commit
062dd306d9
1 file changed
+21
-11
@@ -122,24 +122,34 @@ __init void kho_in_debugfs_init(struct kho_debugfs *dbg, const void *fdt)
|
||||
fdt_for_each_subnode(child, fdt, 0) {
|
||||
int len = 0;
|
||||
const char *name = fdt_get_name(fdt, child, NULL);
|
||||
const u64 *fdt_phys;
|
||||
void *sub_fdt;
|
||||
const u64 *blob_phys;
|
||||
const u64 *blob_size;
|
||||
void *blob;
|
||||
|
||||
fdt_phys = fdt_getprop(fdt, child,
|
||||
blob_phys = fdt_getprop(fdt, child,
|
||||
KHO_SUB_TREE_PROP_NAME, &len);
|
||||
if (!fdt_phys)
|
||||
if (!blob_phys)
|
||||
continue;
|
||||
if (len != sizeof(*fdt_phys)) {
|
||||
pr_warn("node %s prop fdt has invalid length: %d\n",
|
||||
name, len);
|
||||
if (len != sizeof(*blob_phys)) {
|
||||
pr_warn("node %s prop %s has invalid length: %d\n",
|
||||
name, KHO_SUB_TREE_PROP_NAME, len);
|
||||
continue;
|
||||
}
|
||||
sub_fdt = phys_to_virt(*fdt_phys);
|
||||
|
||||
blob_size = fdt_getprop(fdt, child,
|
||||
KHO_SUB_TREE_SIZE_PROP_NAME, &len);
|
||||
if (!blob_size || len != sizeof(*blob_size)) {
|
||||
pr_warn("node %s missing or invalid %s property\n",
|
||||
name, KHO_SUB_TREE_SIZE_PROP_NAME);
|
||||
continue;
|
||||
}
|
||||
|
||||
blob = phys_to_virt(*blob_phys);
|
||||
err = __kho_debugfs_blob_add(&dbg->fdt_list, sub_fdt_dir, name,
|
||||
sub_fdt, fdt_totalsize(sub_fdt));
|
||||
blob, *blob_size);
|
||||
if (err) {
|
||||
pr_warn("failed to add fdt %s to debugfs: %pe\n", name,
|
||||
ERR_PTR(err));
|
||||
pr_warn("failed to add blob %s to debugfs: %pe\n",
|
||||
name, ERR_PTR(err));
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user