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