aboutsummaryrefslogtreecommitdiff
path: root/src/kern/init.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kern/init.c')
-rw-r--r--src/kern/init.c97
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)();
}
}