16#ifndef ZEPHYR_INCLUDE_ARCH_XTENSA_SYSCALL_H_
17#define ZEPHYR_INCLUDE_ARCH_XTENSA_SYSCALL_H_
19#ifdef CONFIG_USERSPACE
27#include <xtensa/config/core-isa.h>
47#ifdef XCHAL_HAVE_LOOPS
48#define XTENSA_SYSCALL_ASM "syscall; nop;"
50#define XTENSA_SYSCALL_ASM "syscall"
53#ifdef CONFIG_XTENSA_SYSCALL_USE_HELPER
67#define SYSINL ALWAYS_INLINE
87#ifdef CONFIG_XTENSA_SYSCALL_USE_HELPER
88 return xtensa_syscall_helper_args_6(arg1, arg2, arg3, arg4, arg5, arg6, call_id);
90 register uintptr_t a2 __asm__(
"%a2") = call_id;
91 register uintptr_t a6 __asm__(
"%a6") = arg1;
92 register uintptr_t a3 __asm__(
"%a3") = arg2;
93 register uintptr_t a4 __asm__(
"%a4") = arg3;
94 register uintptr_t a5 __asm__(
"%a5") = arg4;
95 register uintptr_t a8 __asm__(
"%a8") = arg5;
96 register uintptr_t a9 __asm__(
"%a9") = arg6;
100 :
"r" (a2),
"r" (a6),
"r" (a3),
"r" (a4),
101 "r" (a5),
"r" (a8),
"r" (a9)
112#ifdef CONFIG_XTENSA_SYSCALL_USE_HELPER
113 return xtensa_syscall_helper_args_5(arg1, arg2, arg3, arg4, arg5, call_id);
115 register uintptr_t a2 __asm__(
"%a2") = call_id;
116 register uintptr_t a6 __asm__(
"%a6") = arg1;
117 register uintptr_t a3 __asm__(
"%a3") = arg2;
118 register uintptr_t a4 __asm__(
"%a4") = arg3;
119 register uintptr_t a5 __asm__(
"%a5") = arg4;
120 register uintptr_t a8 __asm__(
"%a8") = arg5;
124 :
"r" (a2),
"r" (a6),
"r" (a3),
"r" (a4),
136#ifdef CONFIG_XTENSA_SYSCALL_USE_HELPER
137 return xtensa_syscall_helper_args_4(arg1, arg2, arg3, arg4, call_id);
139 register uintptr_t a2 __asm__(
"%a2") = call_id;
140 register uintptr_t a6 __asm__(
"%a6") = arg1;
141 register uintptr_t a3 __asm__(
"%a3") = arg2;
142 register uintptr_t a4 __asm__(
"%a4") = arg3;
143 register uintptr_t a5 __asm__(
"%a5") = arg4;
147 :
"r" (a2),
"r" (a6),
"r" (a3),
"r" (a4),
158 register uintptr_t a2 __asm__(
"%a2") = call_id;
159 register uintptr_t a6 __asm__(
"%a6") = arg1;
160 register uintptr_t a3 __asm__(
"%a3") = arg2;
161 register uintptr_t a4 __asm__(
"%a4") = arg3;
165 :
"r" (a2),
"r" (a6),
"r" (a3),
"r" (a4)
174 register uintptr_t a2 __asm__(
"%a2") = call_id;
175 register uintptr_t a6 __asm__(
"%a6") = arg1;
176 register uintptr_t a3 __asm__(
"%a3") = arg2;
180 :
"r" (a2),
"r" (a6),
"r" (a3)
188 register uintptr_t a2 __asm__(
"%a2") = call_id;
189 register uintptr_t a6 __asm__(
"%a6") = arg1;
201 register uintptr_t a2 __asm__(
"%a2") = call_id;
218#if XCHAL_HAVE_THREADPTR
222 "rur.THREADPTR %0\n\t"
225#ifdef CONFIG_THREAD_LOCAL_STORAGE
226 extern Z_THREAD_LOCAL
uint32_t is_user_mode;
232 return is_user_mode != 0;
238 extern bool xtensa_is_user_context(
void);
240 return xtensa_is_user_context();
static uintptr_t arch_syscall_invoke4(uintptr_t arg1, uintptr_t arg2, uintptr_t arg3, uintptr_t arg4, uintptr_t call_id)
Definition syscall.h:89
static uintptr_t arch_syscall_invoke2(uintptr_t arg1, uintptr_t arg2, uintptr_t call_id)
Definition syscall.h:131
static uintptr_t arch_syscall_invoke1(uintptr_t arg1, uintptr_t call_id)
Definition syscall.h:149
static uintptr_t arch_syscall_invoke0(uintptr_t call_id)
Definition syscall.h:165
static bool arch_is_user_context(void)
Definition syscall.h:181
static uintptr_t arch_syscall_invoke5(uintptr_t arg1, uintptr_t arg2, uintptr_t arg3, uintptr_t arg4, uintptr_t arg5, uintptr_t call_id)
Definition syscall.h:65
static uintptr_t arch_syscall_invoke3(uintptr_t arg1, uintptr_t arg2, uintptr_t arg3, uintptr_t call_id)
Definition syscall.h:111
static uintptr_t arch_syscall_invoke6(uintptr_t arg1, uintptr_t arg2, uintptr_t arg3, uintptr_t arg4, uintptr_t arg5, uintptr_t arg6, uintptr_t call_id)
Definition syscall.h:40
#define SYSINL
Definition syscall.h:69
#define XTENSA_SYSCALL_ASM
Definition syscall.h:50
Definitions of various linker Sections.
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINTPTR_TYPE__ uintptr_t
Definition stdint.h:105