xref: /freebsd/sys/amd64/linux/linux.h (revision 4fe77990)
1b2f58791SDmitry Chagin /*-
24d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
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 
30b2f58791SDmitry Chagin #ifndef _AMD64_LINUX_H_
31b2f58791SDmitry Chagin #define	_AMD64_LINUX_H_
32b2f58791SDmitry Chagin 
33562894f0SBrooks Davis #include <sys/abi_compat.h>
34562894f0SBrooks Davis 
354ab7403bSDmitry Chagin #include <compat/linux/linux.h>
36b2f58791SDmitry Chagin #include <amd64/linux/linux_syscall.h>
37b2f58791SDmitry Chagin 
38931e2a1aSEd Maste #define	LINUX_LEGACY_SYSCALLS
39931e2a1aSEd Maste 
40b2f58791SDmitry Chagin #define	LINUX_DTRACE	linuxulator
41b2f58791SDmitry Chagin 
42b2f58791SDmitry Chagin /*
43b2f58791SDmitry Chagin  * Provide a separate set of types for the Linux types.
44b2f58791SDmitry Chagin  */
45b2f58791SDmitry Chagin typedef int32_t		l_int;
46b2f58791SDmitry Chagin typedef int64_t		l_long;
47b2f58791SDmitry Chagin typedef int16_t		l_short;
48b2f58791SDmitry Chagin typedef uint32_t	l_uint;
49b2f58791SDmitry Chagin typedef uint64_t	l_ulong;
50b2f58791SDmitry Chagin typedef uint16_t	l_ushort;
51b2f58791SDmitry Chagin 
52b2f58791SDmitry Chagin typedef l_ulong		l_uintptr_t;
53b2f58791SDmitry Chagin typedef l_long		l_clock_t;
54b2f58791SDmitry Chagin typedef l_int		l_daddr_t;
55b2f58791SDmitry Chagin typedef l_uint		l_gid_t;
56ab60bc84SDmitry Chagin typedef l_ushort	l_gid16_t;
57b2f58791SDmitry Chagin typedef l_uint		l_uid_t;
58ab60bc84SDmitry Chagin typedef	l_ushort	l_uid16_t;
59b2f58791SDmitry Chagin typedef l_ulong		l_ino_t;
60b2f58791SDmitry Chagin typedef l_int		l_key_t;
61b2f58791SDmitry Chagin typedef l_long		l_loff_t;
62b2f58791SDmitry Chagin typedef l_uint		l_mode_t;
63b2f58791SDmitry Chagin typedef l_long		l_off_t;
64b2f58791SDmitry Chagin typedef l_int		l_pid_t;
65b2f58791SDmitry Chagin typedef l_ulong		l_size_t;
66b2f58791SDmitry Chagin typedef l_long		l_ssize_t;
67b2f58791SDmitry Chagin typedef l_long		l_suseconds_t;
68b2f58791SDmitry Chagin typedef l_long		l_time_t;
69b2f58791SDmitry Chagin typedef l_int		l_timer_t;
70b2f58791SDmitry Chagin typedef l_int		l_mqd_t;
71b2f58791SDmitry Chagin typedef l_size_t	l_socklen_t;
723e89b641SDmitry Chagin typedef	l_ulong		l_fd_mask;
73b2f58791SDmitry Chagin 
74af557e64SDmitry Chagin #include <compat/linux/linux_siginfo.h>
75af557e64SDmitry Chagin 
76b2f58791SDmitry Chagin typedef struct {
77b2f58791SDmitry Chagin 	l_int		val[2];
78b2f58791SDmitry Chagin } l_fsid_t;
79b2f58791SDmitry Chagin 
80b2f58791SDmitry Chagin typedef struct {
81b2f58791SDmitry Chagin 	l_time_t	tv_sec;
82b2f58791SDmitry Chagin 	l_suseconds_t	tv_usec;
83b2f58791SDmitry Chagin } l_timeval;
84b2f58791SDmitry Chagin 
85b2f58791SDmitry Chagin #define	l_fd_set	fd_set
86b2f58791SDmitry Chagin 
87b2f58791SDmitry Chagin /*
88b2f58791SDmitry Chagin  * Miscellaneous
89b2f58791SDmitry Chagin  */
9056c5230aSDmitry Chagin #define LINUX_AT_COUNT		21	/* Count of used aux entry types.
9156c5230aSDmitry Chagin 					 * Keep this synchronized with
9256c5230aSDmitry Chagin 					 * linux_copyout_auxargs() code.
9356c5230aSDmitry Chagin 					 */
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 {
134e0bfe0d6SDmitry Chagin 	l_ulong		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;
140e0bfe0d6SDmitry Chagin 	l_uint		__st_pad0;
141e0bfe0d6SDmitry Chagin 	l_ulong		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 union l_semun {
192b2f58791SDmitry Chagin 	l_int		val;
193b2f58791SDmitry Chagin 	l_uintptr_t	buf;
194b2f58791SDmitry Chagin 	l_uintptr_t	array;
195b2f58791SDmitry Chagin 	l_uintptr_t	__buf;
196b2f58791SDmitry Chagin 	l_uintptr_t	__pad;
197b2f58791SDmitry Chagin };
198b2f58791SDmitry Chagin 
199b2f58791SDmitry Chagin #define LINUX_ARCH_SET_GS		0x1001
200b2f58791SDmitry Chagin #define LINUX_ARCH_SET_FS		0x1002
201f1389991SDmitry Chagin #define LINUX_ARCH_GET_FS		0x1003
202f1389991SDmitry Chagin #define LINUX_ARCH_GET_GS		0x1004
203916f3dbaSEdward Tomasz Napierala #define LINUX_ARCH_CET_STATUS		0x3001
204b2f58791SDmitry Chagin 
205b2f58791SDmitry Chagin #define	linux_copyout_rusage(r, u)	copyout(r, u, sizeof(*r))
206b2f58791SDmitry Chagin 
20795c19e1dSEdward Tomasz Napierala /* This corresponds to 'struct user_regs_struct' in Linux. */
20895c19e1dSEdward Tomasz Napierala struct linux_pt_regset {
20995c19e1dSEdward Tomasz Napierala 	l_ulong	r15;
21095c19e1dSEdward Tomasz Napierala 	l_ulong	r14;
21195c19e1dSEdward Tomasz Napierala 	l_ulong	r13;
21295c19e1dSEdward Tomasz Napierala 	l_ulong	r12;
21395c19e1dSEdward Tomasz Napierala 	l_ulong	rbp;
21495c19e1dSEdward Tomasz Napierala 	l_ulong	rbx;
21595c19e1dSEdward Tomasz Napierala 	l_ulong	r11;
21695c19e1dSEdward Tomasz Napierala 	l_ulong	r10;
21795c19e1dSEdward Tomasz Napierala 	l_ulong	r9;
21895c19e1dSEdward Tomasz Napierala 	l_ulong	r8;
21995c19e1dSEdward Tomasz Napierala 	l_ulong	rax;
22095c19e1dSEdward Tomasz Napierala 	l_ulong	rcx;
22195c19e1dSEdward Tomasz Napierala 	l_ulong	rdx;
22295c19e1dSEdward Tomasz Napierala 	l_ulong	rsi;
22395c19e1dSEdward Tomasz Napierala 	l_ulong	rdi;
22495c19e1dSEdward Tomasz Napierala 	l_ulong	orig_rax;
22595c19e1dSEdward Tomasz Napierala 	l_ulong	rip;
22695c19e1dSEdward Tomasz Napierala 	l_ulong	cs;
22795c19e1dSEdward Tomasz Napierala 	l_ulong	eflags;
22895c19e1dSEdward Tomasz Napierala 	l_ulong	rsp;
22995c19e1dSEdward Tomasz Napierala 	l_ulong	ss;
23095c19e1dSEdward Tomasz Napierala 	l_ulong fs_base;
23195c19e1dSEdward Tomasz Napierala 	l_ulong gs_base;
23295c19e1dSEdward Tomasz Napierala 	l_ulong ds;
23395c19e1dSEdward Tomasz Napierala 	l_ulong es;
23495c19e1dSEdward Tomasz Napierala 	l_ulong fs;
23595c19e1dSEdward Tomasz Napierala 	l_ulong gs;
23695c19e1dSEdward Tomasz Napierala };
23795c19e1dSEdward Tomasz Napierala 
238d416ee86SDmitry Chagin #ifdef _KERNEL
23995c19e1dSEdward Tomasz Napierala struct reg;
2400bf8d5d5SEdward Tomasz Napierala struct syscall_info;
24195c19e1dSEdward Tomasz Napierala 
2423417c298SEdward Tomasz Napierala void	bsd_to_linux_regset(const struct reg *b_reg,
24395c19e1dSEdward Tomasz Napierala 	    struct linux_pt_regset *l_regset);
244f0d9a6a7SEdward Tomasz Napierala void	linux_to_bsd_regset(struct reg *b_reg,
245f0d9a6a7SEdward Tomasz Napierala 	    const struct linux_pt_regset *l_regset);
2460bf8d5d5SEdward Tomasz Napierala void	linux_ptrace_get_syscall_info_machdep(const struct reg *reg,
2470bf8d5d5SEdward Tomasz Napierala 	    struct syscall_info *si);
2480bf8d5d5SEdward Tomasz Napierala int	linux_ptrace_getregs_machdep(struct thread *td, pid_t pid,
2490bf8d5d5SEdward Tomasz Napierala 	    struct linux_pt_regset *l_regset);
250dd2a6cd7SDmitry Chagin int	linux_ptrace_peekuser(struct thread *td, pid_t pid,
251dd2a6cd7SDmitry Chagin 	    void *addr, void *data);
2523d0addcdSDmitry Chagin int	linux_ptrace_pokeuser(struct thread *td, pid_t pid,
2533d0addcdSDmitry Chagin 	    void *addr, void *data);
254d416ee86SDmitry Chagin #endif /* _KERNEL */
25595c19e1dSEdward Tomasz Napierala 
256b2f58791SDmitry Chagin #endif /* !_AMD64_LINUX_H_ */
257