From 03341a45127dfca738deb481898736de53ddda4e Mon Sep 17 00:00:00 2001 From: keyb Date: Sun, 20 Apr 2025 14:54:28 +0200 Subject: [PATCH] fix: little in dtb, parenting was not handle properly --- src/libs/dtb/mod.c | 61 +++++++++++++++++++++++++++++++--------------- src/libs/dtb/mod.h | 2 ++ 2 files changed, 44 insertions(+), 19 deletions(-) diff --git a/src/libs/dtb/mod.c b/src/libs/dtb/mod.c index 7f59212..aaf074d 100644 --- a/src/libs/dtb/mod.c +++ b/src/libs/dtb/mod.c @@ -49,34 +49,41 @@ static DTBNode* dtb_parse(FDTHeader* dtb_header, Allocator* alloc) { root->name[0] = '/'; root->name[1] = '\0'; current_node = root; - } else if (*node_name) { - memcpy(current_node->name, node_name, strlen(node_name)); - } else { - memcpy(current_node->name, "", sizeof("")); + break; } - current_node->children = alloc->alloc(alloc, sizeof(DTBNode)); - if (current_node->children == NULL) { + DTBNode* new_node = alloc->alloc(alloc, sizeof(DTBNode)); + if (new_node == NULL) { error$("Failed to allocate memory for device tree node"); abort(); } - current_node->children->parent = current_node; - current_node = current_node->children; + memset(new_node, 0, sizeof(DTBNode)); + + if (*node_name) { + memcpy(new_node->name, node_name, strlen(node_name)); + } else { + memcpy(new_node->name, "", sizeof("")); + } + + new_node->parent = current_node; + + if (current_node->children == NULL) { + current_node->children = new_node; + } else { + DTBNode* last_child = current_node->children; + while (last_child->next != NULL) { + last_child = last_child->next; + } + last_child->next = new_node; + } + + current_node = new_node; break; } case FDT_END_NODE: { - current_node = current_node->parent; - current_node->next = alloc->alloc(alloc, sizeof(DTBNode)); - if (current_node->next == NULL) { - error$("Failed to allocate memory for device tree node"); - abort(); - } - - memset(current_node->next, 0, sizeof(DTBNode)); - current_node->next->parent = current_node->parent; - current_node = current_node->next; + current_node = current_node->parent; break; } @@ -144,9 +151,25 @@ DTBNode* dtb_lookup(DTBNode* root, char const* name) { DTBNode* node = root->children; while (node->next != NULL) { - if (strncmp(name, node->name, strlen(node->name)) == 0) { + if (strncmp(name, node->name, strlen(name)) == 0) { return node; } + + node = node->next; + } + + return NULL; +} + +DTBProp* dtb_lookup_prop(DTBNode* node, char const* name) { + DTBProp* prop = node->props; + + while (prop != NULL) { + if (strncmp(name, prop->name, strlen(name)) == 0) { + return prop; + } + + prop = prop->next; } return NULL; diff --git a/src/libs/dtb/mod.h b/src/libs/dtb/mod.h index 6157f76..5ef0189 100644 --- a/src/libs/dtb/mod.h +++ b/src/libs/dtb/mod.h @@ -43,3 +43,5 @@ typedef struct _DTBNode { DTBNode* dtb_init(uintptr_t dtb, Allocator* alloc); DTBNode* dtb_lookup(DTBNode* root, char const* name); + +DTBProp* dtb_lookup_prop(DTBNode* node, char const* name);