efi/dtb: Fix dtb malloc failed for kernel args

kernel_args_malloc should be used after heap_init, or it will failed
when we new some region instance.

Change-Id: I457057b1e0ff6d4def9e101485e38fec1848d8de
Signed-off-by: Han Pengfei <[email protected]>
Reviewed-on: https://review.haiku-os.org/c/haiku/+/3912
Reviewed-by: Alex von Gluck IV <[email protected]>
Reviewed-by: Adrien Destugues <[email protected]>
This commit is contained in:
Han Pengfei
2021-05-17 08:45:37 +00:00
committed by Adrien Destugues
parent 4a6c01c33f
commit cd9b0eed94
3 changed files with 23 additions and 6 deletions
+21 -6
View File
@@ -21,6 +21,10 @@
#define ERROR(x...) dprintf("efi/fdt: " x) #define ERROR(x...) dprintf("efi/fdt: " x)
static void* sDtbTable = NULL;
static uint32 sDtbSize = 0;
static bool static bool
fdt_valid(void* fdt, uint32* size) fdt_valid(void* fdt, uint32* size)
{ {
@@ -56,16 +60,27 @@ dtb_init()
if (!fdt_valid(dtbPtr, &fdtSize)) { if (!fdt_valid(dtbPtr, &fdtSize)) {
ERROR("Invalid FDT from UEFI table %d\n", i); ERROR("Invalid FDT from UEFI table %d\n", i);
break; break;
} else {
INFO("Valid FDT from UEFI table %d (%d)\n", i, fdtSize);
sDtbTable = dtbPtr;
sDtbSize = fdtSize;
break;
} }
}
}
INFO("Valid FDT from UEFI table %d (%d)\n", i, fdtSize);
// pack into proper location if the architecture cares void
dtb_set_kernel_args()
{
// pack into proper location if the architecture cares
if (sDtbTable != NULL) {
#ifdef __ARM__ #ifdef __ARM__
gKernelArgs.arch_args.fdt = kernel_args_malloc(fdtSize); gKernelArgs.arch_args.fdt = kernel_args_malloc(sDtbSize);
if (gKernelArgs.arch_args.fdt != NULL) { if (gKernelArgs.arch_args.fdt != NULL)
memcpy(gKernelArgs.arch_args.fdt, dtbPtr, fdtSize); memcpy(gKernelArgs.arch_args.fdt, sDtbTable, sDtbSize);
} else else
ERROR("unable to malloc for fdt!\n"); ERROR("unable to malloc for fdt!\n");
#endif #endif
} }
+1
View File
@@ -13,6 +13,7 @@
extern void dtb_init(); extern void dtb_init();
extern void dtb_set_kernel_args();
#endif /* !_ASSEMBLER */ #endif /* !_ASSEMBLER */
+1
View File
@@ -146,6 +146,7 @@ extern "C" void
platform_start_kernel(void) platform_start_kernel(void)
{ {
smp_init_other_cpus(); smp_init_other_cpus();
dtb_set_kernel_args();
addr_t kernelEntry = get_kernel_entry(); addr_t kernelEntry = get_kernel_entry();