17#ifndef ZEPHYR_INCLUDE_ARCH_ARM_SYSCALL_H_
18#define ZEPHYR_INCLUDE_ARCH_ARM_SYSCALL_H_
20#define _SVC_CALL_CONTEXT_SWITCH 0
21#define _SVC_CALL_IRQ_OFFLOAD 1
22#define _SVC_CALL_RUNTIME_EXCEPT 2
23#define _SVC_CALL_SYSTEM_CALL 3
25#ifdef CONFIG_USERSPACE
46 register uint32_t ret __asm__(
"r0") = arg1;
47 register uint32_t r1 __asm__(
"r1") = arg2;
48 register uint32_t r2 __asm__(
"r2") = arg3;
49 register uint32_t r3 __asm__(
"r3") = arg4;
50 register uint32_t r4 __asm__(
"r4") = arg5;
51 register uint32_t r5 __asm__(
"r5") = arg6;
52 register uint32_t r6 __asm__(
"r6") = call_id;
54 __asm__
volatile(
"svc %[svid]\n"
56 :
"=r"(ret),
"=r"(r1),
"=r"(r2),
"=r"(r3)
57 : [svid]
"i" (_SVC_CALL_SYSTEM_CALL),
58 "r" (ret),
"r" (r1),
"r" (r2),
"r" (r3),
59 "r" (r4),
"r" (r5),
"r" (r6)
60 :
"r8",
"memory",
"ip");
70 register uint32_t ret __asm__(
"r0") = arg1;
71 register uint32_t r1 __asm__(
"r1") = arg2;
72 register uint32_t r2 __asm__(
"r2") = arg3;
73 register uint32_t r3 __asm__(
"r3") = arg4;
74 register uint32_t r4 __asm__(
"r4") = arg5;
75 register uint32_t r6 __asm__(
"r6") = call_id;
77 __asm__
volatile(
"svc %[svid]\n"
79 :
"=r"(ret),
"=r"(r1),
"=r"(r2),
"=r"(r3)
80 : [svid]
"i" (_SVC_CALL_SYSTEM_CALL),
81 "r" (ret),
"r" (r1),
"r" (r2),
"r" (r3),
83 :
"r8",
"memory",
"ip");
92 register uint32_t ret __asm__(
"r0") = arg1;
93 register uint32_t r1 __asm__(
"r1") = arg2;
94 register uint32_t r2 __asm__(
"r2") = arg3;
95 register uint32_t r3 __asm__(
"r3") = arg4;
96 register uint32_t r6 __asm__(
"r6") = call_id;
98 __asm__
volatile(
"svc %[svid]\n"
100 :
"=r"(ret),
"=r"(r1),
"=r"(r2),
"=r"(r3)
101 : [svid]
"i" (_SVC_CALL_SYSTEM_CALL),
102 "r" (ret),
"r" (r1),
"r" (r2),
"r" (r3),
104 :
"r8",
"memory",
"ip");
113 register uint32_t ret __asm__(
"r0") = arg1;
114 register uint32_t r1 __asm__(
"r1") = arg2;
115 register uint32_t r2 __asm__(
"r2") = arg3;
116 register uint32_t r6 __asm__(
"r6") = call_id;
118 __asm__
volatile(
"svc %[svid]\n"
120 :
"=r"(ret),
"=r"(r1),
"=r"(r2)
121 : [svid]
"i" (_SVC_CALL_SYSTEM_CALL),
122 "r" (ret),
"r" (r1),
"r" (r2),
"r" (r6)
123 :
"r8",
"memory",
"r3",
"ip");
131 register uint32_t ret __asm__(
"r0") = arg1;
132 register uint32_t r1 __asm__(
"r1") = arg2;
133 register uint32_t r6 __asm__(
"r6") = call_id;
135 __asm__
volatile(
"svc %[svid]\n"
137 :
"=r"(ret),
"=r"(r1)
138 : [svid]
"i" (_SVC_CALL_SYSTEM_CALL),
139 "r" (ret),
"r" (r1),
"r" (r6)
140 :
"r8",
"memory",
"r2",
"r3",
"ip");
148 register uint32_t ret __asm__(
"r0") = arg1;
149 register uint32_t r6 __asm__(
"r6") = call_id;
151 __asm__
volatile(
"svc %[svid]\n"
154 : [svid]
"i" (_SVC_CALL_SYSTEM_CALL),
156 :
"r8",
"memory",
"r1",
"r2",
"r3",
"ip");
162 register uint32_t ret __asm__(
"r0");
163 register uint32_t r6 __asm__(
"r6") = call_id;
165 __asm__
volatile(
"svc %[svid]\n"
168 : [svid]
"i" (_SVC_CALL_SYSTEM_CALL),
170 :
"r8",
"memory",
"r1",
"r2",
"r3",
"ip");
177#if defined(CONFIG_CPU_CORTEX_M)
181 __asm__
volatile(
"mrs %0, IPSR\n\t" :
"=r"(value));
187 return z_arm_thread_is_in_user_mode();
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
ARM AArch32 public kernel miscellaneous.
#define IF_ENABLED(_flag, _code)
Insert code if _flag is defined and equals 1.
Definition util_macro.h:247
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINTPTR_TYPE__ uintptr_t
Definition stdint.h:105