Zephyr Project API 4.4.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
syscall.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2018 Linaro Limited.
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
15
16#ifndef ZEPHYR_INCLUDE_ARCH_X86_IA32_SYSCALL_H_
17#define ZEPHYR_INCLUDE_ARCH_X86_IA32_SYSCALL_H_
18
19#define USER_CODE_SEG 0x2b /* at dpl=3 */
20#define USER_DATA_SEG 0x33 /* at dpl=3 */
21
22#ifdef CONFIG_USERSPACE
23#ifndef _ASMLANGUAGE
24
25#include <zephyr/types.h>
26#include <stdbool.h>
28
29#ifdef __cplusplus
30extern "C" {
31#endif
32
33/* Syscall invocation macros. x86-specific machine constraints used to ensure
34 * args land in the proper registers, see implementation of
35 * z_x86_syscall_entry_stub in userspace.S
36 *
37 * The arch_syscall_invoke* and arch_is_user_context implementations below
38 * are the x86 IA-32 versions of arch-internal stubs whose contract is
39 * documented on the prototypes in <zephyr/arch/arch_interface.h>. Hide
40 * them from Doxygen here to avoid double-counting the same interface
41 * across architectures.
42 */
43
45
46static inline uintptr_t arch_syscall_invoke6(uintptr_t arg1, uintptr_t arg2,
47 uintptr_t arg3, uintptr_t arg4,
48 uintptr_t arg5, uintptr_t arg6,
49 uintptr_t call_id)
50{
51 uint32_t ret;
52
53 __asm__ volatile("push %%ebp\n\t"
54 "mov %[arg6], %%ebp\n\t"
55 "int $0x80\n\t"
56 "pop %%ebp\n\t"
57 : "=a" (ret)
58 : "S" (call_id), "a" (arg1), "d" (arg2),
59 "c" (arg3), "b" (arg4), "D" (arg5),
60 [arg6] "m" (arg6)
61 : "memory");
62 return ret;
63}
64
65static inline uintptr_t arch_syscall_invoke5(uintptr_t arg1, uintptr_t arg2,
66 uintptr_t arg3, uintptr_t arg4,
67 uintptr_t arg5,
68 uintptr_t call_id)
69{
70 uint32_t ret;
71
72 __asm__ volatile("int $0x80"
73 : "=a" (ret)
74 : "S" (call_id), "a" (arg1), "d" (arg2),
75 "c" (arg3), "b" (arg4), "D" (arg5)
76 : "memory");
77 return ret;
78}
79
80static inline uintptr_t arch_syscall_invoke4(uintptr_t arg1, uintptr_t arg2,
81 uintptr_t arg3, uintptr_t arg4,
82 uintptr_t call_id)
83{
84 uint32_t ret;
85
86 __asm__ volatile("int $0x80"
87 : "=a" (ret)
88 : "S" (call_id), "a" (arg1), "d" (arg2), "c" (arg3),
89 "b" (arg4)
90 : "memory");
91 return ret;
92}
93
94static inline uintptr_t arch_syscall_invoke3(uintptr_t arg1, uintptr_t arg2,
95 uintptr_t arg3,
96 uintptr_t call_id)
97{
98 uint32_t ret;
99
100 __asm__ volatile("int $0x80"
101 : "=a" (ret)
102 : "S" (call_id), "a" (arg1), "d" (arg2), "c" (arg3)
103 : "memory");
104 return ret;
105}
106
107static inline uintptr_t arch_syscall_invoke2(uintptr_t arg1, uintptr_t arg2,
108 uintptr_t call_id)
109{
110 uint32_t ret;
111
112 __asm__ volatile("int $0x80"
113 : "=a" (ret)
114 : "S" (call_id), "a" (arg1), "d" (arg2)
115 : "memory"
116 );
117 return ret;
118}
119
120static inline uintptr_t arch_syscall_invoke1(uintptr_t arg1,
121 uintptr_t call_id)
122{
123 uint32_t ret;
124
125 __asm__ volatile("int $0x80"
126 : "=a" (ret)
127 : "S" (call_id), "a" (arg1)
128 : "memory"
129 );
130 return ret;
131}
132
133static inline uintptr_t arch_syscall_invoke0(uintptr_t call_id)
134{
135 uint32_t ret;
136
137 __asm__ volatile("int $0x80"
138 : "=a" (ret)
139 : "S" (call_id)
140 : "memory"
141 );
142 return ret;
143}
144
145static inline bool arch_is_user_context(void)
146{
147 int cs;
148
149 /* On x86, read the CS register (which cannot be manually set) */
150 __asm__ volatile ("mov %%cs, %[cs_val]" : [cs_val] "=r" (cs));
151
152 return cs == USER_CODE_SEG;
153}
154
156
157#ifdef __cplusplus
158}
159#endif
160
161#endif /* _ASMLANGUAGE */
162#endif /* CONFIG_USERSPACE */
163#endif /* ZEPHYR_INCLUDE_ARCH_X86_IA32_SYSCALL_H_ */
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 USER_CODE_SEG
Definition syscall.h:19
Definitions of various linker Sections.
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINTPTR_TYPE__ uintptr_t
Definition stdint.h:105