1*b2f58791SDmitry Chagin /*- 2*b2f58791SDmitry Chagin * Copyright (c) 2013 Dmitry Chagin 3*b2f58791SDmitry Chagin * Copyright (c) 1994-1996 Søren Schmidt 4*b2f58791SDmitry Chagin * All rights reserved. 5*b2f58791SDmitry Chagin * 6*b2f58791SDmitry Chagin * Redistribution and use in source and binary forms, with or without 7*b2f58791SDmitry Chagin * modification, are permitted provided that the following conditions 8*b2f58791SDmitry Chagin * are met: 9*b2f58791SDmitry Chagin * 1. Redistributions of source code must retain the above copyright 10*b2f58791SDmitry Chagin * notice, this list of conditions and the following disclaimer 11*b2f58791SDmitry Chagin * in this position and unchanged. 12*b2f58791SDmitry Chagin * 2. Redistributions in binary form must reproduce the above copyright 13*b2f58791SDmitry Chagin * notice, this list of conditions and the following disclaimer in the 14*b2f58791SDmitry Chagin * documentation and/or other materials provided with the distribution. 15*b2f58791SDmitry Chagin * 3. The name of the author may not be used to endorse or promote products 16*b2f58791SDmitry Chagin * derived from this software without specific prior written permission 17*b2f58791SDmitry Chagin * 18*b2f58791SDmitry Chagin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19*b2f58791SDmitry Chagin * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20*b2f58791SDmitry Chagin * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21*b2f58791SDmitry Chagin * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22*b2f58791SDmitry Chagin * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 23*b2f58791SDmitry Chagin * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24*b2f58791SDmitry Chagin * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25*b2f58791SDmitry Chagin * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26*b2f58791SDmitry Chagin * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27*b2f58791SDmitry Chagin * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28*b2f58791SDmitry Chagin * 29*b2f58791SDmitry Chagin * $FreeBSD$ 30*b2f58791SDmitry Chagin */ 31*b2f58791SDmitry Chagin 32*b2f58791SDmitry Chagin #ifndef _AMD64_LINUX_H_ 33*b2f58791SDmitry Chagin #define _AMD64_LINUX_H_ 34*b2f58791SDmitry Chagin 35*b2f58791SDmitry Chagin #include <amd64/linux/linux_syscall.h> 36*b2f58791SDmitry Chagin 37*b2f58791SDmitry Chagin /* 38*b2f58791SDmitry Chagin * debugging support 39*b2f58791SDmitry Chagin */ 40*b2f58791SDmitry Chagin extern u_char linux_debug_map[]; 41*b2f58791SDmitry Chagin #define ldebug(name) isclr(linux_debug_map, LINUX_SYS_linux_ ## name) 42*b2f58791SDmitry Chagin #define ARGS(nm, fmt) "linux(%ld/%ld): "#nm"("fmt")\n", \ 43*b2f58791SDmitry Chagin (long)td->td_proc->p_pid, (long)td->td_tid 44*b2f58791SDmitry Chagin #define LMSG(fmt) "linux(%ld/%ld): "fmt"\n", \ 45*b2f58791SDmitry Chagin (long)td->td_proc->p_pid, (long)td->td_tid 46*b2f58791SDmitry Chagin #define LINUX_DTRACE linuxulator 47*b2f58791SDmitry Chagin 48*b2f58791SDmitry Chagin #define PTRIN(v) (void *)(v) 49*b2f58791SDmitry Chagin #define PTROUT(v) (uintptr_t)(v) 50*b2f58791SDmitry Chagin 51*b2f58791SDmitry Chagin #define CP(src,dst,fld) do { (dst).fld = (src).fld; } while (0) 52*b2f58791SDmitry Chagin #define CP2(src,dst,sfld,dfld) do { (dst).dfld = (src).sfld; } while (0) 53*b2f58791SDmitry Chagin #define PTRIN_CP(src,dst,fld) \ 54*b2f58791SDmitry Chagin do { (dst).fld = PTRIN((src).fld); } while (0) 55*b2f58791SDmitry Chagin 56*b2f58791SDmitry Chagin /* 57*b2f58791SDmitry Chagin * Provide a separate set of types for the Linux types. 58*b2f58791SDmitry Chagin */ 59*b2f58791SDmitry Chagin typedef int32_t l_int; 60*b2f58791SDmitry Chagin typedef int64_t l_long; 61*b2f58791SDmitry Chagin typedef int16_t l_short; 62*b2f58791SDmitry Chagin typedef uint32_t l_uint; 63*b2f58791SDmitry Chagin typedef uint64_t l_ulong; 64*b2f58791SDmitry Chagin typedef uint16_t l_ushort; 65*b2f58791SDmitry Chagin 66*b2f58791SDmitry Chagin typedef l_ulong l_uintptr_t; 67*b2f58791SDmitry Chagin typedef l_long l_clock_t; 68*b2f58791SDmitry Chagin typedef l_int l_daddr_t; 69*b2f58791SDmitry Chagin typedef l_ulong l_dev_t; 70*b2f58791SDmitry Chagin typedef l_uint l_gid_t; 71*b2f58791SDmitry Chagin typedef l_uint l_uid_t; 72*b2f58791SDmitry Chagin typedef l_ulong l_ino_t; 73*b2f58791SDmitry Chagin typedef l_int l_key_t; 74*b2f58791SDmitry Chagin typedef l_long l_loff_t; 75*b2f58791SDmitry Chagin typedef l_uint l_mode_t; 76*b2f58791SDmitry Chagin typedef l_long l_off_t; 77*b2f58791SDmitry Chagin typedef l_int l_pid_t; 78*b2f58791SDmitry Chagin typedef l_ulong l_size_t; 79*b2f58791SDmitry Chagin typedef l_long l_ssize_t; 80*b2f58791SDmitry Chagin typedef l_long l_suseconds_t; 81*b2f58791SDmitry Chagin typedef l_long l_time_t; 82*b2f58791SDmitry Chagin typedef l_int l_timer_t; 83*b2f58791SDmitry Chagin typedef l_int l_mqd_t; 84*b2f58791SDmitry Chagin typedef l_size_t l_socklen_t; 85*b2f58791SDmitry Chagin 86*b2f58791SDmitry Chagin typedef struct { 87*b2f58791SDmitry Chagin l_int val[2]; 88*b2f58791SDmitry Chagin } l_fsid_t; 89*b2f58791SDmitry Chagin 90*b2f58791SDmitry Chagin typedef struct { 91*b2f58791SDmitry Chagin l_time_t tv_sec; 92*b2f58791SDmitry Chagin l_suseconds_t tv_usec; 93*b2f58791SDmitry Chagin } l_timeval; 94*b2f58791SDmitry Chagin 95*b2f58791SDmitry Chagin #define l_fd_set fd_set 96*b2f58791SDmitry Chagin 97*b2f58791SDmitry Chagin /* 98*b2f58791SDmitry Chagin * Miscellaneous 99*b2f58791SDmitry Chagin */ 100*b2f58791SDmitry Chagin #define LINUX_NAME_MAX 255 101*b2f58791SDmitry Chagin #define LINUX_CTL_MAXNAME 10 102*b2f58791SDmitry Chagin 103*b2f58791SDmitry Chagin #define LINUX_AT_COUNT 17 /* Count of used aux entry types. */ 104*b2f58791SDmitry Chagin 105*b2f58791SDmitry Chagin struct l___sysctl_args 106*b2f58791SDmitry Chagin { 107*b2f58791SDmitry Chagin l_uintptr_t name; 108*b2f58791SDmitry Chagin l_int nlen; 109*b2f58791SDmitry Chagin l_uintptr_t oldval; 110*b2f58791SDmitry Chagin l_uintptr_t oldlenp; 111*b2f58791SDmitry Chagin l_uintptr_t newval; 112*b2f58791SDmitry Chagin l_size_t newlen; 113*b2f58791SDmitry Chagin l_ulong __spare[4]; 114*b2f58791SDmitry Chagin }; 115*b2f58791SDmitry Chagin 116*b2f58791SDmitry Chagin /* Scheduling policies */ 117*b2f58791SDmitry Chagin #define LINUX_SCHED_OTHER 0 118*b2f58791SDmitry Chagin #define LINUX_SCHED_FIFO 1 119*b2f58791SDmitry Chagin #define LINUX_SCHED_RR 2 120*b2f58791SDmitry Chagin 121*b2f58791SDmitry Chagin /* Resource limits */ 122*b2f58791SDmitry Chagin #define LINUX_RLIMIT_CPU 0 123*b2f58791SDmitry Chagin #define LINUX_RLIMIT_FSIZE 1 124*b2f58791SDmitry Chagin #define LINUX_RLIMIT_DATA 2 125*b2f58791SDmitry Chagin #define LINUX_RLIMIT_STACK 3 126*b2f58791SDmitry Chagin #define LINUX_RLIMIT_CORE 4 127*b2f58791SDmitry Chagin #define LINUX_RLIMIT_RSS 5 128*b2f58791SDmitry Chagin #define LINUX_RLIMIT_NPROC 6 129*b2f58791SDmitry Chagin #define LINUX_RLIMIT_NOFILE 7 130*b2f58791SDmitry Chagin #define LINUX_RLIMIT_MEMLOCK 8 131*b2f58791SDmitry Chagin #define LINUX_RLIMIT_AS 9 /* Address space limit */ 132*b2f58791SDmitry Chagin 133*b2f58791SDmitry Chagin #define LINUX_RLIM_NLIMITS 10 134*b2f58791SDmitry Chagin 135*b2f58791SDmitry Chagin struct l_rlimit { 136*b2f58791SDmitry Chagin l_ulong rlim_cur; 137*b2f58791SDmitry Chagin l_ulong rlim_max; 138*b2f58791SDmitry Chagin }; 139*b2f58791SDmitry Chagin 140*b2f58791SDmitry Chagin /* mmap options */ 141*b2f58791SDmitry Chagin #define LINUX_MAP_SHARED 0x0001 142*b2f58791SDmitry Chagin #define LINUX_MAP_PRIVATE 0x0002 143*b2f58791SDmitry Chagin #define LINUX_MAP_FIXED 0x0010 144*b2f58791SDmitry Chagin #define LINUX_MAP_ANON 0x0020 145*b2f58791SDmitry Chagin #define LINUX_MAP_GROWSDOWN 0x0100 146*b2f58791SDmitry Chagin 147*b2f58791SDmitry Chagin /* 148*b2f58791SDmitry Chagin * stat family of syscalls 149*b2f58791SDmitry Chagin */ 150*b2f58791SDmitry Chagin struct l_timespec { 151*b2f58791SDmitry Chagin l_time_t tv_sec; 152*b2f58791SDmitry Chagin l_long tv_nsec; 153*b2f58791SDmitry Chagin }; 154*b2f58791SDmitry Chagin 155*b2f58791SDmitry Chagin struct l_newstat { 156*b2f58791SDmitry Chagin l_dev_t st_dev; 157*b2f58791SDmitry Chagin l_ino_t st_ino; 158*b2f58791SDmitry Chagin l_ulong st_nlink; 159*b2f58791SDmitry Chagin l_uint st_mode; 160*b2f58791SDmitry Chagin l_uid_t st_uid; 161*b2f58791SDmitry Chagin l_gid_t st_gid; 162*b2f58791SDmitry Chagin l_uint __st_pad1; 163*b2f58791SDmitry Chagin l_dev_t st_rdev; 164*b2f58791SDmitry Chagin l_off_t st_size; 165*b2f58791SDmitry Chagin l_long st_blksize; 166*b2f58791SDmitry Chagin l_long st_blocks; 167*b2f58791SDmitry Chagin struct l_timespec st_atim; 168*b2f58791SDmitry Chagin struct l_timespec st_mtim; 169*b2f58791SDmitry Chagin struct l_timespec st_ctim; 170*b2f58791SDmitry Chagin l_long __unused1; 171*b2f58791SDmitry Chagin l_long __unused2; 172*b2f58791SDmitry Chagin l_long __unused3; 173*b2f58791SDmitry Chagin }; 174*b2f58791SDmitry Chagin 175*b2f58791SDmitry Chagin /* 176*b2f58791SDmitry Chagin * Signalling 177*b2f58791SDmitry Chagin */ 178*b2f58791SDmitry Chagin #define LINUX_SIGHUP 1 179*b2f58791SDmitry Chagin #define LINUX_SIGINT 2 180*b2f58791SDmitry Chagin #define LINUX_SIGQUIT 3 181*b2f58791SDmitry Chagin #define LINUX_SIGILL 4 182*b2f58791SDmitry Chagin #define LINUX_SIGTRAP 5 183*b2f58791SDmitry Chagin #define LINUX_SIGABRT 6 184*b2f58791SDmitry Chagin #define LINUX_SIGIOT LINUX_SIGABRT 185*b2f58791SDmitry Chagin #define LINUX_SIGBUS 7 186*b2f58791SDmitry Chagin #define LINUX_SIGFPE 8 187*b2f58791SDmitry Chagin #define LINUX_SIGKILL 9 188*b2f58791SDmitry Chagin #define LINUX_SIGUSR1 10 189*b2f58791SDmitry Chagin #define LINUX_SIGSEGV 11 190*b2f58791SDmitry Chagin #define LINUX_SIGUSR2 12 191*b2f58791SDmitry Chagin #define LINUX_SIGPIPE 13 192*b2f58791SDmitry Chagin #define LINUX_SIGALRM 14 193*b2f58791SDmitry Chagin #define LINUX_SIGTERM 15 194*b2f58791SDmitry Chagin #define LINUX_SIGSTKFLT 16 195*b2f58791SDmitry Chagin #define LINUX_SIGCHLD 17 196*b2f58791SDmitry Chagin #define LINUX_SIGCONT 18 197*b2f58791SDmitry Chagin #define LINUX_SIGSTOP 19 198*b2f58791SDmitry Chagin #define LINUX_SIGTSTP 20 199*b2f58791SDmitry Chagin #define LINUX_SIGTTIN 21 200*b2f58791SDmitry Chagin #define LINUX_SIGTTOU 22 201*b2f58791SDmitry Chagin #define LINUX_SIGURG 23 202*b2f58791SDmitry Chagin #define LINUX_SIGXCPU 24 203*b2f58791SDmitry Chagin #define LINUX_SIGXFSZ 25 204*b2f58791SDmitry Chagin #define LINUX_SIGVTALRM 26 205*b2f58791SDmitry Chagin #define LINUX_SIGPROF 27 206*b2f58791SDmitry Chagin #define LINUX_SIGWINCH 28 207*b2f58791SDmitry Chagin #define LINUX_SIGIO 29 208*b2f58791SDmitry Chagin #define LINUX_SIGPOLL LINUX_SIGIO 209*b2f58791SDmitry Chagin #define LINUX_SIGPWR 30 210*b2f58791SDmitry Chagin #define LINUX_SIGSYS 31 211*b2f58791SDmitry Chagin #define LINUX_SIGRTMIN 32 212*b2f58791SDmitry Chagin 213*b2f58791SDmitry Chagin #define LINUX_SIGTBLSZ 31 214*b2f58791SDmitry Chagin #define LINUX_NSIG 64 215*b2f58791SDmitry Chagin #define LINUX_NBPW 64 216*b2f58791SDmitry Chagin #define LINUX_NSIG_WORDS (LINUX_NSIG / LINUX_NBPW) 217*b2f58791SDmitry Chagin 218*b2f58791SDmitry Chagin /* sigaction flags */ 219*b2f58791SDmitry Chagin #define LINUX_SA_NOCLDSTOP 0x00000001 220*b2f58791SDmitry Chagin #define LINUX_SA_NOCLDWAIT 0x00000002 221*b2f58791SDmitry Chagin #define LINUX_SA_SIGINFO 0x00000004 222*b2f58791SDmitry Chagin #define LINUX_SA_RESTORER 0x04000000 223*b2f58791SDmitry Chagin #define LINUX_SA_ONSTACK 0x08000000 224*b2f58791SDmitry Chagin #define LINUX_SA_RESTART 0x10000000 225*b2f58791SDmitry Chagin #define LINUX_SA_INTERRUPT 0x20000000 226*b2f58791SDmitry Chagin #define LINUX_SA_NOMASK 0x40000000 227*b2f58791SDmitry Chagin #define LINUX_SA_ONESHOT 0x80000000 228*b2f58791SDmitry Chagin 229*b2f58791SDmitry Chagin /* sigprocmask actions */ 230*b2f58791SDmitry Chagin #define LINUX_SIG_BLOCK 0 231*b2f58791SDmitry Chagin #define LINUX_SIG_UNBLOCK 1 232*b2f58791SDmitry Chagin #define LINUX_SIG_SETMASK 2 233*b2f58791SDmitry Chagin 234*b2f58791SDmitry Chagin /* primitives to manipulate sigset_t */ 235*b2f58791SDmitry Chagin 236*b2f58791SDmitry Chagin #define LINUX_SIGEMPTYSET(set) \ 237*b2f58791SDmitry Chagin do { \ 238*b2f58791SDmitry Chagin (set).__bits[0] = 0; \ 239*b2f58791SDmitry Chagin } while(0) 240*b2f58791SDmitry Chagin 241*b2f58791SDmitry Chagin #define LINUX_SIGISMEMBER(set, sig) \ 242*b2f58791SDmitry Chagin (1UL & ((set).__bits[0] >> _SIG_IDX(sig))) 243*b2f58791SDmitry Chagin 244*b2f58791SDmitry Chagin #define LINUX_SIGADDSET(set, sig) \ 245*b2f58791SDmitry Chagin (set).__bits[0] |= 1UL << _SIG_IDX(sig) 246*b2f58791SDmitry Chagin 247*b2f58791SDmitry Chagin /* sigaltstack */ 248*b2f58791SDmitry Chagin #define LINUX_MINSIGSTKSZ 2048 249*b2f58791SDmitry Chagin #define LINUX_SS_ONSTACK 1 250*b2f58791SDmitry Chagin #define LINUX_SS_DISABLE 2 251*b2f58791SDmitry Chagin 252*b2f58791SDmitry Chagin int linux_to_bsd_sigaltstack(int lsa); 253*b2f58791SDmitry Chagin int bsd_to_linux_sigaltstack(int bsa); 254*b2f58791SDmitry Chagin 255*b2f58791SDmitry Chagin typedef void (*l_handler_t)(l_int); 256*b2f58791SDmitry Chagin 257*b2f58791SDmitry Chagin typedef struct { 258*b2f58791SDmitry Chagin l_ulong __bits[LINUX_NSIG_WORDS]; 259*b2f58791SDmitry Chagin } l_sigset_t; 260*b2f58791SDmitry Chagin 261*b2f58791SDmitry Chagin typedef struct { 262*b2f58791SDmitry Chagin l_handler_t lsa_handler; 263*b2f58791SDmitry Chagin l_ulong lsa_flags; 264*b2f58791SDmitry Chagin l_uintptr_t lsa_restorer; 265*b2f58791SDmitry Chagin l_sigset_t lsa_mask; 266*b2f58791SDmitry Chagin } l_sigaction_t; 267*b2f58791SDmitry Chagin 268*b2f58791SDmitry Chagin typedef struct { 269*b2f58791SDmitry Chagin l_uintptr_t ss_sp; 270*b2f58791SDmitry Chagin l_int ss_flags; 271*b2f58791SDmitry Chagin l_size_t ss_size; 272*b2f58791SDmitry Chagin } l_stack_t; 273*b2f58791SDmitry Chagin 274*b2f58791SDmitry Chagin struct l_fpstate { 275*b2f58791SDmitry Chagin u_int16_t cwd; 276*b2f58791SDmitry Chagin u_int16_t swd; 277*b2f58791SDmitry Chagin u_int16_t twd; 278*b2f58791SDmitry Chagin u_int16_t fop; 279*b2f58791SDmitry Chagin u_int64_t rip; 280*b2f58791SDmitry Chagin u_int64_t rdp; 281*b2f58791SDmitry Chagin u_int32_t mxcsr; 282*b2f58791SDmitry Chagin u_int32_t mxcsr_mask; 283*b2f58791SDmitry Chagin u_int32_t st_space[32]; 284*b2f58791SDmitry Chagin u_int32_t xmm_space[64]; 285*b2f58791SDmitry Chagin u_int32_t reserved2[24]; 286*b2f58791SDmitry Chagin }; 287*b2f58791SDmitry Chagin 288*b2f58791SDmitry Chagin struct l_sigcontext { 289*b2f58791SDmitry Chagin l_ulong sc_r8; 290*b2f58791SDmitry Chagin l_ulong sc_r9; 291*b2f58791SDmitry Chagin l_ulong sc_r10; 292*b2f58791SDmitry Chagin l_ulong sc_r11; 293*b2f58791SDmitry Chagin l_ulong sc_r12; 294*b2f58791SDmitry Chagin l_ulong sc_r13; 295*b2f58791SDmitry Chagin l_ulong sc_r14; 296*b2f58791SDmitry Chagin l_ulong sc_r15; 297*b2f58791SDmitry Chagin l_ulong sc_rdi; 298*b2f58791SDmitry Chagin l_ulong sc_rsi; 299*b2f58791SDmitry Chagin l_ulong sc_rbp; 300*b2f58791SDmitry Chagin l_ulong sc_rbx; 301*b2f58791SDmitry Chagin l_ulong sc_rdx; 302*b2f58791SDmitry Chagin l_ulong sc_rax; 303*b2f58791SDmitry Chagin l_ulong sc_rcx; 304*b2f58791SDmitry Chagin l_ulong sc_rsp; 305*b2f58791SDmitry Chagin l_ulong sc_rip; 306*b2f58791SDmitry Chagin l_ulong sc_rflags; 307*b2f58791SDmitry Chagin l_ushort sc_cs; 308*b2f58791SDmitry Chagin l_ushort sc_gs; 309*b2f58791SDmitry Chagin l_ushort sc_fs; 310*b2f58791SDmitry Chagin l_ushort sc___pad0; 311*b2f58791SDmitry Chagin l_ulong sc_err; 312*b2f58791SDmitry Chagin l_ulong sc_trapno; 313*b2f58791SDmitry Chagin l_sigset_t sc_mask; 314*b2f58791SDmitry Chagin l_ulong sc_cr2; 315*b2f58791SDmitry Chagin struct l_fpstate *sc_fpstate; 316*b2f58791SDmitry Chagin l_ulong sc_reserved1[8]; 317*b2f58791SDmitry Chagin }; 318*b2f58791SDmitry Chagin 319*b2f58791SDmitry Chagin struct l_ucontext { 320*b2f58791SDmitry Chagin l_ulong uc_flags; 321*b2f58791SDmitry Chagin l_uintptr_t uc_link; 322*b2f58791SDmitry Chagin l_stack_t uc_stack; 323*b2f58791SDmitry Chagin struct l_sigcontext uc_mcontext; 324*b2f58791SDmitry Chagin l_sigset_t uc_sigmask; 325*b2f58791SDmitry Chagin }; 326*b2f58791SDmitry Chagin 327*b2f58791SDmitry Chagin #define LINUX_SI_PREAMBLE_SIZE (4 * sizeof(int)) 328*b2f58791SDmitry Chagin #define LINUX_SI_MAX_SIZE 128 329*b2f58791SDmitry Chagin #define LINUX_SI_PAD_SIZE ((LINUX_SI_MAX_SIZE - \ 330*b2f58791SDmitry Chagin LINUX_SI_PREAMBLE_SIZE) / sizeof(l_int)) 331*b2f58791SDmitry Chagin typedef union l_sigval { 332*b2f58791SDmitry Chagin l_int sival_int; 333*b2f58791SDmitry Chagin l_uintptr_t sival_ptr; 334*b2f58791SDmitry Chagin } l_sigval_t; 335*b2f58791SDmitry Chagin 336*b2f58791SDmitry Chagin typedef struct l_siginfo { 337*b2f58791SDmitry Chagin l_int lsi_signo; 338*b2f58791SDmitry Chagin l_int lsi_errno; 339*b2f58791SDmitry Chagin l_int lsi_code; 340*b2f58791SDmitry Chagin union { 341*b2f58791SDmitry Chagin l_int _pad[LINUX_SI_PAD_SIZE]; 342*b2f58791SDmitry Chagin 343*b2f58791SDmitry Chagin struct { 344*b2f58791SDmitry Chagin l_pid_t _pid; 345*b2f58791SDmitry Chagin l_uid_t _uid; 346*b2f58791SDmitry Chagin } _kill; 347*b2f58791SDmitry Chagin 348*b2f58791SDmitry Chagin struct { 349*b2f58791SDmitry Chagin l_timer_t _tid; 350*b2f58791SDmitry Chagin l_int _overrun; 351*b2f58791SDmitry Chagin char _pad[sizeof(l_uid_t) - sizeof(int)]; 352*b2f58791SDmitry Chagin union l_sigval _sigval; 353*b2f58791SDmitry Chagin l_uint _sys_private; 354*b2f58791SDmitry Chagin } _timer; 355*b2f58791SDmitry Chagin 356*b2f58791SDmitry Chagin struct { 357*b2f58791SDmitry Chagin l_pid_t _pid; /* sender's pid */ 358*b2f58791SDmitry Chagin l_uid_t _uid; /* sender's uid */ 359*b2f58791SDmitry Chagin union l_sigval _sigval; 360*b2f58791SDmitry Chagin } _rt; 361*b2f58791SDmitry Chagin 362*b2f58791SDmitry Chagin struct { 363*b2f58791SDmitry Chagin l_pid_t _pid; /* which child */ 364*b2f58791SDmitry Chagin l_uid_t _uid; /* sender's uid */ 365*b2f58791SDmitry Chagin l_int _status; /* exit code */ 366*b2f58791SDmitry Chagin l_clock_t _utime; 367*b2f58791SDmitry Chagin l_clock_t _stime; 368*b2f58791SDmitry Chagin } _sigchld; 369*b2f58791SDmitry Chagin 370*b2f58791SDmitry Chagin struct { 371*b2f58791SDmitry Chagin l_uintptr_t _addr; /* Faulting insn/memory ref. */ 372*b2f58791SDmitry Chagin } _sigfault; 373*b2f58791SDmitry Chagin 374*b2f58791SDmitry Chagin struct { 375*b2f58791SDmitry Chagin l_long _band; /* POLL_IN,POLL_OUT,POLL_MSG */ 376*b2f58791SDmitry Chagin l_int _fd; 377*b2f58791SDmitry Chagin } _sigpoll; 378*b2f58791SDmitry Chagin } _sifields; 379*b2f58791SDmitry Chagin } l_siginfo_t; 380*b2f58791SDmitry Chagin 381*b2f58791SDmitry Chagin #define lsi_pid _sifields._kill._pid 382*b2f58791SDmitry Chagin #define lsi_uid _sifields._kill._uid 383*b2f58791SDmitry Chagin #define lsi_tid _sifields._timer._tid 384*b2f58791SDmitry Chagin #define lsi_overrun _sifields._timer._overrun 385*b2f58791SDmitry Chagin #define lsi_sys_private _sifields._timer._sys_private 386*b2f58791SDmitry Chagin #define lsi_status _sifields._sigchld._status 387*b2f58791SDmitry Chagin #define lsi_utime _sifields._sigchld._utime 388*b2f58791SDmitry Chagin #define lsi_stime _sifields._sigchld._stime 389*b2f58791SDmitry Chagin #define lsi_value _sifields._rt._sigval 390*b2f58791SDmitry Chagin #define lsi_int _sifields._rt._sigval.sival_int 391*b2f58791SDmitry Chagin #define lsi_ptr _sifields._rt._sigval.sival_ptr 392*b2f58791SDmitry Chagin #define lsi_addr _sifields._sigfault._addr 393*b2f58791SDmitry Chagin #define lsi_band _sifields._sigpoll._band 394*b2f58791SDmitry Chagin #define lsi_fd _sifields._sigpoll._fd 395*b2f58791SDmitry Chagin 396*b2f58791SDmitry Chagin /* 397*b2f58791SDmitry Chagin * We make the stack look like Linux expects it when calling a signal 398*b2f58791SDmitry Chagin * handler, but use the BSD way of calling the handler and sigreturn(). 399*b2f58791SDmitry Chagin * This means that we need to pass the pointer to the handler too. 400*b2f58791SDmitry Chagin * It is appended to the frame to not interfere with the rest of it. 401*b2f58791SDmitry Chagin */ 402*b2f58791SDmitry Chagin 403*b2f58791SDmitry Chagin struct l_rt_sigframe { 404*b2f58791SDmitry Chagin struct l_ucontext sf_sc; 405*b2f58791SDmitry Chagin struct l_siginfo sf_si; 406*b2f58791SDmitry Chagin l_handler_t sf_handler; 407*b2f58791SDmitry Chagin }; 408*b2f58791SDmitry Chagin 409*b2f58791SDmitry Chagin /* 410*b2f58791SDmitry Chagin * open/fcntl flags 411*b2f58791SDmitry Chagin */ 412*b2f58791SDmitry Chagin #define LINUX_O_RDONLY 00000000 413*b2f58791SDmitry Chagin #define LINUX_O_WRONLY 00000001 414*b2f58791SDmitry Chagin #define LINUX_O_RDWR 00000002 415*b2f58791SDmitry Chagin #define LINUX_O_ACCMODE 00000003 416*b2f58791SDmitry Chagin #define LINUX_O_CREAT 00000100 417*b2f58791SDmitry Chagin #define LINUX_O_EXCL 00000200 418*b2f58791SDmitry Chagin #define LINUX_O_NOCTTY 00000400 419*b2f58791SDmitry Chagin #define LINUX_O_TRUNC 00001000 420*b2f58791SDmitry Chagin #define LINUX_O_APPEND 00002000 421*b2f58791SDmitry Chagin #define LINUX_O_NONBLOCK 00004000 422*b2f58791SDmitry Chagin #define LINUX_O_NDELAY LINUX_O_NONBLOCK 423*b2f58791SDmitry Chagin #define LINUX_O_SYNC 00010000 424*b2f58791SDmitry Chagin #define LINUX_FASYNC 00020000 425*b2f58791SDmitry Chagin #define LINUX_O_DIRECT 00040000 /* Direct disk access hint */ 426*b2f58791SDmitry Chagin #define LINUX_O_LARGEFILE 00100000 427*b2f58791SDmitry Chagin #define LINUX_O_DIRECTORY 00200000 /* Must be a directory */ 428*b2f58791SDmitry Chagin #define LINUX_O_NOFOLLOW 00400000 /* Do not follow links */ 429*b2f58791SDmitry Chagin #define LINUX_O_NOATIME 01000000 430*b2f58791SDmitry Chagin #define LINUX_O_CLOEXEC 02000000 431*b2f58791SDmitry Chagin 432*b2f58791SDmitry Chagin #define LINUX_F_DUPFD 0 433*b2f58791SDmitry Chagin #define LINUX_F_GETFD 1 434*b2f58791SDmitry Chagin #define LINUX_F_SETFD 2 435*b2f58791SDmitry Chagin #define LINUX_F_GETFL 3 436*b2f58791SDmitry Chagin #define LINUX_F_SETFL 4 437*b2f58791SDmitry Chagin #define LINUX_F_GETLK 5 438*b2f58791SDmitry Chagin #define LINUX_F_SETLK 6 439*b2f58791SDmitry Chagin #define LINUX_F_SETLKW 7 440*b2f58791SDmitry Chagin #define LINUX_F_SETOWN 8 441*b2f58791SDmitry Chagin #define LINUX_F_GETOWN 9 442*b2f58791SDmitry Chagin 443*b2f58791SDmitry Chagin #define LINUX_F_RDLCK 0 444*b2f58791SDmitry Chagin #define LINUX_F_WRLCK 1 445*b2f58791SDmitry Chagin #define LINUX_F_UNLCK 2 446*b2f58791SDmitry Chagin 447*b2f58791SDmitry Chagin /* 448*b2f58791SDmitry Chagin * mount flags 449*b2f58791SDmitry Chagin */ 450*b2f58791SDmitry Chagin #define LINUX_MS_RDONLY 0x0001 451*b2f58791SDmitry Chagin #define LINUX_MS_NOSUID 0x0002 452*b2f58791SDmitry Chagin #define LINUX_MS_NODEV 0x0004 453*b2f58791SDmitry Chagin #define LINUX_MS_NOEXEC 0x0008 454*b2f58791SDmitry Chagin #define LINUX_MS_REMOUNT 0x0020 455*b2f58791SDmitry Chagin 456*b2f58791SDmitry Chagin /* 457*b2f58791SDmitry Chagin * SystemV IPC defines 458*b2f58791SDmitry Chagin */ 459*b2f58791SDmitry Chagin #define LINUX_IPC_RMID 0 460*b2f58791SDmitry Chagin #define LINUX_IPC_SET 1 461*b2f58791SDmitry Chagin #define LINUX_IPC_STAT 2 462*b2f58791SDmitry Chagin #define LINUX_IPC_INFO 3 463*b2f58791SDmitry Chagin 464*b2f58791SDmitry Chagin #define LINUX_SHM_LOCK 11 465*b2f58791SDmitry Chagin #define LINUX_SHM_UNLOCK 12 466*b2f58791SDmitry Chagin #define LINUX_SHM_STAT 13 467*b2f58791SDmitry Chagin #define LINUX_SHM_INFO 14 468*b2f58791SDmitry Chagin 469*b2f58791SDmitry Chagin #define LINUX_SHM_RDONLY 0x1000 470*b2f58791SDmitry Chagin #define LINUX_SHM_RND 0x2000 471*b2f58791SDmitry Chagin #define LINUX_SHM_REMAP 0x4000 472*b2f58791SDmitry Chagin 473*b2f58791SDmitry Chagin /* semctl commands */ 474*b2f58791SDmitry Chagin #define LINUX_GETPID 11 475*b2f58791SDmitry Chagin #define LINUX_GETVAL 12 476*b2f58791SDmitry Chagin #define LINUX_GETALL 13 477*b2f58791SDmitry Chagin #define LINUX_GETNCNT 14 478*b2f58791SDmitry Chagin #define LINUX_GETZCNT 15 479*b2f58791SDmitry Chagin #define LINUX_SETVAL 16 480*b2f58791SDmitry Chagin #define LINUX_SETALL 17 481*b2f58791SDmitry Chagin #define LINUX_SEM_STAT 18 482*b2f58791SDmitry Chagin #define LINUX_SEM_INFO 19 483*b2f58791SDmitry Chagin 484*b2f58791SDmitry Chagin union l_semun { 485*b2f58791SDmitry Chagin l_int val; 486*b2f58791SDmitry Chagin l_uintptr_t buf; 487*b2f58791SDmitry Chagin l_uintptr_t array; 488*b2f58791SDmitry Chagin l_uintptr_t __buf; 489*b2f58791SDmitry Chagin l_uintptr_t __pad; 490*b2f58791SDmitry Chagin }; 491*b2f58791SDmitry Chagin 492*b2f58791SDmitry Chagin struct l_ipc_perm { 493*b2f58791SDmitry Chagin l_key_t key; 494*b2f58791SDmitry Chagin l_uid_t uid; 495*b2f58791SDmitry Chagin l_gid_t gid; 496*b2f58791SDmitry Chagin l_uid_t cuid; 497*b2f58791SDmitry Chagin l_gid_t cgid; 498*b2f58791SDmitry Chagin l_ushort mode; 499*b2f58791SDmitry Chagin l_ushort seq; 500*b2f58791SDmitry Chagin }; 501*b2f58791SDmitry Chagin 502*b2f58791SDmitry Chagin /* 503*b2f58791SDmitry Chagin * Socket defines 504*b2f58791SDmitry Chagin */ 505*b2f58791SDmitry Chagin 506*b2f58791SDmitry Chagin #define LINUX_SOL_SOCKET 1 507*b2f58791SDmitry Chagin #define LINUX_SOL_IP 0 508*b2f58791SDmitry Chagin #define LINUX_SOL_IPX 256 509*b2f58791SDmitry Chagin #define LINUX_SOL_AX25 257 510*b2f58791SDmitry Chagin #define LINUX_SOL_TCP 6 511*b2f58791SDmitry Chagin #define LINUX_SOL_UDP 17 512*b2f58791SDmitry Chagin 513*b2f58791SDmitry Chagin #define LINUX_SO_DEBUG 1 514*b2f58791SDmitry Chagin #define LINUX_SO_REUSEADDR 2 515*b2f58791SDmitry Chagin #define LINUX_SO_TYPE 3 516*b2f58791SDmitry Chagin #define LINUX_SO_ERROR 4 517*b2f58791SDmitry Chagin #define LINUX_SO_DONTROUTE 5 518*b2f58791SDmitry Chagin #define LINUX_SO_BROADCAST 6 519*b2f58791SDmitry Chagin #define LINUX_SO_SNDBUF 7 520*b2f58791SDmitry Chagin #define LINUX_SO_RCVBUF 8 521*b2f58791SDmitry Chagin #define LINUX_SO_KEEPALIVE 9 522*b2f58791SDmitry Chagin #define LINUX_SO_OOBINLINE 10 523*b2f58791SDmitry Chagin #define LINUX_SO_NO_CHECK 11 524*b2f58791SDmitry Chagin #define LINUX_SO_PRIORITY 12 525*b2f58791SDmitry Chagin #define LINUX_SO_LINGER 13 526*b2f58791SDmitry Chagin #define LINUX_SO_PASSCRED 16 527*b2f58791SDmitry Chagin #define LINUX_SO_PEERCRED 17 528*b2f58791SDmitry Chagin #define LINUX_SO_RCVLOWAT 18 529*b2f58791SDmitry Chagin #define LINUX_SO_SNDLOWAT 19 530*b2f58791SDmitry Chagin #define LINUX_SO_RCVTIMEO 20 531*b2f58791SDmitry Chagin #define LINUX_SO_SNDTIMEO 21 532*b2f58791SDmitry Chagin #define LINUX_SO_TIMESTAMP 29 533*b2f58791SDmitry Chagin #define LINUX_SO_ACCEPTCONN 30 534*b2f58791SDmitry Chagin 535*b2f58791SDmitry Chagin #define LINUX_IP_TOS 1 536*b2f58791SDmitry Chagin #define LINUX_IP_TTL 2 537*b2f58791SDmitry Chagin #define LINUX_IP_HDRINCL 3 538*b2f58791SDmitry Chagin #define LINUX_IP_OPTIONS 4 539*b2f58791SDmitry Chagin 540*b2f58791SDmitry Chagin #define LINUX_IP_MULTICAST_IF 32 541*b2f58791SDmitry Chagin #define LINUX_IP_MULTICAST_TTL 33 542*b2f58791SDmitry Chagin #define LINUX_IP_MULTICAST_LOOP 34 543*b2f58791SDmitry Chagin #define LINUX_IP_ADD_MEMBERSHIP 35 544*b2f58791SDmitry Chagin #define LINUX_IP_DROP_MEMBERSHIP 36 545*b2f58791SDmitry Chagin 546*b2f58791SDmitry Chagin struct l_sockaddr { 547*b2f58791SDmitry Chagin l_ushort sa_family; 548*b2f58791SDmitry Chagin char sa_data[14]; 549*b2f58791SDmitry Chagin }; 550*b2f58791SDmitry Chagin 551*b2f58791SDmitry Chagin struct l_msghdr { 552*b2f58791SDmitry Chagin l_uintptr_t msg_name; 553*b2f58791SDmitry Chagin l_int msg_namelen; 554*b2f58791SDmitry Chagin l_uintptr_t msg_iov; 555*b2f58791SDmitry Chagin l_size_t msg_iovlen; 556*b2f58791SDmitry Chagin l_uintptr_t msg_control; 557*b2f58791SDmitry Chagin l_size_t msg_controllen; 558*b2f58791SDmitry Chagin l_uint msg_flags; 559*b2f58791SDmitry Chagin }; 560*b2f58791SDmitry Chagin 561*b2f58791SDmitry Chagin struct l_cmsghdr { 562*b2f58791SDmitry Chagin l_size_t cmsg_len; 563*b2f58791SDmitry Chagin l_int cmsg_level; 564*b2f58791SDmitry Chagin l_int cmsg_type; 565*b2f58791SDmitry Chagin }; 566*b2f58791SDmitry Chagin 567*b2f58791SDmitry Chagin struct l_ifmap { 568*b2f58791SDmitry Chagin l_ulong mem_start; 569*b2f58791SDmitry Chagin l_ulong mem_end; 570*b2f58791SDmitry Chagin l_ushort base_addr; 571*b2f58791SDmitry Chagin u_char irq; 572*b2f58791SDmitry Chagin u_char dma; 573*b2f58791SDmitry Chagin u_char port; 574*b2f58791SDmitry Chagin } __packed; 575*b2f58791SDmitry Chagin 576*b2f58791SDmitry Chagin #define LINUX_IFHWADDRLEN 6 577*b2f58791SDmitry Chagin #define LINUX_IFNAMSIZ 16 578*b2f58791SDmitry Chagin 579*b2f58791SDmitry Chagin struct l_ifreq { 580*b2f58791SDmitry Chagin union { 581*b2f58791SDmitry Chagin char ifrn_name[LINUX_IFNAMSIZ]; 582*b2f58791SDmitry Chagin } ifr_ifrn; 583*b2f58791SDmitry Chagin 584*b2f58791SDmitry Chagin union { 585*b2f58791SDmitry Chagin struct l_sockaddr ifru_addr; 586*b2f58791SDmitry Chagin struct l_sockaddr ifru_dstaddr; 587*b2f58791SDmitry Chagin struct l_sockaddr ifru_broadaddr; 588*b2f58791SDmitry Chagin struct l_sockaddr ifru_netmask; 589*b2f58791SDmitry Chagin struct l_sockaddr ifru_hwaddr; 590*b2f58791SDmitry Chagin l_short ifru_flags[1]; 591*b2f58791SDmitry Chagin l_int ifru_metric; 592*b2f58791SDmitry Chagin l_int ifru_mtu; 593*b2f58791SDmitry Chagin struct l_ifmap ifru_map; 594*b2f58791SDmitry Chagin char ifru_slave[LINUX_IFNAMSIZ]; 595*b2f58791SDmitry Chagin l_uintptr_t ifru_data; 596*b2f58791SDmitry Chagin } ifr_ifru; 597*b2f58791SDmitry Chagin } __packed; 598*b2f58791SDmitry Chagin 599*b2f58791SDmitry Chagin #define ifr_name ifr_ifrn.ifrn_name /* Interface name */ 600*b2f58791SDmitry Chagin #define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */ 601*b2f58791SDmitry Chagin 602*b2f58791SDmitry Chagin struct l_ifconf { 603*b2f58791SDmitry Chagin int ifc_len; 604*b2f58791SDmitry Chagin union { 605*b2f58791SDmitry Chagin l_uintptr_t ifcu_buf; 606*b2f58791SDmitry Chagin l_uintptr_t ifcu_req; 607*b2f58791SDmitry Chagin } ifc_ifcu; 608*b2f58791SDmitry Chagin }; 609*b2f58791SDmitry Chagin 610*b2f58791SDmitry Chagin #define ifc_buf ifc_ifcu.ifcu_buf 611*b2f58791SDmitry Chagin #define ifc_req ifc_ifcu.ifcu_req 612*b2f58791SDmitry Chagin 613*b2f58791SDmitry Chagin /* 614*b2f58791SDmitry Chagin * poll() 615*b2f58791SDmitry Chagin */ 616*b2f58791SDmitry Chagin #define LINUX_POLLIN 0x0001 617*b2f58791SDmitry Chagin #define LINUX_POLLPRI 0x0002 618*b2f58791SDmitry Chagin #define LINUX_POLLOUT 0x0004 619*b2f58791SDmitry Chagin #define LINUX_POLLERR 0x0008 620*b2f58791SDmitry Chagin #define LINUX_POLLHUP 0x0010 621*b2f58791SDmitry Chagin #define LINUX_POLLNVAL 0x0020 622*b2f58791SDmitry Chagin #define LINUX_POLLRDNORM 0x0040 623*b2f58791SDmitry Chagin #define LINUX_POLLRDBAND 0x0080 624*b2f58791SDmitry Chagin #define LINUX_POLLWRNORM 0x0100 625*b2f58791SDmitry Chagin #define LINUX_POLLWRBAND 0x0200 626*b2f58791SDmitry Chagin #define LINUX_POLLMSG 0x0400 627*b2f58791SDmitry Chagin 628*b2f58791SDmitry Chagin struct l_pollfd { 629*b2f58791SDmitry Chagin l_int fd; 630*b2f58791SDmitry Chagin l_short events; 631*b2f58791SDmitry Chagin l_short revents; 632*b2f58791SDmitry Chagin }; 633*b2f58791SDmitry Chagin 634*b2f58791SDmitry Chagin 635*b2f58791SDmitry Chagin #define LINUX_CLONE_VM 0x00000100 636*b2f58791SDmitry Chagin #define LINUX_CLONE_FS 0x00000200 637*b2f58791SDmitry Chagin #define LINUX_CLONE_FILES 0x00000400 638*b2f58791SDmitry Chagin #define LINUX_CLONE_SIGHAND 0x00000800 639*b2f58791SDmitry Chagin #define LINUX_CLONE_PID 0x00001000 /* No longer exist in Linux */ 640*b2f58791SDmitry Chagin #define LINUX_CLONE_VFORK 0x00004000 641*b2f58791SDmitry Chagin #define LINUX_CLONE_PARENT 0x00008000 642*b2f58791SDmitry Chagin #define LINUX_CLONE_THREAD 0x00010000 643*b2f58791SDmitry Chagin #define LINUX_CLONE_SETTLS 0x00080000 644*b2f58791SDmitry Chagin #define LINUX_CLONE_PARENT_SETTID 0x00100000 645*b2f58791SDmitry Chagin #define LINUX_CLONE_CHILD_CLEARTID 0x00200000 646*b2f58791SDmitry Chagin #define LINUX_CLONE_CHILD_SETTID 0x01000000 647*b2f58791SDmitry Chagin 648*b2f58791SDmitry Chagin #define LINUX_ARCH_SET_GS 0x1001 649*b2f58791SDmitry Chagin #define LINUX_ARCH_SET_FS 0x1002 650*b2f58791SDmitry Chagin #define LINUX_ARCH_GET_GS 0x1003 651*b2f58791SDmitry Chagin #define LINUX_ARCH_GET_FS 0x1004 652*b2f58791SDmitry Chagin 653*b2f58791SDmitry Chagin #define linux_copyout_rusage(r, u) copyout(r, u, sizeof(*r)) 654*b2f58791SDmitry Chagin 655*b2f58791SDmitry Chagin /* robust futexes */ 656*b2f58791SDmitry Chagin struct linux_robust_list { 657*b2f58791SDmitry Chagin l_uintptr_t next; 658*b2f58791SDmitry Chagin }; 659*b2f58791SDmitry Chagin 660*b2f58791SDmitry Chagin struct linux_robust_list_head { 661*b2f58791SDmitry Chagin struct linux_robust_list list; 662*b2f58791SDmitry Chagin l_long futex_offset; 663*b2f58791SDmitry Chagin l_uintptr_t pending_list; 664*b2f58791SDmitry Chagin }; 665*b2f58791SDmitry Chagin 666*b2f58791SDmitry Chagin #endif /* !_AMD64_LINUX_H_ */ 667