- 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
155 lines
5.2 KiB
ArmAsm
155 lines
5.2 KiB
ArmAsm
/*
|
||
* UniversalisOS Microkernel — Ambiq Micro Apollo2 Startup (Cortex-M4F)
|
||
*
|
||
* Vector table with 40 external IRQs (IRQ 0–39),
|
||
* 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 0–39 (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
|