aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--linker/linker_script.ld16
-rw-r--r--src/kern/init.c27
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();