fix: little in dtb, parenting was not handle properly

This commit is contained in:
Jordan ⌨️ 2025-04-20 14:54:28 +02:00
parent b414b986eb
commit 03341a4512
2 changed files with 44 additions and 19 deletions

View file

@ -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, "<anonymous>", sizeof("<anonymous>"));
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, "<anonymous>", sizeof("<anonymous>"));
}
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;

View file

@ -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);