Files
mkrtos-real/mkrtos_knl/arch/cortex-m4/syscall.S

122 lines
1.9 KiB
ArmAsm
Executable File
Raw 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.

.syntax unified
@ .cpu cortex-m3
.thumb
.global syscall_handler_get
/**
* @brief syscall结束时到这儿
*/
.type syscall_exit, %function
syscall_exit:
svc 1
b .
/**
* void syscall_ret_user(int ret_val);
* @brief 回到用户模式
*/
.type syscall_ret_user, %function
syscall_ret_user:
//
//msp
mrs r0, msp
#ifdef MKRTOS_USE_FPU
//
TST lr, #0x10
IT eq
addeq r0,r0,#0x48
#endif
add r0, #0x20
ldmfd r0!,{r4-r11}
msr msp,r0
pop {r0,r1,r2,lr}
msr CONTROL, r1
CPSIE I
bx lr
/**
* void SVC_Handler(void);
* @brief
*/
.global SVC_Handler
.type SVC_Handler, %function
SVC_Handler:
CPSID I
TST.W LR, #4
ITE EQ
MRSEQ R1, MSP
MRSNE R1, PSP
//svc
LDR R2, [R1, #24]
LDRB R2, [R2, #-2]
cmp r2,#128
beq SYS_CALL
cmp r2,#1
beq TO_USER
cmp r2,#2
// beq enter_fchannel
// cmp r2,#3
// beq exit_fchannel
b TO_END
TO_USER:
B syscall_ret_user
SYS_CALL:
//
mov r0,r1
//
mrs r1,CONTROL
push {r0,r1,r2,lr}
//svc 128
mov r1, r7
//syscall
push {r0-r2,lr}
blx syscall_handler_get
mov r3,r0
pop {r0-r2,lr}
//r4-r11
stmfd sp!,{r4-r11}
//
stmfd r0,{r4-r11}
#ifdef MKRTOS_USE_FPU
//
TST lr, #0x10
IT eq
subeq sp,sp,#0x48
#endif
//PSR PC LR R12 R3 R2 R1 R0
ldmfd r0,{r4-r11}
//
stmfd sp!,{r4-r11}
//lrpc
mov r0,sp
ldr r2, =syscall_exit
//lr
str r2, [r0, #20]
//pc
str r3, [r0, #24]
ldr r3, =0x01000000
str r3, [r0, #28]
//control
mrs r0, CONTROL
bic r0, r0, #0x03
msr CONTROL, r0
dsb
isb
orr lr, lr, #0x08
bic lr, lr, #0x04
CPSIE I
bx lr
TO_END:
CPSIE I
bx lr