- 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
145 lines
4.9 KiB
ArmAsm
145 lines
4.9 KiB
ArmAsm
/*
|
||
* UniversalisOS Microkernel — Silicon Labs EFM32TG108 Startup (Cortex-M3)
|
||
*
|
||
* Vector table with 32 external IRQs (IRQ 0–31),
|
||
* 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.
|
||
*
|
||
* Note: Uses Cortex-M3 instruction set (.cpu cortex-m3) for full Thumb-2.
|
||
*/
|
||
.syntax unified
|
||
.cpu cortex-m3
|
||
.thumb
|
||
|
||
/* === Vector table (48 entries: 16 system + 32 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–31 (EFM32TG108 specific) */
|
||
.word Default_Handler /* 0: DMA */
|
||
.word Default_Handler /* 1: GPIO_EVEN */
|
||
.word Default_Handler /* 2: TIMER0 */
|
||
.word Default_Handler /* 3: USART0_RX */
|
||
.word Default_Handler /* 4: USART0_TX */
|
||
.word Default_Handler /* 5: USB */
|
||
.word Default_Handler /* 6: RTC */
|
||
.word Default_Handler /* 7: BCU */
|
||
.word Default_Handler /* 8: ADC0 */
|
||
.word Default_Handler /* 9: ACMP0 */
|
||
.word Default_Handler /* 10: ACMP1 */
|
||
.word Default_Handler /* 11: WDOG0 */
|
||
.word Default_Handler /* 12: I2C0 */
|
||
.word Default_Handler /* 13: GPIO_ODD */
|
||
.word Default_Handler /* 14: TIMER1 */
|
||
.word Default_Handler /* 15: TIMER2 */
|
||
.word Default_Handler /* 16: UART0_RX */
|
||
.word Default_Handler /* 17: UART0_TX */
|
||
.word Default_Handler /* 18: LEUART0_RX */
|
||
.word Default_Handler /* 19: LEUART0_TX */
|
||
.word Default_Handler /* 20: LETIMER0 */
|
||
.word Default_Handler /* 21: PCNT0 */
|
||
.word Default_Handler /* 22: ACMP2 */
|
||
.word Default_Handler /* 23: WDOG1 */
|
||
.word Default_Handler /* 24: CRYOTIMER */
|
||
.word Default_Handler /* 25: PKECC */
|
||
.word Default_Handler /* 26: LCD */
|
||
.word Default_Handler /* 27: EBI */
|
||
.word Default_Handler /* 28: USART1_RX */
|
||
.word Default_Handler /* 29: USART1_TX */
|
||
.word Default_Handler /* 30: LESENTI0 */
|
||
.word Default_Handler /* 31: LESENTI1 */
|
||
|
||
/* === 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
|