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:
committed by
Adrien Destugues
parent
4a6c01c33f
commit
cd9b0eed94
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
|
|
||||||
extern void dtb_init();
|
extern void dtb_init();
|
||||||
|
extern void dtb_set_kernel_args();
|
||||||
|
|
||||||
|
|
||||||
#endif /* !_ASSEMBLER */
|
#endif /* !_ASSEMBLER */
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user