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