xref: /freebsd/sys/i386/linux/linux.h (revision fa9012aef1ad596a99950f986cf1fb31111c034a)
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 #include <sys/signal.h>	/* for sigval union */
35 
36 #include <compat/linux/linux.h>
37 #include <i386/linux/linux_syscall.h>
38 
39 #define LINUX_LEGACY_SYSCALLS
40 
41 #define	LINUX_DTRACE	linuxulator
42 
43 #define	LINUX_SHAREDPAGE	(VM_MAXUSER_ADDRESS - PAGE_SIZE)
44 #define	LINUX_USRSTACK		LINUX_SHAREDPAGE
45 
46 /*
47  * Provide a separate set of types for the Linux types.
48  */
49 typedef int		l_int;
50 typedef int32_t		l_long;
51 typedef int64_t		l_longlong;
52 typedef short		l_short;
53 typedef unsigned int	l_uint;
54 typedef uint32_t	l_ulong;
55 typedef uint64_t	l_ulonglong;
56 typedef unsigned short	l_ushort;
57 
58 typedef char		*l_caddr_t;
59 typedef l_ulong		l_uintptr_t;
60 typedef l_long		l_clock_t;
61 typedef l_int		l_daddr_t;
62 typedef l_ushort	l_dev_t;
63 typedef l_uint		l_gid_t;
64 typedef l_ushort	l_gid16_t;
65 typedef l_ulong		l_ino_t;
66 typedef l_int		l_key_t;
67 typedef l_longlong	l_loff_t;
68 typedef l_ushort	l_mode_t;
69 typedef l_long		l_off_t;
70 typedef l_int		l_pid_t;
71 typedef l_uint		l_size_t;
72 typedef l_long		l_suseconds_t;
73 typedef l_long		l_time_t;
74 typedef l_uint		l_uid_t;
75 typedef l_ushort	l_uid16_t;
76 typedef l_int		l_timer_t;
77 typedef l_int		l_mqd_t;
78 typedef	l_ulong		l_fd_mask;
79 
80 typedef struct {
81 	l_int		val[2];
82 } l_fsid_t;
83 
84 typedef struct {
85 	l_time_t	tv_sec;
86 	l_suseconds_t	tv_usec;
87 } l_timeval;
88 
89 #define	l_fd_set	fd_set
90 
91 /*
92  * Miscellaneous
93  */
94 #define LINUX_AT_COUNT		20	/* Count of used aux entry types.
95 					 * Keep this synchronized with
96 					 * linux_fixup_elf() code.
97 					 */
98 struct l___sysctl_args
99 {
100 	l_int		*name;
101 	l_int		nlen;
102 	void		*oldval;
103 	l_size_t	*oldlenp;
104 	void		*newval;
105 	l_size_t	newlen;
106 	l_ulong		__spare[4];
107 };
108 
109 /* Resource limits */
110 #define	LINUX_RLIMIT_CPU	0
111 #define	LINUX_RLIMIT_FSIZE	1
112 #define	LINUX_RLIMIT_DATA	2
113 #define	LINUX_RLIMIT_STACK	3
114 #define	LINUX_RLIMIT_CORE	4
115 #define	LINUX_RLIMIT_RSS	5
116 #define	LINUX_RLIMIT_NPROC	6
117 #define	LINUX_RLIMIT_NOFILE	7
118 #define	LINUX_RLIMIT_MEMLOCK	8
119 #define	LINUX_RLIMIT_AS		9	/* Address space limit */
120 
121 #define	LINUX_RLIM_NLIMITS	10
122 
123 struct l_rlimit {
124 	l_ulong rlim_cur;
125 	l_ulong rlim_max;
126 };
127 
128 struct l_mmap_argv {
129 	l_uintptr_t	addr;
130 	l_size_t	len;
131 	l_int		prot;
132 	l_int		flags;
133 	l_int		fd;
134 	l_off_t		pgoff;
135 } __packed;
136 
137 /*
138  * stat family of syscalls
139  */
140 struct l_timespec {
141 	l_time_t	tv_sec;
142 	l_long		tv_nsec;
143 };
144 
145 struct l_newstat {
146 	l_ushort	st_dev;
147 	l_ushort	__pad1;
148 	l_ulong		st_ino;
149 	l_ushort	st_mode;
150 	l_ushort	st_nlink;
151 	l_ushort	st_uid;
152 	l_ushort	st_gid;
153 	l_ushort	st_rdev;
154 	l_ushort	__pad2;
155 	l_ulong		st_size;
156 	l_ulong		st_blksize;
157 	l_ulong		st_blocks;
158 	struct l_timespec	st_atim;
159 	struct l_timespec	st_mtim;
160 	struct l_timespec	st_ctim;
161 	l_ulong		__unused4;
162 	l_ulong		__unused5;
163 };
164 
165 struct l_stat {
166 	l_ushort	st_dev;
167 	l_ulong		st_ino;
168 	l_ushort	st_mode;
169 	l_ushort	st_nlink;
170 	l_ushort	st_uid;
171 	l_ushort	st_gid;
172 	l_ushort	st_rdev;
173 	l_long		st_size;
174 	struct l_timespec	st_atim;
175 	struct l_timespec	st_mtim;
176 	struct l_timespec	st_ctim;
177 	l_long		st_blksize;
178 	l_long		st_blocks;
179 	l_ulong		st_flags;
180 	l_ulong		st_gen;
181 };
182 
183 struct l_stat64 {
184 	l_ushort	st_dev;
185 	u_char		__pad0[10];
186 	l_ulong		__st_ino;
187 	l_uint		st_mode;
188 	l_uint		st_nlink;
189 	l_ulong		st_uid;
190 	l_ulong		st_gid;
191 	l_ushort	st_rdev;
192 	u_char		__pad3[10];
193 	l_longlong	st_size;
194 	l_ulong		st_blksize;
195 	l_ulong		st_blocks;
196 	l_ulong		__pad4;
197 	struct l_timespec	st_atim;
198 	struct l_timespec	st_mtim;
199 	struct l_timespec	st_ctim;
200 	l_ulonglong	st_ino;
201 };
202 
203 struct l_statfs64 {
204 	l_int		f_type;
205 	l_int		f_bsize;
206 	uint64_t	f_blocks;
207 	uint64_t	f_bfree;
208 	uint64_t	f_bavail;
209 	uint64_t	f_files;
210 	uint64_t	f_ffree;
211 	l_fsid_t	f_fsid;
212 	l_int		f_namelen;
213 	l_int		f_frsize;
214 	l_int		f_flags;
215 	l_int		f_spare[4];
216 };
217 
218 #define	LINUX_NSIG_WORDS	2
219 
220 /* sigaction flags */
221 #define	LINUX_SA_NOCLDSTOP	0x00000001
222 #define	LINUX_SA_NOCLDWAIT	0x00000002
223 #define	LINUX_SA_SIGINFO	0x00000004
224 #define	LINUX_SA_RESTORER	0x04000000
225 #define	LINUX_SA_ONSTACK	0x08000000
226 #define	LINUX_SA_RESTART	0x10000000
227 #define	LINUX_SA_INTERRUPT	0x20000000
228 #define	LINUX_SA_NOMASK		0x40000000
229 #define	LINUX_SA_ONESHOT	0x80000000
230 
231 /* sigprocmask actions */
232 #define	LINUX_SIG_BLOCK		0
233 #define	LINUX_SIG_UNBLOCK	1
234 #define	LINUX_SIG_SETMASK	2
235 
236 /* sigaltstack */
237 #define	LINUX_MINSIGSTKSZ	2048
238 
239 typedef void	(*l_handler_t)(l_int);
240 typedef l_ulong	l_osigset_t;
241 
242 typedef struct {
243 	l_handler_t	lsa_handler;
244 	l_osigset_t	lsa_mask;
245 	l_ulong		lsa_flags;
246 	void	(*lsa_restorer)(void);
247 } l_osigaction_t;
248 
249 typedef struct {
250 	l_handler_t	lsa_handler;
251 	l_ulong		lsa_flags;
252 	void	(*lsa_restorer)(void);
253 	l_sigset_t	lsa_mask;
254 } l_sigaction_t;
255 
256 typedef struct {
257 	void		*ss_sp;
258 	l_int		ss_flags;
259 	l_size_t	ss_size;
260 } l_stack_t;
261 
262 /* The Linux sigcontext, pretty much a standard 386 trapframe. */
263 struct l_sigcontext {
264 	l_int		sc_gs;
265 	l_int		sc_fs;
266 	l_int		sc_es;
267 	l_int		sc_ds;
268 	l_int		sc_edi;
269 	l_int		sc_esi;
270 	l_int		sc_ebp;
271 	l_int		sc_esp;
272 	l_int		sc_ebx;
273 	l_int		sc_edx;
274 	l_int		sc_ecx;
275 	l_int		sc_eax;
276 	l_int		sc_trapno;
277 	l_int		sc_err;
278 	l_int		sc_eip;
279 	l_int		sc_cs;
280 	l_int		sc_eflags;
281 	l_int		sc_esp_at_signal;
282 	l_int		sc_ss;
283 	l_int		sc_387;
284 	l_int		sc_mask;
285 	l_int		sc_cr2;
286 };
287 
288 struct l_ucontext {
289 	l_ulong		uc_flags;
290 	void		*uc_link;
291 	l_stack_t	uc_stack;
292 	struct l_sigcontext	uc_mcontext;
293 	l_sigset_t	uc_sigmask;
294 };
295 
296 #define	LINUX_SI_MAX_SIZE	128
297 #define	LINUX_SI_PAD_SIZE	((LINUX_SI_MAX_SIZE/sizeof(l_int)) - 3)
298 
299 typedef union l_sigval {
300 	l_int		sival_int;
301 	l_uintptr_t	sival_ptr;
302 } l_sigval_t;
303 
304 typedef struct l_siginfo {
305 	l_int		lsi_signo;
306 	l_int		lsi_errno;
307 	l_int		lsi_code;
308 	union {
309 		l_int	_pad[LINUX_SI_PAD_SIZE];
310 
311 		struct {
312 			l_pid_t		_pid;
313 			l_uid_t		_uid;
314 		} _kill;
315 
316 		struct {
317 			l_timer_t	_tid;
318 			l_int		_overrun;
319 			char		_pad[sizeof(l_uid_t) - sizeof(l_int)];
320 			l_sigval_t	_sigval;
321 			l_int		_sys_private;
322 		} _timer;
323 
324 		struct {
325 			l_pid_t		_pid;		/* sender's pid */
326 			l_uid_t		_uid;		/* sender's uid */
327 			l_sigval_t	_sigval;
328 		} _rt;
329 
330 		struct {
331 			l_pid_t		_pid;		/* which child */
332 			l_uid_t		_uid;		/* sender's uid */
333 			l_int		_status;	/* exit code */
334 			l_clock_t	_utime;
335 			l_clock_t	_stime;
336 		} _sigchld;
337 
338 		struct {
339 			l_uintptr_t	_addr;	/* Faulting insn/memory ref. */
340 		} _sigfault;
341 
342 		struct {
343 			l_long		_band;	/* POLL_IN,POLL_OUT,POLL_MSG */
344 			l_int		_fd;
345 		} _sigpoll;
346 	} _sifields;
347 } l_siginfo_t;
348 
349 #define	lsi_pid		_sifields._kill._pid
350 #define	lsi_uid		_sifields._kill._uid
351 #define	lsi_tid		_sifields._timer._tid
352 #define	lsi_overrun	_sifields._timer._overrun
353 #define	lsi_sys_private	_sifields._timer._sys_private
354 #define	lsi_status	_sifields._sigchld._status
355 #define	lsi_utime	_sifields._sigchld._utime
356 #define	lsi_stime	_sifields._sigchld._stime
357 #define	lsi_value	_sifields._rt._sigval
358 #define	lsi_int		_sifields._rt._sigval.sival_int
359 #define	lsi_ptr		_sifields._rt._sigval.sival_ptr
360 #define	lsi_addr	_sifields._sigfault._addr
361 #define	lsi_band	_sifields._sigpoll._band
362 #define	lsi_fd		_sifields._sigpoll._fd
363 
364 struct l_fpreg {
365 	u_int16_t	significand[4];
366 	u_int16_t	exponent;
367 };
368 
369 struct l_fpxreg {
370 	u_int16_t	significand[4];
371 	u_int16_t	exponent;
372 	u_int16_t	padding[3];
373 };
374 
375 struct l_xmmreg {
376 	u_int32_t	element[4];
377 };
378 
379 struct l_fpstate {
380 	/* Regular FPU environment */
381 	u_int32_t		cw;
382 	u_int32_t		sw;
383 	u_int32_t		tag;
384 	u_int32_t		ipoff;
385 	u_int32_t		cssel;
386 	u_int32_t		dataoff;
387 	u_int32_t		datasel;
388 	struct l_fpreg		_st[8];
389 	u_int16_t		status;
390 	u_int16_t		magic;		/* 0xffff = regular FPU data */
391 
392 	/* FXSR FPU environment */
393 	u_int32_t		_fxsr_env[6];	/* env is ignored. */
394 	u_int32_t		mxcsr;
395 	u_int32_t		reserved;
396 	struct l_fpxreg		_fxsr_st[8];	/* reg data is ignored. */
397 	struct l_xmmreg		_xmm[8];
398 	u_int32_t		padding[56];
399 };
400 
401 /*
402  * We make the stack look like Linux expects it when calling a signal
403  * handler, but use the BSD way of calling the handler and sigreturn().
404  * This means that we need to pass the pointer to the handler too.
405  * It is appended to the frame to not interfere with the rest of it.
406  */
407 struct l_sigframe {
408 	l_int			sf_sig;
409 	struct l_sigcontext	sf_sc;
410 	struct l_fpstate	sf_fpstate;
411 	l_uint			sf_extramask[LINUX_NSIG_WORDS-1];
412 	l_handler_t		sf_handler;
413 };
414 
415 struct l_rt_sigframe {
416 	l_int			sf_sig;
417 	l_siginfo_t		*sf_siginfo;
418 	struct l_ucontext	*sf_ucontext;
419 	l_siginfo_t		sf_si;
420 	struct l_ucontext	sf_sc;
421 	l_handler_t		sf_handler;
422 };
423 
424 extern struct sysentvec linux_sysvec;
425 
426 /*
427  * arch specific open/fcntl flags
428  */
429 #define	LINUX_F_GETLK64		12
430 #define	LINUX_F_SETLK64		13
431 #define	LINUX_F_SETLKW64	14
432 
433 union l_semun {
434 	l_int		val;
435 	l_uintptr_t	buf;
436 	l_ushort	*array;
437 	l_uintptr_t	__buf;
438 	l_uintptr_t	__pad;
439 };
440 
441 struct l_ifmap {
442 	l_ulong		mem_start;
443 	l_ulong		mem_end;
444 	l_ushort	base_addr;
445 	u_char		irq;
446 	u_char		dma;
447 	u_char		port;
448 };
449 
450 struct l_ifreq {
451 	union {
452 		char	ifrn_name[LINUX_IFNAMSIZ];
453 	} ifr_ifrn;
454 
455 	union {
456 		struct l_sockaddr	ifru_addr;
457 		struct l_sockaddr	ifru_dstaddr;
458 		struct l_sockaddr	ifru_broadaddr;
459 		struct l_sockaddr	ifru_netmask;
460 		struct l_sockaddr	ifru_hwaddr;
461 		l_short		ifru_flags[1];
462 		l_int		ifru_ivalue;
463 		l_int		ifru_mtu;
464 		struct l_ifmap	ifru_map;
465 		char		ifru_slave[LINUX_IFNAMSIZ];
466 		l_caddr_t	ifru_data;
467 	} ifr_ifru;
468 };
469 
470 #define	ifr_name	ifr_ifrn.ifrn_name	/* Interface name */
471 #define	ifr_hwaddr	ifr_ifru.ifru_hwaddr	/* MAC address */
472 #define	ifr_ifindex	ifr_ifru.ifru_ivalue	/* Interface index */
473 
474 /*
475  * poll()
476  */
477 #define	LINUX_POLLIN		0x0001
478 #define	LINUX_POLLPRI		0x0002
479 #define	LINUX_POLLOUT		0x0004
480 #define	LINUX_POLLERR		0x0008
481 #define	LINUX_POLLHUP		0x0010
482 #define	LINUX_POLLNVAL		0x0020
483 #define	LINUX_POLLRDNORM	0x0040
484 #define	LINUX_POLLRDBAND	0x0080
485 #define	LINUX_POLLWRNORM	0x0100
486 #define	LINUX_POLLWRBAND	0x0200
487 #define	LINUX_POLLMSG		0x0400
488 
489 struct l_pollfd {
490 	l_int		fd;
491 	l_short		events;
492 	l_short		revents;
493 };
494 
495 struct l_user_desc {
496 	l_uint		entry_number;
497 	l_uint		base_addr;
498 	l_uint		limit;
499 	l_uint		seg_32bit:1;
500 	l_uint		contents:2;
501 	l_uint		read_exec_only:1;
502 	l_uint		limit_in_pages:1;
503 	l_uint		seg_not_present:1;
504 	l_uint		useable:1;
505 };
506 
507 struct l_desc_struct {
508 	unsigned long	a, b;
509 };
510 
511 
512 #define	LINUX_LOWERWORD	0x0000ffff
513 
514 /*
515  * Macros which does the same thing as those in Linux include/asm-um/ldt-i386.h.
516  * These convert Linux user space descriptor to machine one.
517  */
518 #define	LINUX_LDT_entry_a(info)					\
519 	((((info)->base_addr & LINUX_LOWERWORD) << 16) |	\
520 	((info)->limit & LINUX_LOWERWORD))
521 
522 #define	LINUX_ENTRY_B_READ_EXEC_ONLY	9
523 #define	LINUX_ENTRY_B_CONTENTS		10
524 #define	LINUX_ENTRY_B_SEG_NOT_PRESENT	15
525 #define	LINUX_ENTRY_B_BASE_ADDR		16
526 #define	LINUX_ENTRY_B_USEABLE		20
527 #define	LINUX_ENTRY_B_SEG32BIT		22
528 #define	LINUX_ENTRY_B_LIMIT		23
529 
530 #define	LINUX_LDT_entry_b(info)							\
531 	(((info)->base_addr & 0xff000000) |					\
532 	((info)->limit & 0xf0000) |						\
533 	((info)->contents << LINUX_ENTRY_B_CONTENTS) |				\
534 	(((info)->seg_not_present == 0) << LINUX_ENTRY_B_SEG_NOT_PRESENT) |	\
535 	(((info)->base_addr & 0x00ff0000) >> LINUX_ENTRY_B_BASE_ADDR) |		\
536 	(((info)->read_exec_only == 0) << LINUX_ENTRY_B_READ_EXEC_ONLY) |	\
537 	((info)->seg_32bit << LINUX_ENTRY_B_SEG32BIT) |				\
538 	((info)->useable << LINUX_ENTRY_B_USEABLE) |				\
539 	((info)->limit_in_pages << LINUX_ENTRY_B_LIMIT) | 0x7000)
540 
541 #define	LINUX_LDT_empty(info)		\
542 	((info)->base_addr == 0 &&	\
543 	(info)->limit == 0 &&		\
544 	(info)->contents == 0 &&	\
545 	(info)->seg_not_present == 1 &&	\
546 	(info)->read_exec_only == 1 &&	\
547 	(info)->seg_32bit == 0 &&	\
548 	(info)->limit_in_pages == 0 &&	\
549 	(info)->useable == 0)
550 
551 /*
552  * Macros for converting segments.
553  * They do the same as those in arch/i386/kernel/process.c in Linux.
554  */
555 #define	LINUX_GET_BASE(desc)				\
556 	((((desc)->a >> 16) & LINUX_LOWERWORD) |	\
557 	(((desc)->b << 16) & 0x00ff0000) |		\
558 	((desc)->b & 0xff000000))
559 
560 #define	LINUX_GET_LIMIT(desc)			\
561 	(((desc)->a & LINUX_LOWERWORD) |	\
562 	((desc)->b & 0xf0000))
563 
564 #define	LINUX_GET_32BIT(desc)		\
565 	(((desc)->b >> LINUX_ENTRY_B_SEG32BIT) & 1)
566 #define	LINUX_GET_CONTENTS(desc)	\
567 	(((desc)->b >> LINUX_ENTRY_B_CONTENTS) & 3)
568 #define	LINUX_GET_WRITABLE(desc)	\
569 	(((desc)->b >> LINUX_ENTRY_B_READ_EXEC_ONLY) & 1)
570 #define	LINUX_GET_LIMIT_PAGES(desc)	\
571 	(((desc)->b >> LINUX_ENTRY_B_LIMIT) & 1)
572 #define	LINUX_GET_PRESENT(desc)		\
573 	(((desc)->b >> LINUX_ENTRY_B_SEG_NOT_PRESENT) & 1)
574 #define	LINUX_GET_USEABLE(desc)		\
575 	(((desc)->b >> LINUX_ENTRY_B_USEABLE) & 1)
576 
577 #define	linux_copyout_rusage(r, u)	copyout(r, u, sizeof(*r))
578 
579 /* robust futexes */
580 struct linux_robust_list {
581 	struct linux_robust_list	*next;
582 };
583 
584 struct linux_robust_list_head {
585 	struct linux_robust_list	list;
586 	l_long				futex_offset;
587 	struct linux_robust_list	*pending_list;
588 };
589 
590 #endif /* !_I386_LINUX_H_ */
591