xref: /nrf52832-nimble/rt-thread/components/lwp/arch/arm/arm9/lwp_gcc.S (revision 104654410c56c573564690304ae786df310c91fc)
1/*
2 * Copyright (c) 2006-2018, RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date           Author       Notes
8 * 2018-12-10     Jesven       first version
9 */
10
11#define  Mode_USR       0x10
12#define  Mode_FIQ       0x11
13#define  Mode_IRQ       0x12
14#define  Mode_SVC       0x13
15#define  Mode_MON       0x16
16#define  Mode_ABT       0x17
17#define  Mode_UDF       0x1B
18#define  Mode_SYS       0x1F
19
20#define A_Bit        0x100
21#define I_Bit        0x80 @; when I bit is set, IRQ is disabled
22#define F_Bit        0x40 @; when F bit is set, FIQ is disabled
23#define T_Bit        0x20
24
25.cpu arm9
26.syntax unified
27.text
28
29/*
30 * void lwp_user_entry(args, text, data);
31 */
32.global lwp_user_entry
33.type lwp_user_entry, % function
34lwp_user_entry:
35    mrs     r9, cpsr
36    mov     r8, r9
37    bic     r9, #0x1f
38    orr     r9, #Mode_USR
39
40    orr     r8, #I_Bit
41    msr     cpsr_c, r8
42
43    msr     spsr, r9
44
45    /* set data address. */
46    mov     r9, r2
47    movs    pc, r1
48
49/*
50 * void SVC_Handler(void);
51 */
52.global SVC_Handler
53.type SVC_Handler, % function
54SVC_Handler:
55    push {lr}
56    mrs lr, spsr
57    push {r4, r5, lr}
58
59    mrs r4, cpsr
60    bic r4, #I_Bit
61    msr cpsr_c, r4
62
63    push {r0 - r3, r12}
64    and r0, r7, #0xff
65    bl lwp_get_sys_api
66    cmp r0, #0           /* r0 = api */
67    mov r4, r0
68    pop {r0 - r3, r12}
69    beq svc_exit
70    ldr lr, = svc_exit
71    bx  r4
72
73svc_exit:
74    mrs r4, cpsr
75    orr r4, #I_Bit
76    msr cpsr_c, r4
77
78    pop {r4, r5, lr}
79    msr spsr_cxsf, lr
80    pop {lr}
81    movs pc, lr
82