1 /*
2  * Copyright (c) 2006-2023, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 #include "libfdt.h"
7 #include <stdio.h>
8 #include <unistd.h>
9 #include "dtb_node.h"
10 
11 extern int fdt_exec_status;
12 
dtb_node_check(void * fdt)13 rt_bool_t dtb_node_check(void *fdt)
14 {
15     return fdt_check_header(fdt) == 0 ? RT_TRUE : RT_FALSE;
16 }
17 
dtb_node_load_from_fs(char * dtb_filename)18 void *dtb_node_load_from_fs(char *dtb_filename)
19 {
20     void *fdt = NULL;
21     size_t dtb_sz;
22     int fd = -1;
23 
24     if (dtb_filename == NULL)
25     {
26         fdt_exec_status = FDT_RET_GET_EMPTY;
27         goto end;
28     }
29 
30     fd = open(dtb_filename, O_RDONLY, 0);
31 
32     if (fd == -1)
33     {
34         rt_kprintf("File `%s' not found.\n", dtb_filename);
35         fdt_exec_status = FDT_RET_GET_EMPTY;
36         goto end;
37     }
38 
39     dtb_sz = lseek(fd, 0, SEEK_END);
40 
41     if (dtb_sz > 0)
42     {
43         if ((fdt = (struct fdt_header *)malloc(sizeof(uint8_t) * dtb_sz)) == NULL)
44         {
45             fdt_exec_status = FDT_RET_NO_MEMORY;
46             goto end;
47         }
48 
49         lseek(fd, 0, SEEK_SET);
50         read(fd, fdt, sizeof(uint8_t) * dtb_sz);
51 
52         if (dtb_node_check(fdt) == RT_FALSE)
53         {
54             free(fdt);
55             fdt=NULL;
56         }
57     }
58 
59 end:
60     if (fd != -1)
61     {
62         close(fd);
63     }
64 
65     return fdt;
66 }
67 
dtb_node_load_from_memory(void * dtb_ptr,rt_bool_t is_clone)68 void *dtb_node_load_from_memory(void *dtb_ptr, rt_bool_t is_clone)
69 {
70     void *fdt = NULL;
71 
72     if (dtb_ptr == NULL)
73     {
74         fdt_exec_status = FDT_RET_GET_EMPTY;
75         goto end;
76     }
77 
78     if (dtb_node_check(dtb_ptr) == RT_FALSE)
79     {
80         fdt_exec_status = FDT_RET_GET_EMPTY;
81         fdt = NULL;
82         goto end;
83     }
84 
85     if (is_clone)
86     {
87         size_t dtb_sz = fdt_totalsize(dtb_ptr);
88         if (dtb_sz > 0)
89         {
90             if ((fdt = (size_t *)malloc(dtb_sz)) != NULL)
91             {
92                 memcpy(fdt, dtb_ptr, dtb_sz);
93             }
94             else
95             {
96                 fdt_exec_status = FDT_RET_NO_MEMORY;
97             }
98         }
99     }
100     else
101     {
102         fdt = dtb_ptr;
103     }
104 
105 end:
106     return fdt;
107 }
108