opuntiaOS - an operating system targeting x86 and ARMv7
at master 1.4 kB view raw
1/* 2 * Copyright (C) 2020-2022 The opuntiaOS Project Authors. 3 * + Contributed by Nikita Melekhin <nimelehin@gmail.com> 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9#include "devtree.h" 10#include <libboot/mem/mem.h> 11 12static size_t _devtree_size = 0; 13static devtree_header_t* _devtree_header = NULL; 14static devtree_entry_t* _devtree_body = NULL; 15static char* _devtree_name_section = NULL; 16 17void* devtree_start() 18{ 19 return (void*)_devtree_header; 20} 21 22size_t devtree_size() 23{ 24 return _devtree_size; 25} 26 27int devtree_init(void* devtree, size_t size) 28{ 29 if (!devtree) { 30 return 0; 31 } 32 33 devtree_header_t* dth = (devtree_header_t*)devtree; 34 _devtree_header = dth; 35 _devtree_body = (devtree_entry_t*)&dth[1]; 36 _devtree_name_section = ((char*)dth + dth->name_list_offset); 37 _devtree_size = size; 38 return 0; 39} 40 41const char* devtree_name_of_entry(devtree_entry_t* en) 42{ 43 return &_devtree_name_section[en->rel_name_offset]; 44} 45 46devtree_entry_t* devtree_find_device(const char* name) 47{ 48 if (!_devtree_body) { 49 return NULL; 50 } 51 52 for (int i = 0; i < _devtree_header->entries_count; i++) { 53 const char* curdev_name = devtree_name_of_entry(&_devtree_body[i]); 54 if (strcmp(curdev_name, name) == 0) { 55 return &_devtree_body[i]; 56 } 57 } 58 return NULL; 59}