From f6a2143e22f577abafea5190b242471da6e34896 Mon Sep 17 00:00:00 2001 From: Victor Mignot Date: Tue, 22 Jul 2025 15:14:14 +0200 Subject: cortex-m4f: bootstrap code --- src/boot.s | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.c | 4 ++++ src/types.h | 17 ++++++++++++++++ 3 files changed, 88 insertions(+) create mode 100644 src/boot.s create mode 100644 src/main.c create mode 100644 src/types.h (limited to 'src') 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 -- cgit v1.2.3