ca13734bf0
Add kernel (Cortex-M0/M3/M4, Tricore, S32K, RISC-V ports), drivers, middleware (CAN stack, diagnostics, safety), applications, board support, build/test tooling, and documentation.
186 lines
3.1 KiB
ArmAsm
186 lines
3.1 KiB
ArmAsm
/**
|
|
* @file port_asm.s
|
|
* @brief NXP S32K assembly routines
|
|
*/
|
|
|
|
.syntax unified
|
|
.thumb
|
|
.arch armv7e-m
|
|
|
|
.section .text
|
|
|
|
/* Global symbols */
|
|
.global current_task_sp
|
|
.global next_task_sp
|
|
.global port_context_switch
|
|
.global port_start_first_task
|
|
.global port_disable_interrupts
|
|
.global port_enable_interrupts
|
|
|
|
/* Variables */
|
|
.section .bss
|
|
.align 3
|
|
current_task_sp: .word 0
|
|
next_task_sp: .word 0
|
|
|
|
.section .text
|
|
.thumb_func
|
|
|
|
/* Start First Task */
|
|
port_start_first_task:
|
|
/* Load task stack pointer */
|
|
ldr r0, =next_task_sp
|
|
ldr r1, [r0]
|
|
|
|
/* Set PSP */
|
|
msr PSP, r1
|
|
|
|
/* Switch to PSP */
|
|
mov r0, #2
|
|
msr CONTROL, r0
|
|
isb
|
|
|
|
/* Restore context */
|
|
ldmia r1!, {r4-r11}
|
|
msr PSP, r1
|
|
mov lr, #0xFFFFFFFD
|
|
bx lr
|
|
|
|
/* PendSV Handler */
|
|
PendSV_Handler:
|
|
/* Save context */
|
|
mrs r0, PSP
|
|
stmdb r0!, {r4-r11}
|
|
ldr r1, =current_task_sp
|
|
str r0, [r1]
|
|
|
|
/* Load next context */
|
|
ldr r0, =next_task_sp
|
|
ldr r1, [r0]
|
|
ldmia r1!, {r4-r11}
|
|
msr PSP, r1
|
|
bx lr
|
|
|
|
/* SVC Handler */
|
|
SVC_Handler:
|
|
tst lr, #4
|
|
ite eq
|
|
mrseq r0, MSP
|
|
mrsne r0, PSP
|
|
ldr r0, [r0, #24]
|
|
ldrb r0, [r0, #-2]
|
|
push {lr}
|
|
bl svc_handler
|
|
pop {lr}
|
|
bx lr
|
|
|
|
/* Disable Interrupts */
|
|
port_disable_interrupts:
|
|
cpsid i
|
|
bx lr
|
|
|
|
/* Enable Interrupts */
|
|
port_enable_interrupts:
|
|
cpsie i
|
|
bx lr
|
|
|
|
/* LPIT Interrupt Handler */
|
|
LPIT0_IRQHandler:
|
|
/* Save context */
|
|
push {r4-r11, lr}
|
|
|
|
/* Clear interrupt flag */
|
|
ldr r0, =0x40037008 /* LPIT0->MSR */
|
|
movs r1, #1
|
|
str r1, [r0]
|
|
|
|
/* Call kernel tick handler */
|
|
bl kernel_tick_handler
|
|
|
|
/* Service watchdog */
|
|
ldr r0, =0x40052000 /* WDOG->CNT */
|
|
ldr r1, =0xB480
|
|
str r1, [r0]
|
|
ldr r1, =0x4B80
|
|
str r1, [r0]
|
|
|
|
/* Restore context */
|
|
pop {r4-r11, lr}
|
|
bx lr
|
|
|
|
/* Hard Fault Handler */
|
|
HardFault_Handler:
|
|
/* Save context */
|
|
mrs r0, PSP
|
|
stmdb r0!, {r4-r11}
|
|
|
|
/* Get fault status */
|
|
ldr r2, =0xE000ED2C /* HFSR */
|
|
ldr r2, [r2]
|
|
|
|
/* Call fault handler */
|
|
movs r0, #1
|
|
movs r1, #0
|
|
bl fault_handler_process
|
|
|
|
/* Safe state */
|
|
b .
|
|
|
|
/* Memory Management Fault */
|
|
MemManage_Handler:
|
|
/* Save context */
|
|
mrs r0, PSP
|
|
stmdb r0!, {r4-r11}
|
|
|
|
/* Get fault information */
|
|
ldr r1, =0xE000ED34 /* MMFAR */
|
|
ldr r1, [r1]
|
|
ldr r2, =0xE000ED28 /* CFSR */
|
|
ldr r2, [r2]
|
|
|
|
/* Call fault handler */
|
|
movs r0, #2
|
|
bl fault_handler_process
|
|
|
|
/* Safe state */
|
|
b .
|
|
|
|
/* Bus Fault Handler */
|
|
BusFault_Handler:
|
|
/* Save context */
|
|
mrs r0, PSP
|
|
stmdb r0!, {r4-r11}
|
|
|
|
/* Get fault information */
|
|
ldr r1, =0xE000ED38 /* BFAR */
|
|
ldr r1, [r1]
|
|
ldr r2, =0xE000ED28 /* CFSR */
|
|
ldr r2, [r2]
|
|
|
|
/* Call fault handler */
|
|
movs r0, #3
|
|
bl fault_handler_process
|
|
|
|
/* Safe state */
|
|
b .
|
|
|
|
/* Usage Fault Handler */
|
|
UsageFault_Handler:
|
|
/* Save context */
|
|
mrs r0, PSP
|
|
stmdb r0!, {r4-r11}
|
|
|
|
/* Get fault status */
|
|
ldr r2, =0xE000ED28 /* CFSR */
|
|
ldr r2, [r2]
|
|
|
|
/* Call fault handler */
|
|
movs r0, #4
|
|
movs r1, #0
|
|
bl fault_handler_process
|
|
|
|
/* Safe state */
|
|
b .
|
|
|
|
.end
|