aboutsummaryrefslogtreecommitdiff
path: root/ldelf/syscalls_a32.S
diff options
context:
space:
mode:
authorBalint Dobszay <balint.dobszay@arm.com>2020-12-11 16:25:47 +0100
committerJérôme Forissier <jerome@forissier.org>2021-01-05 17:56:19 +0100
commitbaa5161d50da0b430760fa9e2180496c2806f839 (patch)
treeaf0751444c45a46857c241b9044dac8a6ae1941e /ldelf/syscalls_a32.S
parent988ea29c4666687dcc038a35efd6412567be57bf (diff)
core: ldelf: implement separate syscalls for ldelf
Implements a separate syscall handler for ldelf to decouple it from user TAs and enable using it for all TSs. The calling convention is the same as for utee_* syscalls. To distinguish between the different SVCs, the syscall handler pointer is updated before entering ldelf and restored after returning. The step of opening a system PTA session and invoking the commands there is eliminated, the necessary functionality is implemented in the ldelf syscall functions. Acked-by: Etienne Carriere <etienne.carriere@linaro.org> Reviewed-by: Jens Wiklander <jens.wiklander@linaro.org> Signed-off-by: Balint Dobszay <balint.dobszay@arm.com>
Diffstat (limited to 'ldelf/syscalls_a32.S')
-rw-r--r--ldelf/syscalls_a32.S51
1 files changed, 51 insertions, 0 deletions
diff --git a/ldelf/syscalls_a32.S b/ldelf/syscalls_a32.S
new file mode 100644
index 00000000..332fa94c
--- /dev/null
+++ b/ldelf/syscalls_a32.S
@@ -0,0 +1,51 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+/*
+ * Copyright (c) 2014, STMicroelectronics International N.V.
+ * Copyright (c) 2015, Linaro Limited
+ * Copyright (c) 2020, Arm Limited
+ */
+
+#include <asm.S>
+
+ .section .text
+ .balign 4
+ .code 32
+
+ .macro LDELF_SYSCALL name, scn, num_args
+ FUNC \name , :
+
+ .if \num_args > 8
+ .error "Too many arguments for syscall"
+ .endif
+
+ push {r5-r7, lr}
+UNWIND( .save {r5-r7, lr})
+ mov r7, #(\scn)
+
+ .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}
+ END_FUNC \name
+ .endm
+
+ FUNC _ldelf_panic, :
+ push {r0-r11, lr}
+UNWIND( .save {r0-r11, lr})
+ mov lr, pc
+ push {lr}
+UNWIND( .save {lr})
+ mov r1, sp
+ bl __ldelf_panic
+ /* Not reached */
+ END_FUNC _ldelf_panic
+
+#include "syscalls_asm.S"