diff options
Diffstat (limited to 'src/kern/init.c')
-rw-r--r-- | src/kern/init.c | 97 |
1 files changed, 48 insertions, 49 deletions
diff --git a/src/kern/init.c b/src/kern/init.c index 550fea0..0267b7b 100644 --- a/src/kern/init.c +++ b/src/kern/init.c @@ -18,16 +18,15 @@ int main(); /* These are defined in the linker script. */ #ifdef ARCH_STM32L4 -extern uint32_t INIT_DATA_VALUES; + +extern uint32_t DATA_VALUES_IN_FLASH; extern uint32_t DATA_SEGMENT_START; extern uint32_t DATA_SEGMENT_STOP; -extern uint32_t TEXT_START; -extern uint32_t TEXT_STOP; extern uint32_t BSS_START; extern uint32_t BSS_END; -extern void (*INIT_ROUTINES_FLASH_START)(); -extern void (*INIT_ROUTINES_FLASH_STOP)(); +extern void (*INITS_START)(); +extern void (*INITS_END)(); extern uint32_t INIT_0_END; extern uint32_t INIT_1_END; @@ -38,19 +37,27 @@ extern uint32_t INIT_5_END; extern uint32_t INIT_6_END; extern uint32_t INIT_7_END; -extern uint32_t WAT; - -#define MAGIC_COOKIE 0xDEADBEEF -/* Test that data segment is properly set. */ -static uint32_t magic_cookie = MAGIC_COOKIE; +extern uint32_t INIT_0_START; +extern uint32_t INIT_1_START; +extern uint32_t INIT_2_START; +extern uint32_t INIT_3_START; +extern uint32_t INIT_4_START; +extern uint32_t INIT_5_START; +extern uint32_t INIT_6_START; +extern uint32_t INIT_7_START; + +extern uint32_t VECTORS_START; +extern uint32_t VECTORS_END; +extern uint32_t TEXT_START; +extern uint32_t TEXT_END; -void panic(const char*); +extern uint32_t FLASH_STOP; init2() { volatile uint32_t bss_start_ptr = (uint32_t)&BSS_START; volatile uint32_t bss_end_ptr = (uint32_t)&BSS_END; - volatile uint32_t init_data_values_ptr = (uint32_t)&INIT_DATA_VALUES; + volatile uint32_t init_data_values_ptr = (uint32_t)&DATA_VALUES_IN_FLASH; volatile uint32_t data_segment_start_ptr = (uint32_t)&DATA_SEGMENT_START; volatile uint32_t data_segment_stop_ptr = (uint32_t)&DATA_SEGMENT_STOP; @@ -58,7 +65,7 @@ init2() klogf(" .data ...\n"); klogf(" set (%p - %p)\n", &DATA_SEGMENT_START, &DATA_SEGMENT_STOP); - klogf(" from (%p)\n", &INIT_DATA_VALUES); + klogf(" from (%p)\n", &DATA_VALUES_IN_FLASH); if ((data_segment_start_ptr | data_segment_start_ptr) & 3) { panic(".data segment not aligned with sizeof(uint32_t)!\n"); @@ -72,7 +79,7 @@ init2() uint32_t* src; uint32_t* dest; - src = &INIT_DATA_VALUES; + src = &DATA_VALUES_IN_FLASH; dest = &DATA_SEGMENT_START; /* Copy the values from flash into the data segment. */ @@ -94,11 +101,6 @@ init2() *(dest++) = 0; } - if (magic_cookie != MAGIC_COOKIE) { - panic("Data Segment Initialization Failed!"); - } - - klogf("Magic Cookie Matches!\n"); klogf("Done!\n"); } @@ -106,11 +108,23 @@ init3() { /* Set the vector offset table to be at the start * of FLASH memory. */ - SCB.vto_r = 0x08000000; + SCB.vto_r = (uint32_t) &VECTORS_START; + + klogf("Vector offset table set to %p\n", &VECTORS_START); } void run_init_routines() { + void* init_starts[] = { + &INIT_0_START, + &INIT_1_START, + &INIT_2_START, + &INIT_3_START, + &INIT_4_START, + &INIT_5_START, + &INIT_6_START, + &INIT_7_START, + }; void* init_boundaries[] = { &INIT_0_END, &INIT_1_END, @@ -124,55 +138,40 @@ void run_init_routines() void (**initfn)(); - klogf("WAT: %p\n", &WAT); + klogf(".vectors:\n at (%p - %p)\n", &VECTORS_START, &VECTORS_END); + klogf(".text:\n at (%p - %p)\n", &TEXT_START, &TEXT_END); - klogf( - "Init routines at (%p - %p)\n", - &INIT_ROUTINES_FLASH_START, - &INIT_ROUTINES_FLASH_STOP); + klogf("inits: (%p - %p)\n", &INITS_START, &INIT_7_END); + + for (size_t i = 0; i < 8; ++i) { + klogf(".init%d\n at (%p - %p)\n", i, init_starts[i], init_boundaries[i]); + } klogf( - "Data segment at (%p - %p) from (%p)\n", + ".data:\n at (%p - %p)\n from (%p)\n", &DATA_SEGMENT_START, &DATA_SEGMENT_STOP, - &INIT_DATA_VALUES); + &DATA_VALUES_IN_FLASH); klogf( - "Bss segment at (%p - %p)\n", - &BSS_START, - &BSS_END); - - klogf( - "Heap at (%p - %p)\n", + ".heap:\n at (%p - %p) size %d bytes\n", &HEAP_START, - &HEAP_STOP); - - klogf( - "Text at (%p - %p)\n", - &TEXT_START, - &TEXT_STOP); - - klogf( "Init Boundary 0: %p\n", &INIT_0_END); - klogf( "Init Boundary 1: %p\n", &INIT_1_END); - klogf( "Init Boundary 2: %p\n", &INIT_2_END); + &HEAP_STOP, + (uint32_t)(&HEAP_STOP - &HEAP_START)); - // for (size_t i = 0; i < sizeof(init_boundaries) / sizeof(void*); ++ i) { - // klogf("Init Boundary %d at %p\n", i, init_boundaries[i]); - // } + klogf(".bss:\n at (%p - %p)\n", &BSS_START, &BSS_END); /* Enable a higher clock speed. This is the first thing we do * beacuse it will boost the boot up time. */ set_system_clock_MHz(80); klogf("[Init Level 0]\n"); - for (initfn = &INIT_ROUTINES_FLASH_START; initfn < &INIT_ROUTINES_FLASH_STOP; - ++initfn) { + for (initfn = &INITS_START; initfn < &INITS_END; ++initfn) { while (initfn >= init_boundaries[initlevel] && initlevel < INIT_LEVEL_7) { ++initlevel; klogf("[Init Level %d]\n", initlevel); } - klogf("Calling (%p)\n", initfn); (*initfn)(); } } |