2020#include <string.h>
2121#include <droidboot_dtb.h>
2222#include <droidboot_kernel_helper.h>
23+ #include <droidboot_ufdt_overlay.h>
2324
2425#include "linux-boot/arm.h"
2526
@@ -104,13 +105,36 @@ void droidboot_internal_boot_linux_from_ram(void *kernel_raw, off_t kernel_raw_s
104105
105106 // Reallocate DTB
106107 // NOTE: Here we do change dtb size by adding 512 bytes for our extras, 4096 for cmdline, to make sure we have space for cmdline, memory node and initrd addr
107- dtb_raw_size += 512 + fdt_totalsize (dtbo_raw )+ 4096 ;
108+ if (dtbo_raw == NULL )
109+ dtb_raw_size += 512 + 4096 ;
110+ else
111+ dtb_raw_size += 512 + fdt_totalsize (dtbo_raw )+ 4096 ;
108112 mem_pages = EFI_SIZE_TO_PAGES (ALIGN_VALUE (dtb_raw_size ,MEM_ALIGN ));
109113 mem_size = EFI_PAGES_TO_SIZE (mem_pages );
110114 if (!(dtb_address = AllocateAlignedPages (mem_pages ,MEM_ALIGN )))
111115 droidboot_log (DROIDBOOT_LOG_ERROR , "dtb alloc failed\n" );
112116 ZeroMem (dtb_address ,mem_size );
113- CopyMem (dtb_address ,dtb_raw ,dtb_raw_size - 512 - fdt_totalsize (dtbo_raw )- 4096 );
117+ // Append dtbo
118+ if (dtbo_raw == NULL )
119+ CopyMem (dtb_address ,dtb_raw ,dtb_raw_size );
120+ else {
121+ unsigned char * header_ptr = (unsigned char * )dtbo_raw ;
122+ droidboot_dump_hex (DROIDBOOT_LOG_TRACE , dtbo_raw , 16 );
123+ if (fdt_totalsize (dtbo_raw )<=4 || fdt_totalsize (dtbo_raw )> MAX_DTBO_SIZE ){
124+ CopyMem (dtb_address ,dtb_raw ,dtb_raw_size );
125+ droidboot_log (DROIDBOOT_LOG_ERROR , "invalid dtbo size\n" );
126+ } else {
127+ const uint32_t magic_dtbo = 0xd0dfeed ;
128+ if (memcmp (dtbo_raw , & magic_dtbo , 4 )){
129+ struct fdt_header * fdto = ufdt_apply_overlay (dtb_raw ,fdt_totalsize (dtb_raw ),dtbo_raw ,fdt_totalsize (dtbo_raw ));
130+ CopyMem (dtb_address ,fdto ,fdt_totalsize (fdto ));
131+ droidboot_log (DROIDBOOT_LOG_INFO , "Dtb overlay aplied\n" );
132+ } else {
133+ CopyMem (dtb_address ,dtb_raw ,dtb_raw_size );
134+ droidboot_log (DROIDBOOT_LOG_ERROR , "dtbo wrong signature, ecepted: %llx, got: %x%x%x %x\n" , magic_dtbo , header_ptr [0 ], header_ptr [1 ], header_ptr [2 ], header_ptr [3 ]);
135+ }
136+ }
137+ }
114138 droidboot_log (DROIDBOOT_LOG_INFO , "dtb reallocation done, old addr: %p new: %p, new size: %llx\n" , dtb_raw , dtb_address , dtb_raw_size );
115139
116140 // Update size in dtb itself
@@ -122,32 +146,21 @@ void droidboot_internal_boot_linux_from_ram(void *kernel_raw, off_t kernel_raw_s
122146 if (r != 0 ){
123147 droidboot_log (DROIDBOOT_LOG_ERROR , "invalid dtb head: %s\n" ,fdt_strerror (r ));
124148 }
125- r = fdt_check_header (dtbo_raw );
126- if (r != 0 ){
127- droidboot_log (DROIDBOOT_LOG_ERROR ,"invalid dtbo head: %s\n" ,fdt_strerror (r ));
149+ if (dtbo_raw != NULL ){
150+ r = fdt_check_header (dtbo_raw );
151+ if (r != 0 ){
152+ droidboot_log (DROIDBOOT_LOG_ERROR ,"invalid dtbo head: %s\n" ,fdt_strerror (r ));
153+ }
128154 }
129155 droidboot_log (DROIDBOOT_LOG_INFO ,"dtb totalsize is: %d\n" ,fdt_totalsize (dtb_address ));
130- droidboot_log (DROIDBOOT_LOG_INFO ,"dtbo totalsize is: %d\n" ,fdt_totalsize (dtbo_raw ));
156+ if (dtbo_raw != NULL )
157+ droidboot_log (DROIDBOOT_LOG_INFO ,"dtbo totalsize is: %d\n" ,fdt_totalsize (dtbo_raw ));
131158
132159 if ((model = (char * )fdt_getprop (dtb_address ,0 ,"model" ,NULL )))
133160 droidboot_log (DROIDBOOT_LOG_INFO , "dtb device model: %s\n" ,model );
134- if ((model = (char * )fdt_getprop (dtbo_raw ,0 ,"model" ,NULL )))
135- droidboot_log (DROIDBOOT_LOG_INFO , "dtbo device model: %s\n" ,model );
136-
137- // Append dtbo
138- unsigned char * header_ptr = (unsigned char * )dtbo_raw ;
139- droidboot_dump_hex (DROIDBOOT_LOG_TRACE , dtbo_raw , 16 );
140- if (fdt_totalsize (dtbo_raw )<=4 || fdt_totalsize (dtbo_raw )> MAX_DTBO_SIZE ){
141- droidboot_log (DROIDBOOT_LOG_ERROR , "invalid dtbo size\n" );
142- } else {
143- const uint32_t magic_dtbo = 0xd0dfeed ;
144- if (memcmp (dtbo_raw , & magic_dtbo , 4 )){
145- r = fdt_overlay_apply (dtb_address ,dtbo_raw );
146- if (r != 0 ){
147- droidboot_log (DROIDBOOT_LOG_ERROR , "Failed to apply dtbo overlay, error: %s\n" , fdt_strerror (r ));
148- }
149- droidboot_log (DROIDBOOT_LOG_INFO , "Dtb overlay aplied\n" );
150- } else droidboot_log (DROIDBOOT_LOG_ERROR , "dtbo wrong signature, ecepted: %llx, got: %x%x%x %x\n" , magic_dtbo , header_ptr [0 ], header_ptr [1 ], header_ptr [2 ], header_ptr [3 ]);
161+ if (dtbo_raw != NULL ){
162+ if ((model = (char * )fdt_getprop (dtbo_raw ,0 ,"model" ,NULL )))
163+ droidboot_log (DROIDBOOT_LOG_INFO , "dtbo device model: %s\n" ,model );
151164 }
152165
153166 // Update fdt
0 commit comments