From e586c178073b9a0fee90d5fc8e795d266ebd7b7d Mon Sep 17 00:00:00 2001 From: Vegard Storheil Eriksen Date: Tue, 7 Aug 2012 16:50:46 +0200 Subject: Initial import. Most sources are split off from suzumebachi project revision 2fc77d2 as is with some path changes. New build rules introduced. --- startup/entry.cpp | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 startup/entry.cpp (limited to 'startup') diff --git a/startup/entry.cpp b/startup/entry.cpp new file mode 100644 index 0000000..d7385f8 --- /dev/null +++ b/startup/entry.cpp @@ -0,0 +1,63 @@ +#include +#include + +int main(); + +typedef void (*funcp_t)(); + +// Symbols from linker script. +extern uint32_t _data_rom; +extern uint32_t _data_start; +extern uint32_t _data_end; +extern uint32_t _bss_start; +extern uint32_t _bss_end; +extern funcp_t _init_array_start; +extern funcp_t _init_array_end; +extern funcp_t _fini_array_start; +extern funcp_t _fini_array_end; + +void __attribute__((naked)) entry() { + // Initialize HAL. + rcc_init(); + + // Load .data from rom image. + uint32_t* rp = &_data_rom; + uint32_t* wp = &_data_start; + + while(wp < &_data_end) { + *wp++ = *rp++; + } + + // Clear .bss. + wp = &_bss_start; + + while(wp < &_bss_end) { + *wp++ = 0; + } + + // Call constructors. + funcp_t* fp = &_init_array_start; + + while(fp < &_init_array_end) { + (*fp++)(); + } + + // Call main(). + main(); + + // Call destructors. + fp = &_fini_array_start; + + while(fp < &_fini_array_end) { + (*fp++)(); + } + + // Halt. + while(1); +} + +extern "C" void __cxa_pure_virtual() { + while (1); +} + +void* __dso_handle = 0; -- cgit v1.2.3