xref: /freebsd/sys/amd64/linux/linux.h (revision d416ee86c73bef55ba29c25cd594156441f1daa9)
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  */
93ca6e1fa3SEdward Tomasz Napierala #define LINUX_AT_COUNT		20	/* Count of used aux entry types. */
94b2f58791SDmitry Chagin 
95b2f58791SDmitry Chagin struct l___sysctl_args
96b2f58791SDmitry Chagin {
97b2f58791SDmitry Chagin 	l_uintptr_t	name;
98b2f58791SDmitry Chagin 	l_int		nlen;
99b2f58791SDmitry Chagin 	l_uintptr_t	oldval;
100b2f58791SDmitry Chagin 	l_uintptr_t	oldlenp;
101b2f58791SDmitry Chagin 	l_uintptr_t	newval;
102b2f58791SDmitry Chagin 	l_size_t	newlen;
103b2f58791SDmitry Chagin 	l_ulong		__spare[4];
104b2f58791SDmitry Chagin };
105b2f58791SDmitry Chagin 
106b2f58791SDmitry Chagin /* Resource limits */
107b2f58791SDmitry Chagin #define	LINUX_RLIMIT_CPU	0
108b2f58791SDmitry Chagin #define	LINUX_RLIMIT_FSIZE	1
109b2f58791SDmitry Chagin #define	LINUX_RLIMIT_DATA	2
110b2f58791SDmitry Chagin #define	LINUX_RLIMIT_STACK	3
111b2f58791SDmitry Chagin #define	LINUX_RLIMIT_CORE	4
112b2f58791SDmitry Chagin #define	LINUX_RLIMIT_RSS	5
113b2f58791SDmitry Chagin #define	LINUX_RLIMIT_NPROC	6
114b2f58791SDmitry Chagin #define	LINUX_RLIMIT_NOFILE	7
115b2f58791SDmitry Chagin #define	LINUX_RLIMIT_MEMLOCK	8
116b2f58791SDmitry Chagin #define	LINUX_RLIMIT_AS		9	/* Address space limit */
117b2f58791SDmitry Chagin 
118b2f58791SDmitry Chagin #define	LINUX_RLIM_NLIMITS	10
119b2f58791SDmitry Chagin 
120b2f58791SDmitry Chagin struct l_rlimit {
121b2f58791SDmitry Chagin 	l_ulong		rlim_cur;
122b2f58791SDmitry Chagin 	l_ulong		rlim_max;
123b2f58791SDmitry Chagin };
124b2f58791SDmitry Chagin 
125b2f58791SDmitry Chagin /*
126b2f58791SDmitry Chagin  * stat family of syscalls
127b2f58791SDmitry Chagin  */
128b2f58791SDmitry Chagin struct l_timespec {
129b2f58791SDmitry Chagin 	l_time_t	tv_sec;
130b2f58791SDmitry Chagin 	l_long		tv_nsec;
131b2f58791SDmitry Chagin };
132b2f58791SDmitry Chagin 
133b2f58791SDmitry Chagin struct l_newstat {
134b2f58791SDmitry Chagin 	l_dev_t		st_dev;
135b2f58791SDmitry Chagin 	l_ino_t		st_ino;
136b2f58791SDmitry Chagin 	l_ulong		st_nlink;
137b2f58791SDmitry Chagin 	l_uint		st_mode;
138b2f58791SDmitry Chagin 	l_uid_t		st_uid;
139b2f58791SDmitry Chagin 	l_gid_t		st_gid;
140b2f58791SDmitry Chagin 	l_uint		__st_pad1;
141b2f58791SDmitry Chagin 	l_dev_t		st_rdev;
142b2f58791SDmitry Chagin 	l_off_t		st_size;
143b2f58791SDmitry Chagin 	l_long		st_blksize;
144b2f58791SDmitry Chagin 	l_long		st_blocks;
145b2f58791SDmitry Chagin 	struct l_timespec	st_atim;
146b2f58791SDmitry Chagin 	struct l_timespec	st_mtim;
147b2f58791SDmitry Chagin 	struct l_timespec	st_ctim;
148b2f58791SDmitry Chagin 	l_long		__unused1;
149b2f58791SDmitry Chagin 	l_long		__unused2;
150b2f58791SDmitry Chagin 	l_long		__unused3;
151b2f58791SDmitry Chagin };
152b2f58791SDmitry Chagin 
153b2f58791SDmitry Chagin /* sigaction flags */
154b2f58791SDmitry Chagin #define	LINUX_SA_NOCLDSTOP	0x00000001
155b2f58791SDmitry Chagin #define	LINUX_SA_NOCLDWAIT	0x00000002
156b2f58791SDmitry Chagin #define	LINUX_SA_SIGINFO	0x00000004
157b2f58791SDmitry Chagin #define	LINUX_SA_RESTORER	0x04000000
158b2f58791SDmitry Chagin #define	LINUX_SA_ONSTACK	0x08000000
159b2f58791SDmitry Chagin #define	LINUX_SA_RESTART	0x10000000
160b2f58791SDmitry Chagin #define	LINUX_SA_INTERRUPT	0x20000000
161b2f58791SDmitry Chagin #define	LINUX_SA_NOMASK		0x40000000
162b2f58791SDmitry Chagin #define	LINUX_SA_ONESHOT	0x80000000
163b2f58791SDmitry Chagin 
164b2f58791SDmitry Chagin /* sigaltstack */
165b2f58791SDmitry Chagin #define	LINUX_MINSIGSTKSZ	2048
166b2f58791SDmitry Chagin 
167b2f58791SDmitry Chagin typedef void	(*l_handler_t)(l_int);
168b2f58791SDmitry Chagin 
169b2f58791SDmitry Chagin typedef struct {
170b2f58791SDmitry Chagin 	l_handler_t	lsa_handler;
171b2f58791SDmitry Chagin 	l_ulong		lsa_flags;
172b2f58791SDmitry Chagin 	l_uintptr_t	lsa_restorer;
173b2f58791SDmitry Chagin 	l_sigset_t	lsa_mask;
174b2f58791SDmitry Chagin } l_sigaction_t;
175b2f58791SDmitry Chagin 
176b2f58791SDmitry Chagin typedef struct {
177b2f58791SDmitry Chagin 	l_uintptr_t	ss_sp;
178b2f58791SDmitry Chagin 	l_int		ss_flags;
179b2f58791SDmitry Chagin 	l_size_t	ss_size;
180b2f58791SDmitry Chagin } l_stack_t;
181b2f58791SDmitry Chagin 
182b2f58791SDmitry Chagin /*
183b2f58791SDmitry Chagin  * mount flags
184b2f58791SDmitry Chagin  */
185b2f58791SDmitry Chagin #define	LINUX_MS_RDONLY		0x0001
186b2f58791SDmitry Chagin #define	LINUX_MS_NOSUID		0x0002
187b2f58791SDmitry Chagin #define	LINUX_MS_NODEV		0x0004
188b2f58791SDmitry Chagin #define	LINUX_MS_NOEXEC		0x0008
189b2f58791SDmitry Chagin #define	LINUX_MS_REMOUNT	0x0020
190b2f58791SDmitry Chagin 
191b2f58791SDmitry Chagin /*
192b2f58791SDmitry Chagin  * SystemV IPC defines
193b2f58791SDmitry Chagin  */
194b2f58791SDmitry Chagin #define	LINUX_IPC_RMID		0
195b2f58791SDmitry Chagin #define	LINUX_IPC_SET		1
196b2f58791SDmitry Chagin #define	LINUX_IPC_STAT		2
197b2f58791SDmitry Chagin #define	LINUX_IPC_INFO		3
198b2f58791SDmitry Chagin 
199b2f58791SDmitry Chagin #define	LINUX_SHM_LOCK		11
200b2f58791SDmitry Chagin #define	LINUX_SHM_UNLOCK	12
201b2f58791SDmitry Chagin #define	LINUX_SHM_STAT		13
202b2f58791SDmitry Chagin #define	LINUX_SHM_INFO		14
203b2f58791SDmitry Chagin 
204b2f58791SDmitry Chagin #define	LINUX_SHM_RDONLY	0x1000
205b2f58791SDmitry Chagin #define	LINUX_SHM_RND		0x2000
206b2f58791SDmitry Chagin #define	LINUX_SHM_REMAP		0x4000
207b2f58791SDmitry Chagin 
208b2f58791SDmitry Chagin /* semctl commands */
209b2f58791SDmitry Chagin #define	LINUX_GETPID		11
210b2f58791SDmitry Chagin #define	LINUX_GETVAL		12
211b2f58791SDmitry Chagin #define	LINUX_GETALL		13
212b2f58791SDmitry Chagin #define	LINUX_GETNCNT		14
213b2f58791SDmitry Chagin #define	LINUX_GETZCNT		15
214b2f58791SDmitry Chagin #define	LINUX_SETVAL		16
215b2f58791SDmitry Chagin #define	LINUX_SETALL		17
216b2f58791SDmitry Chagin #define	LINUX_SEM_STAT		18
217b2f58791SDmitry Chagin #define	LINUX_SEM_INFO		19
218b2f58791SDmitry Chagin 
219b2f58791SDmitry Chagin union l_semun {
220b2f58791SDmitry Chagin 	l_int		val;
221b2f58791SDmitry Chagin 	l_uintptr_t	buf;
222b2f58791SDmitry Chagin 	l_uintptr_t	array;
223b2f58791SDmitry Chagin 	l_uintptr_t	__buf;
224b2f58791SDmitry Chagin 	l_uintptr_t	__pad;
225b2f58791SDmitry Chagin };
226b2f58791SDmitry Chagin 
227b2f58791SDmitry Chagin struct l_ifmap {
228b2f58791SDmitry Chagin 	l_ulong		mem_start;
229b2f58791SDmitry Chagin 	l_ulong		mem_end;
230b2f58791SDmitry Chagin 	l_ushort	base_addr;
231b2f58791SDmitry Chagin 	u_char		irq;
232b2f58791SDmitry Chagin 	u_char		dma;
233b2f58791SDmitry Chagin 	u_char		port;
23419593f77SDmitry Chagin 	/* 3 bytes spare */
23519593f77SDmitry Chagin };
236b2f58791SDmitry Chagin 
237b2f58791SDmitry Chagin struct l_ifreq {
238b2f58791SDmitry Chagin 	union {
239b2f58791SDmitry Chagin 		char	ifrn_name[LINUX_IFNAMSIZ];
240b2f58791SDmitry Chagin 	} ifr_ifrn;
241b2f58791SDmitry Chagin 
242b2f58791SDmitry Chagin 	union {
243b2f58791SDmitry Chagin 		struct l_sockaddr	ifru_addr;
244b2f58791SDmitry Chagin 		struct l_sockaddr	ifru_dstaddr;
245b2f58791SDmitry Chagin 		struct l_sockaddr	ifru_broadaddr;
246b2f58791SDmitry Chagin 		struct l_sockaddr	ifru_netmask;
247b2f58791SDmitry Chagin 		struct l_sockaddr	ifru_hwaddr;
248b2f58791SDmitry Chagin 		l_short		ifru_flags[1];
2497ece126eSTai-hwa Liang 		l_int		ifru_ivalue;
250b2f58791SDmitry Chagin 		l_int		ifru_mtu;
251b2f58791SDmitry Chagin 		struct l_ifmap	ifru_map;
252b2f58791SDmitry Chagin 		char		ifru_slave[LINUX_IFNAMSIZ];
253b2f58791SDmitry Chagin 		l_uintptr_t	ifru_data;
254b2f58791SDmitry Chagin 	} ifr_ifru;
25519593f77SDmitry Chagin };
256b2f58791SDmitry Chagin 
257b2f58791SDmitry Chagin #define	ifr_name	ifr_ifrn.ifrn_name	/* Interface name */
258b2f58791SDmitry Chagin #define	ifr_hwaddr	ifr_ifru.ifru_hwaddr	/* MAC address */
2597ece126eSTai-hwa Liang #define	ifr_ifindex	ifr_ifru.ifru_ivalue	/* Interface index */
260b2f58791SDmitry Chagin 
261b2f58791SDmitry Chagin struct l_ifconf {
262b2f58791SDmitry Chagin 	int	ifc_len;
263b2f58791SDmitry Chagin 	union {
264b2f58791SDmitry Chagin 		l_uintptr_t	ifcu_buf;
265b2f58791SDmitry Chagin 		l_uintptr_t	ifcu_req;
266b2f58791SDmitry Chagin 	} ifc_ifcu;
267b2f58791SDmitry Chagin };
268b2f58791SDmitry Chagin 
269b2f58791SDmitry Chagin #define	ifc_buf		ifc_ifcu.ifcu_buf
270b2f58791SDmitry Chagin #define	ifc_req		ifc_ifcu.ifcu_req
271b2f58791SDmitry Chagin 
272b2f58791SDmitry Chagin #define LINUX_ARCH_SET_GS		0x1001
273b2f58791SDmitry Chagin #define LINUX_ARCH_SET_FS		0x1002
274f1389991SDmitry Chagin #define LINUX_ARCH_GET_FS		0x1003
275f1389991SDmitry Chagin #define LINUX_ARCH_GET_GS		0x1004
276916f3dbaSEdward Tomasz Napierala #define LINUX_ARCH_CET_STATUS		0x3001
277b2f58791SDmitry Chagin 
278b2f58791SDmitry Chagin #define	linux_copyout_rusage(r, u)	copyout(r, u, sizeof(*r))
279b2f58791SDmitry Chagin 
280b2f58791SDmitry Chagin /* robust futexes */
281b2f58791SDmitry Chagin struct linux_robust_list {
282b2f58791SDmitry Chagin 	l_uintptr_t			next;
283b2f58791SDmitry Chagin };
284b2f58791SDmitry Chagin 
285b2f58791SDmitry Chagin struct linux_robust_list_head {
286b2f58791SDmitry Chagin 	struct linux_robust_list	list;
287b2f58791SDmitry Chagin 	l_long				futex_offset;
288b2f58791SDmitry Chagin 	l_uintptr_t			pending_list;
289b2f58791SDmitry Chagin };
290b2f58791SDmitry Chagin 
29195c19e1dSEdward Tomasz Napierala /* This corresponds to 'struct user_regs_struct' in Linux. */
29295c19e1dSEdward Tomasz Napierala struct linux_pt_regset {
29395c19e1dSEdward Tomasz Napierala 	l_ulong	r15;
29495c19e1dSEdward Tomasz Napierala 	l_ulong	r14;
29595c19e1dSEdward Tomasz Napierala 	l_ulong	r13;
29695c19e1dSEdward Tomasz Napierala 	l_ulong	r12;
29795c19e1dSEdward Tomasz Napierala 	l_ulong	rbp;
29895c19e1dSEdward Tomasz Napierala 	l_ulong	rbx;
29995c19e1dSEdward Tomasz Napierala 	l_ulong	r11;
30095c19e1dSEdward Tomasz Napierala 	l_ulong	r10;
30195c19e1dSEdward Tomasz Napierala 	l_ulong	r9;
30295c19e1dSEdward Tomasz Napierala 	l_ulong	r8;
30395c19e1dSEdward Tomasz Napierala 	l_ulong	rax;
30495c19e1dSEdward Tomasz Napierala 	l_ulong	rcx;
30595c19e1dSEdward Tomasz Napierala 	l_ulong	rdx;
30695c19e1dSEdward Tomasz Napierala 	l_ulong	rsi;
30795c19e1dSEdward Tomasz Napierala 	l_ulong	rdi;
30895c19e1dSEdward Tomasz Napierala 	l_ulong	orig_rax;
30995c19e1dSEdward Tomasz Napierala 	l_ulong	rip;
31095c19e1dSEdward Tomasz Napierala 	l_ulong	cs;
31195c19e1dSEdward Tomasz Napierala 	l_ulong	eflags;
31295c19e1dSEdward Tomasz Napierala 	l_ulong	rsp;
31395c19e1dSEdward Tomasz Napierala 	l_ulong	ss;
31495c19e1dSEdward Tomasz Napierala 	l_ulong fs_base;
31595c19e1dSEdward Tomasz Napierala 	l_ulong gs_base;
31695c19e1dSEdward Tomasz Napierala 	l_ulong ds;
31795c19e1dSEdward Tomasz Napierala 	l_ulong es;
31895c19e1dSEdward Tomasz Napierala 	l_ulong fs;
31995c19e1dSEdward Tomasz Napierala 	l_ulong gs;
32095c19e1dSEdward Tomasz Napierala };
32195c19e1dSEdward Tomasz Napierala 
322*d416ee86SDmitry Chagin #ifdef _KERNEL
32395c19e1dSEdward Tomasz Napierala struct reg;
3240bf8d5d5SEdward Tomasz Napierala struct syscall_info;
32595c19e1dSEdward Tomasz Napierala 
3263417c298SEdward Tomasz Napierala void	bsd_to_linux_regset(const struct reg *b_reg,
32795c19e1dSEdward Tomasz Napierala 	    struct linux_pt_regset *l_regset);
328f0d9a6a7SEdward Tomasz Napierala void	linux_to_bsd_regset(struct reg *b_reg,
329f0d9a6a7SEdward Tomasz Napierala 	    const struct linux_pt_regset *l_regset);
3300bf8d5d5SEdward Tomasz Napierala void	linux_ptrace_get_syscall_info_machdep(const struct reg *reg,
3310bf8d5d5SEdward Tomasz Napierala 	    struct syscall_info *si);
3320bf8d5d5SEdward Tomasz Napierala int	linux_ptrace_getregs_machdep(struct thread *td, pid_t pid,
3330bf8d5d5SEdward Tomasz Napierala 	    struct linux_pt_regset *l_regset);
334*d416ee86SDmitry Chagin #endif /* _KERNEL */
33595c19e1dSEdward Tomasz Napierala 
336b2f58791SDmitry Chagin #endif /* !_AMD64_LINUX_H_ */
337