universalisos/microkernel/ports/ambiq_apollo/startup.S
Fábio Coutada 62e8454f91 build: add UEFI ISO builder, test boot scripts, EIM config
- make-uefi-iso.sh: UEFI ISO image builder
- test_boot.S, test_boot.ld: test boot assembly and linker script
- eim_config.toml: EIM (External Interface Module) configuration
- edk2-ovmf RPM for UEFI firmware
- GAP_ANALYSIS_PIKEOS_PARITY.md: PikeOS parity gap analysis
2026-07-15 15:33:07 +01:00

155 lines
5.2 KiB
ArmAsm
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* UniversalisOS Microkernel Ambiq Micro Apollo2 Startup (Cortex-M4F)
*
* Vector table with 40 external IRQs (IRQ 039),
* Reset_Handler with .data/.bss init.
*
* Weak aliases for exception/IRQ handlers actual implementations
* for NMI, HardFault, SVC, PendSV, SysTick live in uos_port_context.S.
*
* Apollo2 uses Cortex-M4F (ARMv7E-M) includes extended fault handlers
* and uses Thumb-2 instructions.
*/
.syntax unified
.cpu cortex-m4
.thumb
.fpu fpv4-sp-d16
/* === Vector table (56 entries: 16 system + 40 IRQ) === */
.section .vectors, "a"
.global __Vectors
__Vectors:
.word _estack /* 0: Initial stack pointer */
.word Reset_Handler /* 1: Reset */
.word NMI_Handler /* 2: NMI */
.word HardFault_Handler /* 3: Hard fault */
.word MemManage_Handler /* 4: Memory management */
.word BusFault_Handler /* 5: Bus fault */
.word UsageFault_Handler /* 6: Usage fault */
.word 0 /* 7: Reserved */
.word 0 /* 8: Reserved */
.word 0 /* 9: Reserved */
.word 0 /* 10: Reserved */
.word SVC_Handler /* 11: SVCall */
.word DebugMon_Handler /* 12: Debug monitor */
.word 0 /* 13: Reserved */
.word PendSV_Handler /* 14: PendSV — context switch */
.word SysTick_Handler /* 15: SysTick — tick timer */
/* External IRQs 039 (Apollo2 specific) */
.word Default_Handler /* 0: BOD */
.word Default_Handler /* 1: Watchdog */
.word Default_Handler /* 2: RTC */
.word Default_Handler /* 3: VCOMP */
.word Default_Handler /* 4: ADC */
.word Default_Handler /* 5: ACMP0 */
.word Default_Handler /* 6: ACMP1 */
.word Default_Handler /* 7: ACMP2 */
.word Default_Handler /* 8: ACMP3 */
.word Default_Handler /* 9: GPIO0 */
.word Default_Handler /* 10: GPIO1 */
.word Default_Handler /* 11: GPIO2 */
.word Default_Handler /* 12: GPIO3 */
.word Default_Handler /* 13: UART0 */
.word Default_Handler /* 14: UART1 */
.word Default_Handler /* 15: SPI0 */
.word Default_Handler /* 16: SPI1 */
.word Default_Handler /* 17: I2C0 */
.word Default_Handler /* 18: I2C1 */
.word Default_Handler /* 19: BLEB0 */
.word Default_Handler /* 20: BLEB1 */
.word Default_Handler /* 21: BLEA */
.word Default_Handler /* 22: GPIO4 */
.word Default_Handler /* 23: GPIO5 */
.word Default_Handler /* 24: GPIO6 */
.word Default_Handler /* 25: GPIO7 */
.word Default_Handler /* 26: UART2 */
.word Default_Handler /* 27: UART3 */
.word Default_Handler /* 28: SPI2 */
.word Default_Handler /* 29: SPI3 */
.word Default_Handler /* 30: I2C2 */
.word Default_Handler /* 31: I2C3 */
.word Default_Handler /* 32: TIMER0 */
.word Default_Handler /* 33: TIMER1 */
.word Default_Handler /* 34: TIMER2 */
.word Default_Handler /* 35: TIMER3 */
.word Default_Handler /* 36: TIMER4 */
.word Default_Handler /* 37: TIMER5 */
.word Default_Handler /* 38: DMA */
.word Default_Handler /* 39: USB */
/* === Reset handler === */
.section .text.Reset_Handler
.global Reset_Handler
.type Reset_Handler, %function
.thumb_func
Reset_Handler:
/* Set stack pointer */
ldr r0, =_estack
msr msp, r0
/* Copy .data from flash to RAM */
ldr r0, =_sdata
ldr r1, =_edata
ldr r2, =_etext
movs r3, #0
b .Ldata_check
.Ldata_loop:
ldr r4, [r2, r3]
str r4, [r0, r3]
adds r3, r3, #4
.Ldata_check:
adds r4, r0, r3
cmp r4, r1
bne .Ldata_loop
/* Zero .bss */
ldr r0, =_sbss
ldr r1, =_ebss
movs r2, #0
b .Lbss_check
.Lbss_loop:
str r2, [r0]
adds r0, r0, #4
.Lbss_check:
cmp r0, r1
bne .Lbss_loop
/* Call main() */
bl main
/* If main returns, loop forever */
.Lhalt:
wfi
b .Lhalt
.size Reset_Handler, .-Reset_Handler
/* === Weak exception handler aliases === */
.weak NMI_Handler
.thumb_set NMI_Handler, Default_Handler
.weak HardFault_Handler
.thumb_set HardFault_Handler, Default_Handler
.weak MemManage_Handler
.thumb_set MemManage_Handler, Default_Handler
.weak BusFault_Handler
.thumb_set BusFault_Handler, Default_Handler
.weak UsageFault_Handler
.thumb_set UsageFault_Handler, Default_Handler
.weak DebugMon_Handler
.thumb_set DebugMon_Handler, Default_Handler
.weak SVC_Handler
.thumb_set SVC_Handler, Default_Handler
.weak PendSV_Handler
.thumb_set PendSV_Handler, Default_Handler
.weak SysTick_Handler
.thumb_set SysTick_Handler, Default_Handler
/* === Default handler (infinite loop) === */
.section .text.Default_Handler
.global Default_Handler
.type Default_Handler, %function
.thumb_func
Default_Handler:
b Default_Handler
.size Default_Handler, .-Default_Handler