xref: /f-stack/freebsd/arm64/linux/linux.h (revision 22ce4aff)
1*22ce4affSfengbojiang /*-
2*22ce4affSfengbojiang  * Copyright (c) 1994-1996 Søren Schmidt
3*22ce4affSfengbojiang  * Copyright (c) 2013 Dmitry Chagin
4*22ce4affSfengbojiang  * Copyright (c) 2018 Turing Robotic Industries Inc.
5*22ce4affSfengbojiang  *
6*22ce4affSfengbojiang  * Redistribution and use in source and binary forms, with or without
7*22ce4affSfengbojiang  * modification, are permitted provided that the following conditions
8*22ce4affSfengbojiang  * are met:
9*22ce4affSfengbojiang  * 1. Redistributions of source code must retain the above copyright
10*22ce4affSfengbojiang  *    notice, this list of conditions and the following disclaimer.
11*22ce4affSfengbojiang  * 2. Redistributions in binary form must reproduce the above copyright
12*22ce4affSfengbojiang  *    notice, this list of conditions and the following disclaimer in the
13*22ce4affSfengbojiang  *    documentation and/or other materials provided with the distribution.
14*22ce4affSfengbojiang  *
15*22ce4affSfengbojiang  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16*22ce4affSfengbojiang  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17*22ce4affSfengbojiang  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18*22ce4affSfengbojiang  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19*22ce4affSfengbojiang  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20*22ce4affSfengbojiang  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21*22ce4affSfengbojiang  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22*22ce4affSfengbojiang  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23*22ce4affSfengbojiang  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24*22ce4affSfengbojiang  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25*22ce4affSfengbojiang  * SUCH DAMAGE.
26*22ce4affSfengbojiang  */
27*22ce4affSfengbojiang 
28*22ce4affSfengbojiang /*
29*22ce4affSfengbojiang  * $FreeBSD$
30*22ce4affSfengbojiang  */
31*22ce4affSfengbojiang #ifndef _ARM64_LINUX_H_
32*22ce4affSfengbojiang #define	_ARM64_LINUX_H_
33*22ce4affSfengbojiang 
34*22ce4affSfengbojiang #include <sys/abi_compat.h>
35*22ce4affSfengbojiang 
36*22ce4affSfengbojiang #include <compat/linux/linux.h>
37*22ce4affSfengbojiang #include <arm64/linux/linux_syscall.h>
38*22ce4affSfengbojiang 
39*22ce4affSfengbojiang #define	LINUX_DTRACE	linuxulator
40*22ce4affSfengbojiang 
41*22ce4affSfengbojiang /* Provide a separate set of types for the Linux types */
42*22ce4affSfengbojiang typedef int32_t		l_int;
43*22ce4affSfengbojiang typedef int64_t		l_long;
44*22ce4affSfengbojiang typedef int16_t		l_short;
45*22ce4affSfengbojiang typedef uint32_t	l_uint;
46*22ce4affSfengbojiang typedef uint64_t	l_ulong;
47*22ce4affSfengbojiang typedef uint16_t	l_ushort;
48*22ce4affSfengbojiang 
49*22ce4affSfengbojiang typedef l_ulong		l_uintptr_t;
50*22ce4affSfengbojiang typedef l_long		l_clock_t;
51*22ce4affSfengbojiang typedef l_int		l_daddr_t;
52*22ce4affSfengbojiang typedef l_ulong		l_dev_t;
53*22ce4affSfengbojiang typedef l_uint		l_gid_t;
54*22ce4affSfengbojiang typedef l_ushort	l_gid16_t;	/* XXX */
55*22ce4affSfengbojiang typedef l_uint		l_uid_t;
56*22ce4affSfengbojiang typedef l_ushort	l_uid16_t;	/* XXX */
57*22ce4affSfengbojiang typedef l_ulong		l_ino_t;
58*22ce4affSfengbojiang typedef l_int		l_key_t;
59*22ce4affSfengbojiang typedef l_long		l_loff_t;
60*22ce4affSfengbojiang typedef l_uint		l_mode_t;
61*22ce4affSfengbojiang typedef l_long		l_off_t;
62*22ce4affSfengbojiang typedef l_int		l_pid_t;
63*22ce4affSfengbojiang typedef l_ulong		l_size_t;
64*22ce4affSfengbojiang typedef l_long		l_suseconds_t;
65*22ce4affSfengbojiang typedef l_long		l_time_t;
66*22ce4affSfengbojiang typedef l_int		l_timer_t;	/* XXX */
67*22ce4affSfengbojiang typedef l_int		l_mqd_t;
68*22ce4affSfengbojiang typedef l_ulong		l_fd_mask;
69*22ce4affSfengbojiang 
70*22ce4affSfengbojiang typedef struct {
71*22ce4affSfengbojiang 	l_int		val[2];
72*22ce4affSfengbojiang } l_fsid_t;
73*22ce4affSfengbojiang 
74*22ce4affSfengbojiang typedef struct {
75*22ce4affSfengbojiang 	l_time_t	tv_sec;
76*22ce4affSfengbojiang 	l_suseconds_t	tv_usec;
77*22ce4affSfengbojiang } l_timeval;
78*22ce4affSfengbojiang 
79*22ce4affSfengbojiang #define	l_fd_set	fd_set
80*22ce4affSfengbojiang 
81*22ce4affSfengbojiang /* Miscellaneous */
82*22ce4affSfengbojiang #define	LINUX_AT_COUNT		20
83*22ce4affSfengbojiang 
84*22ce4affSfengbojiang struct l___sysctl_args
85*22ce4affSfengbojiang {
86*22ce4affSfengbojiang 	l_uintptr_t	name;
87*22ce4affSfengbojiang 	l_int		nlen;
88*22ce4affSfengbojiang 	l_uintptr_t	oldval;
89*22ce4affSfengbojiang 	l_uintptr_t	oldlenp;
90*22ce4affSfengbojiang 	l_uintptr_t	newval;
91*22ce4affSfengbojiang 	l_uintptr_t	newlen;
92*22ce4affSfengbojiang 	l_ulong		__spare[4];
93*22ce4affSfengbojiang };
94*22ce4affSfengbojiang 
95*22ce4affSfengbojiang /* Resource limits */
96*22ce4affSfengbojiang #define	LINUX_RLIMIT_CPU	0
97*22ce4affSfengbojiang #define	LINUX_RLIMIT_FSIZE	1
98*22ce4affSfengbojiang #define	LINUX_RLIMIT_DATA	2
99*22ce4affSfengbojiang #define	LINUX_RLIMIT_STACK	3
100*22ce4affSfengbojiang #define	LINUX_RLIMIT_CORE	4
101*22ce4affSfengbojiang #define	LINUX_RLIMIT_RSS	5
102*22ce4affSfengbojiang #define	LINUX_RLIMIT_NPROC	6
103*22ce4affSfengbojiang #define	LINUX_RLIMIT_NOFILE	7
104*22ce4affSfengbojiang #define	LINUX_RLIMIT_MEMLOCK	8
105*22ce4affSfengbojiang #define	LINUX_RLIMIT_AS		9	/* Address space limit */
106*22ce4affSfengbojiang 
107*22ce4affSfengbojiang #define	LINUX_RLIM_NLIMITS	10
108*22ce4affSfengbojiang 
109*22ce4affSfengbojiang struct l_rlimit {
110*22ce4affSfengbojiang 	l_ulong		rlim_cur;
111*22ce4affSfengbojiang 	l_ulong		rlim_max;
112*22ce4affSfengbojiang };
113*22ce4affSfengbojiang 
114*22ce4affSfengbojiang /* stat family of syscalls */
115*22ce4affSfengbojiang struct l_timespec {
116*22ce4affSfengbojiang 	l_time_t	tv_sec;
117*22ce4affSfengbojiang 	l_long		tv_nsec;
118*22ce4affSfengbojiang };
119*22ce4affSfengbojiang 
120*22ce4affSfengbojiang struct l_newstat {
121*22ce4affSfengbojiang 	l_dev_t		st_dev;
122*22ce4affSfengbojiang 	l_ino_t		st_ino;
123*22ce4affSfengbojiang 	l_uint		st_mode;
124*22ce4affSfengbojiang 	l_uint		st_nlink;
125*22ce4affSfengbojiang 
126*22ce4affSfengbojiang 	l_uid_t		st_uid;
127*22ce4affSfengbojiang 	l_gid_t		st_gid;
128*22ce4affSfengbojiang 
129*22ce4affSfengbojiang 	l_dev_t		st_rdev;
130*22ce4affSfengbojiang 	l_ulong		__st_pad1;
131*22ce4affSfengbojiang 	l_off_t		st_size;
132*22ce4affSfengbojiang 	l_int		st_blksize;
133*22ce4affSfengbojiang 	l_int		__st_pad2;
134*22ce4affSfengbojiang 	l_long		st_blocks;
135*22ce4affSfengbojiang 
136*22ce4affSfengbojiang 	struct l_timespec	st_atim;
137*22ce4affSfengbojiang 	struct l_timespec	st_mtim;
138*22ce4affSfengbojiang 	struct l_timespec	st_ctim;
139*22ce4affSfengbojiang 	l_uint		__unused1;
140*22ce4affSfengbojiang 	l_uint		__unused2;
141*22ce4affSfengbojiang };
142*22ce4affSfengbojiang 
143*22ce4affSfengbojiang /* sigaction flags */
144*22ce4affSfengbojiang #define	LINUX_SA_NOCLDSTOP	0x00000001
145*22ce4affSfengbojiang #define	LINUX_SA_NOCLDWAIT	0x00000002
146*22ce4affSfengbojiang #define	LINUX_SA_SIGINFO	0x00000004
147*22ce4affSfengbojiang #define	LINUX_SA_RESTORER	0x04000000
148*22ce4affSfengbojiang #define	LINUX_SA_ONSTACK	0x08000000
149*22ce4affSfengbojiang #define	LINUX_SA_RESTART	0x10000000
150*22ce4affSfengbojiang #define	LINUX_SA_INTERRUPT	0x20000000	/* XXX */
151*22ce4affSfengbojiang #define	LINUX_SA_NOMASK		0x40000000	/* SA_NODEFER */
152*22ce4affSfengbojiang #define	LINUX_SA_ONESHOT	0x80000000	/* SA_RESETHAND */
153*22ce4affSfengbojiang 
154*22ce4affSfengbojiang /* sigprocmask actions */
155*22ce4affSfengbojiang #define	LINUX_SIG_BLOCK		0
156*22ce4affSfengbojiang #define	LINUX_SIG_UNBLOCK	1
157*22ce4affSfengbojiang #define	LINUX_SIG_SETMASK	2
158*22ce4affSfengbojiang 
159*22ce4affSfengbojiang /* sigaltstack */
160*22ce4affSfengbojiang #define	LINUX_MINSIGSTKSZ	2048		/* XXX */
161*22ce4affSfengbojiang 
162*22ce4affSfengbojiang typedef void	(*l_handler_t)(l_int);
163*22ce4affSfengbojiang 
164*22ce4affSfengbojiang typedef struct {
165*22ce4affSfengbojiang 	l_handler_t	lsa_handler;
166*22ce4affSfengbojiang 	l_ulong		lsa_flags;
167*22ce4affSfengbojiang 	l_uintptr_t	lsa_restorer;
168*22ce4affSfengbojiang 	l_sigset_t	lsa_mask;
169*22ce4affSfengbojiang } l_sigaction_t;				/* XXX */
170*22ce4affSfengbojiang 
171*22ce4affSfengbojiang typedef struct {
172*22ce4affSfengbojiang 	l_uintptr_t	ss_sp;
173*22ce4affSfengbojiang 	l_int		ss_flags;
174*22ce4affSfengbojiang 	l_size_t	ss_size;
175*22ce4affSfengbojiang } l_stack_t;
176*22ce4affSfengbojiang 
177*22ce4affSfengbojiang #define	LINUX_SI_PREAMBLE_SIZE	(4 * sizeof(int))
178*22ce4affSfengbojiang #define	LINUX_SI_MAX_SIZE	128
179*22ce4affSfengbojiang #define	LINUX_SI_PAD_SIZE	((LINUX_SI_MAX_SIZE - \
180*22ce4affSfengbojiang 				    LINUX_SI_PREAMBLE_SIZE) / sizeof(l_int))
181*22ce4affSfengbojiang typedef union l_sigval {
182*22ce4affSfengbojiang 	l_int		sival_int;
183*22ce4affSfengbojiang 	l_uintptr_t	sival_ptr;
184*22ce4affSfengbojiang } l_sigval_t;
185*22ce4affSfengbojiang 
186*22ce4affSfengbojiang typedef struct l_siginfo {
187*22ce4affSfengbojiang 	l_int		lsi_signo;
188*22ce4affSfengbojiang 	l_int		lsi_errno;
189*22ce4affSfengbojiang 	l_int		lsi_code;
190*22ce4affSfengbojiang 	union {
191*22ce4affSfengbojiang 		l_int	_pad[LINUX_SI_PAD_SIZE];
192*22ce4affSfengbojiang 
193*22ce4affSfengbojiang 		struct {
194*22ce4affSfengbojiang 			l_pid_t		_pid;
195*22ce4affSfengbojiang 			l_uid_t		_uid;
196*22ce4affSfengbojiang 		} _kill;
197*22ce4affSfengbojiang 
198*22ce4affSfengbojiang 		struct {
199*22ce4affSfengbojiang 			l_timer_t	_tid;
200*22ce4affSfengbojiang 			l_int		_overrun;
201*22ce4affSfengbojiang 			char		_pad[sizeof(l_uid_t) - sizeof(int)];
202*22ce4affSfengbojiang 			union l_sigval	_sigval;
203*22ce4affSfengbojiang 			l_uint		_sys_private;
204*22ce4affSfengbojiang 		} _timer;
205*22ce4affSfengbojiang 
206*22ce4affSfengbojiang 		struct {
207*22ce4affSfengbojiang 			l_pid_t		_pid;		/* sender's pid */
208*22ce4affSfengbojiang 			l_uid_t		_uid;		/* sender's uid */
209*22ce4affSfengbojiang 			union l_sigval	_sigval;
210*22ce4affSfengbojiang 		} _rt;
211*22ce4affSfengbojiang 
212*22ce4affSfengbojiang 		struct {
213*22ce4affSfengbojiang 			l_pid_t		_pid;		/* which child */
214*22ce4affSfengbojiang 			l_uid_t		_uid;		/* sender's uid */
215*22ce4affSfengbojiang 			l_int		_status;	/* exit code */
216*22ce4affSfengbojiang 			l_clock_t	_utime;
217*22ce4affSfengbojiang 			l_clock_t	_stime;
218*22ce4affSfengbojiang 		} _sigchld;
219*22ce4affSfengbojiang 
220*22ce4affSfengbojiang 		struct {
221*22ce4affSfengbojiang 			l_uintptr_t	_addr;	/* Faulting insn/memory ref. */
222*22ce4affSfengbojiang 		} _sigfault;
223*22ce4affSfengbojiang 
224*22ce4affSfengbojiang 		struct {
225*22ce4affSfengbojiang 			l_long		_band;	/* POLL_IN,POLL_OUT,POLL_MSG */
226*22ce4affSfengbojiang 			l_int		_fd;
227*22ce4affSfengbojiang 		} _sigpoll;
228*22ce4affSfengbojiang 	} _sifields;
229*22ce4affSfengbojiang } l_siginfo_t;
230*22ce4affSfengbojiang 
231*22ce4affSfengbojiang #define	lsi_pid		_sifields._kill._pid
232*22ce4affSfengbojiang #define	lsi_uid		_sifields._kill._uid
233*22ce4affSfengbojiang #define	lsi_tid		_sifields._timer._tid
234*22ce4affSfengbojiang #define	lsi_overrun	_sifields._timer._overrun
235*22ce4affSfengbojiang #define	lsi_sys_private	_sifields._timer._sys_private
236*22ce4affSfengbojiang #define	lsi_status	_sifields._sigchld._status
237*22ce4affSfengbojiang #define	lsi_utime	_sifields._sigchld._utime
238*22ce4affSfengbojiang #define	lsi_stime	_sifields._sigchld._stime
239*22ce4affSfengbojiang #define	lsi_value	_sifields._rt._sigval
240*22ce4affSfengbojiang #define	lsi_int		_sifields._rt._sigval.sival_int
241*22ce4affSfengbojiang #define	lsi_ptr		_sifields._rt._sigval.sival_ptr
242*22ce4affSfengbojiang #define	lsi_addr	_sifields._sigfault._addr
243*22ce4affSfengbojiang #define	lsi_band	_sifields._sigpoll._band
244*22ce4affSfengbojiang #define	lsi_fd		_sifields._sigpoll._fd
245*22ce4affSfengbojiang 
246*22ce4affSfengbojiang union l_semun {
247*22ce4affSfengbojiang 	l_int		val;
248*22ce4affSfengbojiang 	l_uintptr_t	buf;
249*22ce4affSfengbojiang 	l_uintptr_t	array;
250*22ce4affSfengbojiang 	l_uintptr_t	__buf;
251*22ce4affSfengbojiang 	l_uintptr_t	__pad;
252*22ce4affSfengbojiang };
253*22ce4affSfengbojiang 
254*22ce4affSfengbojiang struct l_ifmap {
255*22ce4affSfengbojiang 	l_ulong		mem_start;
256*22ce4affSfengbojiang 	l_ulong		mem_end;
257*22ce4affSfengbojiang 	l_ushort	base_addr;
258*22ce4affSfengbojiang 	u_char		irq;
259*22ce4affSfengbojiang 	u_char		dma;
260*22ce4affSfengbojiang 	u_char		port;
261*22ce4affSfengbojiang } __packed;
262*22ce4affSfengbojiang 
263*22ce4affSfengbojiang struct l_ifreq {
264*22ce4affSfengbojiang 	union {
265*22ce4affSfengbojiang 		char	ifrn_name[LINUX_IFNAMSIZ];
266*22ce4affSfengbojiang 	} ifr_ifrn;
267*22ce4affSfengbojiang 
268*22ce4affSfengbojiang 	union {
269*22ce4affSfengbojiang 		struct l_sockaddr	ifru_addr;
270*22ce4affSfengbojiang 		struct l_sockaddr	ifru_dstaddr;
271*22ce4affSfengbojiang 		struct l_sockaddr	ifru_broadaddr;
272*22ce4affSfengbojiang 		struct l_sockaddr	ifru_netmask;
273*22ce4affSfengbojiang 		struct l_sockaddr	ifru_hwaddr;
274*22ce4affSfengbojiang 		l_short		ifru_flags[1];
275*22ce4affSfengbojiang 		l_int		ifru_ivalue;
276*22ce4affSfengbojiang 		l_int		ifru_mtu;
277*22ce4affSfengbojiang 		struct l_ifmap	ifru_map;
278*22ce4affSfengbojiang 		char		ifru_slave[LINUX_IFNAMSIZ];
279*22ce4affSfengbojiang 		l_uintptr_t	ifru_data;
280*22ce4affSfengbojiang 	} ifr_ifru;
281*22ce4affSfengbojiang } __packed;
282*22ce4affSfengbojiang 
283*22ce4affSfengbojiang #define	ifr_name	ifr_ifrn.ifrn_name	/* Interface name */
284*22ce4affSfengbojiang #define	ifr_hwaddr	ifr_ifru.ifru_hwaddr	/* MAC address */
285*22ce4affSfengbojiang #define	ifr_ifindex	ifr_ifru.ifru_ivalue	/* Interface index */
286*22ce4affSfengbojiang 
287*22ce4affSfengbojiang #define	linux_copyout_rusage(r, u)	copyout(r, u, sizeof(*r))
288*22ce4affSfengbojiang 
289*22ce4affSfengbojiang /* robust futexes */
290*22ce4affSfengbojiang struct linux_robust_list {
291*22ce4affSfengbojiang 	l_uintptr_t			next;
292*22ce4affSfengbojiang };
293*22ce4affSfengbojiang 
294*22ce4affSfengbojiang struct linux_robust_list_head {
295*22ce4affSfengbojiang 	struct linux_robust_list	list;
296*22ce4affSfengbojiang 	l_long				futex_offset;
297*22ce4affSfengbojiang 	l_uintptr_t			pending_list;
298*22ce4affSfengbojiang };
299*22ce4affSfengbojiang 
300*22ce4affSfengbojiang #endif /* _ARM64_LINUX_H_ */
301