81
rt-thread/components/lwp/arch/arm/arm926/lwp_gcc.S
Normal file
81
rt-thread/components/lwp/arch/arm/arm926/lwp_gcc.S
Normal file
@@ -0,0 +1,81 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2018-12-10 Jesven first version
|
||||
*/
|
||||
|
||||
#define Mode_USR 0x10
|
||||
#define Mode_FIQ 0x11
|
||||
#define Mode_IRQ 0x12
|
||||
#define Mode_SVC 0x13
|
||||
#define Mode_MON 0x16
|
||||
#define Mode_ABT 0x17
|
||||
#define Mode_UDF 0x1B
|
||||
#define Mode_SYS 0x1F
|
||||
|
||||
#define A_Bit 0x100
|
||||
#define I_Bit 0x80 @; when I bit is set, IRQ is disabled
|
||||
#define F_Bit 0x40 @; when F bit is set, FIQ is disabled
|
||||
#define T_Bit 0x20
|
||||
|
||||
.cpu arm9
|
||||
.syntax unified
|
||||
.text
|
||||
|
||||
/*
|
||||
* void lwp_user_entry(args, text, data);
|
||||
*/
|
||||
.global lwp_user_entry
|
||||
.type lwp_user_entry, % function
|
||||
lwp_user_entry:
|
||||
mrs r9, cpsr
|
||||
mov r8, r9
|
||||
bic r9, #0x1f
|
||||
orr r9, #Mode_USR
|
||||
|
||||
orr r8, #I_Bit
|
||||
msr cpsr_c, r8
|
||||
|
||||
msr spsr, r9
|
||||
|
||||
/* set data address. */
|
||||
mov r9, r2
|
||||
movs pc, r1
|
||||
|
||||
/*
|
||||
* void SVC_Handler(void);
|
||||
*/
|
||||
.global SVC_Handler
|
||||
.type SVC_Handler, % function
|
||||
SVC_Handler:
|
||||
push {lr}
|
||||
mrs lr, spsr
|
||||
push {r4, r5, lr}
|
||||
|
||||
mrs r4, cpsr
|
||||
bic r4, #I_Bit
|
||||
msr cpsr_c, r4
|
||||
|
||||
push {r0 - r3, r12}
|
||||
and r0, r7, #0xff
|
||||
bl lwp_get_sys_api
|
||||
cmp r0, #0 /* r0 = api */
|
||||
mov r4, r0
|
||||
pop {r0 - r3, r12}
|
||||
beq svc_exit
|
||||
ldr lr, = svc_exit
|
||||
bx r4
|
||||
|
||||
svc_exit:
|
||||
mrs r4, cpsr
|
||||
orr r4, #I_Bit
|
||||
msr cpsr_c, r4
|
||||
|
||||
pop {r4, r5, lr}
|
||||
msr spsr_cxsf, lr
|
||||
pop {lr}
|
||||
movs pc, lr
|
70
rt-thread/components/lwp/arch/arm/cortex-a/lwp_gcc.S
Normal file
70
rt-thread/components/lwp/arch/arm/cortex-a/lwp_gcc.S
Normal file
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2018-12-10 Jesven first version
|
||||
*/
|
||||
|
||||
#define Mode_USR 0x10
|
||||
#define Mode_FIQ 0x11
|
||||
#define Mode_IRQ 0x12
|
||||
#define Mode_SVC 0x13
|
||||
#define Mode_MON 0x16
|
||||
#define Mode_ABT 0x17
|
||||
#define Mode_UDF 0x1B
|
||||
#define Mode_SYS 0x1F
|
||||
|
||||
#define A_Bit 0x100
|
||||
#define I_Bit 0x80 @; when I bit is set, IRQ is disabled
|
||||
#define F_Bit 0x40 @; when F bit is set, FIQ is disabled
|
||||
#define T_Bit 0x20
|
||||
|
||||
.cpu cortex-a9
|
||||
.syntax unified
|
||||
.text
|
||||
|
||||
/*
|
||||
* void lwp_user_entry(args, text, data);
|
||||
*/
|
||||
.global lwp_user_entry
|
||||
.type lwp_user_entry, % function
|
||||
lwp_user_entry:
|
||||
mrs r9, cpsr
|
||||
bic r9, #0x1f
|
||||
orr r9, #Mode_USR
|
||||
cpsid i
|
||||
msr spsr, r9
|
||||
|
||||
/* set data address. */
|
||||
mov r9, r2
|
||||
movs pc, r1
|
||||
|
||||
/*
|
||||
* void SVC_Handler(void);
|
||||
*/
|
||||
.global vector_swi
|
||||
.type vector_swi, % function
|
||||
vector_swi:
|
||||
push {lr}
|
||||
mrs lr, spsr
|
||||
push {r4, r5, lr}
|
||||
cpsie i
|
||||
|
||||
push {r0 - r3, r12}
|
||||
and r0, r7, #0xff
|
||||
bl lwp_get_sys_api
|
||||
cmp r0, #0 /* r0 = api */
|
||||
mov lr, r0
|
||||
pop {r0 - r3, r12}
|
||||
beq svc_exit
|
||||
blx lr
|
||||
|
||||
svc_exit:
|
||||
cpsid i
|
||||
pop {r4, r5, lr}
|
||||
msr spsr_cxsf, lr
|
||||
pop {lr}
|
||||
movs pc, lr
|
70
rt-thread/components/lwp/arch/arm/cortex-a9/lwp_gcc.S
Normal file
70
rt-thread/components/lwp/arch/arm/cortex-a9/lwp_gcc.S
Normal file
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2018-12-10 Jesven first version
|
||||
*/
|
||||
|
||||
#define Mode_USR 0x10
|
||||
#define Mode_FIQ 0x11
|
||||
#define Mode_IRQ 0x12
|
||||
#define Mode_SVC 0x13
|
||||
#define Mode_MON 0x16
|
||||
#define Mode_ABT 0x17
|
||||
#define Mode_UDF 0x1B
|
||||
#define Mode_SYS 0x1F
|
||||
|
||||
#define A_Bit 0x100
|
||||
#define I_Bit 0x80 @; when I bit is set, IRQ is disabled
|
||||
#define F_Bit 0x40 @; when F bit is set, FIQ is disabled
|
||||
#define T_Bit 0x20
|
||||
|
||||
.cpu cortex-a9
|
||||
.syntax unified
|
||||
.text
|
||||
|
||||
/*
|
||||
* void lwp_user_entry(args, text, data);
|
||||
*/
|
||||
.global lwp_user_entry
|
||||
.type lwp_user_entry, % function
|
||||
lwp_user_entry:
|
||||
mrs r9, cpsr
|
||||
bic r9, #0x1f
|
||||
orr r9, #Mode_USR
|
||||
cpsid i
|
||||
msr spsr, r9
|
||||
|
||||
/* set data address. */
|
||||
mov r9, r2
|
||||
movs pc, r1
|
||||
|
||||
/*
|
||||
* void vector_swi(void);
|
||||
*/
|
||||
.global vector_swi
|
||||
.type vector_swi, % function
|
||||
vector_swi:
|
||||
push {lr}
|
||||
mrs lr, spsr
|
||||
push {r4, r5, lr}
|
||||
cpsie i
|
||||
|
||||
push {r0 - r3, r12}
|
||||
and r0, r7, #0xff
|
||||
bl lwp_get_sys_api
|
||||
cmp r0, #0 /* r0 = api */
|
||||
mov lr, r0
|
||||
pop {r0 - r3, r12}
|
||||
beq svc_exit
|
||||
blx lr
|
||||
|
||||
svc_exit:
|
||||
cpsid i
|
||||
pop {r4, r5, lr}
|
||||
msr spsr_cxsf, lr
|
||||
pop {lr}
|
||||
movs pc, lr
|
124
rt-thread/components/lwp/arch/arm/cortex-m3/lwp_gcc.S
Normal file
124
rt-thread/components/lwp/arch/arm/cortex-m3/lwp_gcc.S
Normal file
@@ -0,0 +1,124 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2018-10-30 heyuanjie first version
|
||||
*/
|
||||
|
||||
.cpu cortex-m3
|
||||
.syntax unified
|
||||
.thumb
|
||||
.text
|
||||
|
||||
/*
|
||||
* void* lwp_get_sys_api(rt_uint32_t number);
|
||||
*/
|
||||
.global lwp_get_sys_api
|
||||
.global lwp_get_kernel_sp
|
||||
.global lwp_set_kernel_sp
|
||||
|
||||
|
||||
/*
|
||||
* void lwp_user_entry(args, text, data);
|
||||
*/
|
||||
.global lwp_user_entry
|
||||
.type lwp_user_entry, % function
|
||||
lwp_user_entry:
|
||||
PUSH {R0-R3} @; push text&data addr.
|
||||
|
||||
MOV R0, SP @; v1 = SP
|
||||
BL lwp_set_kernel_sp @; lwp_set_kernel_sp(v1)
|
||||
|
||||
@; set CPU to user-thread mode.
|
||||
MRS R2, CONTROL
|
||||
ORR R2, R2, #0x03 @; use PSP, user-thread mode.
|
||||
MSR CONTROL, R2
|
||||
|
||||
POP {R0-R3} @; pop app address to R1.
|
||||
@; set data address.
|
||||
MOV R9, R2
|
||||
|
||||
@; run app, only Thumb-mode.
|
||||
ORR R1, R1, #0x01
|
||||
BX R1
|
||||
|
||||
/*
|
||||
* void SVC_Handler(void);
|
||||
*/
|
||||
.global SVC_Handler
|
||||
.type SVC_Handler, % function
|
||||
SVC_Handler:
|
||||
PUSH {LR}
|
||||
|
||||
@; get user SP.
|
||||
TST LR, #0x4
|
||||
ITE EQ
|
||||
MRSEQ R1, MSP
|
||||
MRSNE R1, PSP
|
||||
PUSH {R1} @; push app SP.
|
||||
|
||||
@; get SVC number.
|
||||
mov R0, R7
|
||||
|
||||
@; get kernel system API
|
||||
BL lwp_get_sys_api
|
||||
|
||||
PUSH {R0} @; push api
|
||||
|
||||
@; get kernel SP to R0.
|
||||
BL lwp_get_kernel_sp
|
||||
|
||||
POP {R2} @; pop api to R2.
|
||||
POP {R1} @; pop app SP to R1.
|
||||
|
||||
stmfd r0!, {r1} @; save app SP to kernel SP
|
||||
|
||||
@;push app parm5~6 to kernel SP
|
||||
STMFD R0!, {R4 - R5}
|
||||
@; copy R1(app SP) to R0(kernel SP).
|
||||
push {r8-r11}
|
||||
LDMFD R1, {R4 - R11} @; pop exception_stack_frame to r4 - r11 register
|
||||
STMFD R0!, {R4 - R11} @; push exception_stack_frame to server SP.
|
||||
pop {r8-r11}
|
||||
|
||||
LDR R3, =svc_exit
|
||||
STR R3, [R0, #20] @; update LR
|
||||
STR R2, [R0, #24] @; update api to PC
|
||||
MSR PSP, R0 @; update SP, API is executed with kernel SP
|
||||
|
||||
@; set to thread-privilege mode.
|
||||
MRS R3, CONTROL
|
||||
BIC R3, R3, #0x01
|
||||
ORR R3, R3, #0x02
|
||||
MSR CONTROL, R3
|
||||
|
||||
POP {LR} @; 0xFFFFFFED
|
||||
ORR LR, LR, #0x10
|
||||
BX LR
|
||||
/*
|
||||
* void svc_exit(void);
|
||||
*/
|
||||
.global svc_exit
|
||||
.type svc_exit, % function
|
||||
svc_exit:
|
||||
@; get user SP.
|
||||
PUSH {R0} @; push result to SP.
|
||||
BL lwp_get_kernel_sp
|
||||
ldr r3, [r0, #-4]
|
||||
pop {r0}
|
||||
|
||||
ldr lr, [r3, #20]
|
||||
ldr r1, [r3, #24] @; load pc
|
||||
add r3, #32 @; exception_stack_frame size
|
||||
MSR PSP, R3 @; restore app stack pointer
|
||||
@; restore to PSP & thread-unprivilege mode.
|
||||
MRS R2, CONTROL
|
||||
ORR R2, R2, #0x03
|
||||
MSR CONTROL, R2
|
||||
|
||||
@; return to lwp.
|
||||
ORR R1, R1, #0x01 @; only Thumb-mode.
|
||||
BX R1 @; return to user app.
|
123
rt-thread/components/lwp/arch/arm/cortex-m3/lwp_iar.S
Normal file
123
rt-thread/components/lwp/arch/arm/cortex-m3/lwp_iar.S
Normal file
@@ -0,0 +1,123 @@
|
||||
;/*
|
||||
; * Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
; *
|
||||
; * SPDX-License-Identifier: Apache-2.0
|
||||
; *
|
||||
; * Change Logs:
|
||||
; * Date Author Notes
|
||||
; * 2018-10-30 heyuanjie first version
|
||||
; */
|
||||
|
||||
SECTION .text:CODE(2)
|
||||
THUMB
|
||||
REQUIRE8
|
||||
PRESERVE8
|
||||
|
||||
;/*
|
||||
; * void* lwp_get_sys_api(rt_uint32_t number);
|
||||
; */
|
||||
IMPORT lwp_get_sys_api
|
||||
IMPORT lwp_get_kernel_sp
|
||||
IMPORT lwp_set_kernel_sp
|
||||
|
||||
;/*
|
||||
; * void lwp_user_entry(args, text, data);
|
||||
; */
|
||||
EXPORT lwp_user_entry
|
||||
lwp_user_entry:
|
||||
PUSH {R0-R3} ; push text&data addr.
|
||||
|
||||
MOV R0, SP ; v1 = SP
|
||||
BL lwp_set_kernel_sp ; lwp_set_kernel_sp(v1)
|
||||
|
||||
; set CPU to user-thread mode.
|
||||
MRS R2, CONTROL
|
||||
ORR R2, R2, #0x03 ; use PSP, user-thread mode.
|
||||
MSR CONTROL, R2
|
||||
|
||||
POP {R0-R3} ; pop app address to R1.
|
||||
; set data address.
|
||||
MOV R9, R2
|
||||
|
||||
; run app, only Thumb-mode.
|
||||
ORR R1, R1, #0x01
|
||||
BX R1
|
||||
|
||||
;/*
|
||||
; * void SVC_Handler(void);
|
||||
; */
|
||||
EXPORT SVC_Handler
|
||||
SVC_Handler:
|
||||
PUSH {LR}
|
||||
|
||||
; get user SP.
|
||||
TST LR, #0x4
|
||||
ITE EQ
|
||||
MRSEQ R1, MSP
|
||||
MRSNE R1, PSP
|
||||
PUSH {R1} ; push app SP.
|
||||
|
||||
; get SVC number.
|
||||
mov R0, R7
|
||||
|
||||
; get kernel system API
|
||||
BL lwp_get_sys_api
|
||||
|
||||
PUSH {R0} ; push api
|
||||
|
||||
; get kernel SP to R0.
|
||||
BL lwp_get_kernel_sp
|
||||
|
||||
POP {R2} ; pop api to R2.
|
||||
POP {R1} ; pop app SP to R1.
|
||||
|
||||
stmfd r0!, {r1} ; save app SP to kernel SP
|
||||
|
||||
;push app parm5~6 to kernel SP
|
||||
STMFD R0!, {R4 - R5}
|
||||
; copy R1(app SP) to R0(kernel SP).
|
||||
push {r8-r11}
|
||||
LDMFD R1, {R4 - R11} ; pop exception_stack_frame to r4 - r11 register
|
||||
STMFD R0!, {R4 - R11} ; push exception_stack_frame to server SP.
|
||||
pop {r8-r11}
|
||||
|
||||
LDR R3, =svc_exit
|
||||
STR R3, [R0, #20] ; update LR
|
||||
STR R2, [R0, #24] ; update api to PC
|
||||
MSR PSP, R0 ; update SP, API is executed with kernel SP
|
||||
|
||||
; set to thread-privilege mode.
|
||||
MRS R3, CONTROL
|
||||
BIC R3, R3, #0x01
|
||||
ORR R3, R3, #0x02
|
||||
MSR CONTROL, R3
|
||||
|
||||
POP {LR} ; 0xFFFFFFED
|
||||
ORR LR, LR, #0x10
|
||||
BX LR
|
||||
|
||||
;/*
|
||||
; * void svc_exit(void);
|
||||
; */
|
||||
EXPORT svc_exit
|
||||
svc_exit:
|
||||
; get user SP.
|
||||
PUSH {R0} ; push result to SP.
|
||||
BL lwp_get_kernel_sp
|
||||
ldr r3, [r0, #-4]
|
||||
pop {r0}
|
||||
|
||||
ldr lr, [r3, #20]
|
||||
ldr r1, [r3, #24] ; load pc
|
||||
add r3, r3, #32 ; exception_stack_frame size
|
||||
MSR PSP, R3 ; restore app stack pointer
|
||||
; restore to PSP & thread-unprivilege mode.
|
||||
MRS R2, CONTROL
|
||||
ORR R2, R2, #0x03
|
||||
MSR CONTROL, R2
|
||||
|
||||
; return to lwp.
|
||||
ORR R1, R1, #0x01 ; only Thumb-mode.
|
||||
BX R1 ; return to user app.
|
||||
|
||||
END
|
135
rt-thread/components/lwp/arch/arm/cortex-m3/lwp_rvds.S
Normal file
135
rt-thread/components/lwp/arch/arm/cortex-m3/lwp_rvds.S
Normal file
@@ -0,0 +1,135 @@
|
||||
;/*
|
||||
; * Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
; *
|
||||
; * SPDX-License-Identifier: Apache-2.0
|
||||
; *
|
||||
; * Change Logs:
|
||||
; * Date Author Notes
|
||||
; * 2018-10-30 heyuanjie first version
|
||||
; */
|
||||
|
||||
AREA |.text|, CODE, READONLY, ALIGN=2
|
||||
THUMB
|
||||
REQUIRE8
|
||||
PRESERVE8
|
||||
|
||||
;/*
|
||||
; * void* lwp_get_sys_api(rt_uint32_t number);
|
||||
; */
|
||||
IMPORT lwp_get_sys_api
|
||||
IMPORT lwp_get_kernel_sp
|
||||
IMPORT lwp_set_kernel_sp
|
||||
|
||||
;/*
|
||||
; * void lwp_user_entry(args, text, data);
|
||||
; */
|
||||
lwp_user_entry PROC
|
||||
EXPORT lwp_user_entry
|
||||
|
||||
PUSH {R0-R3} ; push text&data addr.
|
||||
|
||||
MOV R0, SP ; v1 = SP
|
||||
BL lwp_set_kernel_sp ; lwp_set_kernel_sp(v1)
|
||||
|
||||
; set CPU to user-thread mode.
|
||||
MRS R2, CONTROL
|
||||
ORR R2, R2, #0x03 ; use PSP, user-thread mode.
|
||||
MSR CONTROL, R2
|
||||
|
||||
POP {R0-R3} ; pop app address to R1.
|
||||
; set data address.
|
||||
MOV R9, R2
|
||||
|
||||
; run app, only Thumb-mode.
|
||||
ORR R1, R1, #0x01
|
||||
BX R1
|
||||
|
||||
; never reach here!
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void SVC_Handler(void);
|
||||
; */
|
||||
SVC_Handler PROC
|
||||
EXPORT SVC_Handler
|
||||
|
||||
PUSH {LR}
|
||||
|
||||
; get user SP.
|
||||
TST LR, #0x4
|
||||
ITE EQ
|
||||
MRSEQ R1, MSP
|
||||
MRSNE R1, PSP
|
||||
PUSH {R1} ; push app SP.
|
||||
|
||||
; get SVC number.
|
||||
mov R0, R7
|
||||
|
||||
; get kernel system API
|
||||
BL lwp_get_sys_api
|
||||
|
||||
PUSH {R0} ; push api
|
||||
|
||||
; get kernel SP to R0.
|
||||
BL lwp_get_kernel_sp
|
||||
|
||||
POP {R2} ; pop api to R2.
|
||||
POP {R1} ; pop app SP to R1.
|
||||
|
||||
stmfd r0!, {r1} ; save app SP to kernel SP
|
||||
|
||||
;push app parm5~6 to kernel SP
|
||||
STMFD R0!, {R4 - R5}
|
||||
; copy R1(app SP) to R0(kernel SP).
|
||||
push {r8-r11}
|
||||
LDMFD R1, {R4 - R11} ; pop exception_stack_frame to r4 - r11 register
|
||||
STMFD R0!, {R4 - R11} ; push exception_stack_frame to server SP.
|
||||
pop {r8-r11}
|
||||
|
||||
LDR R3, =svc_exit
|
||||
STR R3, [R0, #20] ; update LR
|
||||
STR R2, [R0, #24] ; update api to PC
|
||||
MSR PSP, R0 ; update SP, API is executed with kernel SP
|
||||
|
||||
; set to thread-privilege mode.
|
||||
MRS R3, CONTROL
|
||||
BIC R3, R3, #0x01
|
||||
ORR R3, R3, #0x02
|
||||
MSR CONTROL, R3
|
||||
|
||||
POP {LR} ; 0xFFFFFFED
|
||||
ORR LR, LR, #0x10
|
||||
BX LR
|
||||
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void svc_exit(void);
|
||||
; */
|
||||
svc_exit PROC
|
||||
EXPORT svc_exit
|
||||
|
||||
; get user SP.
|
||||
PUSH {R0} ; push result to SP.
|
||||
BL lwp_get_kernel_sp
|
||||
ldr r3, [r0, #-4]
|
||||
pop {r0}
|
||||
|
||||
ldr lr, [r3, #20]
|
||||
ldr r1, [r3, #24] ; load pc
|
||||
add r3, #32 ; exception_stack_frame size
|
||||
MSR PSP, R3 ; restore app stack pointer
|
||||
; restore to PSP & thread-unprivilege mode.
|
||||
MRS R2, CONTROL
|
||||
ORR R2, R2, #0x03
|
||||
MSR CONTROL, R2
|
||||
|
||||
; return to lwp.
|
||||
ORR R1, R1, #0x01 ; only Thumb-mode.
|
||||
BX R1 ; return to user app.
|
||||
|
||||
ENDP
|
||||
|
||||
ALIGN
|
||||
|
||||
END
|
124
rt-thread/components/lwp/arch/arm/cortex-m4/lwp_gcc.S
Normal file
124
rt-thread/components/lwp/arch/arm/cortex-m4/lwp_gcc.S
Normal file
@@ -0,0 +1,124 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2018-10-30 heyuanjie first version
|
||||
*/
|
||||
|
||||
.cpu cortex-m4
|
||||
.syntax unified
|
||||
.thumb
|
||||
.text
|
||||
|
||||
/*
|
||||
* void* lwp_get_sys_api(rt_uint32_t number);
|
||||
*/
|
||||
.global lwp_get_sys_api
|
||||
.global lwp_get_kernel_sp
|
||||
.global lwp_set_kernel_sp
|
||||
|
||||
|
||||
/*
|
||||
* void lwp_user_entry(args, text, data);
|
||||
*/
|
||||
.global lwp_user_entry
|
||||
.type lwp_user_entry, % function
|
||||
lwp_user_entry:
|
||||
PUSH {R0-R3} @; push text&data addr.
|
||||
|
||||
MOV R0, SP @; v1 = SP
|
||||
BL lwp_set_kernel_sp @; lwp_set_kernel_sp(v1)
|
||||
|
||||
@; set CPU to user-thread mode.
|
||||
MRS R2, CONTROL
|
||||
ORR R2, R2, #0x03 @; use PSP, user-thread mode.
|
||||
MSR CONTROL, R2
|
||||
|
||||
POP {R0-R3} @; pop app address to R1.
|
||||
@; set data address.
|
||||
MOV R9, R2
|
||||
|
||||
@; run app, only Thumb-mode.
|
||||
ORR R1, R1, #0x01
|
||||
BX R1
|
||||
|
||||
/*
|
||||
* void SVC_Handler(void);
|
||||
*/
|
||||
.global SVC_Handler
|
||||
.type SVC_Handler, % function
|
||||
SVC_Handler:
|
||||
PUSH {LR}
|
||||
|
||||
@; get user SP.
|
||||
TST LR, #0x4
|
||||
ITE EQ
|
||||
MRSEQ R1, MSP
|
||||
MRSNE R1, PSP
|
||||
PUSH {R1} @; push app SP.
|
||||
|
||||
@; get SVC number.
|
||||
mov R0, R7
|
||||
|
||||
@; get kernel system API
|
||||
BL lwp_get_sys_api
|
||||
|
||||
PUSH {R0} @; push api
|
||||
|
||||
@; get kernel SP to R0.
|
||||
BL lwp_get_kernel_sp
|
||||
|
||||
POP {R2} @; pop api to R2.
|
||||
POP {R1} @; pop app SP to R1.
|
||||
|
||||
stmfd r0!, {r1} @; save app SP to kernel SP
|
||||
|
||||
@;push app parm5~6 to kernel SP
|
||||
STMFD R0!, {R4 - R5}
|
||||
@; copy R1(app SP) to R0(kernel SP).
|
||||
push {r8-r11}
|
||||
LDMFD R1, {R4 - R11} @; pop exception_stack_frame to r4 - r11 register
|
||||
STMFD R0!, {R4 - R11} @; push exception_stack_frame to server SP.
|
||||
pop {r8-r11}
|
||||
|
||||
LDR R3, =svc_exit
|
||||
STR R3, [R0, #20] @; update LR
|
||||
STR R2, [R0, #24] @; update api to PC
|
||||
MSR PSP, R0 @; update SP, API is executed with kernel SP
|
||||
|
||||
@; set to thread-privilege mode.
|
||||
MRS R3, CONTROL
|
||||
BIC R3, R3, #0x01
|
||||
ORR R3, R3, #0x02
|
||||
MSR CONTROL, R3
|
||||
|
||||
POP {LR} @; 0xFFFFFFED
|
||||
ORR LR, LR, #0x10
|
||||
BX LR
|
||||
/*
|
||||
* void svc_exit(void);
|
||||
*/
|
||||
.global svc_exit
|
||||
.type svc_exit, % function
|
||||
svc_exit:
|
||||
@; get user SP.
|
||||
PUSH {R0} @; push result to SP.
|
||||
BL lwp_get_kernel_sp
|
||||
ldr r3, [r0, #-4]
|
||||
pop {r0}
|
||||
|
||||
ldr lr, [r3, #20]
|
||||
ldr r1, [r3, #24] @; load pc
|
||||
add r3, #32 @; exception_stack_frame size
|
||||
MSR PSP, R3 @; restore app stack pointer
|
||||
@; restore to PSP & thread-unprivilege mode.
|
||||
MRS R2, CONTROL
|
||||
ORR R2, R2, #0x03
|
||||
MSR CONTROL, R2
|
||||
|
||||
@; return to lwp.
|
||||
ORR R1, R1, #0x01 @; only Thumb-mode.
|
||||
BX R1 @; return to user app.
|
123
rt-thread/components/lwp/arch/arm/cortex-m4/lwp_iar.S
Normal file
123
rt-thread/components/lwp/arch/arm/cortex-m4/lwp_iar.S
Normal file
@@ -0,0 +1,123 @@
|
||||
;/*
|
||||
; * Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
; *
|
||||
; * SPDX-License-Identifier: Apache-2.0
|
||||
; *
|
||||
; * Change Logs:
|
||||
; * Date Author Notes
|
||||
; * 2018-10-30 heyuanjie first version
|
||||
; */
|
||||
|
||||
SECTION .text:CODE(2)
|
||||
THUMB
|
||||
REQUIRE8
|
||||
PRESERVE8
|
||||
|
||||
;/*
|
||||
; * void* lwp_get_sys_api(rt_uint32_t number);
|
||||
; */
|
||||
IMPORT lwp_get_sys_api
|
||||
IMPORT lwp_get_kernel_sp
|
||||
IMPORT lwp_set_kernel_sp
|
||||
|
||||
;/*
|
||||
; * void lwp_user_entry(args, text, data);
|
||||
; */
|
||||
EXPORT lwp_user_entry
|
||||
lwp_user_entry:
|
||||
PUSH {R0-R3} ; push text&data addr.
|
||||
|
||||
MOV R0, SP ; v1 = SP
|
||||
BL lwp_set_kernel_sp ; lwp_set_kernel_sp(v1)
|
||||
|
||||
; set CPU to user-thread mode.
|
||||
MRS R2, CONTROL
|
||||
ORR R2, R2, #0x03 ; use PSP, user-thread mode.
|
||||
MSR CONTROL, R2
|
||||
|
||||
POP {R0-R3} ; pop app address to R1.
|
||||
; set data address.
|
||||
MOV R9, R2
|
||||
|
||||
; run app, only Thumb-mode.
|
||||
ORR R1, R1, #0x01
|
||||
BX R1
|
||||
|
||||
;/*
|
||||
; * void SVC_Handler(void);
|
||||
; */
|
||||
EXPORT SVC_Handler
|
||||
SVC_Handler:
|
||||
PUSH {LR}
|
||||
|
||||
; get user SP.
|
||||
TST LR, #0x4
|
||||
ITE EQ
|
||||
MRSEQ R1, MSP
|
||||
MRSNE R1, PSP
|
||||
PUSH {R1} ; push app SP.
|
||||
|
||||
; get SVC number.
|
||||
mov R0, R7
|
||||
|
||||
; get kernel system API
|
||||
BL lwp_get_sys_api
|
||||
|
||||
PUSH {R0} ; push api
|
||||
|
||||
; get kernel SP to R0.
|
||||
BL lwp_get_kernel_sp
|
||||
|
||||
POP {R2} ; pop api to R2.
|
||||
POP {R1} ; pop app SP to R1.
|
||||
|
||||
stmfd r0!, {r1} ; save app SP to kernel SP
|
||||
|
||||
;push app parm5~6 to kernel SP
|
||||
STMFD R0!, {R4 - R5}
|
||||
; copy R1(app SP) to R0(kernel SP).
|
||||
push {r8-r11}
|
||||
LDMFD R1, {R4 - R11} ; pop exception_stack_frame to r4 - r11 register
|
||||
STMFD R0!, {R4 - R11} ; push exception_stack_frame to server SP.
|
||||
pop {r8-r11}
|
||||
|
||||
LDR R3, =svc_exit
|
||||
STR R3, [R0, #20] ; update LR
|
||||
STR R2, [R0, #24] ; update api to PC
|
||||
MSR PSP, R0 ; update SP, API is executed with kernel SP
|
||||
|
||||
; set to thread-privilege mode.
|
||||
MRS R3, CONTROL
|
||||
BIC R3, R3, #0x01
|
||||
ORR R3, R3, #0x02
|
||||
MSR CONTROL, R3
|
||||
|
||||
POP {LR} ; 0xFFFFFFED
|
||||
ORR LR, LR, #0x10
|
||||
BX LR
|
||||
|
||||
;/*
|
||||
; * void svc_exit(void);
|
||||
; */
|
||||
EXPORT svc_exit
|
||||
svc_exit:
|
||||
; get user SP.
|
||||
PUSH {R0} ; push result to SP.
|
||||
BL lwp_get_kernel_sp
|
||||
ldr r3, [r0, #-4]
|
||||
pop {r0}
|
||||
|
||||
ldr lr, [r3, #20]
|
||||
ldr r1, [r3, #24] ; load pc
|
||||
add r3, r3, #32 ; exception_stack_frame size
|
||||
MSR PSP, R3 ; restore app stack pointer
|
||||
; restore to PSP & thread-unprivilege mode.
|
||||
MRS R2, CONTROL
|
||||
ORR R2, R2, #0x03
|
||||
MSR CONTROL, R2
|
||||
|
||||
; return to lwp.
|
||||
ORR R1, R1, #0x01 ; only Thumb-mode.
|
||||
BX R1 ; return to user app.
|
||||
|
||||
END
|
135
rt-thread/components/lwp/arch/arm/cortex-m4/lwp_rvds.S
Normal file
135
rt-thread/components/lwp/arch/arm/cortex-m4/lwp_rvds.S
Normal file
@@ -0,0 +1,135 @@
|
||||
;/*
|
||||
; * Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
; *
|
||||
; * SPDX-License-Identifier: Apache-2.0
|
||||
; *
|
||||
; * Change Logs:
|
||||
; * Date Author Notes
|
||||
; * 2018-10-30 heyuanjie first version
|
||||
; */
|
||||
|
||||
AREA |.text|, CODE, READONLY, ALIGN=2
|
||||
THUMB
|
||||
REQUIRE8
|
||||
PRESERVE8
|
||||
|
||||
;/*
|
||||
; * void* lwp_get_sys_api(rt_uint32_t number);
|
||||
; */
|
||||
IMPORT lwp_get_sys_api
|
||||
IMPORT lwp_get_kernel_sp
|
||||
IMPORT lwp_set_kernel_sp
|
||||
|
||||
;/*
|
||||
; * void lwp_user_entry(args, text, data);
|
||||
; */
|
||||
lwp_user_entry PROC
|
||||
EXPORT lwp_user_entry
|
||||
|
||||
PUSH {R0-R3} ; push text&data addr.
|
||||
|
||||
MOV R0, SP ; v1 = SP
|
||||
BL lwp_set_kernel_sp ; lwp_set_kernel_sp(v1)
|
||||
|
||||
; set CPU to user-thread mode.
|
||||
MRS R2, CONTROL
|
||||
ORR R2, R2, #0x03 ; use PSP, user-thread mode.
|
||||
MSR CONTROL, R2
|
||||
|
||||
POP {R0-R3} ; pop app address to R1.
|
||||
; set data address.
|
||||
MOV R9, R2
|
||||
|
||||
; run app, only Thumb-mode.
|
||||
ORR R1, R1, #0x01
|
||||
BX R1
|
||||
|
||||
; never reach here!
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void SVC_Handler(void);
|
||||
; */
|
||||
SVC_Handler PROC
|
||||
EXPORT SVC_Handler
|
||||
|
||||
PUSH {LR}
|
||||
|
||||
; get user SP.
|
||||
TST LR, #0x4
|
||||
ITE EQ
|
||||
MRSEQ R1, MSP
|
||||
MRSNE R1, PSP
|
||||
PUSH {R1} ; push app SP.
|
||||
|
||||
; get SVC number.
|
||||
mov R0, R7
|
||||
|
||||
; get kernel system API
|
||||
BL lwp_get_sys_api
|
||||
|
||||
PUSH {R0} ; push api
|
||||
|
||||
; get kernel SP to R0.
|
||||
BL lwp_get_kernel_sp
|
||||
|
||||
POP {R2} ; pop api to R2.
|
||||
POP {R1} ; pop app SP to R1.
|
||||
|
||||
stmfd r0!, {r1} ; save app SP to kernel SP
|
||||
|
||||
;push app parm5~6 to kernel SP
|
||||
STMFD R0!, {R4 - R5}
|
||||
; copy R1(app SP) to R0(kernel SP).
|
||||
push {r8-r11}
|
||||
LDMFD R1, {R4 - R11} ; pop exception_stack_frame to r4 - r11 register
|
||||
STMFD R0!, {R4 - R11} ; push exception_stack_frame to server SP.
|
||||
pop {r8-r11}
|
||||
|
||||
LDR R3, =svc_exit
|
||||
STR R3, [R0, #20] ; update LR
|
||||
STR R2, [R0, #24] ; update api to PC
|
||||
MSR PSP, R0 ; update SP, API is executed with kernel SP
|
||||
|
||||
; set to thread-privilege mode.
|
||||
MRS R3, CONTROL
|
||||
BIC R3, R3, #0x01
|
||||
ORR R3, R3, #0x02
|
||||
MSR CONTROL, R3
|
||||
|
||||
POP {LR} ; 0xFFFFFFED
|
||||
ORR LR, LR, #0x10
|
||||
BX LR
|
||||
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void svc_exit(void);
|
||||
; */
|
||||
svc_exit PROC
|
||||
EXPORT svc_exit
|
||||
|
||||
; get user SP.
|
||||
PUSH {R0} ; push result to SP.
|
||||
BL lwp_get_kernel_sp
|
||||
ldr r3, [r0, #-4]
|
||||
pop {r0}
|
||||
|
||||
ldr lr, [r3, #20]
|
||||
ldr r1, [r3, #24] ; load pc
|
||||
add r3, #32 ; exception_stack_frame size
|
||||
MSR PSP, R3 ; restore app stack pointer
|
||||
; restore to PSP & thread-unprivilege mode.
|
||||
MRS R2, CONTROL
|
||||
ORR R2, R2, #0x03
|
||||
MSR CONTROL, R2
|
||||
|
||||
; return to lwp.
|
||||
ORR R1, R1, #0x01 ; only Thumb-mode.
|
||||
BX R1 ; return to user app.
|
||||
|
||||
ENDP
|
||||
|
||||
ALIGN
|
||||
|
||||
END
|
124
rt-thread/components/lwp/arch/arm/cortex-m7/lwp_gcc.S
Normal file
124
rt-thread/components/lwp/arch/arm/cortex-m7/lwp_gcc.S
Normal file
@@ -0,0 +1,124 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2018-10-30 heyuanjie first version
|
||||
*/
|
||||
|
||||
.cpu cortex-m7
|
||||
.syntax unified
|
||||
.thumb
|
||||
.text
|
||||
|
||||
/*
|
||||
* void* lwp_get_sys_api(rt_uint32_t number);
|
||||
*/
|
||||
.global lwp_get_sys_api
|
||||
.global lwp_get_kernel_sp
|
||||
.global lwp_set_kernel_sp
|
||||
|
||||
|
||||
/*
|
||||
* void lwp_user_entry(args, text, data);
|
||||
*/
|
||||
.global lwp_user_entry
|
||||
.type lwp_user_entry, % function
|
||||
lwp_user_entry:
|
||||
PUSH {R0-R3} @; push text&data addr.
|
||||
|
||||
MOV R0, SP @; v1 = SP
|
||||
BL lwp_set_kernel_sp @; lwp_set_kernel_sp(v1)
|
||||
|
||||
@; set CPU to user-thread mode.
|
||||
MRS R2, CONTROL
|
||||
ORR R2, R2, #0x03 @; use PSP, user-thread mode.
|
||||
MSR CONTROL, R2
|
||||
|
||||
POP {R0-R3} @; pop app address to R1.
|
||||
@; set data address.
|
||||
MOV R9, R2
|
||||
|
||||
@; run app, only Thumb-mode.
|
||||
ORR R1, R1, #0x01
|
||||
BX R1
|
||||
|
||||
/*
|
||||
* void SVC_Handler(void);
|
||||
*/
|
||||
.global SVC_Handler
|
||||
.type SVC_Handler, % function
|
||||
SVC_Handler:
|
||||
PUSH {LR}
|
||||
|
||||
@; get user SP.
|
||||
TST LR, #0x4
|
||||
ITE EQ
|
||||
MRSEQ R1, MSP
|
||||
MRSNE R1, PSP
|
||||
PUSH {R1} @; push app SP.
|
||||
|
||||
@; get SVC number.
|
||||
mov R0, R7
|
||||
|
||||
@; get kernel system API
|
||||
BL lwp_get_sys_api
|
||||
|
||||
PUSH {R0} @; push api
|
||||
|
||||
@; get kernel SP to R0.
|
||||
BL lwp_get_kernel_sp
|
||||
|
||||
POP {R2} @; pop api to R2.
|
||||
POP {R1} @; pop app SP to R1.
|
||||
|
||||
stmfd r0!, {r1} @; save app SP to kernel SP
|
||||
|
||||
@;push app parm5~6 to kernel SP
|
||||
STMFD R0!, {R4 - R5}
|
||||
@; copy R1(app SP) to R0(kernel SP).
|
||||
push {r8-r11}
|
||||
LDMFD R1, {R4 - R11} @; pop exception_stack_frame to r4 - r11 register
|
||||
STMFD R0!, {R4 - R11} @; push exception_stack_frame to server SP.
|
||||
pop {r8-r11}
|
||||
|
||||
LDR R3, =svc_exit
|
||||
STR R3, [R0, #20] @; update LR
|
||||
STR R2, [R0, #24] @; update api to PC
|
||||
MSR PSP, R0 @; update SP, API is executed with kernel SP
|
||||
|
||||
@; set to thread-privilege mode.
|
||||
MRS R3, CONTROL
|
||||
BIC R3, R3, #0x01
|
||||
ORR R3, R3, #0x02
|
||||
MSR CONTROL, R3
|
||||
|
||||
POP {LR} @; 0xFFFFFFED
|
||||
ORR LR, LR, #0x10
|
||||
BX LR
|
||||
/*
|
||||
* void svc_exit(void);
|
||||
*/
|
||||
.global svc_exit
|
||||
.type svc_exit, % function
|
||||
svc_exit:
|
||||
@; get user SP.
|
||||
PUSH {R0} @; push result to SP.
|
||||
BL lwp_get_kernel_sp
|
||||
ldr r3, [r0, #-4]
|
||||
pop {r0}
|
||||
|
||||
ldr lr, [r3, #20]
|
||||
ldr r1, [r3, #24] @; load pc
|
||||
add r3, #32 @; exception_stack_frame size
|
||||
MSR PSP, R3 @; restore app stack pointer
|
||||
@; restore to PSP & thread-unprivilege mode.
|
||||
MRS R2, CONTROL
|
||||
ORR R2, R2, #0x03
|
||||
MSR CONTROL, R2
|
||||
|
||||
@; return to lwp.
|
||||
ORR R1, R1, #0x01 @; only Thumb-mode.
|
||||
BX R1 @; return to user app.
|
123
rt-thread/components/lwp/arch/arm/cortex-m7/lwp_iar.S
Normal file
123
rt-thread/components/lwp/arch/arm/cortex-m7/lwp_iar.S
Normal file
@@ -0,0 +1,123 @@
|
||||
;/*
|
||||
; * Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
; *
|
||||
; * SPDX-License-Identifier: Apache-2.0
|
||||
; *
|
||||
; * Change Logs:
|
||||
; * Date Author Notes
|
||||
; * 2018-10-30 heyuanjie first version
|
||||
; */
|
||||
|
||||
SECTION .text:CODE(2)
|
||||
THUMB
|
||||
REQUIRE8
|
||||
PRESERVE8
|
||||
|
||||
;/*
|
||||
; * void* lwp_get_sys_api(rt_uint32_t number);
|
||||
; */
|
||||
IMPORT lwp_get_sys_api
|
||||
IMPORT lwp_get_kernel_sp
|
||||
IMPORT lwp_set_kernel_sp
|
||||
|
||||
;/*
|
||||
; * void lwp_user_entry(args, text, data);
|
||||
; */
|
||||
EXPORT lwp_user_entry
|
||||
lwp_user_entry:
|
||||
PUSH {R0-R3} ; push text&data addr.
|
||||
|
||||
MOV R0, SP ; v1 = SP
|
||||
BL lwp_set_kernel_sp ; lwp_set_kernel_sp(v1)
|
||||
|
||||
; set CPU to user-thread mode.
|
||||
MRS R2, CONTROL
|
||||
ORR R2, R2, #0x03 ; use PSP, user-thread mode.
|
||||
MSR CONTROL, R2
|
||||
|
||||
POP {R0-R3} ; pop app address to R1.
|
||||
; set data address.
|
||||
MOV R9, R2
|
||||
|
||||
; run app, only Thumb-mode.
|
||||
ORR R1, R1, #0x01
|
||||
BX R1
|
||||
|
||||
;/*
|
||||
; * void SVC_Handler(void);
|
||||
; */
|
||||
EXPORT SVC_Handler
|
||||
SVC_Handler:
|
||||
PUSH {LR}
|
||||
|
||||
; get user SP.
|
||||
TST LR, #0x4
|
||||
ITE EQ
|
||||
MRSEQ R1, MSP
|
||||
MRSNE R1, PSP
|
||||
PUSH {R1} ; push app SP.
|
||||
|
||||
; get SVC number.
|
||||
mov R0, R7
|
||||
|
||||
; get kernel system API
|
||||
BL lwp_get_sys_api
|
||||
|
||||
PUSH {R0} ; push api
|
||||
|
||||
; get kernel SP to R0.
|
||||
BL lwp_get_kernel_sp
|
||||
|
||||
POP {R2} ; pop api to R2.
|
||||
POP {R1} ; pop app SP to R1.
|
||||
|
||||
stmfd r0!, {r1} ; save app SP to kernel SP
|
||||
|
||||
;push app parm5~6 to kernel SP
|
||||
STMFD R0!, {R4 - R5}
|
||||
; copy R1(app SP) to R0(kernel SP).
|
||||
push {r8-r11}
|
||||
LDMFD R1, {R4 - R11} ; pop exception_stack_frame to r4 - r11 register
|
||||
STMFD R0!, {R4 - R11} ; push exception_stack_frame to server SP.
|
||||
pop {r8-r11}
|
||||
|
||||
LDR R3, =svc_exit
|
||||
STR R3, [R0, #20] ; update LR
|
||||
STR R2, [R0, #24] ; update api to PC
|
||||
MSR PSP, R0 ; update SP, API is executed with kernel SP
|
||||
|
||||
; set to thread-privilege mode.
|
||||
MRS R3, CONTROL
|
||||
BIC R3, R3, #0x01
|
||||
ORR R3, R3, #0x02
|
||||
MSR CONTROL, R3
|
||||
|
||||
POP {LR} ; 0xFFFFFFED
|
||||
ORR LR, LR, #0x10
|
||||
BX LR
|
||||
|
||||
;/*
|
||||
; * void svc_exit(void);
|
||||
; */
|
||||
EXPORT svc_exit
|
||||
svc_exit:
|
||||
; get user SP.
|
||||
PUSH {R0} ; push result to SP.
|
||||
BL lwp_get_kernel_sp
|
||||
ldr r3, [r0, #-4]
|
||||
pop {r0}
|
||||
|
||||
ldr lr, [r3, #20]
|
||||
ldr r1, [r3, #24] ; load pc
|
||||
add r3, r3, #32 ; exception_stack_frame size
|
||||
MSR PSP, R3 ; restore app stack pointer
|
||||
; restore to PSP & thread-unprivilege mode.
|
||||
MRS R2, CONTROL
|
||||
ORR R2, R2, #0x03
|
||||
MSR CONTROL, R2
|
||||
|
||||
; return to lwp.
|
||||
ORR R1, R1, #0x01 ; only Thumb-mode.
|
||||
BX R1 ; return to user app.
|
||||
|
||||
END
|
135
rt-thread/components/lwp/arch/arm/cortex-m7/lwp_rvds.S
Normal file
135
rt-thread/components/lwp/arch/arm/cortex-m7/lwp_rvds.S
Normal file
@@ -0,0 +1,135 @@
|
||||
;/*
|
||||
; * Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
; *
|
||||
; * SPDX-License-Identifier: Apache-2.0
|
||||
; *
|
||||
; * Change Logs:
|
||||
; * Date Author Notes
|
||||
; * 2018-10-30 heyuanjie first version
|
||||
; */
|
||||
|
||||
AREA |.text|, CODE, READONLY, ALIGN=2
|
||||
THUMB
|
||||
REQUIRE8
|
||||
PRESERVE8
|
||||
|
||||
;/*
|
||||
; * void* lwp_get_sys_api(rt_uint32_t number);
|
||||
; */
|
||||
IMPORT lwp_get_sys_api
|
||||
IMPORT lwp_get_kernel_sp
|
||||
IMPORT lwp_set_kernel_sp
|
||||
|
||||
;/*
|
||||
; * void lwp_user_entry(args, text, data);
|
||||
; */
|
||||
lwp_user_entry PROC
|
||||
EXPORT lwp_user_entry
|
||||
|
||||
PUSH {R0-R3} ; push text&data addr.
|
||||
|
||||
MOV R0, SP ; v1 = SP
|
||||
BL lwp_set_kernel_sp ; lwp_set_kernel_sp(v1)
|
||||
|
||||
; set CPU to user-thread mode.
|
||||
MRS R2, CONTROL
|
||||
ORR R2, R2, #0x03 ; use PSP, user-thread mode.
|
||||
MSR CONTROL, R2
|
||||
|
||||
POP {R0-R3} ; pop app address to R1.
|
||||
; set data address.
|
||||
MOV R9, R2
|
||||
|
||||
; run app, only Thumb-mode.
|
||||
ORR R1, R1, #0x01
|
||||
BX R1
|
||||
|
||||
; never reach here!
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void SVC_Handler(void);
|
||||
; */
|
||||
SVC_Handler PROC
|
||||
EXPORT SVC_Handler
|
||||
|
||||
PUSH {LR}
|
||||
|
||||
; get user SP.
|
||||
TST LR, #0x4
|
||||
ITE EQ
|
||||
MRSEQ R1, MSP
|
||||
MRSNE R1, PSP
|
||||
PUSH {R1} ; push app SP.
|
||||
|
||||
; get SVC number.
|
||||
mov R0, R7
|
||||
|
||||
; get kernel system API
|
||||
BL lwp_get_sys_api
|
||||
|
||||
PUSH {R0} ; push api
|
||||
|
||||
; get kernel SP to R0.
|
||||
BL lwp_get_kernel_sp
|
||||
|
||||
POP {R2} ; pop api to R2.
|
||||
POP {R1} ; pop app SP to R1.
|
||||
|
||||
stmfd r0!, {r1} ; save app SP to kernel SP
|
||||
|
||||
;push app parm5~6 to kernel SP
|
||||
STMFD R0!, {R4 - R5}
|
||||
; copy R1(app SP) to R0(kernel SP).
|
||||
push {r8-r11}
|
||||
LDMFD R1, {R4 - R11} ; pop exception_stack_frame to r4 - r11 register
|
||||
STMFD R0!, {R4 - R11} ; push exception_stack_frame to server SP.
|
||||
pop {r8-r11}
|
||||
|
||||
LDR R3, =svc_exit
|
||||
STR R3, [R0, #20] ; update LR
|
||||
STR R2, [R0, #24] ; update api to PC
|
||||
MSR PSP, R0 ; update SP, API is executed with kernel SP
|
||||
|
||||
; set to thread-privilege mode.
|
||||
MRS R3, CONTROL
|
||||
BIC R3, R3, #0x01
|
||||
ORR R3, R3, #0x02
|
||||
MSR CONTROL, R3
|
||||
|
||||
POP {LR} ; 0xFFFFFFED
|
||||
ORR LR, LR, #0x10
|
||||
BX LR
|
||||
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void svc_exit(void);
|
||||
; */
|
||||
svc_exit PROC
|
||||
EXPORT svc_exit
|
||||
|
||||
; get user SP.
|
||||
PUSH {R0} ; push result to SP.
|
||||
BL lwp_get_kernel_sp
|
||||
ldr r3, [r0, #-4]
|
||||
pop {r0}
|
||||
|
||||
ldr lr, [r3, #20]
|
||||
ldr r1, [r3, #24] ; load pc
|
||||
add r3, #32 ; exception_stack_frame size
|
||||
MSR PSP, R3 ; restore app stack pointer
|
||||
; restore to PSP & thread-unprivilege mode.
|
||||
MRS R2, CONTROL
|
||||
ORR R2, R2, #0x03
|
||||
MSR CONTROL, R2
|
||||
|
||||
; return to lwp.
|
||||
ORR R1, R1, #0x01 ; only Thumb-mode.
|
||||
BX R1 ; return to user app.
|
||||
|
||||
ENDP
|
||||
|
||||
ALIGN
|
||||
|
||||
END
|
Reference in New Issue
Block a user