Skip to content

Commit 6cf45a4

Browse files
committed
efi: linuxloader: move to libufdt, allow null dtbo
1 parent 327e9e3 commit 6cf45a4

3 files changed

Lines changed: 38 additions & 23 deletions

File tree

droidbootPlatformsLib.inf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
UefiRuntimeServicesTableLib
3737
ReportStatusCodeLib
3838
droidbootLib
39+
UfdtLib
3940

4041
[Sources]
4142
uefi/common/droidboot_uefi_common.c

uefi/common_linuxloader/common_linuxloader.c

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
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

uefi/common_linuxloader/common_linuxloader.inf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
[LibraryClasses]
1414
UefiLib
15+
UfdtLib
1516

1617
[Sources]
1718
common_linuxloader.c

0 commit comments

Comments
 (0)