1 /* SPDX-License-Identifier: BSD-2-Clause */
2 /*
3 * Copyright (c) 2014-2022, Linaro Limited
4 * Copyright (c) 2020, Arm Limited
5 */
6 #ifndef __KERNEL_ARCH_SCALL_H
7 #define __KERNEL_ARCH_SCALL_H
8
9 #include <arm.h>
10 #include <kernel/thread.h>
11 #include <types_ext.h>
12
scall_get_max_args(struct thread_scall_regs * regs,size_t * scn,size_t * max_args)13 static inline void scall_get_max_args(struct thread_scall_regs *regs,
14 size_t *scn, size_t *max_args)
15 {
16 #ifdef ARM32
17 *scn = regs->r7;
18 *max_args = regs->r6;
19 #endif
20 #ifdef ARM64
21 if (((regs->spsr >> SPSR_MODE_RW_SHIFT) & SPSR_MODE_RW_MASK) ==
22 SPSR_MODE_RW_32) {
23 *scn = regs->x7;
24 *max_args = regs->x6;
25 } else {
26 *scn = regs->x8;
27 *max_args = 0;
28 }
29 #endif
30 }
31
scall_set_retval(struct thread_scall_regs * regs,uint32_t ret_val)32 static inline void scall_set_retval(struct thread_scall_regs *regs,
33 uint32_t ret_val)
34 {
35 #ifdef ARM32
36 regs->r0 = ret_val;
37 #endif
38 #ifdef ARM64
39 regs->x0 = ret_val;
40 #endif
41 }
42
scall_set_sys_return_regs(struct thread_scall_regs * regs,bool panic,uint32_t panic_code)43 static inline void scall_set_sys_return_regs(struct thread_scall_regs *regs,
44 bool panic, uint32_t panic_code)
45 {
46 #ifdef ARM32
47 regs->r1 = panic;
48 regs->r2 = panic_code;
49 #endif
50 #ifdef ARM64
51 regs->x1 = panic;
52 regs->x2 = panic_code;
53 #endif
54 }
55 #endif /*__KERNEL_ARCH_SCALL_H*/
56
57