fix: little in dtb, parenting was not handle properly
This commit is contained in:
parent
b414b986eb
commit
03341a4512
2 changed files with 44 additions and 19 deletions
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue