xref: /freebsd/sys/amd64/linux/linux.h (revision 56c5230afdcf2b317d904009abe577e91b382542)
1b2f58791SDmitry Chagin /*-
2023b850bSEd Maste  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3023b850bSEd Maste  *
4b2f58791SDmitry Chagin  * Copyright (c) 1994-1996 Søren Schmidt
5b2f58791SDmitry Chagin  * All rights reserved.
61ca6b15bSDmitry Chagin  * Copyright (c) 2013 Dmitry Chagin <dchagin@FreeBSD.org>
7b2f58791SDmitry Chagin  *
8b2f58791SDmitry Chagin  * Redistribution and use in source and binary forms, with or without
9b2f58791SDmitry Chagin  * modification, are permitted provided that the following conditions
10b2f58791SDmitry Chagin  * are met:
11b2f58791SDmitry Chagin  * 1. Redistributions of source code must retain the above copyright
12023b850bSEd Maste  *    notice, this list of conditions and the following disclaimer.
13b2f58791SDmitry Chagin  * 2. Redistributions in binary form must reproduce the above copyright
14b2f58791SDmitry Chagin  *    notice, this list of conditions and the following disclaimer in the
15b2f58791SDmitry Chagin  *    documentation and/or other materials provided with the distribution.
16b2f58791SDmitry Chagin  *
17023b850bSEd Maste  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18023b850bSEd Maste  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19023b850bSEd Maste  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20023b850bSEd Maste  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21023b850bSEd Maste  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22023b850bSEd Maste  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23023b850bSEd Maste  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24023b850bSEd Maste  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25023b850bSEd Maste  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26023b850bSEd Maste  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27023b850bSEd Maste  * SUCH DAMAGE.
28b2f58791SDmitry Chagin  *
29b2f58791SDmitry Chagin  * $FreeBSD$
30b2f58791SDmitry Chagin  */
31b2f58791SDmitry Chagin 
32b2f58791SDmitry Chagin #ifndef _AMD64_LINUX_H_
33b2f58791SDmitry Chagin #define	_AMD64_LINUX_H_
34b2f58791SDmitry Chagin 
35562894f0SBrooks Davis #include <sys/abi_compat.h>
36562894f0SBrooks Davis 
374ab7403bSDmitry Chagin #include <compat/linux/linux.h>
38b2f58791SDmitry Chagin #include <amd64/linux/linux_syscall.h>
39b2f58791SDmitry Chagin 
40931e2a1aSEd Maste #define	LINUX_LEGACY_SYSCALLS
41931e2a1aSEd Maste 
42b2f58791SDmitry Chagin #define	LINUX_DTRACE	linuxulator
43b2f58791SDmitry Chagin 
44b2f58791SDmitry Chagin /*
45b2f58791SDmitry Chagin  * Provide a separate set of types for the Linux types.
46b2f58791SDmitry Chagin  */
47b2f58791SDmitry Chagin typedef int32_t		l_int;
48b2f58791SDmitry Chagin typedef int64_t		l_long;
49b2f58791SDmitry Chagin typedef int16_t		l_short;
50b2f58791SDmitry Chagin typedef uint32_t	l_uint;
51b2f58791SDmitry Chagin typedef uint64_t	l_ulong;
52b2f58791SDmitry Chagin typedef uint16_t	l_ushort;
53b2f58791SDmitry Chagin 
54b2f58791SDmitry Chagin typedef l_ulong		l_uintptr_t;
55b2f58791SDmitry Chagin typedef l_long		l_clock_t;
56b2f58791SDmitry Chagin typedef l_int		l_daddr_t;
57b2f58791SDmitry Chagin typedef l_ulong		l_dev_t;
58b2f58791SDmitry Chagin typedef l_uint		l_gid_t;
59ab60bc84SDmitry Chagin typedef l_ushort	l_gid16_t;
60b2f58791SDmitry Chagin typedef l_uint		l_uid_t;
61ab60bc84SDmitry Chagin typedef	l_ushort	l_uid16_t;
62b2f58791SDmitry Chagin typedef l_ulong		l_ino_t;
63b2f58791SDmitry Chagin typedef l_int		l_key_t;
64b2f58791SDmitry Chagin typedef l_long		l_loff_t;
65b2f58791SDmitry Chagin typedef l_uint		l_mode_t;
66b2f58791SDmitry Chagin typedef l_long		l_off_t;
67b2f58791SDmitry Chagin typedef l_int		l_pid_t;
68b2f58791SDmitry Chagin typedef l_ulong		l_size_t;
69b2f58791SDmitry Chagin typedef l_long		l_ssize_t;
70b2f58791SDmitry Chagin typedef l_long		l_suseconds_t;
71b2f58791SDmitry Chagin typedef l_long		l_time_t;
72b2f58791SDmitry Chagin typedef l_int		l_timer_t;
73b2f58791SDmitry Chagin typedef l_int		l_mqd_t;
74b2f58791SDmitry Chagin typedef l_size_t	l_socklen_t;
753e89b641SDmitry Chagin typedef	l_ulong		l_fd_mask;
76b2f58791SDmitry Chagin 
77af557e64SDmitry Chagin #include <compat/linux/linux_siginfo.h>
78af557e64SDmitry Chagin 
79b2f58791SDmitry Chagin typedef struct {
80b2f58791SDmitry Chagin 	l_int		val[2];
81b2f58791SDmitry Chagin } l_fsid_t;
82b2f58791SDmitry Chagin 
83b2f58791SDmitry Chagin typedef struct {
84b2f58791SDmitry Chagin 	l_time_t	tv_sec;
85b2f58791SDmitry Chagin 	l_suseconds_t	tv_usec;
86b2f58791SDmitry Chagin } l_timeval;
87b2f58791SDmitry Chagin 
88b2f58791SDmitry Chagin #define	l_fd_set	fd_set
89b2f58791SDmitry Chagin 
90b2f58791SDmitry Chagin /*
91b2f58791SDmitry Chagin  * Miscellaneous
92b2f58791SDmitry Chagin  */
93*56c5230aSDmitry Chagin #define LINUX_AT_COUNT		21	/* Count of used aux entry types.
94*56c5230aSDmitry Chagin 					 * Keep this synchronized with
95*56c5230aSDmitry Chagin 					 * linux_copyout_auxargs() code.
96*56c5230aSDmitry Chagin 					 */
97b2f58791SDmitry Chagin 
98b2f58791SDmitry Chagin struct l___sysctl_args
99b2f58791SDmitry Chagin {
100b2f58791SDmitry Chagin 	l_uintptr_t	name;
101b2f58791SDmitry Chagin 	l_int		nlen;
102b2f58791SDmitry Chagin 	l_uintptr_t	oldval;
103b2f58791SDmitry Chagin 	l_uintptr_t	oldlenp;
104b2f58791SDmitry Chagin 	l_uintptr_t	newval;
105b2f58791SDmitry Chagin 	l_size_t	newlen;
106b2f58791SDmitry Chagin 	l_ulong		__spare[4];
107b2f58791SDmitry Chagin };
108b2f58791SDmitry Chagin 
109b2f58791SDmitry Chagin /* Resource limits */
110b2f58791SDmitry Chagin #define	LINUX_RLIMIT_CPU	0
111b2f58791SDmitry Chagin #define	LINUX_RLIMIT_FSIZE	1
112b2f58791SDmitry Chagin #define	LINUX_RLIMIT_DATA	2
113b2f58791SDmitry Chagin #define	LINUX_RLIMIT_STACK	3
114b2f58791SDmitry Chagin #define	LINUX_RLIMIT_CORE	4
115b2f58791SDmitry Chagin #define	LINUX_RLIMIT_RSS	5
116b2f58791SDmitry Chagin #define	LINUX_RLIMIT_NPROC	6
117b2f58791SDmitry Chagin #define	LINUX_RLIMIT_NOFILE	7
118b2f58791SDmitry Chagin #define	LINUX_RLIMIT_MEMLOCK	8
119b2f58791SDmitry Chagin #define	LINUX_RLIMIT_AS		9	/* Address space limit */
120b2f58791SDmitry Chagin 
121b2f58791SDmitry Chagin #define	LINUX_RLIM_NLIMITS	10
122b2f58791SDmitry Chagin 
123b2f58791SDmitry Chagin struct l_rlimit {
124b2f58791SDmitry Chagin 	l_ulong		rlim_cur;
125b2f58791SDmitry Chagin 	l_ulong		rlim_max;
126b2f58791SDmitry Chagin };
127b2f58791SDmitry Chagin 
128b2f58791SDmitry Chagin /*
129b2f58791SDmitry Chagin  * stat family of syscalls
130b2f58791SDmitry Chagin  */
131b2f58791SDmitry Chagin struct l_timespec {
132b2f58791SDmitry Chagin 	l_time_t	tv_sec;
133b2f58791SDmitry Chagin 	l_long		tv_nsec;
134b2f58791SDmitry Chagin };
135b2f58791SDmitry Chagin 
136b2f58791SDmitry Chagin struct l_newstat {
137b2f58791SDmitry Chagin 	l_dev_t		st_dev;
138b2f58791SDmitry Chagin 	l_ino_t		st_ino;
139b2f58791SDmitry Chagin 	l_ulong		st_nlink;
140b2f58791SDmitry Chagin 	l_uint		st_mode;
141b2f58791SDmitry Chagin 	l_uid_t		st_uid;
142b2f58791SDmitry Chagin 	l_gid_t		st_gid;
143b2f58791SDmitry Chagin 	l_uint		__st_pad1;
144b2f58791SDmitry Chagin 	l_dev_t		st_rdev;
145b2f58791SDmitry Chagin 	l_off_t		st_size;
146b2f58791SDmitry Chagin 	l_long		st_blksize;
147b2f58791SDmitry Chagin 	l_long		st_blocks;
148b2f58791SDmitry Chagin 	struct l_timespec	st_atim;
149b2f58791SDmitry Chagin 	struct l_timespec	st_mtim;
150b2f58791SDmitry Chagin 	struct l_timespec	st_ctim;
151b2f58791SDmitry Chagin 	l_long		__unused1;
152b2f58791SDmitry Chagin 	l_long		__unused2;
153b2f58791SDmitry Chagin 	l_long		__unused3;
154b2f58791SDmitry Chagin };
155b2f58791SDmitry Chagin 
156b2f58791SDmitry Chagin /* sigaction flags */
157b2f58791SDmitry Chagin #define	LINUX_SA_NOCLDSTOP	0x00000001
158b2f58791SDmitry Chagin #define	LINUX_SA_NOCLDWAIT	0x00000002
159b2f58791SDmitry Chagin #define	LINUX_SA_SIGINFO	0x00000004
160b2f58791SDmitry Chagin #define	LINUX_SA_RESTORER	0x04000000
161b2f58791SDmitry Chagin #define	LINUX_SA_ONSTACK	0x08000000
162b2f58791SDmitry Chagin #define	LINUX_SA_RESTART	0x10000000
163b2f58791SDmitry Chagin #define	LINUX_SA_INTERRUPT	0x20000000
164b2f58791SDmitry Chagin #define	LINUX_SA_NOMASK		0x40000000
165b2f58791SDmitry Chagin #define	LINUX_SA_ONESHOT	0x80000000
166b2f58791SDmitry Chagin 
167b2f58791SDmitry Chagin /* sigaltstack */
168b2f58791SDmitry Chagin #define	LINUX_MINSIGSTKSZ	2048
169b2f58791SDmitry Chagin 
170b2f58791SDmitry Chagin typedef void	(*l_handler_t)(l_int);
171b2f58791SDmitry Chagin 
172b2f58791SDmitry Chagin typedef struct {
173b2f58791SDmitry Chagin 	l_handler_t	lsa_handler;
174b2f58791SDmitry Chagin 	l_ulong		lsa_flags;
175b2f58791SDmitry Chagin 	l_uintptr_t	lsa_restorer;
176b2f58791SDmitry Chagin 	l_sigset_t	lsa_mask;
177b2f58791SDmitry Chagin } l_sigaction_t;
178b2f58791SDmitry Chagin 
179b2f58791SDmitry Chagin typedef struct {
180b2f58791SDmitry Chagin 	l_uintptr_t	ss_sp;
181b2f58791SDmitry Chagin 	l_int		ss_flags;
182b2f58791SDmitry Chagin 	l_size_t	ss_size;
183b2f58791SDmitry Chagin } l_stack_t;
184b2f58791SDmitry Chagin 
185b2f58791SDmitry Chagin /*
186b2f58791SDmitry Chagin  * mount flags
187b2f58791SDmitry Chagin  */
188b2f58791SDmitry Chagin #define	LINUX_MS_RDONLY		0x0001
189b2f58791SDmitry Chagin #define	LINUX_MS_NOSUID		0x0002
190b2f58791SDmitry Chagin #define	LINUX_MS_NODEV		0x0004
191b2f58791SDmitry Chagin #define	LINUX_MS_NOEXEC		0x0008
192b2f58791SDmitry Chagin #define	LINUX_MS_REMOUNT	0x0020
193b2f58791SDmitry Chagin 
194b2f58791SDmitry Chagin /*
195b2f58791SDmitry Chagin  * SystemV IPC defines
196b2f58791SDmitry Chagin  */
197b2f58791SDmitry Chagin #define	LINUX_IPC_RMID		0
198b2f58791SDmitry Chagin #define	LINUX_IPC_SET		1
199b2f58791SDmitry Chagin #define	LINUX_IPC_STAT		2
200b2f58791SDmitry Chagin #define	LINUX_IPC_INFO		3
201b2f58791SDmitry Chagin 
202b2f58791SDmitry Chagin #define	LINUX_SHM_LOCK		11
203b2f58791SDmitry Chagin #define	LINUX_SHM_UNLOCK	12
204b2f58791SDmitry Chagin #define	LINUX_SHM_STAT		13
205b2f58791SDmitry Chagin #define	LINUX_SHM_INFO		14
206b2f58791SDmitry Chagin 
207b2f58791SDmitry Chagin #define	LINUX_SHM_RDONLY	0x1000
208b2f58791SDmitry Chagin #define	LINUX_SHM_RND		0x2000
209b2f58791SDmitry Chagin #define	LINUX_SHM_REMAP		0x4000
210b2f58791SDmitry Chagin 
211b2f58791SDmitry Chagin /* semctl commands */
212b2f58791SDmitry Chagin #define	LINUX_GETPID		11
213b2f58791SDmitry Chagin #define	LINUX_GETVAL		12
214b2f58791SDmitry Chagin #define	LINUX_GETALL		13
215b2f58791SDmitry Chagin #define	LINUX_GETNCNT		14
216b2f58791SDmitry Chagin #define	LINUX_GETZCNT		15
217b2f58791SDmitry Chagin #define	LINUX_SETVAL		16
218b2f58791SDmitry Chagin #define	LINUX_SETALL		17
219b2f58791SDmitry Chagin #define	LINUX_SEM_STAT		18
220b2f58791SDmitry Chagin #define	LINUX_SEM_INFO		19
221b2f58791SDmitry Chagin 
222b2f58791SDmitry Chagin union l_semun {
223b2f58791SDmitry Chagin 	l_int		val;
224b2f58791SDmitry Chagin 	l_uintptr_t	buf;
225b2f58791SDmitry Chagin 	l_uintptr_t	array;
226b2f58791SDmitry Chagin 	l_uintptr_t	__buf;
227b2f58791SDmitry Chagin 	l_uintptr_t	__pad;
228b2f58791SDmitry Chagin };
229b2f58791SDmitry Chagin 
230b2f58791SDmitry Chagin #define LINUX_ARCH_SET_GS		0x1001
231b2f58791SDmitry Chagin #define LINUX_ARCH_SET_FS		0x1002
232f1389991SDmitry Chagin #define LINUX_ARCH_GET_FS		0x1003
233f1389991SDmitry Chagin #define LINUX_ARCH_GET_GS		0x1004
234916f3dbaSEdward Tomasz Napierala #define LINUX_ARCH_CET_STATUS		0x3001
235b2f58791SDmitry Chagin 
236b2f58791SDmitry Chagin #define	linux_copyout_rusage(r, u)	copyout(r, u, sizeof(*r))
237b2f58791SDmitry Chagin 
23895c19e1dSEdward Tomasz Napierala /* This corresponds to 'struct user_regs_struct' in Linux. */
23995c19e1dSEdward Tomasz Napierala struct linux_pt_regset {
24095c19e1dSEdward Tomasz Napierala 	l_ulong	r15;
24195c19e1dSEdward Tomasz Napierala 	l_ulong	r14;
24295c19e1dSEdward Tomasz Napierala 	l_ulong	r13;
24395c19e1dSEdward Tomasz Napierala 	l_ulong	r12;
24495c19e1dSEdward Tomasz Napierala 	l_ulong	rbp;
24595c19e1dSEdward Tomasz Napierala 	l_ulong	rbx;
24695c19e1dSEdward Tomasz Napierala 	l_ulong	r11;
24795c19e1dSEdward Tomasz Napierala 	l_ulong	r10;
24895c19e1dSEdward Tomasz Napierala 	l_ulong	r9;
24995c19e1dSEdward Tomasz Napierala 	l_ulong	r8;
25095c19e1dSEdward Tomasz Napierala 	l_ulong	rax;
25195c19e1dSEdward Tomasz Napierala 	l_ulong	rcx;
25295c19e1dSEdward Tomasz Napierala 	l_ulong	rdx;
25395c19e1dSEdward Tomasz Napierala 	l_ulong	rsi;
25495c19e1dSEdward Tomasz Napierala 	l_ulong	rdi;
25595c19e1dSEdward Tomasz Napierala 	l_ulong	orig_rax;
25695c19e1dSEdward Tomasz Napierala 	l_ulong	rip;
25795c19e1dSEdward Tomasz Napierala 	l_ulong	cs;
25895c19e1dSEdward Tomasz Napierala 	l_ulong	eflags;
25995c19e1dSEdward Tomasz Napierala 	l_ulong	rsp;
26095c19e1dSEdward Tomasz Napierala 	l_ulong	ss;
26195c19e1dSEdward Tomasz Napierala 	l_ulong fs_base;
26295c19e1dSEdward Tomasz Napierala 	l_ulong gs_base;
26395c19e1dSEdward Tomasz Napierala 	l_ulong ds;
26495c19e1dSEdward Tomasz Napierala 	l_ulong es;
26595c19e1dSEdward Tomasz Napierala 	l_ulong fs;
26695c19e1dSEdward Tomasz Napierala 	l_ulong gs;
26795c19e1dSEdward Tomasz Napierala };
26895c19e1dSEdward Tomasz Napierala 
269d416ee86SDmitry Chagin #ifdef _KERNEL
27095c19e1dSEdward Tomasz Napierala struct reg;
2710bf8d5d5SEdward Tomasz Napierala struct syscall_info;
27295c19e1dSEdward Tomasz Napierala 
2733417c298SEdward Tomasz Napierala void	bsd_to_linux_regset(const struct reg *b_reg,
27495c19e1dSEdward Tomasz Napierala 	    struct linux_pt_regset *l_regset);
275f0d9a6a7SEdward Tomasz Napierala void	linux_to_bsd_regset(struct reg *b_reg,
276f0d9a6a7SEdward Tomasz Napierala 	    const struct linux_pt_regset *l_regset);
2770bf8d5d5SEdward Tomasz Napierala void	linux_ptrace_get_syscall_info_machdep(const struct reg *reg,
2780bf8d5d5SEdward Tomasz Napierala 	    struct syscall_info *si);
2790bf8d5d5SEdward Tomasz Napierala int	linux_ptrace_getregs_machdep(struct thread *td, pid_t pid,
2800bf8d5d5SEdward Tomasz Napierala 	    struct linux_pt_regset *l_regset);
281d416ee86SDmitry Chagin #endif /* _KERNEL */
28295c19e1dSEdward Tomasz Napierala 
283b2f58791SDmitry Chagin #endif /* !_AMD64_LINUX_H_ */
284