syscall: Move arch specific syscall code into its own header
Split out the arch specific syscall code to reduce include pollution from other arch related headers. For example on ARM its possible to get errno.h included via SoC specific headers. Which created an interesting compile issue because of the order of syscall & errno/errno syscall inclusion. Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
This commit is contained in:
parent
b8ca8cf9b7
commit
4b22ba7e4b
11 changed files with 566 additions and 449 deletions
|
@ -327,150 +327,6 @@ extern "C" {
|
|||
typedef u32_t k_mem_partition_attr_t;
|
||||
#endif /* _ASMLANGUAGE */
|
||||
|
||||
#ifdef CONFIG_USERSPACE
|
||||
#ifndef _ASMLANGUAGE
|
||||
|
||||
/* Syscall invocation macros. arm-specific machine constraints used to ensure
|
||||
* args land in the proper registers.
|
||||
*/
|
||||
static inline u32_t _arch_syscall_invoke6(u32_t arg1, u32_t arg2, u32_t arg3,
|
||||
u32_t arg4, u32_t arg5, u32_t arg6,
|
||||
u32_t call_id)
|
||||
{
|
||||
register u32_t ret __asm__("r0") = arg1;
|
||||
register u32_t r1 __asm__("r1") = arg2;
|
||||
register u32_t r2 __asm__("r2") = arg3;
|
||||
register u32_t r3 __asm__("r3") = arg4;
|
||||
register u32_t r4 __asm__("r4") = arg5;
|
||||
register u32_t r5 __asm__("r5") = arg6;
|
||||
register u32_t r6 __asm__("r6") = call_id;
|
||||
|
||||
__asm__ volatile("svc %[svid]\n"
|
||||
: "=r"(ret)
|
||||
: [svid] "i" (_SVC_CALL_SYSTEM_CALL),
|
||||
"r" (ret), "r" (r1), "r" (r2), "r" (r3),
|
||||
"r" (r4), "r" (r5), "r" (r6)
|
||||
: "r8", "memory");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline u32_t _arch_syscall_invoke5(u32_t arg1, u32_t arg2, u32_t arg3,
|
||||
u32_t arg4, u32_t arg5, u32_t call_id)
|
||||
{
|
||||
register u32_t ret __asm__("r0") = arg1;
|
||||
register u32_t r1 __asm__("r1") = arg2;
|
||||
register u32_t r2 __asm__("r2") = arg3;
|
||||
register u32_t r3 __asm__("r3") = arg4;
|
||||
register u32_t r4 __asm__("r4") = arg5;
|
||||
register u32_t r6 __asm__("r6") = call_id;
|
||||
|
||||
__asm__ volatile("svc %[svid]\n"
|
||||
: "=r"(ret)
|
||||
: [svid] "i" (_SVC_CALL_SYSTEM_CALL),
|
||||
"r" (ret), "r" (r1), "r" (r2), "r" (r3),
|
||||
"r" (r4), "r" (r6)
|
||||
: "r8", "memory");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline u32_t _arch_syscall_invoke4(u32_t arg1, u32_t arg2, u32_t arg3,
|
||||
u32_t arg4, u32_t call_id)
|
||||
{
|
||||
register u32_t ret __asm__("r0") = arg1;
|
||||
register u32_t r1 __asm__("r1") = arg2;
|
||||
register u32_t r2 __asm__("r2") = arg3;
|
||||
register u32_t r3 __asm__("r3") = arg4;
|
||||
register u32_t r6 __asm__("r6") = call_id;
|
||||
|
||||
__asm__ volatile("svc %[svid]\n"
|
||||
: "=r"(ret)
|
||||
: [svid] "i" (_SVC_CALL_SYSTEM_CALL),
|
||||
"r" (ret), "r" (r1), "r" (r2), "r" (r3),
|
||||
"r" (r6)
|
||||
: "r8", "memory");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline u32_t _arch_syscall_invoke3(u32_t arg1, u32_t arg2, u32_t arg3,
|
||||
u32_t call_id)
|
||||
{
|
||||
register u32_t ret __asm__("r0") = arg1;
|
||||
register u32_t r1 __asm__("r1") = arg2;
|
||||
register u32_t r2 __asm__("r2") = arg3;
|
||||
register u32_t r6 __asm__("r6") = call_id;
|
||||
|
||||
__asm__ volatile("svc %[svid]\n"
|
||||
: "=r"(ret)
|
||||
: [svid] "i" (_SVC_CALL_SYSTEM_CALL),
|
||||
"r" (ret), "r" (r1), "r" (r2), "r" (r6)
|
||||
: "r8", "memory", "r3");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline u32_t _arch_syscall_invoke2(u32_t arg1, u32_t arg2, u32_t call_id)
|
||||
{
|
||||
register u32_t ret __asm__("r0") = arg1;
|
||||
register u32_t r1 __asm__("r1") = arg2;
|
||||
register u32_t r6 __asm__("r6") = call_id;
|
||||
|
||||
__asm__ volatile("svc %[svid]\n"
|
||||
: "=r"(ret)
|
||||
: [svid] "i" (_SVC_CALL_SYSTEM_CALL),
|
||||
"r" (ret), "r" (r1), "r" (r6)
|
||||
: "r8", "memory", "r2", "r3");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline u32_t _arch_syscall_invoke1(u32_t arg1, u32_t call_id)
|
||||
{
|
||||
register u32_t ret __asm__("r0") = arg1;
|
||||
register u32_t r6 __asm__("r6") = call_id;
|
||||
|
||||
__asm__ volatile("svc %[svid]\n"
|
||||
: "=r"(ret)
|
||||
: [svid] "i" (_SVC_CALL_SYSTEM_CALL),
|
||||
"r" (ret), "r" (r6)
|
||||
: "r8", "memory", "r1", "r2", "r3");
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline u32_t _arch_syscall_invoke0(u32_t call_id)
|
||||
{
|
||||
register u32_t ret __asm__("r0");
|
||||
register u32_t r6 __asm__("r6") = call_id;
|
||||
|
||||
__asm__ volatile("svc %[svid]\n"
|
||||
: "=r"(ret)
|
||||
: [svid] "i" (_SVC_CALL_SYSTEM_CALL),
|
||||
"r" (ret), "r" (r6)
|
||||
: "r8", "memory", "r1", "r2", "r3");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int _arch_is_user_context(void)
|
||||
{
|
||||
u32_t value;
|
||||
|
||||
/* check for handler mode */
|
||||
__asm__ volatile("mrs %0, IPSR\n\t" : "=r"(value));
|
||||
if (value) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* if not handler mode, return mode information */
|
||||
__asm__ volatile("mrs %0, CONTROL\n\t" : "=r"(value));
|
||||
return value & 0x1;
|
||||
}
|
||||
|
||||
#endif /* _ASMLANGUAGE */
|
||||
#endif /* CONFIG_USERSPACE */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue