aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVictor Mignot <victor@vmignot.fr>2025-07-22 15:14:14 +0200
committerVictor Mignot <victor@vmignot.fr>2025-07-23 15:08:17 +0200
commitf6a2143e22f577abafea5190b242471da6e34896 (patch)
treef2465b65f11a8b9d83c467d4658ffd7257e8b0e9 /src
downloadnanji-f6a2143e22f577abafea5190b242471da6e34896.tar.gz
cortex-m4f: bootstrap code
Diffstat (limited to 'src')
-rw-r--r--src/boot.s67
-rw-r--r--src/main.c4
-rw-r--r--src/types.h17
3 files changed, 88 insertions, 0 deletions
diff --git a/src/boot.s b/src/boot.s
new file mode 100644
index 0000000..626420c
--- /dev/null
+++ b/src/boot.s
@@ -0,0 +1,67 @@
+.syntax unified
+.thumb
+
+.section .vector_table, "a"
+.word __stack_top /* Initial stack pointer */
+.word _start /* Reset Handler */
+.word _hang /* Non Maskable Interrupts */
+.word _hang /* Hard Fault */
+.word _hang /* Memory Management Fault */
+.word _hang /* Bus Fault */
+.word _hang /* Usage Fault */
+.skip 16 /* Reserved */
+.word _hang /* SVCall */
+.skip 8 /* Reserved */
+.word _hang /* PendSV */
+.word _hang /* SysTick */
+
+
+.text
+.align
+.thumb_func
+_start:
+/* Zero init BSS */
+_bss_init_start:
+ /* BSS section start and end addresses are 4-bytes aligned thanks to the linker script */
+ ldr r0, =__bss_start
+ ldr r1, =__bss_end
+ mov r2, #0
+_bss_init_loop:
+ cmp r0, r1
+ beq _bss_init_end
+ str r2, [r0], #4
+ b _bss_init_loop
+_bss_init_end:
+
+/* Init data section */
+_data_init_start:
+ /* Data section start and end addresses are also 4-bytes aligned */
+ ldr r0, =__data_lma
+ ldr r1, =__data_start
+ ldr r2, =__data_end
+__data_init_loop:
+ cmp r1, r2
+ beq _data_init_end
+ ldr r4, [r0], #4
+ ldr r4, [r1], #4
+ b __data_init_loop
+_data_init_end:
+
+ /* Reset all general purpose registers */
+ mov r0, #0
+ mov r1, #0
+ mov r2, #0
+ mov r3, #0
+ mov r4, #0
+ mov r5, #0
+ mov r6, #0
+ mov r7, #0
+ mov r8, #0
+ mov r9, #0
+ mov r10, #0
+ mov r11, #0
+ mov r12, #0
+ bl main
+
+_hang:
+ b .
diff --git a/src/main.c b/src/main.c
new file mode 100644
index 0000000..62563e2
--- /dev/null
+++ b/src/main.c
@@ -0,0 +1,4 @@
+[[noreturn]]
+void main() {
+ while (1) {}
+}
diff --git a/src/types.h b/src/types.h
new file mode 100644
index 0000000..2a8b9bb
--- /dev/null
+++ b/src/types.h
@@ -0,0 +1,17 @@
+#ifndef TYPES_H
+#define TYPES_H
+
+/*
+ * Integer types
+ */
+typedef signed char i8;
+typedef unsigned char u8;
+typedef signed short i16;
+typedef unsigned short u16;
+typedef signed int i32;
+typedef unsigned int u32;
+typedef signed long long i64;
+typedef unsigned long long u64;
+typedef u32 hwaddr;
+
+#endif