diff options
-rw-r--r-- | linker/linker_script.ld | 16 | ||||
-rw-r--r-- | src/kern/init.c | 27 |
2 files changed, 23 insertions, 20 deletions
diff --git a/linker/linker_script.ld b/linker/linker_script.ld index 0338591..d6ce40b 100644 --- a/linker/linker_script.ld +++ b/linker/linker_script.ld @@ -29,21 +29,21 @@ SECTIONS INITS_START = .; *(.init0); - INIT_0_END = LOADADDR(.data) + (. - INITS_START); + INIT_0_END = ABSOLUTE(INIT_ROUTINES_FLASH_START) + (. - INITS_START); *(.init1); - INIT_1_END = LOADADDR(.data) + (. - INITS_START); + INIT_1_END = ABSOLUTE(INIT_ROUTINES_FLASH_START) + (. - INITS_START); *(.init2); - INIT_2_END = LOADADDR(.data) + (. - INITS_START); + INIT_2_END = ABSOLUTE(INIT_ROUTINES_FLASH_START) + (. - INITS_START); *(.init3); - INIT_3_END = LOADADDR(.data) + (. - INITS_START); + INIT_3_END = ABSOLUTE(INIT_ROUTINES_FLASH_START) + (. - INITS_START); *(.init4); - INIT_4_END = LOADADDR(.data) + (. - INITS_START); + INIT_4_END = ABSOLUTE(INIT_ROUTINES_FLASH_START) + (. - INITS_START); *(.init5); - INIT_5_END = LOADADDR(.data) + (. - INITS_START); + INIT_5_END = ABSOLUTE(INIT_ROUTINES_FLASH_START) + (. - INITS_START); *(.init6); - INIT_6_END = LOADADDR(.data) + (. - INITS_START); + INIT_6_END = ABSOLUTE(INIT_ROUTINES_FLASH_START) + (. - INITS_START); *(.init7); - INIT_7_END = LOADADDR(.data) + (. - INITS_START); + INIT_7_END = ABSOLUTE(INIT_ROUTINES_FLASH_START) + (. - INITS_START); INITS_END = .; INIT_ROUTINES_FLASH_STOP = diff --git a/src/kern/init.c b/src/kern/init.c index 288e851..247c44f 100644 --- a/src/kern/init.c +++ b/src/kern/init.c @@ -5,7 +5,7 @@ #include "arch/stm32l4xxx/peripherals/system.h" #include "kern/log.h" -static _no_init init_level_t initlevel; +static volatile _no_init init_level_t initlevel; init_level_t get_system_init_level() { @@ -43,6 +43,8 @@ init2() volatile uint32_t init_data_values_ptr = (uint32_t) &INIT_DATA_VALUES; volatile uint32_t data_segment_start_ptr = (uint32_t) &DATA_SEGMENT_START; volatile uint32_t data_segment_stop_ptr = (uint32_t) &DATA_SEGMENT_STOP; + + klogf("Copy data segments from flash ... \n"); klogf(" .data ...\n"); klogf(" set (%p - %p)\n", &DATA_SEGMENT_START, &DATA_SEGMENT_STOP); @@ -55,8 +57,6 @@ init2() if (init_data_values_ptr & 3) { panic("init data values pointer not aligned with sizeof(uint32_t)!\n"); } - - klogf("Copy data segments from flash ... \n"); /* Next, we'll copy the data sections from flash to ram. */ uint32_t* src; @@ -107,28 +107,26 @@ void run_init_routines() &INIT_7_END, }; - initialize_logging(); - void (**initfn)(); + klogf("Init routines at (%p - %p)\n", + &INIT_ROUTINES_FLASH_START, + &INIT_ROUTINES_FLASH_STOP); + /* 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"); + klogf("[Init Level 0]\n"); for (initfn = &INIT_ROUTINES_FLASH_START; initfn < &INIT_ROUTINES_FLASH_STOP; ++initfn) { while (initfn >= init_boundaries[initlevel] && initlevel < INIT_LEVEL_7) { ++initlevel; - klogf("Init Level %d ...\n", initlevel); + klogf("[Init Level %d]\n", initlevel); } (*initfn)(); } - - while (initlevel < INIT_LEVEL_7) { - ++initlevel; - } } /* @@ -137,11 +135,16 @@ void run_init_routines() */ _Noreturn void on_reset() { - + initialize_logging(); initlevel = INIT_LEVEL_0; run_init_routines(); + while (initlevel < INIT_LEVEL_7) { + ++initlevel; + klogf("[Init Level %d]\n", initlevel); + } + /* Jump to main. */ main(); |