syscall_iar.S 1.7 KB
Newer Older
1
;/*
2
; * Copyright (c) 2006-2022, RT-Thread Development Team
3 4 5 6 7 8
; *
; * SPDX-License-Identifier: Apache-2.0
; *
; * Change Logs:
; * Date           Author       Notes
; * 2019-10-25     tyx          first version
9
; * 2021-03-26     lxf          modify bad instruction
10 11 12 13 14 15
; */

;/*
; * @addtogroup cortex-m33
; */

16

17 18 19 20 21
    SECTION    .text:CODE(2)
    THUMB
    REQUIRE8
    PRESERVE8

22 23
    IMPORT rt_secure_svc_handle

24 25 26
;/*
; * int tzcall(int id, rt_ubase_t arg0, rt_ubase_t arg1, rt_ubase_t arg2);
; */
27
    EXPORT tzcall
28
tzcall:
29
    SVC     1                       ;/* call SVC 1 */
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
    BX      LR

tzcall_entry:
    PUSH    {R1, R4, LR}
    MOV     R4, R1                  ;/* copy thread SP to R4 */
    LDMFD   R4!, {r0 - r3}          ;/* pop user stack, get input arg0, arg1, arg2 */
    STMFD   R4!, {r0 - r3}          ;/* push stack, user stack recovery */
    BL      rt_secure_svc_handle    ;/* call fun */
    POP     {R1, R4, LR}
    STR     R0, [R1]                ;/* update return value */
    BX      LR                      ;/* return to thread */

syscall_entry:
    BX      LR                      ;/* return to user app */

45
    EXPORT SVC_Handler
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
SVC_Handler:

    ;/* get SP, save to R1 */
    MRS     R1, MSP                 ;/* get fault context from handler. */
    TST     LR, #0x04               ;/* if(!EXC_RETURN[2]) */
    BEQ     get_sp_done
    MRS     R1, PSP                 ;/* get fault context from thread. */
get_sp_done:

    ;/* get svc index */
    LDR     R0, [R1, #24]
    LDRB    R0, [R0, #-2]

    ;/* if svc == 0, do system call */
    CMP     R0, #0x0
    BEQ    syscall_entry

    ;/* if svc == 1, do TrustZone call */
    CMP     R0, #0x1
    BEQ    tzcall_entry
66 67

    END