19313Ssos/*- 2230132Suqs * Copyright (c) 1994-1996 S��ren Schmidt 39313Ssos * All rights reserved. 49313Ssos * 59313Ssos * Redistribution and use in source and binary forms, with or without 69313Ssos * modification, are permitted provided that the following conditions 79313Ssos * are met: 89313Ssos * 1. Redistributions of source code must retain the above copyright 9167157Sjkim * notice, this list of conditions and the following disclaimer 109313Ssos * in this position and unchanged. 119313Ssos * 2. Redistributions in binary form must reproduce the above copyright 129313Ssos * notice, this list of conditions and the following disclaimer in the 139313Ssos * documentation and/or other materials provided with the distribution. 149313Ssos * 3. The name of the author may not be used to endorse or promote products 1513765Smpp * derived from this software without specific prior written permission 169313Ssos * 179313Ssos * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 189313Ssos * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 199313Ssos * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 209313Ssos * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 219313Ssos * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 229313Ssos * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 239313Ssos * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 249313Ssos * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 259313Ssos * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 269313Ssos * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 279313Ssos * 2850477Speter * $FreeBSD$ 299313Ssos */ 309313Ssos 31167157Sjkim#ifndef _I386_LINUX_H_ 32167157Sjkim#define _I386_LINUX_H_ 339313Ssos 34167157Sjkim#include <sys/signal.h> /* for sigval union */ 3567234Sgallatin 36293575Sdchagin#include <compat/linux/linux.h> 3768583Smarcel#include <i386/linux/linux_syscall.h> 3818946Sbde 3972543Sjlemon/* 4072543Sjlemon * debugging support 4172543Sjlemon */ 4283221Smarcelextern u_char linux_debug_map[]; 43167157Sjkim#define ldebug(name) isclr(linux_debug_map, LINUX_SYS_linux_ ## name) 44293477Sdchagin#define ARGS(nm, fmt) "linux(%ld/%ld): "#nm"("fmt")\n", \ 45293477Sdchagin (long)td->td_proc->p_pid, (long)td->td_tid 46293477Sdchagin#define LMSG(fmt) "linux(%ld/%ld): "fmt"\n", \ 47293477Sdchagin (long)td->td_proc->p_pid, (long)td->td_tid 48235063Snetchild#define LINUX_DTRACE linuxulator 4972543Sjlemon 50219609Sdchagin#define LINUX_SHAREDPAGE (VM_MAXUSER_ADDRESS - PAGE_SIZE) 51219609Sdchagin#define LINUX_USRSTACK LINUX_SHAREDPAGE 52219609Sdchagin 53133815Stjr#define PTRIN(v) (void *)(v) 54133815Stjr#define PTROUT(v) (l_uintptr_t)(v) 55133815Stjr 56272020Sbz#define CP(src,dst,fld) do { (dst).fld = (src).fld; } while (0) 57272020Sbz#define CP2(src,dst,sfld,dfld) do { (dst).dfld = (src).sfld; } while (0) 58272020Sbz#define PTRIN_CP(src,dst,fld) \ 59272020Sbz do { (dst).fld = PTRIN((src).fld); } while (0) 60272020Sbz 6154122Smarcel/* 6293842Seric * Provide a separate set of types for the Linux types. 6383221Smarcel */ 6483221Smarceltypedef int l_int; 6583221Smarceltypedef int32_t l_long; 6683221Smarceltypedef int64_t l_longlong; 6783221Smarceltypedef short l_short; 6883221Smarceltypedef unsigned int l_uint; 6983221Smarceltypedef uint32_t l_ulong; 7083221Smarceltypedef uint64_t l_ulonglong; 7183221Smarceltypedef unsigned short l_ushort; 7283221Smarcel 7383221Smarceltypedef char *l_caddr_t; 74133815Stjrtypedef l_ulong l_uintptr_t; 7583221Smarceltypedef l_long l_clock_t; 7683221Smarceltypedef l_int l_daddr_t; 7783221Smarceltypedef l_ushort l_dev_t; 7883221Smarceltypedef l_uint l_gid_t; 7983221Smarceltypedef l_ushort l_gid16_t; 8083221Smarceltypedef l_ulong l_ino_t; 8183221Smarceltypedef l_int l_key_t; 8283221Smarceltypedef l_longlong l_loff_t; 8383221Smarceltypedef l_ushort l_mode_t; 8483221Smarceltypedef l_long l_off_t; 8583221Smarceltypedef l_int l_pid_t; 8683221Smarceltypedef l_uint l_size_t; 8783221Smarceltypedef l_long l_suseconds_t; 8883221Smarceltypedef l_long l_time_t; 8983221Smarceltypedef l_uint l_uid_t; 9083221Smarceltypedef l_ushort l_uid16_t; 91184058Skibtypedef l_int l_timer_t; 92184058Skibtypedef l_int l_mqd_t; 93293548Sdchagintypedef l_ulong l_fd_mask; 9483221Smarcel 9583221Smarceltypedef struct { 9683221Smarcel l_int val[2]; 9783221Smarcel} l_fsid_t; 9883221Smarcel 9983221Smarceltypedef struct { 10083221Smarcel l_time_t tv_sec; 10183221Smarcel l_suseconds_t tv_usec; 10283221Smarcel} l_timeval; 10383221Smarcel 10483221Smarcel#define l_fd_set fd_set 10583221Smarcel 10683221Smarcel/* 10754122Smarcel * Miscellaneous 10854122Smarcel */ 109293535Sdchagin#define LINUX_AT_COUNT 20 /* Count of used aux entry types. 110189362Sdchagin * Keep this synchronized with 111189362Sdchagin * elf_linux_fixup() code. 112189362Sdchagin */ 11383221Smarcelstruct l___sysctl_args 11483221Smarcel{ 11583221Smarcel l_int *name; 11683221Smarcel l_int nlen; 11783221Smarcel void *oldval; 11883221Smarcel l_size_t *oldlenp; 11983221Smarcel void *newval; 12083221Smarcel l_size_t newlen; 12183221Smarcel l_ulong __spare[4]; 12283221Smarcel}; 12383221Smarcel 12454122Smarcel/* Resource limits */ 12554122Smarcel#define LINUX_RLIMIT_CPU 0 12654122Smarcel#define LINUX_RLIMIT_FSIZE 1 12754122Smarcel#define LINUX_RLIMIT_DATA 2 12854122Smarcel#define LINUX_RLIMIT_STACK 3 12954122Smarcel#define LINUX_RLIMIT_CORE 4 13054122Smarcel#define LINUX_RLIMIT_RSS 5 13154122Smarcel#define LINUX_RLIMIT_NPROC 6 13254122Smarcel#define LINUX_RLIMIT_NOFILE 7 13354122Smarcel#define LINUX_RLIMIT_MEMLOCK 8 134167157Sjkim#define LINUX_RLIMIT_AS 9 /* Address space limit */ 13554122Smarcel 13654122Smarcel#define LINUX_RLIM_NLIMITS 10 13754122Smarcel 13883221Smarcelstruct l_rlimit { 13983221Smarcel l_ulong rlim_cur; 14083221Smarcel l_ulong rlim_max; 14183221Smarcel}; 14283221Smarcel 143166727Sjkimstruct l_mmap_argv { 144166727Sjkim l_uintptr_t addr; 145166727Sjkim l_size_t len; 146166727Sjkim l_int prot; 147166727Sjkim l_int flags; 148166727Sjkim l_int fd; 149166727Sjkim l_off_t pgoff; 150166727Sjkim} __packed; 151166727Sjkim 15283221Smarcel/* 15383221Smarcel * stat family of syscalls 15483221Smarcel */ 15583221Smarcelstruct l_timespec { 156165408Sjkim l_time_t tv_sec; 157165408Sjkim l_long tv_nsec; 15883221Smarcel}; 15954122Smarcel 16083221Smarcelstruct l_newstat { 16183221Smarcel l_ushort st_dev; 16283221Smarcel l_ushort __pad1; 16383221Smarcel l_ulong st_ino; 16483221Smarcel l_ushort st_mode; 16583221Smarcel l_ushort st_nlink; 16683221Smarcel l_ushort st_uid; 16783221Smarcel l_ushort st_gid; 16883221Smarcel l_ushort st_rdev; 16983221Smarcel l_ushort __pad2; 17083221Smarcel l_ulong st_size; 17183221Smarcel l_ulong st_blksize; 17283221Smarcel l_ulong st_blocks; 173205792Sed struct l_timespec st_atim; 174205792Sed struct l_timespec st_mtim; 175205792Sed struct l_timespec st_ctim; 17683221Smarcel l_ulong __unused4; 17783221Smarcel l_ulong __unused5; 17883221Smarcel}; 17951793Smarcel 180156843Snetchildstruct l_stat { 181167157Sjkim l_ushort st_dev; 182167157Sjkim l_ulong st_ino; 183167157Sjkim l_ushort st_mode; 184167157Sjkim l_ushort st_nlink; 185167157Sjkim l_ushort st_uid; 186167157Sjkim l_ushort st_gid; 187167157Sjkim l_ushort st_rdev; 188167157Sjkim l_long st_size; 189205792Sed struct l_timespec st_atim; 190205792Sed struct l_timespec st_mtim; 191205792Sed struct l_timespec st_ctim; 192167157Sjkim l_long st_blksize; 193167157Sjkim l_long st_blocks; 194167157Sjkim l_ulong st_flags; 195167157Sjkim l_ulong st_gen; 196156843Snetchild}; 197156843Snetchild 19883221Smarcelstruct l_stat64 { 19983221Smarcel l_ushort st_dev; 20083221Smarcel u_char __pad0[10]; 20183221Smarcel l_ulong __st_ino; 20283221Smarcel l_uint st_mode; 20383221Smarcel l_uint st_nlink; 20483221Smarcel l_ulong st_uid; 20583221Smarcel l_ulong st_gid; 20683221Smarcel l_ushort st_rdev; 20783221Smarcel u_char __pad3[10]; 20883221Smarcel l_longlong st_size; 20983221Smarcel l_ulong st_blksize; 21083221Smarcel l_ulong st_blocks; 21183221Smarcel l_ulong __pad4; 212205792Sed struct l_timespec st_atim; 213205792Sed struct l_timespec st_mtim; 214205792Sed struct l_timespec st_ctim; 21583221Smarcel l_ulonglong st_ino; 21683221Smarcel}; 21783221Smarcel 218172220Sdwmalonestruct l_statfs64 { 219172220Sdwmalone l_int f_type; 220172220Sdwmalone l_int f_bsize; 221172220Sdwmalone uint64_t f_blocks; 222172220Sdwmalone uint64_t f_bfree; 223172220Sdwmalone uint64_t f_bavail; 224172220Sdwmalone uint64_t f_files; 225172220Sdwmalone uint64_t f_ffree; 226172220Sdwmalone l_fsid_t f_fsid; 227172220Sdwmalone l_int f_namelen; 228172220Sdwmalone l_int f_spare[6]; 229172220Sdwmalone}; 230172220Sdwmalone 23168689Sgallatin#define LINUX_NSIG_WORDS 2 23251793Smarcel 23354122Smarcel/* sigaction flags */ 23454122Smarcel#define LINUX_SA_NOCLDSTOP 0x00000001 23554122Smarcel#define LINUX_SA_NOCLDWAIT 0x00000002 23654122Smarcel#define LINUX_SA_SIGINFO 0x00000004 23754122Smarcel#define LINUX_SA_RESTORER 0x04000000 23854122Smarcel#define LINUX_SA_ONSTACK 0x08000000 23954122Smarcel#define LINUX_SA_RESTART 0x10000000 24054122Smarcel#define LINUX_SA_INTERRUPT 0x20000000 24154122Smarcel#define LINUX_SA_NOMASK 0x40000000 24254122Smarcel#define LINUX_SA_ONESHOT 0x80000000 24354122Smarcel 24454122Smarcel/* sigprocmask actions */ 24554122Smarcel#define LINUX_SIG_BLOCK 0 24654122Smarcel#define LINUX_SIG_UNBLOCK 1 24754122Smarcel#define LINUX_SIG_SETMASK 2 24854122Smarcel 24965506Smarcel/* sigaltstack */ 250167157Sjkim#define LINUX_MINSIGSTKSZ 2048 25165506Smarcel 25283221Smarceltypedef void (*l_handler_t)(l_int); 25383221Smarceltypedef l_ulong l_osigset_t; 25467051Sgallatin 2559313Ssostypedef struct { 25683221Smarcel l_handler_t lsa_handler; 25783221Smarcel l_osigset_t lsa_mask; 25883221Smarcel l_ulong lsa_flags; 25954122Smarcel void (*lsa_restorer)(void); 26083221Smarcel} l_osigaction_t; 26151793Smarcel 26249786Smarceltypedef struct { 26383221Smarcel l_handler_t lsa_handler; 26483221Smarcel l_ulong lsa_flags; 26554122Smarcel void (*lsa_restorer)(void); 26683221Smarcel l_sigset_t lsa_mask; 26783221Smarcel} l_sigaction_t; 26849786Smarcel 26954122Smarceltypedef struct { 27083221Smarcel void *ss_sp; 27183221Smarcel l_int ss_flags; 27283221Smarcel l_size_t ss_size; 27383221Smarcel} l_stack_t; 27453954Smarcel 27554122Smarcel/* The Linux sigcontext, pretty much a standard 386 trapframe. */ 27683221Smarcelstruct l_sigcontext { 27783221Smarcel l_int sc_gs; 27883221Smarcel l_int sc_fs; 27983221Smarcel l_int sc_es; 28083221Smarcel l_int sc_ds; 28183221Smarcel l_int sc_edi; 28283221Smarcel l_int sc_esi; 28383221Smarcel l_int sc_ebp; 28483221Smarcel l_int sc_esp; 28583221Smarcel l_int sc_ebx; 28683221Smarcel l_int sc_edx; 28783221Smarcel l_int sc_ecx; 28883221Smarcel l_int sc_eax; 28983221Smarcel l_int sc_trapno; 29083221Smarcel l_int sc_err; 29183221Smarcel l_int sc_eip; 29283221Smarcel l_int sc_cs; 29383221Smarcel l_int sc_eflags; 29483221Smarcel l_int sc_esp_at_signal; 29583221Smarcel l_int sc_ss; 29683221Smarcel l_int sc_387; 29783221Smarcel l_int sc_mask; 29883221Smarcel l_int sc_cr2; 29914331Speter}; 30014331Speter 30183221Smarcelstruct l_ucontext { 30283221Smarcel l_ulong uc_flags; 30383221Smarcel void *uc_link; 30483221Smarcel l_stack_t uc_stack; 30583221Smarcel struct l_sigcontext uc_mcontext; 306167157Sjkim l_sigset_t uc_sigmask; 30767234Sgallatin}; 30867234Sgallatin 309167157Sjkim#define LINUX_SI_MAX_SIZE 128 310167157Sjkim#define LINUX_SI_PAD_SIZE ((LINUX_SI_MAX_SIZE/sizeof(l_int)) - 3) 31167234Sgallatin 312184058Skibtypedef union l_sigval { 313184058Skib l_int sival_int; 314184058Skib l_uintptr_t sival_ptr; 315184058Skib} l_sigval_t; 316184058Skib 31783221Smarceltypedef struct l_siginfo { 31883221Smarcel l_int lsi_signo; 31983221Smarcel l_int lsi_errno; 32083221Smarcel l_int lsi_code; 32183221Smarcel union { 32283221Smarcel l_int _pad[LINUX_SI_PAD_SIZE]; 32367234Sgallatin 32467234Sgallatin struct { 32583221Smarcel l_pid_t _pid; 326184058Skib l_uid_t _uid; 32767234Sgallatin } _kill; 32867234Sgallatin 32967234Sgallatin struct { 330184058Skib l_timer_t _tid; 331184058Skib l_int _overrun; 332184058Skib char _pad[sizeof(l_uid_t) - sizeof(l_int)]; 333184058Skib l_sigval_t _sigval; 334184058Skib l_int _sys_private; 33567234Sgallatin } _timer; 33683221Smarcel 33767234Sgallatin struct { 33883221Smarcel l_pid_t _pid; /* sender's pid */ 339184058Skib l_uid_t _uid; /* sender's uid */ 340184058Skib l_sigval_t _sigval; 34167234Sgallatin } _rt; 34267234Sgallatin 34367234Sgallatin struct { 34483221Smarcel l_pid_t _pid; /* which child */ 345184058Skib l_uid_t _uid; /* sender's uid */ 34683221Smarcel l_int _status; /* exit code */ 34783221Smarcel l_clock_t _utime; 34883221Smarcel l_clock_t _stime; 34967234Sgallatin } _sigchld; 35067234Sgallatin 35167234Sgallatin struct { 352184058Skib l_uintptr_t _addr; /* Faulting insn/memory ref. */ 35367234Sgallatin } _sigfault; 35467234Sgallatin 35567234Sgallatin struct { 356184058Skib l_long _band; /* POLL_IN,POLL_OUT,POLL_MSG */ 35783221Smarcel l_int _fd; 35867234Sgallatin } _sigpoll; 35967234Sgallatin } _sifields; 36083221Smarcel} l_siginfo_t; 36167234Sgallatin 362167157Sjkim#define lsi_pid _sifields._kill._pid 363167157Sjkim#define lsi_uid _sifields._kill._uid 364184058Skib#define lsi_tid _sifields._timer._tid 365184058Skib#define lsi_overrun _sifields._timer._overrun 366184058Skib#define lsi_sys_private _sifields._timer._sys_private 367167157Sjkim#define lsi_status _sifields._sigchld._status 368167157Sjkim#define lsi_utime _sifields._sigchld._utime 369167157Sjkim#define lsi_stime _sifields._sigchld._stime 370167157Sjkim#define lsi_value _sifields._rt._sigval 371167157Sjkim#define lsi_int _sifields._rt._sigval.sival_int 372167157Sjkim#define lsi_ptr _sifields._rt._sigval.sival_ptr 373167157Sjkim#define lsi_addr _sifields._sigfault._addr 374167157Sjkim#define lsi_band _sifields._sigpoll._band 375167157Sjkim#define lsi_fd _sifields._sigpoll._fd 37667234Sgallatin 37783221Smarcelstruct l_fpreg { 378167157Sjkim u_int16_t significand[4]; 379167157Sjkim u_int16_t exponent; 38068689Sgallatin}; 38167234Sgallatin 38283221Smarcelstruct l_fpxreg { 383167157Sjkim u_int16_t significand[4]; 384167157Sjkim u_int16_t exponent; 385167157Sjkim u_int16_t padding[3]; 38668689Sgallatin}; 38768689Sgallatin 38883221Smarcelstruct l_xmmreg { 389167157Sjkim u_int32_t element[4]; 39068689Sgallatin}; 39168689Sgallatin 39283221Smarcelstruct l_fpstate { 39368689Sgallatin /* Regular FPU environment */ 39468689Sgallatin u_int32_t cw; 39568689Sgallatin u_int32_t sw; 39668689Sgallatin u_int32_t tag; 39768689Sgallatin u_int32_t ipoff; 39868689Sgallatin u_int32_t cssel; 39968689Sgallatin u_int32_t dataoff; 40068689Sgallatin u_int32_t datasel; 40183221Smarcel struct l_fpreg _st[8]; 40268689Sgallatin u_int16_t status; 403167157Sjkim u_int16_t magic; /* 0xffff = regular FPU data */ 40468689Sgallatin 40568689Sgallatin /* FXSR FPU environment */ 406167157Sjkim u_int32_t _fxsr_env[6]; /* env is ignored. */ 40768689Sgallatin u_int32_t mxcsr; 40868689Sgallatin u_int32_t reserved; 409167157Sjkim struct l_fpxreg _fxsr_st[8]; /* reg data is ignored. */ 41083221Smarcel struct l_xmmreg _xmm[8]; 41168689Sgallatin u_int32_t padding[56]; 41268689Sgallatin}; 41368689Sgallatin 41414331Speter/* 41514331Speter * We make the stack look like Linux expects it when calling a signal 41614331Speter * handler, but use the BSD way of calling the handler and sigreturn(). 41714331Speter * This means that we need to pass the pointer to the handler too. 41814331Speter * It is appended to the frame to not interfere with the rest of it. 41914331Speter */ 42083221Smarcelstruct l_sigframe { 42183221Smarcel l_int sf_sig; 42283221Smarcel struct l_sigcontext sf_sc; 42383221Smarcel struct l_fpstate sf_fpstate; 42483221Smarcel l_uint sf_extramask[LINUX_NSIG_WORDS-1]; 42583221Smarcel l_handler_t sf_handler; 42614331Speter}; 42714331Speter 42883221Smarcelstruct l_rt_sigframe { 42983221Smarcel l_int sf_sig; 43083221Smarcel l_siginfo_t *sf_siginfo; 43183221Smarcel struct l_ucontext *sf_ucontext; 43283221Smarcel l_siginfo_t sf_si; 43383221Smarcel struct l_ucontext sf_sc; 43483221Smarcel l_handler_t sf_handler; 43567234Sgallatin}; 43667234Sgallatin 43759663Sdillonextern struct sysentvec linux_sysvec; 4389313Ssos 43954122Smarcel/* 440293541Sdchagin * arch specific open/fcntl flags 44154122Smarcel */ 44299670Srobert#define LINUX_F_GETLK64 12 44399670Srobert#define LINUX_F_SETLK64 13 44499670Srobert#define LINUX_F_SETLKW64 14 44599670Srobert 44683221Smarcelunion l_semun { 44783221Smarcel l_int val; 44883221Smarcel struct l_semid_ds *buf; 44983221Smarcel l_ushort *array; 45083221Smarcel struct l_seminfo *__buf; 45183221Smarcel void *__pad; 45283221Smarcel}; 45383221Smarcel 454293522Sdchaginstruct l_ipc_perm { 455293522Sdchagin l_key_t key; 456293522Sdchagin l_uid16_t uid; 457293522Sdchagin l_gid16_t gid; 458293522Sdchagin l_uid16_t cuid; 459293522Sdchagin l_gid16_t cgid; 460293522Sdchagin l_ushort mode; 461293522Sdchagin l_ushort seq; 462293522Sdchagin}; 463293522Sdchagin 46454122Smarcel/* 46554122Smarcel * Socket defines 46654122Smarcel */ 46754122Smarcel#define LINUX_SOL_SOCKET 1 46854122Smarcel#define LINUX_SOL_IP 0 46954122Smarcel#define LINUX_SOL_IPX 256 47054122Smarcel#define LINUX_SOL_AX25 257 47154122Smarcel#define LINUX_SOL_TCP 6 47254122Smarcel#define LINUX_SOL_UDP 17 4739313Ssos 47454122Smarcel#define LINUX_SO_DEBUG 1 47554122Smarcel#define LINUX_SO_REUSEADDR 2 47654122Smarcel#define LINUX_SO_TYPE 3 47754122Smarcel#define LINUX_SO_ERROR 4 47854122Smarcel#define LINUX_SO_DONTROUTE 5 47954122Smarcel#define LINUX_SO_BROADCAST 6 48054122Smarcel#define LINUX_SO_SNDBUF 7 48154122Smarcel#define LINUX_SO_RCVBUF 8 48254122Smarcel#define LINUX_SO_KEEPALIVE 9 48354122Smarcel#define LINUX_SO_OOBINLINE 10 48454122Smarcel#define LINUX_SO_NO_CHECK 11 48554122Smarcel#define LINUX_SO_PRIORITY 12 48654122Smarcel#define LINUX_SO_LINGER 13 487166398Skib#define LINUX_SO_PEERCRED 17 488166398Skib#define LINUX_SO_RCVLOWAT 18 489166398Skib#define LINUX_SO_SNDLOWAT 19 490166398Skib#define LINUX_SO_RCVTIMEO 20 491166398Skib#define LINUX_SO_SNDTIMEO 21 492166398Skib#define LINUX_SO_TIMESTAMP 29 493166398Skib#define LINUX_SO_ACCEPTCONN 30 4949313Ssos 49583221Smarcelstruct l_sockaddr { 49683221Smarcel l_ushort sa_family; 49783221Smarcel char sa_data[14]; 49826364Smsmith}; 49926364Smsmith 50083221Smarcelstruct l_ifmap { 50183221Smarcel l_ulong mem_start; 50283221Smarcel l_ulong mem_end; 50383221Smarcel l_ushort base_addr; 50483221Smarcel u_char irq; 50583221Smarcel u_char dma; 50683221Smarcel u_char port; 50726364Smsmith}; 50826364Smsmith 50954122Smarcel#define LINUX_IFHWADDRLEN 6 51054122Smarcel#define LINUX_IFNAMSIZ 16 51126364Smsmith 51283221Smarcelstruct l_ifreq { 51354122Smarcel union { 51454122Smarcel char ifrn_name[LINUX_IFNAMSIZ]; 51554122Smarcel } ifr_ifrn; 51626364Smsmith 51754122Smarcel union { 51883221Smarcel struct l_sockaddr ifru_addr; 51983221Smarcel struct l_sockaddr ifru_dstaddr; 52083221Smarcel struct l_sockaddr ifru_broadaddr; 52183221Smarcel struct l_sockaddr ifru_netmask; 52283221Smarcel struct l_sockaddr ifru_hwaddr; 52385008Sdes l_short ifru_flags[1]; 52483221Smarcel l_int ifru_metric; 52583221Smarcel l_int ifru_mtu; 52683221Smarcel struct l_ifmap ifru_map; 52783221Smarcel char ifru_slave[LINUX_IFNAMSIZ]; 52883221Smarcel l_caddr_t ifru_data; 52954122Smarcel } ifr_ifru; 53054122Smarcel}; 53126364Smsmith 532167157Sjkim#define ifr_name ifr_ifrn.ifrn_name /* Interface name */ 53354122Smarcel#define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */ 53414466Speter 53583221Smarcel/* 53683221Smarcel * poll() 53783221Smarcel */ 53883221Smarcel#define LINUX_POLLIN 0x0001 53983221Smarcel#define LINUX_POLLPRI 0x0002 54083221Smarcel#define LINUX_POLLOUT 0x0004 54183221Smarcel#define LINUX_POLLERR 0x0008 54283221Smarcel#define LINUX_POLLHUP 0x0010 54383221Smarcel#define LINUX_POLLNVAL 0x0020 54483221Smarcel#define LINUX_POLLRDNORM 0x0040 54583221Smarcel#define LINUX_POLLRDBAND 0x0080 54683221Smarcel#define LINUX_POLLWRNORM 0x0100 54783221Smarcel#define LINUX_POLLWRBAND 0x0200 54883221Smarcel#define LINUX_POLLMSG 0x0400 54983221Smarcel 55083221Smarcelstruct l_pollfd { 55183221Smarcel l_int fd; 55283221Smarcel l_short events; 55383221Smarcel l_short revents; 55483221Smarcel}; 55583221Smarcel 556161310Snetchildstruct l_user_desc { 557161310Snetchild l_uint entry_number; 558161310Snetchild l_uint base_addr; 559161310Snetchild l_uint limit; 560161310Snetchild l_uint seg_32bit:1; 561161310Snetchild l_uint contents:2; 562161310Snetchild l_uint read_exec_only:1; 563161310Snetchild l_uint limit_in_pages:1; 564161310Snetchild l_uint seg_not_present:1; 565161310Snetchild l_uint useable:1; 566161310Snetchild}; 567161310Snetchild 568161310Snetchildstruct l_desc_struct { 569167157Sjkim unsigned long a, b; 570161310Snetchild}; 571161310Snetchild 572161310Snetchild 573167157Sjkim#define LINUX_LOWERWORD 0x0000ffff 574161310Snetchild 575167157Sjkim/* 576167157Sjkim * Macros which does the same thing as those in Linux include/asm-um/ldt-i386.h. 577167157Sjkim * These convert Linux user space descriptor to machine one. 578161310Snetchild */ 579167157Sjkim#define LINUX_LDT_entry_a(info) \ 580167157Sjkim ((((info)->base_addr & LINUX_LOWERWORD) << 16) | \ 581167157Sjkim ((info)->limit & LINUX_LOWERWORD)) 582161310Snetchild 583167157Sjkim#define LINUX_ENTRY_B_READ_EXEC_ONLY 9 584167157Sjkim#define LINUX_ENTRY_B_CONTENTS 10 585167157Sjkim#define LINUX_ENTRY_B_SEG_NOT_PRESENT 15 586167157Sjkim#define LINUX_ENTRY_B_BASE_ADDR 16 587167157Sjkim#define LINUX_ENTRY_B_USEABLE 20 588167157Sjkim#define LINUX_ENTRY_B_SEG32BIT 22 589167157Sjkim#define LINUX_ENTRY_B_LIMIT 23 590161310Snetchild 591167157Sjkim#define LINUX_LDT_entry_b(info) \ 592167157Sjkim (((info)->base_addr & 0xff000000) | \ 593167157Sjkim ((info)->limit & 0xf0000) | \ 594167157Sjkim ((info)->contents << LINUX_ENTRY_B_CONTENTS) | \ 595167157Sjkim (((info)->seg_not_present == 0) << LINUX_ENTRY_B_SEG_NOT_PRESENT) | \ 596167157Sjkim (((info)->base_addr & 0x00ff0000) >> LINUX_ENTRY_B_BASE_ADDR) | \ 597167157Sjkim (((info)->read_exec_only == 0) << LINUX_ENTRY_B_READ_EXEC_ONLY) | \ 598167157Sjkim ((info)->seg_32bit << LINUX_ENTRY_B_SEG32BIT) | \ 599167157Sjkim ((info)->useable << LINUX_ENTRY_B_USEABLE) | \ 600167157Sjkim ((info)->limit_in_pages << LINUX_ENTRY_B_LIMIT) | 0x7000) 601161310Snetchild 602167157Sjkim#define LINUX_LDT_empty(info) \ 603167157Sjkim ((info)->base_addr == 0 && \ 604167157Sjkim (info)->limit == 0 && \ 605167157Sjkim (info)->contents == 0 && \ 606167157Sjkim (info)->seg_not_present == 1 && \ 607167157Sjkim (info)->read_exec_only == 1 && \ 608167157Sjkim (info)->seg_32bit == 0 && \ 609167157Sjkim (info)->limit_in_pages == 0 && \ 610167157Sjkim (info)->useable == 0) 611161310Snetchild 612167157Sjkim/* 613167157Sjkim * Macros for converting segments. 614167157Sjkim * They do the same as those in arch/i386/kernel/process.c in Linux. 615167157Sjkim */ 616167157Sjkim#define LINUX_GET_BASE(desc) \ 617167157Sjkim ((((desc)->a >> 16) & LINUX_LOWERWORD) | \ 618167157Sjkim (((desc)->b << 16) & 0x00ff0000) | \ 619167157Sjkim ((desc)->b & 0xff000000)) 620161310Snetchild 621167157Sjkim#define LINUX_GET_LIMIT(desc) \ 622167157Sjkim (((desc)->a & LINUX_LOWERWORD) | \ 623167157Sjkim ((desc)->b & 0xf0000)) 624161310Snetchild 625167157Sjkim#define LINUX_GET_32BIT(desc) \ 626167157Sjkim (((desc)->b >> LINUX_ENTRY_B_SEG32BIT) & 1) 627167157Sjkim#define LINUX_GET_CONTENTS(desc) \ 628167157Sjkim (((desc)->b >> LINUX_ENTRY_B_CONTENTS) & 3) 629167157Sjkim#define LINUX_GET_WRITABLE(desc) \ 630167157Sjkim (((desc)->b >> LINUX_ENTRY_B_READ_EXEC_ONLY) & 1) 631167157Sjkim#define LINUX_GET_LIMIT_PAGES(desc) \ 632167157Sjkim (((desc)->b >> LINUX_ENTRY_B_LIMIT) & 1) 633167157Sjkim#define LINUX_GET_PRESENT(desc) \ 634167157Sjkim (((desc)->b >> LINUX_ENTRY_B_SEG_NOT_PRESENT) & 1) 635167157Sjkim#define LINUX_GET_USEABLE(desc) \ 636167157Sjkim (((desc)->b >> LINUX_ENTRY_B_USEABLE) & 1) 637161310Snetchild 638293500Sdchagin#define linux_copyout_rusage(r, u) copyout(r, u, sizeof(*r)) 639293500Sdchagin 640183871Skib/* robust futexes */ 641183871Skibstruct linux_robust_list { 642183871Skib struct linux_robust_list *next; 643183871Skib}; 644183871Skib 645183871Skibstruct linux_robust_list_head { 646183871Skib struct linux_robust_list list; 647185002Skib l_long futex_offset; 648183871Skib struct linux_robust_list *pending_list; 649183871Skib}; 650183871Skib 651167157Sjkim#endif /* !_I386_LINUX_H_ */ 652