FreeBSD/Linux Kernel Cross Reference
sys/i386/linux/linux.h
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3 *
4 * Copyright (c) 1994-1996 Søren Schmidt
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 * $FreeBSD$
28 */
29
30 #ifndef _I386_LINUX_H_
31 #define _I386_LINUX_H_
32
33 #include <sys/abi_compat.h>
34
35 #include <compat/linux/linux.h>
36 #include <i386/linux/linux_syscall.h>
37
38 #define LINUX_LEGACY_SYSCALLS
39
40 #define LINUX_DTRACE linuxulator
41
42 /*
43 * Provide a separate set of types for the Linux types.
44 */
45 typedef int l_int;
46 typedef int32_t l_long;
47 typedef int64_t l_longlong;
48 typedef short l_short;
49 typedef unsigned int l_uint;
50 typedef uint32_t l_ulong;
51 typedef uint64_t l_ulonglong;
52 typedef unsigned short l_ushort;
53
54 typedef char *l_caddr_t;
55 typedef l_ulong l_uintptr_t;
56 typedef l_long l_clock_t;
57 typedef l_int l_daddr_t;
58 typedef l_ushort l_dev_t;
59 typedef l_uint l_gid_t;
60 typedef l_ushort l_gid16_t;
61 typedef l_ulong l_ino_t;
62 typedef l_int l_key_t;
63 typedef l_longlong l_loff_t;
64 typedef l_ushort l_mode_t;
65 typedef l_long l_off_t;
66 typedef l_int l_pid_t;
67 typedef l_uint l_size_t;
68 typedef l_long l_suseconds_t;
69 typedef l_long l_time_t;
70 typedef l_longlong l_time64_t;
71 typedef l_uint l_uid_t;
72 typedef l_ushort l_uid16_t;
73 typedef l_int l_timer_t;
74 typedef l_int l_mqd_t;
75 typedef l_ulong l_fd_mask;
76
77 #include <compat/linux/linux_siginfo.h>
78
79 typedef struct {
80 l_int val[2];
81 } l_fsid_t;
82
83 typedef struct {
84 l_time_t tv_sec;
85 l_suseconds_t tv_usec;
86 } l_timeval;
87
88 typedef struct {
89 l_time64_t tv_sec;
90 l_time64_t tv_usec;
91 } l_sock_timeval;
92
93 #define l_fd_set fd_set
94
95 /*
96 * Miscellaneous
97 */
98 #define LINUX_AT_COUNT 20 /* Count of used aux entry types.
99 * Keep this synchronized with
100 * linux_fixup_elf() code.
101 */
102 struct l___sysctl_args
103 {
104 l_int *name;
105 l_int nlen;
106 void *oldval;
107 l_size_t *oldlenp;
108 void *newval;
109 l_size_t newlen;
110 l_ulong __spare[4];
111 };
112
113 /* Resource limits */
114 #define LINUX_RLIMIT_CPU 0
115 #define LINUX_RLIMIT_FSIZE 1
116 #define LINUX_RLIMIT_DATA 2
117 #define LINUX_RLIMIT_STACK 3
118 #define LINUX_RLIMIT_CORE 4
119 #define LINUX_RLIMIT_RSS 5
120 #define LINUX_RLIMIT_NPROC 6
121 #define LINUX_RLIMIT_NOFILE 7
122 #define LINUX_RLIMIT_MEMLOCK 8
123 #define LINUX_RLIMIT_AS 9 /* Address space limit */
124
125 #define LINUX_RLIM_NLIMITS 10
126
127 struct l_rlimit {
128 l_ulong rlim_cur;
129 l_ulong rlim_max;
130 };
131
132 struct l_mmap_argv {
133 l_uintptr_t addr;
134 l_size_t len;
135 l_int prot;
136 l_int flags;
137 l_int fd;
138 l_off_t pgoff;
139 };
140
141 /*
142 * stat family of syscalls
143 */
144 struct l_timespec {
145 l_time_t tv_sec;
146 l_long tv_nsec;
147 };
148
149 /* __kernel_timespec */
150 struct l_timespec64 {
151 l_time64_t tv_sec;
152 l_longlong tv_nsec;
153 };
154
155 struct l_newstat {
156 l_ushort st_dev;
157 l_ushort __pad1;
158 l_ulong st_ino;
159 l_ushort st_mode;
160 l_ushort st_nlink;
161 l_ushort st_uid;
162 l_ushort st_gid;
163 l_ushort st_rdev;
164 l_ushort __pad2;
165 l_ulong st_size;
166 l_ulong st_blksize;
167 l_ulong st_blocks;
168 struct l_timespec st_atim;
169 struct l_timespec st_mtim;
170 struct l_timespec st_ctim;
171 l_ulong __unused4;
172 l_ulong __unused5;
173 };
174
175 struct l_stat {
176 l_ushort st_dev;
177 l_ulong st_ino;
178 l_ushort st_mode;
179 l_ushort st_nlink;
180 l_ushort st_uid;
181 l_ushort st_gid;
182 l_ushort st_rdev;
183 l_long st_size;
184 struct l_timespec st_atim;
185 struct l_timespec st_mtim;
186 struct l_timespec st_ctim;
187 l_long st_blksize;
188 l_long st_blocks;
189 l_ulong st_flags;
190 l_ulong st_gen;
191 };
192
193 struct l_stat64 {
194 l_ushort st_dev;
195 u_char __pad0[10];
196 l_ulong __st_ino;
197 l_uint st_mode;
198 l_uint st_nlink;
199 l_ulong st_uid;
200 l_ulong st_gid;
201 l_ushort st_rdev;
202 u_char __pad3[10];
203 l_longlong st_size;
204 l_ulong st_blksize;
205 l_ulong st_blocks;
206 l_ulong __pad4;
207 struct l_timespec st_atim;
208 struct l_timespec st_mtim;
209 struct l_timespec st_ctim;
210 l_ulonglong st_ino;
211 };
212
213 struct l_statfs64 {
214 l_int f_type;
215 l_int f_bsize;
216 uint64_t f_blocks;
217 uint64_t f_bfree;
218 uint64_t f_bavail;
219 uint64_t f_files;
220 uint64_t f_ffree;
221 l_fsid_t f_fsid;
222 l_int f_namelen;
223 l_int f_frsize;
224 l_int f_flags;
225 l_int f_spare[4];
226 };
227
228 /* sigaction flags */
229 #define LINUX_SA_NOCLDSTOP 0x00000001
230 #define LINUX_SA_NOCLDWAIT 0x00000002
231 #define LINUX_SA_SIGINFO 0x00000004
232 #define LINUX_SA_RESTORER 0x04000000
233 #define LINUX_SA_ONSTACK 0x08000000
234 #define LINUX_SA_RESTART 0x10000000
235 #define LINUX_SA_INTERRUPT 0x20000000
236 #define LINUX_SA_NOMASK 0x40000000
237 #define LINUX_SA_ONESHOT 0x80000000
238
239 /* sigaltstack */
240 #define LINUX_MINSIGSTKSZ 2048
241
242 typedef void (*l_handler_t)(l_int);
243 typedef l_ulong l_osigset_t;
244
245 typedef struct {
246 l_handler_t lsa_handler;
247 l_osigset_t lsa_mask;
248 l_ulong lsa_flags;
249 void (*lsa_restorer)(void);
250 } l_osigaction_t;
251
252 typedef struct {
253 l_handler_t lsa_handler;
254 l_ulong lsa_flags;
255 void (*lsa_restorer)(void);
256 l_sigset_t lsa_mask;
257 } l_sigaction_t;
258
259 typedef struct {
260 l_uintptr_t ss_sp;
261 l_int ss_flags;
262 l_size_t ss_size;
263 } l_stack_t;
264
265 extern struct sysentvec linux_sysvec;
266
267 /*
268 * arch specific open/fcntl flags
269 */
270 #define LINUX_F_GETLK64 12
271 #define LINUX_F_SETLK64 13
272 #define LINUX_F_SETLKW64 14
273
274 union l_semun {
275 l_int val;
276 l_uintptr_t buf;
277 l_ushort *array;
278 l_uintptr_t __buf;
279 l_uintptr_t __pad;
280 };
281
282 struct l_ifmap {
283 l_ulong mem_start;
284 l_ulong mem_end;
285 l_ushort base_addr;
286 u_char irq;
287 u_char dma;
288 u_char port;
289 };
290
291 struct l_ifreq {
292 union {
293 char ifrn_name[LINUX_IFNAMSIZ];
294 } ifr_ifrn;
295
296 union {
297 struct l_sockaddr ifru_addr;
298 struct l_sockaddr ifru_dstaddr;
299 struct l_sockaddr ifru_broadaddr;
300 struct l_sockaddr ifru_netmask;
301 struct l_sockaddr ifru_hwaddr;
302 l_short ifru_flags[1];
303 l_int ifru_ivalue;
304 l_int ifru_mtu;
305 struct l_ifmap ifru_map;
306 char ifru_slave[LINUX_IFNAMSIZ];
307 l_caddr_t ifru_data;
308 } ifr_ifru;
309 };
310
311 #define ifr_name ifr_ifrn.ifrn_name /* Interface name */
312 #define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */
313 #define ifr_ifindex ifr_ifru.ifru_ivalue /* Interface index */
314
315 struct l_user_desc {
316 l_uint entry_number;
317 l_uint base_addr;
318 l_uint limit;
319 l_uint seg_32bit:1;
320 l_uint contents:2;
321 l_uint read_exec_only:1;
322 l_uint limit_in_pages:1;
323 l_uint seg_not_present:1;
324 l_uint useable:1;
325 };
326
327 struct l_desc_struct {
328 unsigned long a, b;
329 };
330
331 #define LINUX_LOWERWORD 0x0000ffff
332
333 /*
334 * Macros which does the same thing as those in Linux include/asm-um/ldt-i386.h.
335 * These convert Linux user space descriptor to machine one.
336 */
337 #define LINUX_LDT_entry_a(info) \
338 ((((info)->base_addr & LINUX_LOWERWORD) << 16) | \
339 ((info)->limit & LINUX_LOWERWORD))
340
341 #define LINUX_ENTRY_B_READ_EXEC_ONLY 9
342 #define LINUX_ENTRY_B_CONTENTS 10
343 #define LINUX_ENTRY_B_SEG_NOT_PRESENT 15
344 #define LINUX_ENTRY_B_BASE_ADDR 16
345 #define LINUX_ENTRY_B_USEABLE 20
346 #define LINUX_ENTRY_B_SEG32BIT 22
347 #define LINUX_ENTRY_B_LIMIT 23
348
349 #define LINUX_LDT_entry_b(info) \
350 (((info)->base_addr & 0xff000000) | \
351 ((info)->limit & 0xf0000) | \
352 ((info)->contents << LINUX_ENTRY_B_CONTENTS) | \
353 (((info)->seg_not_present == 0) << LINUX_ENTRY_B_SEG_NOT_PRESENT) | \
354 (((info)->base_addr & 0x00ff0000) >> LINUX_ENTRY_B_BASE_ADDR) | \
355 (((info)->read_exec_only == 0) << LINUX_ENTRY_B_READ_EXEC_ONLY) | \
356 ((info)->seg_32bit << LINUX_ENTRY_B_SEG32BIT) | \
357 ((info)->useable << LINUX_ENTRY_B_USEABLE) | \
358 ((info)->limit_in_pages << LINUX_ENTRY_B_LIMIT) | 0x7000)
359
360 #define LINUX_LDT_empty(info) \
361 ((info)->base_addr == 0 && \
362 (info)->limit == 0 && \
363 (info)->contents == 0 && \
364 (info)->seg_not_present == 1 && \
365 (info)->read_exec_only == 1 && \
366 (info)->seg_32bit == 0 && \
367 (info)->limit_in_pages == 0 && \
368 (info)->useable == 0)
369
370 /*
371 * Macros for converting segments.
372 * They do the same as those in arch/i386/kernel/process.c in Linux.
373 */
374 #define LINUX_GET_BASE(desc) \
375 ((((desc)->a >> 16) & LINUX_LOWERWORD) | \
376 (((desc)->b << 16) & 0x00ff0000) | \
377 ((desc)->b & 0xff000000))
378
379 #define LINUX_GET_LIMIT(desc) \
380 (((desc)->a & LINUX_LOWERWORD) | \
381 ((desc)->b & 0xf0000))
382
383 #define LINUX_GET_32BIT(desc) \
384 (((desc)->b >> LINUX_ENTRY_B_SEG32BIT) & 1)
385 #define LINUX_GET_CONTENTS(desc) \
386 (((desc)->b >> LINUX_ENTRY_B_CONTENTS) & 3)
387 #define LINUX_GET_WRITABLE(desc) \
388 (((desc)->b >> LINUX_ENTRY_B_READ_EXEC_ONLY) & 1)
389 #define LINUX_GET_LIMIT_PAGES(desc) \
390 (((desc)->b >> LINUX_ENTRY_B_LIMIT) & 1)
391 #define LINUX_GET_PRESENT(desc) \
392 (((desc)->b >> LINUX_ENTRY_B_SEG_NOT_PRESENT) & 1)
393 #define LINUX_GET_USEABLE(desc) \
394 (((desc)->b >> LINUX_ENTRY_B_USEABLE) & 1)
395
396 #define linux_copyout_rusage(r, u) copyout(r, u, sizeof(*r))
397
398 /* robust futexes */
399 struct linux_robust_list {
400 struct linux_robust_list *next;
401 };
402
403 struct linux_robust_list_head {
404 struct linux_robust_list list;
405 l_long futex_offset;
406 struct linux_robust_list *pending_list;
407 };
408
409 #endif /* !_I386_LINUX_H_ */
Cache object: 2c8e2ba23066522118157fdcb9ffb0e1
|