From cb3ea122d3c5d2ad41eff682dd5f78e0e1193d10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Revol?= Date: Mon, 3 Nov 2014 19:38:41 +0100 Subject: [PATCH] U-Boot: delay checking /chosen:bootargs after remapping FDT This avoids having to copy the strings. For now we disregard argv[] as it is not remapped before being used in add_stage2_driver_settings() and is not used by the linux entry point. This makes the overo loader panic at the same place as the beagle xm one now, even though it fails to display anything with the default RAM size since we allocate the framebuffer beyond 128MB... --- src/system/boot/platform/u-boot/start.cpp | 39 ++++++++++++++++------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/src/system/boot/platform/u-boot/start.cpp b/src/system/boot/platform/u-boot/start.cpp index 655667579c..7bcbdea8b7 100644 --- a/src/system/boot/platform/u-boot/start.cpp +++ b/src/system/boot/platform/u-boot/start.cpp @@ -133,7 +133,6 @@ start_netbsd(struct board_info *bd, struct image_header *image, { const char *argv[] = { "haiku", cmdline }; int argc = 1; - // TODO: Ensure cmdline is mapped into memory by MMU before usage. if (cmdline && *cmdline) argc++; return start_gen(argc, argv, image); @@ -193,9 +192,10 @@ start_gen(int argc, const char **argv, struct image_header *uimage, void *fdt) if (argv) { // skip the kernel name - args.arguments = ++argv; - args.arguments_count = --argc; + ++argv; + --argc; } + // TODO: Ensure cmdline is mapped into memory by MMU before usage. // if we get passed a uimage, try to find the third blob // only if we do not have FDT data yet @@ -236,14 +236,7 @@ start_gen(int argc, const char **argv, struct image_header *uimage, void *fdt) dprintf("Found boot tgz from FDT @ %p, %" B_PRIu32 " bytes\n", args.platform.boot_tgz_data, args.platform.boot_tgz_size); } - prop = fdt_getprop(gFDT, node, "bootargs", &len); - if (prop) { - dprintf("Found bootargs: %s\n", (const char *)prop); - static const char *sArgs[] = { NULL, NULL }; - sArgs[0] = (const char *)prop; - args.arguments = sArgs; - args.arguments_count = 1; - } + // we check for bootargs after remapping the FDT } } @@ -292,6 +285,30 @@ start_gen(int argc, const char **argv, struct image_header *uimage, void *fdt) if (gFDT != NULL) gFDT = (void*)mmu_map_physical_memory((addr_t)gFDT, fdtSize, kDefaultPageFlags); + // if we get passed an FDT, check /chosen for bootargs now + // to avoid having to copy them. + if (gFDT != NULL) { + int node = fdt_path_offset(gFDT, "/chosen"); + const void *prop; + int len; + + if (node >= 0) { + prop = fdt_getprop(gFDT, node, "bootargs", &len); + if (prop) { + dprintf("Found bootargs: %s\n", (const char *)prop); + static const char *sArgs[] = { NULL, NULL }; + sArgs[0] = (const char *)prop; + // override main() args + args.arguments = sArgs; + args.arguments_count = 1; + } + } + dprintf("args.arguments_count = %d\n", args.arguments_count); + for (int i = 0; i < args.arguments_count; i++) + dprintf("args.arguments[%d] @%lx = '%s'\n", i, + (uint32)args.arguments[i], args.arguments[i]); + } + // wait a bit to give the user the opportunity to press a key // spin(750000);