]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/amd64/linux/linux.h
In order to reduce duplication between MD parts of the Linuxulator
[FreeBSD/FreeBSD.git] / sys / amd64 / linux / linux.h
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2013 Dmitry Chagin
5  * Copyright (c) 1994-1996 Søren Schmidt
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  * $FreeBSD$
30  */
31
32 #ifndef _AMD64_LINUX_H_
33 #define _AMD64_LINUX_H_
34
35 #include <compat/linux/linux.h>
36 #include <amd64/linux/linux_syscall.h>
37
38 #define LINUX_LEGACY_SYSCALLS
39
40 /*
41  * debugging support
42  */
43 extern u_char linux_debug_map[];
44 #define ldebug(name)    isclr(linux_debug_map, LINUX_SYS_linux_ ## name)
45 #define ARGS(nm, fmt)   "linux(%ld/%ld): "#nm"("fmt")\n",                       \
46                         (long)td->td_proc->p_pid, (long)td->td_tid
47 #define LMSG(fmt)       "linux(%ld/%ld): "fmt"\n",                              \
48                         (long)td->td_proc->p_pid, (long)td->td_tid
49 #define LINUX_DTRACE    linuxulator
50
51 #define PTRIN(v)        (void *)(v)
52 #define PTROUT(v)       (uintptr_t)(v)
53
54 #define CP(src,dst,fld) do { (dst).fld = (src).fld; } while (0)
55 #define CP2(src,dst,sfld,dfld) do { (dst).dfld = (src).sfld; } while (0)
56 #define PTRIN_CP(src,dst,fld) \
57         do { (dst).fld = PTRIN((src).fld); } while (0)
58
59 /*
60  * Provide a separate set of types for the Linux types.
61  */
62 typedef int32_t         l_int;
63 typedef int64_t         l_long;
64 typedef int16_t         l_short;
65 typedef uint32_t        l_uint;
66 typedef uint64_t        l_ulong;
67 typedef uint16_t        l_ushort;
68
69 typedef l_ulong         l_uintptr_t;
70 typedef l_long          l_clock_t;
71 typedef l_int           l_daddr_t;
72 typedef l_ulong         l_dev_t;
73 typedef l_uint          l_gid_t;
74 typedef l_ushort        l_gid16_t;
75 typedef l_uint          l_uid_t;
76 typedef l_ushort        l_uid16_t;
77 typedef l_ulong         l_ino_t;
78 typedef l_int           l_key_t;
79 typedef l_long          l_loff_t;
80 typedef l_uint          l_mode_t;
81 typedef l_long          l_off_t;
82 typedef l_int           l_pid_t;
83 typedef l_ulong         l_size_t;
84 typedef l_long          l_ssize_t;
85 typedef l_long          l_suseconds_t;
86 typedef l_long          l_time_t;
87 typedef l_int           l_timer_t;
88 typedef l_int           l_mqd_t;
89 typedef l_size_t        l_socklen_t;
90 typedef l_ulong         l_fd_mask;
91
92 typedef struct {
93         l_int           val[2];
94 } l_fsid_t;
95
96 typedef struct {
97         l_time_t        tv_sec;
98         l_suseconds_t   tv_usec;
99 } l_timeval;
100
101 #define l_fd_set        fd_set
102
103 /*
104  * Miscellaneous
105  */
106 #define LINUX_AT_COUNT          19      /* Count of used aux entry types. */
107
108 struct l___sysctl_args
109 {
110         l_uintptr_t     name;
111         l_int           nlen;
112         l_uintptr_t     oldval;
113         l_uintptr_t     oldlenp;
114         l_uintptr_t     newval;
115         l_size_t        newlen;
116         l_ulong         __spare[4];
117 };
118
119 /* Resource limits */
120 #define LINUX_RLIMIT_CPU        0
121 #define LINUX_RLIMIT_FSIZE      1
122 #define LINUX_RLIMIT_DATA       2
123 #define LINUX_RLIMIT_STACK      3
124 #define LINUX_RLIMIT_CORE       4
125 #define LINUX_RLIMIT_RSS        5
126 #define LINUX_RLIMIT_NPROC      6
127 #define LINUX_RLIMIT_NOFILE     7
128 #define LINUX_RLIMIT_MEMLOCK    8
129 #define LINUX_RLIMIT_AS         9       /* Address space limit */
130
131 #define LINUX_RLIM_NLIMITS      10
132
133 struct l_rlimit {
134         l_ulong         rlim_cur;
135         l_ulong         rlim_max;
136 };
137
138 /*
139  * stat family of syscalls
140  */
141 struct l_timespec {
142         l_time_t        tv_sec;
143         l_long          tv_nsec;
144 };
145
146 struct l_newstat {
147         l_dev_t         st_dev;
148         l_ino_t         st_ino;
149         l_ulong         st_nlink;
150         l_uint          st_mode;
151         l_uid_t         st_uid;
152         l_gid_t         st_gid;
153         l_uint          __st_pad1;
154         l_dev_t         st_rdev;
155         l_off_t         st_size;
156         l_long          st_blksize;
157         l_long          st_blocks;
158         struct l_timespec       st_atim;
159         struct l_timespec       st_mtim;
160         struct l_timespec       st_ctim;
161         l_long          __unused1;
162         l_long          __unused2;
163         l_long          __unused3;
164 };
165
166 /* sigaction flags */
167 #define LINUX_SA_NOCLDSTOP      0x00000001
168 #define LINUX_SA_NOCLDWAIT      0x00000002
169 #define LINUX_SA_SIGINFO        0x00000004
170 #define LINUX_SA_RESTORER       0x04000000
171 #define LINUX_SA_ONSTACK        0x08000000
172 #define LINUX_SA_RESTART        0x10000000
173 #define LINUX_SA_INTERRUPT      0x20000000
174 #define LINUX_SA_NOMASK         0x40000000
175 #define LINUX_SA_ONESHOT        0x80000000
176
177 /* sigprocmask actions */
178 #define LINUX_SIG_BLOCK         0
179 #define LINUX_SIG_UNBLOCK       1
180 #define LINUX_SIG_SETMASK       2
181
182 /* sigaltstack */
183 #define LINUX_MINSIGSTKSZ       2048
184
185 typedef void    (*l_handler_t)(l_int);
186
187 typedef struct {
188         l_handler_t     lsa_handler;
189         l_ulong         lsa_flags;
190         l_uintptr_t     lsa_restorer;
191         l_sigset_t      lsa_mask;
192 } l_sigaction_t;
193
194 typedef struct {
195         l_uintptr_t     ss_sp;
196         l_int           ss_flags;
197         l_size_t        ss_size;
198 } l_stack_t;
199
200 struct l_fpstate {
201         u_int16_t cwd;
202         u_int16_t swd;
203         u_int16_t twd;
204         u_int16_t fop;
205         u_int64_t rip;
206         u_int64_t rdp;
207         u_int32_t mxcsr;
208         u_int32_t mxcsr_mask;
209         u_int32_t st_space[32];
210         u_int32_t xmm_space[64];
211         u_int32_t reserved2[24];
212 };
213
214 struct l_sigcontext {
215         l_ulong         sc_r8;
216         l_ulong         sc_r9;
217         l_ulong         sc_r10;
218         l_ulong         sc_r11;
219         l_ulong         sc_r12;
220         l_ulong         sc_r13;
221         l_ulong         sc_r14;
222         l_ulong         sc_r15;
223         l_ulong         sc_rdi;
224         l_ulong         sc_rsi;
225         l_ulong         sc_rbp;
226         l_ulong         sc_rbx;
227         l_ulong         sc_rdx;
228         l_ulong         sc_rax;
229         l_ulong         sc_rcx;
230         l_ulong         sc_rsp;
231         l_ulong         sc_rip;
232         l_ulong         sc_rflags;
233         l_ushort        sc_cs;
234         l_ushort        sc_gs;
235         l_ushort        sc_fs;
236         l_ushort        sc___pad0;
237         l_ulong         sc_err;
238         l_ulong         sc_trapno;
239         l_sigset_t      sc_mask;
240         l_ulong         sc_cr2;
241         struct l_fpstate *sc_fpstate;
242         l_ulong         sc_reserved1[8];
243 };
244
245 struct l_ucontext {
246         l_ulong         uc_flags;
247         l_uintptr_t     uc_link;
248         l_stack_t       uc_stack;
249         struct l_sigcontext     uc_mcontext;
250         l_sigset_t      uc_sigmask;
251 };
252
253 #define LINUX_SI_PREAMBLE_SIZE  (4 * sizeof(int))
254 #define LINUX_SI_MAX_SIZE       128
255 #define LINUX_SI_PAD_SIZE       ((LINUX_SI_MAX_SIZE - \
256                                     LINUX_SI_PREAMBLE_SIZE) / sizeof(l_int))
257 typedef union l_sigval {
258         l_int           sival_int;
259         l_uintptr_t     sival_ptr;
260 } l_sigval_t;
261
262 typedef struct l_siginfo {
263         l_int           lsi_signo;
264         l_int           lsi_errno;
265         l_int           lsi_code;
266         union {
267                 l_int   _pad[LINUX_SI_PAD_SIZE];
268
269                 struct {
270                         l_pid_t         _pid;
271                         l_uid_t         _uid;
272                 } _kill;
273
274                 struct {
275                         l_timer_t       _tid;
276                         l_int           _overrun;
277                         char            _pad[sizeof(l_uid_t) - sizeof(int)];
278                         union l_sigval  _sigval;
279                         l_uint          _sys_private;
280                 } _timer;
281
282                 struct {
283                         l_pid_t         _pid;           /* sender's pid */
284                         l_uid_t         _uid;           /* sender's uid */
285                         union l_sigval  _sigval;
286                 } _rt;
287
288                 struct {
289                         l_pid_t         _pid;           /* which child */
290                         l_uid_t         _uid;           /* sender's uid */
291                         l_int           _status;        /* exit code */
292                         l_clock_t       _utime;
293                         l_clock_t       _stime;
294                 } _sigchld;
295
296                 struct {
297                         l_uintptr_t     _addr;  /* Faulting insn/memory ref. */
298                 } _sigfault;
299
300                 struct {
301                         l_long          _band;  /* POLL_IN,POLL_OUT,POLL_MSG */
302                         l_int           _fd;
303                 } _sigpoll;
304         } _sifields;
305 } l_siginfo_t;
306
307 #define lsi_pid         _sifields._kill._pid
308 #define lsi_uid         _sifields._kill._uid
309 #define lsi_tid         _sifields._timer._tid
310 #define lsi_overrun     _sifields._timer._overrun
311 #define lsi_sys_private _sifields._timer._sys_private
312 #define lsi_status      _sifields._sigchld._status
313 #define lsi_utime       _sifields._sigchld._utime
314 #define lsi_stime       _sifields._sigchld._stime
315 #define lsi_value       _sifields._rt._sigval
316 #define lsi_int         _sifields._rt._sigval.sival_int
317 #define lsi_ptr         _sifields._rt._sigval.sival_ptr
318 #define lsi_addr        _sifields._sigfault._addr
319 #define lsi_band        _sifields._sigpoll._band
320 #define lsi_fd          _sifields._sigpoll._fd
321
322 /*
323  * We make the stack look like Linux expects it when calling a signal
324  * handler, but use the BSD way of calling the handler and sigreturn().
325  * This means that we need to pass the pointer to the handler too.
326  * It is appended to the frame to not interfere with the rest of it.
327  */
328
329 struct l_rt_sigframe {
330         struct l_ucontext       sf_sc;
331         struct l_siginfo        sf_si;
332         l_handler_t             sf_handler;
333 };
334
335 /*
336  * mount flags
337  */
338 #define LINUX_MS_RDONLY         0x0001
339 #define LINUX_MS_NOSUID         0x0002
340 #define LINUX_MS_NODEV          0x0004
341 #define LINUX_MS_NOEXEC         0x0008
342 #define LINUX_MS_REMOUNT        0x0020
343
344 /*
345  * SystemV IPC defines
346  */
347 #define LINUX_IPC_RMID          0
348 #define LINUX_IPC_SET           1
349 #define LINUX_IPC_STAT          2
350 #define LINUX_IPC_INFO          3
351
352 #define LINUX_SHM_LOCK          11
353 #define LINUX_SHM_UNLOCK        12
354 #define LINUX_SHM_STAT          13
355 #define LINUX_SHM_INFO          14
356
357 #define LINUX_SHM_RDONLY        0x1000
358 #define LINUX_SHM_RND           0x2000
359 #define LINUX_SHM_REMAP         0x4000
360
361 /* semctl commands */
362 #define LINUX_GETPID            11
363 #define LINUX_GETVAL            12
364 #define LINUX_GETALL            13
365 #define LINUX_GETNCNT           14
366 #define LINUX_GETZCNT           15
367 #define LINUX_SETVAL            16
368 #define LINUX_SETALL            17
369 #define LINUX_SEM_STAT          18
370 #define LINUX_SEM_INFO          19
371
372 union l_semun {
373         l_int           val;
374         l_uintptr_t     buf;
375         l_uintptr_t     array;
376         l_uintptr_t     __buf;
377         l_uintptr_t     __pad;
378 };
379
380 struct l_ifmap {
381         l_ulong         mem_start;
382         l_ulong         mem_end;
383         l_ushort        base_addr;
384         u_char          irq;
385         u_char          dma;
386         u_char          port;
387 } __packed;
388
389 struct l_ifreq {
390         union {
391                 char    ifrn_name[LINUX_IFNAMSIZ];
392         } ifr_ifrn;
393
394         union {
395                 struct l_sockaddr       ifru_addr;
396                 struct l_sockaddr       ifru_dstaddr;
397                 struct l_sockaddr       ifru_broadaddr;
398                 struct l_sockaddr       ifru_netmask;
399                 struct l_sockaddr       ifru_hwaddr;
400                 l_short         ifru_flags[1];
401                 l_int           ifru_ivalue;
402                 l_int           ifru_mtu;
403                 struct l_ifmap  ifru_map;
404                 char            ifru_slave[LINUX_IFNAMSIZ];
405                 l_uintptr_t     ifru_data;
406         } ifr_ifru;
407 } __packed;
408
409 #define ifr_name        ifr_ifrn.ifrn_name      /* Interface name */
410 #define ifr_hwaddr      ifr_ifru.ifru_hwaddr    /* MAC address */
411 #define ifr_ifindex     ifr_ifru.ifru_ivalue    /* Interface index */
412
413 struct l_ifconf {
414         int     ifc_len;
415         union {
416                 l_uintptr_t     ifcu_buf;
417                 l_uintptr_t     ifcu_req;
418         } ifc_ifcu;
419 };
420
421 #define ifc_buf         ifc_ifcu.ifcu_buf
422 #define ifc_req         ifc_ifcu.ifcu_req
423
424 /*
425  * poll()
426  */
427 #define LINUX_POLLIN            0x0001
428 #define LINUX_POLLPRI           0x0002
429 #define LINUX_POLLOUT           0x0004
430 #define LINUX_POLLERR           0x0008
431 #define LINUX_POLLHUP           0x0010
432 #define LINUX_POLLNVAL          0x0020
433 #define LINUX_POLLRDNORM        0x0040
434 #define LINUX_POLLRDBAND        0x0080
435 #define LINUX_POLLWRNORM        0x0100
436 #define LINUX_POLLWRBAND        0x0200
437 #define LINUX_POLLMSG           0x0400
438
439 struct l_pollfd {
440         l_int           fd;
441         l_short         events;
442         l_short         revents;
443 };
444
445 #define LINUX_ARCH_SET_GS               0x1001
446 #define LINUX_ARCH_SET_FS               0x1002
447 #define LINUX_ARCH_GET_FS               0x1003
448 #define LINUX_ARCH_GET_GS               0x1004
449
450 #define linux_copyout_rusage(r, u)      copyout(r, u, sizeof(*r))
451
452 /* robust futexes */
453 struct linux_robust_list {
454         l_uintptr_t                     next;
455 };
456
457 struct linux_robust_list_head {
458         struct linux_robust_list        list;
459         l_long                          futex_offset;
460         l_uintptr_t                     pending_list;
461 };
462
463 #endif /* !_AMD64_LINUX_H_ */