diff --git a/src/system/boot/platform/bios_ia32/Jamfile b/src/system/boot/platform/bios_ia32/Jamfile index 501a663d49..c736ad5b20 100644 --- a/src/system/boot/platform/bios_ia32/Jamfile +++ b/src/system/boot/platform/bios_ia32/Jamfile @@ -26,7 +26,7 @@ local genericPlatformSources = KernelMergeObject boot_platform_bios_ia32.o : shell.S - start.c + start.cpp debug.cpp bios.S console.cpp diff --git a/src/system/boot/platform/bios_ia32/start.c b/src/system/boot/platform/bios_ia32/start.cpp similarity index 95% rename from src/system/boot/platform/bios_ia32/start.c rename to src/system/boot/platform/bios_ia32/start.cpp index 3542128a39..9f259578d8 100644 --- a/src/system/boot/platform/bios_ia32/start.c +++ b/src/system/boot/platform/bios_ia32/start.cpp @@ -35,8 +35,8 @@ extern void (*__ctor_end)(void); extern uint8 __bss_start; extern uint8 _end; -extern int main(stage2_args *args); -void _start(void); +extern "C" int main(stage2_args *args); +extern "C" void _start(void); uint32 sBootOptions; @@ -60,7 +60,7 @@ call_ctors(void) } -uint32 +extern "C" uint32 platform_boot_options(void) { #if 0 @@ -71,7 +71,7 @@ platform_boot_options(void) } -void +extern "C" void platform_start_kernel(void) { static struct kernel_args *args = &gKernelArgs; @@ -103,7 +103,7 @@ platform_start_kernel(void) } -void +extern "C" void platform_exit(void) { // reset the system using the keyboard controller @@ -111,7 +111,7 @@ platform_exit(void) } -void +extern "C" void _start(void) { stage2_args args; diff --git a/src/system/boot/platform/openfirmware/Jamfile b/src/system/boot/platform/openfirmware/Jamfile index 00c2b6d702..09196bfa64 100644 --- a/src/system/boot/platform/openfirmware/Jamfile +++ b/src/system/boot/platform/openfirmware/Jamfile @@ -4,7 +4,7 @@ SubDirC++Flags -D_BOOT_MODE -fno-rtti ; KernelMergeObject boot_platform_openfirmware.o : console.cpp - debug.c + debug.cpp devices.cpp Handle.cpp heap.cpp @@ -12,7 +12,7 @@ KernelMergeObject boot_platform_openfirmware.o : mmu.cpp network.cpp real_time_clock.cpp - start.c + start.cpp support.cpp video.cpp diff --git a/src/system/boot/platform/openfirmware/debug.c b/src/system/boot/platform/openfirmware/debug.cpp similarity index 58% rename from src/system/boot/platform/openfirmware/debug.c rename to src/system/boot/platform/openfirmware/debug.cpp index 351aa050aa..e24a692924 100644 --- a/src/system/boot/platform/openfirmware/debug.c +++ b/src/system/boot/platform/openfirmware/debug.cpp @@ -1,22 +1,20 @@ /* - * Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved. + * Copyright 2003-2010, Axel Dörfler, axeld@pinc-software.de. * Distributed under the terms of the MIT License. */ +#include + #include #include #include -#include -/** ToDo: this works only after console_init() was called. - * But it probably should do something before as well... - */ - -void -panic(const char *format, ...) +extern "C" void +panic(const char* format, ...) { + // TODO: this works only after console_init() was called. va_list list; puts("*** PANIC ***"); @@ -29,8 +27,8 @@ panic(const char *format, ...) } -void -dprintf(const char *format, ...) +extern "C" void +dprintf(const char* format, ...) { va_list list; diff --git a/src/system/boot/platform/openfirmware/start.c b/src/system/boot/platform/openfirmware/start.cpp similarity index 90% rename from src/system/boot/platform/openfirmware/start.c rename to src/system/boot/platform/openfirmware/start.cpp index 7a8dc2e46b..7d67729b13 100644 --- a/src/system/boot/platform/openfirmware/start.c +++ b/src/system/boot/platform/openfirmware/start.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2005, Axel Dörfler, axeld@pinc-software.de. All rights reserved. + * Copyright 2003-2010, Axel Dörfler, axeld@pinc-software.de. * Distributed under the terms of the MIT License. */ @@ -21,8 +21,9 @@ #define HEAP_SIZE 65536 -void _start(uint32 _unused1, uint32 _unused2, void *openFirmwareEntry); -void start(void *openFirmwareEntry); +extern "C" void _start(uint32 _unused1, uint32 _unused2, + void *openFirmwareEntry); +extern "C" void start(void *openFirmwareEntry); // GCC defined globals extern void (*__ctor_list)(void); @@ -79,7 +80,7 @@ determine_machine(void) } -void +extern "C" void platform_start_kernel(void) { addr_t kernelEntry = gKernelArgs.kernel_image.elf_header.e_entry; @@ -100,14 +101,14 @@ platform_start_kernel(void) } -void +extern "C" void platform_exit(void) { of_interpret("reset-all", 0, 0); } -uint32 +extern "C" uint32 platform_boot_options(void) { // ToDo: implement me! @@ -115,7 +116,7 @@ platform_boot_options(void) } -void +extern "C" void _start(uint32 _unused1, uint32 _unused3, void *openFirmwareEntry) { // According to the PowerPC bindings, OpenFirmware should have created @@ -129,7 +130,7 @@ _start(uint32 _unused1, uint32 _unused3, void *openFirmwareEntry) } -void +extern "C" void start(void *openFirmwareEntry) { char bootargs[512]; @@ -139,7 +140,7 @@ start(void *openFirmwareEntry) args.heap_size = HEAP_SIZE; args.arguments = NULL; - of_init(openFirmwareEntry); + of_init((int (*)(void*))openFirmwareEntry); // check for arguments if (of_getprop(gChosen, "bootargs", bootargs, sizeof(bootargs)) != OF_FAILED) { @@ -169,4 +170,3 @@ start(void *openFirmwareEntry) of_exit(); } - diff --git a/src/system/boot/platform/pxe_ia32/Jamfile b/src/system/boot/platform/pxe_ia32/Jamfile index 6921ca3cfd..748c0e341e 100644 --- a/src/system/boot/platform/pxe_ia32/Jamfile +++ b/src/system/boot/platform/pxe_ia32/Jamfile @@ -25,7 +25,7 @@ local genericPlatformSources = ; local bios_ia32_src = - start.c + start.cpp debug.cpp bios.S console.cpp diff --git a/src/system/boot/platform/u-boot/Jamfile b/src/system/boot/platform/u-boot/Jamfile index aa7a0f2a33..2946e96bde 100644 --- a/src/system/boot/platform/u-boot/Jamfile +++ b/src/system/boot/platform/u-boot/Jamfile @@ -9,7 +9,7 @@ UsePrivateHeaders [ FDirName graphics common ] ; UsePrivateHeaders [ FDirName graphics vesa ] ; UsePrivateHeaders [ FDirName storage ] ; -# XXX: FIXME! move this to arch/arm ! +# TODO: move this to arch/arm ! UsePrivateHeaders [ FDirName kernel arch arm board $(TARGET_BOOT_BOARD) ] ; @@ -36,8 +36,8 @@ local genericPlatformSources = KernelMergeObject boot_platform_u-boot.o : shell.S - start2.c - debug.c + start2.cpp + debug.cpp console.cpp serial.cpp devices.cpp diff --git a/src/system/boot/platform/u-boot/debug.c b/src/system/boot/platform/u-boot/debug.cpp similarity index 83% rename from src/system/boot/platform/u-boot/debug.c rename to src/system/boot/platform/u-boot/debug.cpp index 23094c0009..bb412eccf8 100644 --- a/src/system/boot/platform/u-boot/debug.c +++ b/src/system/boot/platform/u-boot/debug.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2004-2007, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2004-2010, Axel Dörfler, axeld@pinc-software.de. * Distributed under the terms of the MIT License. */ @@ -14,8 +14,8 @@ /*! This works only after console_init() was called. */ -void -panic(const char *format, ...) +extern "C" void +panic(const char* format, ...) { va_list list; @@ -35,8 +35,8 @@ panic(const char *format, ...) } -void -dprintf(const char *format, ...) +extern "C" void +dprintf(const char* format, ...) { char buffer[512]; va_list list; @@ -54,4 +54,3 @@ dprintf(const char *format, ...) if (platform_boot_options() & BOOT_OPTION_DEBUG_OUTPUT) fprintf(stderr, "%s", buffer); } - diff --git a/src/system/boot/platform/u-boot/start2.c b/src/system/boot/platform/u-boot/start2.cpp similarity index 74% rename from src/system/boot/platform/u-boot/start2.c rename to src/system/boot/platform/u-boot/start2.cpp index 50116af92d..9d035b60a7 100644 --- a/src/system/boot/platform/u-boot/start2.c +++ b/src/system/boot/platform/u-boot/start2.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2003-2010, Axel Dörfler, axeld@pinc-software.de. * Distributed under the terms of the MIT License. */ @@ -7,6 +7,7 @@ #include "serial.h" #include "console.h" #include "cpu.h" +#include "mmu.h" #include "smp.h" #include "uimage.h" #include "keyboard.h" @@ -17,26 +18,43 @@ #include #include - #include #define HEAP_SIZE (128 * 1024) + +typedef struct uboot_arm_gd { + struct board_data *bd; + uint32 flags; + uint32 baudrate; + uint32 have_console; + uint32 reloc_off; + uint32 env_addr; + uint32 env_valid; + uint32 fb_base; +} uboot_arm_gd; + + // GCC defined globals extern void (*__ctor_list)(void); extern void (*__ctor_end)(void); extern uint8 __bss_start; extern uint8 _end; -extern int main(stage2_args *args); -extern void _start(void); -extern int start_raw(int argc, char **argv); -extern void dump_uimage(struct image_header *image); +extern "C" int main(stage2_args *args); +extern "C" void _start(void); +extern "C" int start_raw(int argc, const char **argv); +extern "C" void dump_uimage(struct image_header *image); + extern struct image_header *gUImage; +extern uboot_arm_gd *gUBootGlobalData; +extern uint8 gUBootOS; -uint32 sBootOptions; +register volatile uboot_arm_gd *gGD asm ("r8"); + +static uint32 sBootOptions; static void @@ -58,14 +76,14 @@ call_ctors(void) /* needed for libgcc unwind XXX */ -void +extern "C" void abort(void) { panic("abort"); } -void +extern "C" void platform_start_kernel(void) { static struct kernel_args *args = &gKernelArgs; @@ -83,11 +101,11 @@ platform_start_kernel(void) dprintf("kernel entry at %lx\n", gKernelArgs.kernel_image.elf_header.e_entry); - - asm( "MOV sp, %[adr]"::[adr] "r" (stackTop) ); - asm( "MOV r0, %[args]"::[args] "r" (args) ); - asm( "MOV r1, #0"::); - asm( "MOV pc, %[entry]"::[entry] "r" (gKernelArgs.kernel_image.elf_header.e_entry)); + asm("MOV sp, %[adr]"::[adr] "r" (stackTop)); + asm("MOV r0, %[args]"::[args] "r" (args)); + asm("MOV r1, #0"::); + asm("MOV pc, %[entry]"::[entry] "r" + (gKernelArgs.kernel_image.elf_header.e_entry)); /* asm("movl %0, %%eax; " // move stack out of way "movl %%eax, %%esp; " @@ -103,47 +121,34 @@ platform_start_kernel(void) } -void +extern "C" void platform_exit(void) { } -typedef struct uboot_arm_gd { - struct board_data *bd; - uint32 flags; - uint32 baudrate; - uint32 have_console; - uint32 reloc_off; - uint32 env_addr; - uint32 env_valid; - uint32 fb_base; -} uboot_arm_gd; - -register volatile uboot_arm_gd *gGD asm ("r8"); -extern uboot_arm_gd *gUBootGlobalData; -extern uint8 gUBootOS; - -int -start_netbsd(struct board_info *bd, struct image_header *image, const char *consdev, - const char *cmdline) +extern "C" int +start_netbsd(struct board_info *bd, struct image_header *image, + const char *consdev, const char *cmdline) { const char *argv[] = { "haiku", cmdline }; int argc = 1; if (cmdline) argc++; gUImage = image; - start_raw(argc, argv); + return start_raw(argc, argv); } -int + +extern "C" int start_linux(int argc, int archnum, void *atags) { + return 1; } -int -start_raw(int argc, char **argv) +extern "C" int +start_raw(int argc, const char **argv) { stage2_args args; @@ -154,18 +159,18 @@ start_raw(int argc, char **argv) args.arguments = NULL; args.platform.boot_tgz_data = NULL; args.platform.boot_tgz_size = 0; - - serial_init(); console_init(); cpu_init(); // if we get passed a uimage, try to find the second blob - if (gUImage && image_multi_getimg(gUImage, 1, &args.platform.boot_tgz_data, - &args.platform.boot_tgz_size)) - dprintf("Found boot tgz @ %p, %d bytes\n", args.platform.boot_tgz_data, - args.platform.boot_tgz_size); + if (gUImage != NULL + && image_multi_getimg(gUImage, 1, (uint32*)&args.platform.boot_tgz_data, + &args.platform.boot_tgz_size)) { + dprintf("Found boot tgz @ %p, %" B_PRIu32 " bytes\n", + args.platform.boot_tgz_data, args.platform.boot_tgz_size); + } { //DEBUG: int i; @@ -175,7 +180,7 @@ start_raw(int argc, char **argv) dprintf("os: %d\n", gUBootOS); dprintf("gd @ %p\n", gGD); dprintf("gd->bd @ %p\n", gGD->bd); - dprintf("fb_base %p\n", gGD->fb_base); + dprintf("fb_base %p\n", (void*)gGD->fb_base); dprintf("uimage @ %p\n", gUImage); if (gUImage) dump_uimage(gUImage); @@ -193,9 +198,11 @@ start_raw(int argc, char **argv) serial_enable(); main(&args); + return 0; } -uint32 + +extern "C" uint32 platform_boot_options(void) { return sBootOptions;