aboutsummaryrefslogtreecommitdiff
path: root/src/kern/init.c
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2022-12-09 15:20:40 -0700
committerJosh Rahm <joshuarahm@gmail.com>2022-12-09 15:20:40 -0700
commitac25063e15d7aa645f7567b9bdb0726e5c332fd6 (patch)
tree1a18f6d80cbcc25ce50ebb23c3a81f2d802130e9 /src/kern/init.c
parent2aaf2180aa352c71c43efd548893fffe506397e5 (diff)
downloadstm32l4-ac25063e15d7aa645f7567b9bdb0726e5c332fd6.tar.gz
stm32l4-ac25063e15d7aa645f7567b9bdb0726e5c332fd6.tar.bz2
stm32l4-ac25063e15d7aa645f7567b9bdb0726e5c332fd6.zip
Refactor the linker script to make more sense.broken_linker
Specifically this moves the inits into the .text section. This also move the data and bss segments into sram2 to give the heap and stack more space to work with in sram1.
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)();
}
}