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[0] = '/';
|
||||||
root->name[1] = '\0';
|
root->name[1] = '\0';
|
||||||
current_node = root;
|
current_node = root;
|
||||||
} else if (*node_name) {
|
break;
|
||||||
memcpy(current_node->name, node_name, strlen(node_name));
|
|
||||||
} else {
|
|
||||||
memcpy(current_node->name, "<anonymous>", sizeof("<anonymous>"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
current_node->children = alloc->alloc(alloc, sizeof(DTBNode));
|
DTBNode* new_node = alloc->alloc(alloc, sizeof(DTBNode));
|
||||||
if (current_node->children == NULL) {
|
if (new_node == NULL) {
|
||||||
error$("Failed to allocate memory for device tree node");
|
error$("Failed to allocate memory for device tree node");
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
current_node->children->parent = current_node;
|
memset(new_node, 0, sizeof(DTBNode));
|
||||||
current_node = current_node->children;
|
|
||||||
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case FDT_END_NODE: {
|
case FDT_END_NODE: {
|
||||||
current_node = current_node->parent;
|
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;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,9 +151,25 @@ DTBNode* dtb_lookup(DTBNode* root, char const* name) {
|
||||||
DTBNode* node = root->children;
|
DTBNode* node = root->children;
|
||||||
|
|
||||||
while (node->next != NULL) {
|
while (node->next != NULL) {
|
||||||
if (strncmp(name, node->name, strlen(node->name)) == 0) {
|
if (strncmp(name, node->name, strlen(name)) == 0) {
|
||||||
return node;
|
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;
|
return NULL;
|
||||||
|
|
|
@ -43,3 +43,5 @@ typedef struct _DTBNode {
|
||||||
DTBNode* dtb_init(uintptr_t dtb, Allocator* alloc);
|
DTBNode* dtb_init(uintptr_t dtb, Allocator* alloc);
|
||||||
|
|
||||||
DTBNode* dtb_lookup(DTBNode* root, char const* name);
|
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