| /* SPDX-License-Identifier: BSD-2-Clause */ |
| /* |
| * Copyright (c) 2015, Linaro Limited |
| * Copyright (c) 2014, STMicroelectronics International N.V. |
| */ |
| |
| #include <tee_syscall_numbers.h> |
| #include <asm.S> |
| |
| #if defined(CFG_UNWIND) |
| #define UNWIND(...) __VA_ARGS__ |
| #else |
| #define UNWIND(...) |
| #endif |
| |
| .section .text |
| .balign 4 |
| .code 32 |
| |
| .macro UTEE_SYSCALL name, scn, num_args |
| FUNC \name , : |
| |
| UNWIND( .fnstart) |
| push {r5-r7,lr} |
| UNWIND( .save {r5-r7,lr}) |
| #if defined(CFG_SYSCALL_WRAPPERS_MCOUNT) && !defined(__LDELF__) |
| .if \scn != TEE_SCN_RETURN |
| mov ip, sp |
| push {r0-r4, fp, ip} |
| add fp, ip, #16 |
| push {lr} |
| bl __gnu_mcount_nc |
| pop {r0-r4, fp, ip} |
| mov sp, ip |
| .endif |
| #endif |
| mov r7, #(\scn) |
| .if \num_args > TEE_SVC_MAX_ARGS |
| .error "Too many arguments for syscall" |
| .endif |
| .if \num_args <= 4 |
| @ No arguments passed on stack |
| mov r6, #0 |
| .else |
| @ Tell number of arguments passed on the stack |
| mov r6, #(\num_args - 4) |
| @ Point just before the push (4 registers) above on the first argument |
| add r5, sp, #(4 * 4) |
| .endif |
| svc #0 |
| pop {r5-r7,pc} |
| UNWIND( .fnend) |
| END_FUNC \name |
| .endm |
| |
| FUNC utee_panic, : |
| UNWIND( .fnstart) |
| push {r0-r11, lr} |
| UNWIND( .save {r0-r11, lr}) |
| mov lr, pc |
| push {lr} |
| UNWIND( .save {lr}) |
| mov r1, sp |
| bl __utee_panic |
| /* Not reached */ |
| UNWIND( .fnend) |
| END_FUNC utee_panic |
| |
| #include "utee_syscalls_asm.S" |