1a9643ea8Slogwang /*- 2*22ce4affSfengbojiang * SPDX-License-Identifier: BSD-3-Clause 3*22ce4affSfengbojiang * 4a9643ea8Slogwang * Copyright (c) 2004 Tim J. Robbins 5a9643ea8Slogwang * Copyright (c) 2001 Doug Rabson 6a9643ea8Slogwang * Copyright (c) 1994-1996 Søren Schmidt 7a9643ea8Slogwang * All rights reserved. 8a9643ea8Slogwang * 9a9643ea8Slogwang * Redistribution and use in source and binary forms, with or without 10a9643ea8Slogwang * modification, are permitted provided that the following conditions 11a9643ea8Slogwang * are met: 12a9643ea8Slogwang * 1. Redistributions of source code must retain the above copyright 13a9643ea8Slogwang * notice, this list of conditions and the following disclaimer 14a9643ea8Slogwang * in this position and unchanged. 15a9643ea8Slogwang * 2. Redistributions in binary form must reproduce the above copyright 16a9643ea8Slogwang * notice, this list of conditions and the following disclaimer in the 17a9643ea8Slogwang * documentation and/or other materials provided with the distribution. 18a9643ea8Slogwang * 3. The name of the author may not be used to endorse or promote products 19a9643ea8Slogwang * derived from this software without specific prior written permission 20a9643ea8Slogwang * 21a9643ea8Slogwang * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22a9643ea8Slogwang * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23a9643ea8Slogwang * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24a9643ea8Slogwang * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25a9643ea8Slogwang * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26a9643ea8Slogwang * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27a9643ea8Slogwang * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28a9643ea8Slogwang * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29a9643ea8Slogwang * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30a9643ea8Slogwang * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31a9643ea8Slogwang * 32a9643ea8Slogwang * $FreeBSD$ 33a9643ea8Slogwang */ 34a9643ea8Slogwang 35a9643ea8Slogwang #ifndef _AMD64_LINUX_H_ 36a9643ea8Slogwang #define _AMD64_LINUX_H_ 37a9643ea8Slogwang 38*22ce4affSfengbojiang #include <sys/abi_compat.h> 39*22ce4affSfengbojiang 40a9643ea8Slogwang #include <compat/linux/linux.h> 41a9643ea8Slogwang #include <amd64/linux32/linux32_syscall.h> 42a9643ea8Slogwang 43*22ce4affSfengbojiang #define LINUX_LEGACY_SYSCALLS 44*22ce4affSfengbojiang 45a9643ea8Slogwang #define LINUX_DTRACE linuxulator32 46a9643ea8Slogwang 47a9643ea8Slogwang #define LINUX32_MAXUSER ((1ul << 32) - PAGE_SIZE) 48a9643ea8Slogwang #define LINUX32_SHAREDPAGE (LINUX32_MAXUSER - PAGE_SIZE) 49a9643ea8Slogwang #define LINUX32_USRSTACK LINUX32_SHAREDPAGE 50a9643ea8Slogwang 51a9643ea8Slogwang /* XXX 16 = sizeof(linux32_ps_strings) */ 52a9643ea8Slogwang #define LINUX32_PS_STRINGS (LINUX32_USRSTACK - 16) 53a9643ea8Slogwang #define LINUX32_MAXDSIZ (512 * 1024 * 1024) /* 512MB */ 54a9643ea8Slogwang #define LINUX32_MAXSSIZ (64 * 1024 * 1024) /* 64MB */ 55a9643ea8Slogwang #define LINUX32_MAXVMEM 0 /* Unlimited */ 56a9643ea8Slogwang 57a9643ea8Slogwang /* 58a9643ea8Slogwang * Provide a separate set of types for the Linux types. 59a9643ea8Slogwang */ 60a9643ea8Slogwang typedef int l_int; 61a9643ea8Slogwang typedef int32_t l_long; 62a9643ea8Slogwang typedef int64_t l_longlong; 63a9643ea8Slogwang typedef short l_short; 64a9643ea8Slogwang typedef unsigned int l_uint; 65a9643ea8Slogwang typedef uint32_t l_ulong; 66a9643ea8Slogwang typedef uint64_t l_ulonglong; 67a9643ea8Slogwang typedef unsigned short l_ushort; 68a9643ea8Slogwang 69a9643ea8Slogwang typedef l_ulong l_uintptr_t; 70a9643ea8Slogwang typedef l_long l_clock_t; 71a9643ea8Slogwang typedef l_int l_daddr_t; 72a9643ea8Slogwang typedef l_ushort l_dev_t; 73a9643ea8Slogwang typedef l_uint l_gid_t; 74a9643ea8Slogwang typedef l_ushort l_gid16_t; 75a9643ea8Slogwang typedef l_ulong l_ino_t; 76a9643ea8Slogwang typedef l_int l_key_t; 77a9643ea8Slogwang typedef l_longlong l_loff_t; 78a9643ea8Slogwang typedef l_ushort l_mode_t; 79a9643ea8Slogwang typedef l_long l_off_t; 80a9643ea8Slogwang typedef l_int l_pid_t; 81a9643ea8Slogwang typedef l_uint l_size_t; 82a9643ea8Slogwang typedef l_long l_suseconds_t; 83a9643ea8Slogwang typedef l_long l_time_t; 84a9643ea8Slogwang typedef l_uint l_uid_t; 85a9643ea8Slogwang typedef l_ushort l_uid16_t; 86a9643ea8Slogwang typedef l_int l_timer_t; 87a9643ea8Slogwang typedef l_int l_mqd_t; 88a9643ea8Slogwang typedef l_ulong l_fd_mask; 89a9643ea8Slogwang 90a9643ea8Slogwang typedef struct { 91a9643ea8Slogwang l_int val[2]; 92a9643ea8Slogwang } __packed l_fsid_t; 93a9643ea8Slogwang 94a9643ea8Slogwang typedef struct { 95a9643ea8Slogwang l_time_t tv_sec; 96a9643ea8Slogwang l_suseconds_t tv_usec; 97a9643ea8Slogwang } l_timeval; 98a9643ea8Slogwang 99a9643ea8Slogwang #define l_fd_set fd_set 100a9643ea8Slogwang 101a9643ea8Slogwang /* 102a9643ea8Slogwang * Miscellaneous 103a9643ea8Slogwang */ 104a9643ea8Slogwang #define LINUX_AT_COUNT 20 /* Count of used aux entry types. 105a9643ea8Slogwang * Keep this synchronized with 106*22ce4affSfengbojiang * linux_fixup_elf() code. 107a9643ea8Slogwang */ 108a9643ea8Slogwang struct l___sysctl_args 109a9643ea8Slogwang { 110a9643ea8Slogwang l_uintptr_t name; 111a9643ea8Slogwang l_int nlen; 112a9643ea8Slogwang l_uintptr_t oldval; 113a9643ea8Slogwang l_uintptr_t oldlenp; 114a9643ea8Slogwang l_uintptr_t newval; 115a9643ea8Slogwang l_size_t newlen; 116a9643ea8Slogwang l_ulong __spare[4]; 117a9643ea8Slogwang } __packed; 118a9643ea8Slogwang 119a9643ea8Slogwang /* Resource limits */ 120a9643ea8Slogwang #define LINUX_RLIMIT_CPU 0 121a9643ea8Slogwang #define LINUX_RLIMIT_FSIZE 1 122a9643ea8Slogwang #define LINUX_RLIMIT_DATA 2 123a9643ea8Slogwang #define LINUX_RLIMIT_STACK 3 124a9643ea8Slogwang #define LINUX_RLIMIT_CORE 4 125a9643ea8Slogwang #define LINUX_RLIMIT_RSS 5 126a9643ea8Slogwang #define LINUX_RLIMIT_NPROC 6 127a9643ea8Slogwang #define LINUX_RLIMIT_NOFILE 7 128a9643ea8Slogwang #define LINUX_RLIMIT_MEMLOCK 8 129a9643ea8Slogwang #define LINUX_RLIMIT_AS 9 /* Address space limit */ 130a9643ea8Slogwang 131a9643ea8Slogwang #define LINUX_RLIM_NLIMITS 10 132a9643ea8Slogwang 133a9643ea8Slogwang struct l_rlimit { 134a9643ea8Slogwang l_ulong rlim_cur; 135a9643ea8Slogwang l_ulong rlim_max; 136a9643ea8Slogwang } __packed; 137a9643ea8Slogwang 138a9643ea8Slogwang struct l_rusage { 139a9643ea8Slogwang l_timeval ru_utime; 140a9643ea8Slogwang l_timeval ru_stime; 141a9643ea8Slogwang l_long ru_maxrss; 142a9643ea8Slogwang l_long ru_ixrss; 143a9643ea8Slogwang l_long ru_idrss; 144a9643ea8Slogwang l_long ru_isrss; 145a9643ea8Slogwang l_long ru_minflt; 146a9643ea8Slogwang l_long ru_majflt; 147a9643ea8Slogwang l_long ru_nswap; 148a9643ea8Slogwang l_long ru_inblock; 149a9643ea8Slogwang l_long ru_oublock; 150a9643ea8Slogwang l_long ru_msgsnd; 151a9643ea8Slogwang l_long ru_msgrcv; 152a9643ea8Slogwang l_long ru_nsignals; 153a9643ea8Slogwang l_long ru_nvcsw; 154a9643ea8Slogwang l_long ru_nivcsw; 155a9643ea8Slogwang } __packed; 156a9643ea8Slogwang 157a9643ea8Slogwang struct l_mmap_argv { 158a9643ea8Slogwang l_uintptr_t addr; 159a9643ea8Slogwang l_size_t len; 160a9643ea8Slogwang l_int prot; 161a9643ea8Slogwang l_int flags; 162a9643ea8Slogwang l_int fd; 163a9643ea8Slogwang l_ulong pgoff; 164a9643ea8Slogwang }; 165a9643ea8Slogwang 166a9643ea8Slogwang /* 167a9643ea8Slogwang * stat family of syscalls 168a9643ea8Slogwang */ 169a9643ea8Slogwang struct l_timespec { 170a9643ea8Slogwang l_time_t tv_sec; 171a9643ea8Slogwang l_long tv_nsec; 172a9643ea8Slogwang } __packed; 173a9643ea8Slogwang 174a9643ea8Slogwang struct l_newstat { 175a9643ea8Slogwang l_ushort st_dev; 176a9643ea8Slogwang l_ushort __pad1; 177a9643ea8Slogwang l_ulong st_ino; 178a9643ea8Slogwang l_ushort st_mode; 179a9643ea8Slogwang l_ushort st_nlink; 180a9643ea8Slogwang l_ushort st_uid; 181a9643ea8Slogwang l_ushort st_gid; 182a9643ea8Slogwang l_ushort st_rdev; 183a9643ea8Slogwang l_ushort __pad2; 184a9643ea8Slogwang l_ulong st_size; 185a9643ea8Slogwang l_ulong st_blksize; 186a9643ea8Slogwang l_ulong st_blocks; 187a9643ea8Slogwang struct l_timespec st_atim; 188a9643ea8Slogwang struct l_timespec st_mtim; 189a9643ea8Slogwang struct l_timespec st_ctim; 190a9643ea8Slogwang l_ulong __unused4; 191a9643ea8Slogwang l_ulong __unused5; 192a9643ea8Slogwang } __packed; 193a9643ea8Slogwang 194a9643ea8Slogwang struct l_stat { 195a9643ea8Slogwang l_ushort st_dev; 196a9643ea8Slogwang l_ulong st_ino; 197a9643ea8Slogwang l_ushort st_mode; 198a9643ea8Slogwang l_ushort st_nlink; 199a9643ea8Slogwang l_ushort st_uid; 200a9643ea8Slogwang l_ushort st_gid; 201a9643ea8Slogwang l_ushort st_rdev; 202a9643ea8Slogwang l_long st_size; 203a9643ea8Slogwang struct l_timespec st_atim; 204a9643ea8Slogwang struct l_timespec st_mtim; 205a9643ea8Slogwang struct l_timespec st_ctim; 206a9643ea8Slogwang l_long st_blksize; 207a9643ea8Slogwang l_long st_blocks; 208a9643ea8Slogwang l_ulong st_flags; 209a9643ea8Slogwang l_ulong st_gen; 210a9643ea8Slogwang }; 211a9643ea8Slogwang 212a9643ea8Slogwang struct l_stat64 { 213a9643ea8Slogwang l_ushort st_dev; 214a9643ea8Slogwang u_char __pad0[10]; 215a9643ea8Slogwang l_ulong __st_ino; 216a9643ea8Slogwang l_uint st_mode; 217a9643ea8Slogwang l_uint st_nlink; 218a9643ea8Slogwang l_ulong st_uid; 219a9643ea8Slogwang l_ulong st_gid; 220a9643ea8Slogwang l_ushort st_rdev; 221a9643ea8Slogwang u_char __pad3[10]; 222a9643ea8Slogwang l_longlong st_size; 223a9643ea8Slogwang l_ulong st_blksize; 224a9643ea8Slogwang l_ulong st_blocks; 225a9643ea8Slogwang l_ulong __pad4; 226a9643ea8Slogwang struct l_timespec st_atim; 227a9643ea8Slogwang struct l_timespec st_mtim; 228a9643ea8Slogwang struct l_timespec st_ctim; 229a9643ea8Slogwang l_ulonglong st_ino; 230a9643ea8Slogwang } __packed; 231a9643ea8Slogwang 232a9643ea8Slogwang struct l_statfs64 { 233a9643ea8Slogwang l_int f_type; 234a9643ea8Slogwang l_int f_bsize; 235a9643ea8Slogwang uint64_t f_blocks; 236a9643ea8Slogwang uint64_t f_bfree; 237a9643ea8Slogwang uint64_t f_bavail; 238a9643ea8Slogwang uint64_t f_files; 239a9643ea8Slogwang uint64_t f_ffree; 240a9643ea8Slogwang l_fsid_t f_fsid; 241a9643ea8Slogwang l_int f_namelen; 242*22ce4affSfengbojiang l_int f_frsize; 243*22ce4affSfengbojiang l_int f_flags; 244*22ce4affSfengbojiang l_int f_spare[4]; 245a9643ea8Slogwang } __packed; 246a9643ea8Slogwang 247a9643ea8Slogwang /* sigaction flags */ 248a9643ea8Slogwang #define LINUX_SA_NOCLDSTOP 0x00000001 249a9643ea8Slogwang #define LINUX_SA_NOCLDWAIT 0x00000002 250a9643ea8Slogwang #define LINUX_SA_SIGINFO 0x00000004 251a9643ea8Slogwang #define LINUX_SA_RESTORER 0x04000000 252a9643ea8Slogwang #define LINUX_SA_ONSTACK 0x08000000 253a9643ea8Slogwang #define LINUX_SA_RESTART 0x10000000 254a9643ea8Slogwang #define LINUX_SA_INTERRUPT 0x20000000 255a9643ea8Slogwang #define LINUX_SA_NOMASK 0x40000000 256a9643ea8Slogwang #define LINUX_SA_ONESHOT 0x80000000 257a9643ea8Slogwang 258a9643ea8Slogwang /* sigprocmask actions */ 259a9643ea8Slogwang #define LINUX_SIG_BLOCK 0 260a9643ea8Slogwang #define LINUX_SIG_UNBLOCK 1 261a9643ea8Slogwang #define LINUX_SIG_SETMASK 2 262a9643ea8Slogwang 263a9643ea8Slogwang /* sigaltstack */ 264a9643ea8Slogwang #define LINUX_MINSIGSTKSZ 2048 265a9643ea8Slogwang 266a9643ea8Slogwang typedef l_uintptr_t l_handler_t; 267a9643ea8Slogwang typedef l_ulong l_osigset_t; 268a9643ea8Slogwang 269a9643ea8Slogwang typedef struct { 270a9643ea8Slogwang l_handler_t lsa_handler; 271a9643ea8Slogwang l_osigset_t lsa_mask; 272a9643ea8Slogwang l_ulong lsa_flags; 273a9643ea8Slogwang l_uintptr_t lsa_restorer; 274a9643ea8Slogwang } __packed l_osigaction_t; 275a9643ea8Slogwang 276a9643ea8Slogwang typedef struct { 277a9643ea8Slogwang l_handler_t lsa_handler; 278a9643ea8Slogwang l_ulong lsa_flags; 279a9643ea8Slogwang l_uintptr_t lsa_restorer; 280a9643ea8Slogwang l_sigset_t lsa_mask; 281a9643ea8Slogwang } __packed l_sigaction_t; 282a9643ea8Slogwang 283a9643ea8Slogwang typedef struct { 284a9643ea8Slogwang l_uintptr_t ss_sp; 285a9643ea8Slogwang l_int ss_flags; 286a9643ea8Slogwang l_size_t ss_size; 287a9643ea8Slogwang } __packed l_stack_t; 288a9643ea8Slogwang 289a9643ea8Slogwang /* The Linux sigcontext, pretty much a standard 386 trapframe. */ 290a9643ea8Slogwang struct l_sigcontext { 291a9643ea8Slogwang l_uint sc_gs; 292a9643ea8Slogwang l_uint sc_fs; 293a9643ea8Slogwang l_uint sc_es; 294a9643ea8Slogwang l_uint sc_ds; 295a9643ea8Slogwang l_uint sc_edi; 296a9643ea8Slogwang l_uint sc_esi; 297a9643ea8Slogwang l_uint sc_ebp; 298a9643ea8Slogwang l_uint sc_esp; 299a9643ea8Slogwang l_uint sc_ebx; 300a9643ea8Slogwang l_uint sc_edx; 301a9643ea8Slogwang l_uint sc_ecx; 302a9643ea8Slogwang l_uint sc_eax; 303a9643ea8Slogwang l_uint sc_trapno; 304a9643ea8Slogwang l_uint sc_err; 305a9643ea8Slogwang l_uint sc_eip; 306a9643ea8Slogwang l_uint sc_cs; 307a9643ea8Slogwang l_uint sc_eflags; 308a9643ea8Slogwang l_uint sc_esp_at_signal; 309a9643ea8Slogwang l_uint sc_ss; 310a9643ea8Slogwang l_uint sc_387; 311a9643ea8Slogwang l_uint sc_mask; 312a9643ea8Slogwang l_uint sc_cr2; 313a9643ea8Slogwang } __packed; 314a9643ea8Slogwang 315a9643ea8Slogwang struct l_ucontext { 316a9643ea8Slogwang l_ulong uc_flags; 317a9643ea8Slogwang l_uintptr_t uc_link; 318a9643ea8Slogwang l_stack_t uc_stack; 319a9643ea8Slogwang struct l_sigcontext uc_mcontext; 320a9643ea8Slogwang l_sigset_t uc_sigmask; 321a9643ea8Slogwang } __packed; 322a9643ea8Slogwang 323a9643ea8Slogwang #define LINUX_SI_MAX_SIZE 128 324a9643ea8Slogwang #define LINUX_SI_PAD_SIZE ((LINUX_SI_MAX_SIZE/sizeof(l_int)) - 3) 325a9643ea8Slogwang 326a9643ea8Slogwang typedef union l_sigval { 327a9643ea8Slogwang l_int sival_int; 328a9643ea8Slogwang l_uintptr_t sival_ptr; 329a9643ea8Slogwang } l_sigval_t; 330a9643ea8Slogwang 331a9643ea8Slogwang typedef struct l_siginfo { 332a9643ea8Slogwang l_int lsi_signo; 333a9643ea8Slogwang l_int lsi_errno; 334a9643ea8Slogwang l_int lsi_code; 335a9643ea8Slogwang union { 336a9643ea8Slogwang l_int _pad[LINUX_SI_PAD_SIZE]; 337a9643ea8Slogwang 338a9643ea8Slogwang struct { 339a9643ea8Slogwang l_pid_t _pid; 340a9643ea8Slogwang l_uid_t _uid; 341a9643ea8Slogwang } __packed _kill; 342a9643ea8Slogwang 343a9643ea8Slogwang struct { 344a9643ea8Slogwang l_timer_t _tid; 345a9643ea8Slogwang l_int _overrun; 346a9643ea8Slogwang char _pad[sizeof(l_uid_t) - sizeof(l_int)]; 347a9643ea8Slogwang l_sigval_t _sigval; 348a9643ea8Slogwang l_int _sys_private; 349a9643ea8Slogwang } __packed _timer; 350a9643ea8Slogwang 351a9643ea8Slogwang struct { 352a9643ea8Slogwang l_pid_t _pid; /* sender's pid */ 353a9643ea8Slogwang l_uid_t _uid; /* sender's uid */ 354a9643ea8Slogwang l_sigval_t _sigval; 355a9643ea8Slogwang } __packed _rt; 356a9643ea8Slogwang 357a9643ea8Slogwang struct { 358a9643ea8Slogwang l_pid_t _pid; /* which child */ 359a9643ea8Slogwang l_uid_t _uid; /* sender's uid */ 360a9643ea8Slogwang l_int _status; /* exit code */ 361a9643ea8Slogwang l_clock_t _utime; 362a9643ea8Slogwang l_clock_t _stime; 363a9643ea8Slogwang } __packed _sigchld; 364a9643ea8Slogwang 365a9643ea8Slogwang struct { 366a9643ea8Slogwang l_uintptr_t _addr; /* Faulting insn/memory ref. */ 367a9643ea8Slogwang } __packed _sigfault; 368a9643ea8Slogwang 369a9643ea8Slogwang struct { 370a9643ea8Slogwang l_long _band; /* POLL_IN,POLL_OUT,POLL_MSG */ 371a9643ea8Slogwang l_int _fd; 372a9643ea8Slogwang } __packed _sigpoll; 373a9643ea8Slogwang } _sifields; 374a9643ea8Slogwang } __packed l_siginfo_t; 375a9643ea8Slogwang 376a9643ea8Slogwang #define lsi_pid _sifields._kill._pid 377a9643ea8Slogwang #define lsi_uid _sifields._kill._uid 378a9643ea8Slogwang #define lsi_tid _sifields._timer._tid 379a9643ea8Slogwang #define lsi_overrun _sifields._timer._overrun 380a9643ea8Slogwang #define lsi_sys_private _sifields._timer._sys_private 381a9643ea8Slogwang #define lsi_status _sifields._sigchld._status 382a9643ea8Slogwang #define lsi_utime _sifields._sigchld._utime 383a9643ea8Slogwang #define lsi_stime _sifields._sigchld._stime 384a9643ea8Slogwang #define lsi_value _sifields._rt._sigval 385a9643ea8Slogwang #define lsi_int _sifields._rt._sigval.sival_int 386a9643ea8Slogwang #define lsi_ptr _sifields._rt._sigval.sival_ptr 387a9643ea8Slogwang #define lsi_addr _sifields._sigfault._addr 388a9643ea8Slogwang #define lsi_band _sifields._sigpoll._band 389a9643ea8Slogwang #define lsi_fd _sifields._sigpoll._fd 390a9643ea8Slogwang 391a9643ea8Slogwang struct l_fpreg { 392a9643ea8Slogwang u_int16_t significand[4]; 393a9643ea8Slogwang u_int16_t exponent; 394a9643ea8Slogwang } __packed; 395a9643ea8Slogwang 396a9643ea8Slogwang struct l_fpxreg { 397a9643ea8Slogwang u_int16_t significand[4]; 398a9643ea8Slogwang u_int16_t exponent; 399a9643ea8Slogwang u_int16_t padding[3]; 400a9643ea8Slogwang } __packed; 401a9643ea8Slogwang 402a9643ea8Slogwang struct l_xmmreg { 403a9643ea8Slogwang u_int32_t element[4]; 404a9643ea8Slogwang } __packed; 405a9643ea8Slogwang 406a9643ea8Slogwang struct l_fpstate { 407a9643ea8Slogwang /* Regular FPU environment */ 408a9643ea8Slogwang u_int32_t cw; 409a9643ea8Slogwang u_int32_t sw; 410a9643ea8Slogwang u_int32_t tag; 411a9643ea8Slogwang u_int32_t ipoff; 412a9643ea8Slogwang u_int32_t cssel; 413a9643ea8Slogwang u_int32_t dataoff; 414a9643ea8Slogwang u_int32_t datasel; 415a9643ea8Slogwang struct l_fpreg _st[8]; 416a9643ea8Slogwang u_int16_t status; 417a9643ea8Slogwang u_int16_t magic; /* 0xffff = regular FPU data */ 418a9643ea8Slogwang 419a9643ea8Slogwang /* FXSR FPU environment */ 420a9643ea8Slogwang u_int32_t _fxsr_env[6]; /* env is ignored. */ 421a9643ea8Slogwang u_int32_t mxcsr; 422a9643ea8Slogwang u_int32_t reserved; 423a9643ea8Slogwang struct l_fpxreg _fxsr_st[8]; /* reg data is ignored. */ 424a9643ea8Slogwang struct l_xmmreg _xmm[8]; 425a9643ea8Slogwang u_int32_t padding[56]; 426a9643ea8Slogwang } __packed; 427a9643ea8Slogwang 428a9643ea8Slogwang /* 429a9643ea8Slogwang * We make the stack look like Linux expects it when calling a signal 430a9643ea8Slogwang * handler, but use the BSD way of calling the handler and sigreturn(). 431a9643ea8Slogwang * This means that we need to pass the pointer to the handler too. 432a9643ea8Slogwang * It is appended to the frame to not interfere with the rest of it. 433a9643ea8Slogwang */ 434a9643ea8Slogwang struct l_sigframe { 435a9643ea8Slogwang l_int sf_sig; 436a9643ea8Slogwang struct l_sigcontext sf_sc; 437a9643ea8Slogwang struct l_fpstate sf_fpstate; 438a9643ea8Slogwang l_uint sf_extramask[1]; 439a9643ea8Slogwang l_handler_t sf_handler; 440a9643ea8Slogwang } __packed; 441a9643ea8Slogwang 442a9643ea8Slogwang struct l_rt_sigframe { 443a9643ea8Slogwang l_int sf_sig; 444a9643ea8Slogwang l_uintptr_t sf_siginfo; 445a9643ea8Slogwang l_uintptr_t sf_ucontext; 446a9643ea8Slogwang l_siginfo_t sf_si; 447a9643ea8Slogwang struct l_ucontext sf_sc; 448a9643ea8Slogwang l_handler_t sf_handler; 449a9643ea8Slogwang } __packed; 450a9643ea8Slogwang 451a9643ea8Slogwang /* 452a9643ea8Slogwang * arch specific open/fcntl flags 453a9643ea8Slogwang */ 454a9643ea8Slogwang #define LINUX_F_GETLK64 12 455a9643ea8Slogwang #define LINUX_F_SETLK64 13 456a9643ea8Slogwang #define LINUX_F_SETLKW64 14 457a9643ea8Slogwang 458a9643ea8Slogwang union l_semun { 459a9643ea8Slogwang l_int val; 460a9643ea8Slogwang l_uintptr_t buf; 461a9643ea8Slogwang l_uintptr_t array; 462a9643ea8Slogwang l_uintptr_t __buf; 463a9643ea8Slogwang l_uintptr_t __pad; 464a9643ea8Slogwang } __packed; 465a9643ea8Slogwang 466a9643ea8Slogwang struct l_ifmap { 467a9643ea8Slogwang l_ulong mem_start; 468a9643ea8Slogwang l_ulong mem_end; 469a9643ea8Slogwang l_ushort base_addr; 470a9643ea8Slogwang u_char irq; 471a9643ea8Slogwang u_char dma; 472a9643ea8Slogwang u_char port; 473a9643ea8Slogwang } __packed; 474a9643ea8Slogwang 475a9643ea8Slogwang struct l_ifreq { 476a9643ea8Slogwang union { 477a9643ea8Slogwang char ifrn_name[LINUX_IFNAMSIZ]; 478a9643ea8Slogwang } ifr_ifrn; 479a9643ea8Slogwang 480a9643ea8Slogwang union { 481a9643ea8Slogwang struct l_sockaddr ifru_addr; 482a9643ea8Slogwang struct l_sockaddr ifru_dstaddr; 483a9643ea8Slogwang struct l_sockaddr ifru_broadaddr; 484a9643ea8Slogwang struct l_sockaddr ifru_netmask; 485a9643ea8Slogwang struct l_sockaddr ifru_hwaddr; 486a9643ea8Slogwang l_short ifru_flags[1]; 487*22ce4affSfengbojiang l_int ifru_ivalue; 488a9643ea8Slogwang l_int ifru_mtu; 489a9643ea8Slogwang struct l_ifmap ifru_map; 490a9643ea8Slogwang char ifru_slave[LINUX_IFNAMSIZ]; 491a9643ea8Slogwang l_uintptr_t ifru_data; 492a9643ea8Slogwang } ifr_ifru; 493a9643ea8Slogwang } __packed; 494a9643ea8Slogwang 495a9643ea8Slogwang #define ifr_name ifr_ifrn.ifrn_name /* Interface name */ 496a9643ea8Slogwang #define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */ 497*22ce4affSfengbojiang #define ifr_ifindex ifr_ifru.ifru_ivalue /* Interface index */ 498a9643ea8Slogwang 499a9643ea8Slogwang struct l_ifconf { 500a9643ea8Slogwang int ifc_len; 501a9643ea8Slogwang union { 502a9643ea8Slogwang l_uintptr_t ifcu_buf; 503a9643ea8Slogwang l_uintptr_t ifcu_req; 504a9643ea8Slogwang } ifc_ifcu; 505a9643ea8Slogwang } __packed; 506a9643ea8Slogwang 507a9643ea8Slogwang #define ifc_buf ifc_ifcu.ifcu_buf 508a9643ea8Slogwang #define ifc_req ifc_ifcu.ifcu_req 509a9643ea8Slogwang 510a9643ea8Slogwang /* 511a9643ea8Slogwang * poll() 512a9643ea8Slogwang */ 513a9643ea8Slogwang #define LINUX_POLLIN 0x0001 514a9643ea8Slogwang #define LINUX_POLLPRI 0x0002 515a9643ea8Slogwang #define LINUX_POLLOUT 0x0004 516a9643ea8Slogwang #define LINUX_POLLERR 0x0008 517a9643ea8Slogwang #define LINUX_POLLHUP 0x0010 518a9643ea8Slogwang #define LINUX_POLLNVAL 0x0020 519a9643ea8Slogwang #define LINUX_POLLRDNORM 0x0040 520a9643ea8Slogwang #define LINUX_POLLRDBAND 0x0080 521a9643ea8Slogwang #define LINUX_POLLWRNORM 0x0100 522a9643ea8Slogwang #define LINUX_POLLWRBAND 0x0200 523a9643ea8Slogwang #define LINUX_POLLMSG 0x0400 524a9643ea8Slogwang 525a9643ea8Slogwang struct l_pollfd { 526a9643ea8Slogwang l_int fd; 527a9643ea8Slogwang l_short events; 528a9643ea8Slogwang l_short revents; 529a9643ea8Slogwang } __packed; 530a9643ea8Slogwang 531a9643ea8Slogwang struct l_user_desc { 532a9643ea8Slogwang l_uint entry_number; 533a9643ea8Slogwang l_uint base_addr; 534a9643ea8Slogwang l_uint limit; 535a9643ea8Slogwang l_uint seg_32bit:1; 536a9643ea8Slogwang l_uint contents:2; 537a9643ea8Slogwang l_uint read_exec_only:1; 538a9643ea8Slogwang l_uint limit_in_pages:1; 539a9643ea8Slogwang l_uint seg_not_present:1; 540a9643ea8Slogwang l_uint useable:1; 541a9643ea8Slogwang }; 542a9643ea8Slogwang 543a9643ea8Slogwang #define LINUX_LOWERWORD 0x0000ffff 544a9643ea8Slogwang 545a9643ea8Slogwang /* 546a9643ea8Slogwang * Macros which does the same thing as those in Linux include/asm-um/ldt-i386.h. 547a9643ea8Slogwang * These convert Linux user space descriptor to machine one. 548a9643ea8Slogwang */ 549a9643ea8Slogwang #define LINUX_LDT_entry_a(info) \ 550a9643ea8Slogwang ((((info)->base_addr & LINUX_LOWERWORD) << 16) | \ 551a9643ea8Slogwang ((info)->limit & LINUX_LOWERWORD)) 552a9643ea8Slogwang 553a9643ea8Slogwang #define LINUX_ENTRY_B_READ_EXEC_ONLY 9 554a9643ea8Slogwang #define LINUX_ENTRY_B_CONTENTS 10 555a9643ea8Slogwang #define LINUX_ENTRY_B_SEG_NOT_PRESENT 15 556a9643ea8Slogwang #define LINUX_ENTRY_B_BASE_ADDR 16 557a9643ea8Slogwang #define LINUX_ENTRY_B_USEABLE 20 558a9643ea8Slogwang #define LINUX_ENTRY_B_SEG32BIT 22 559a9643ea8Slogwang #define LINUX_ENTRY_B_LIMIT 23 560a9643ea8Slogwang 561a9643ea8Slogwang #define LINUX_LDT_entry_b(info) \ 562a9643ea8Slogwang (((info)->base_addr & 0xff000000) | \ 563a9643ea8Slogwang ((info)->limit & 0xf0000) | \ 564a9643ea8Slogwang ((info)->contents << LINUX_ENTRY_B_CONTENTS) | \ 565a9643ea8Slogwang (((info)->seg_not_present == 0) << LINUX_ENTRY_B_SEG_NOT_PRESENT) | \ 566a9643ea8Slogwang (((info)->base_addr & 0x00ff0000) >> LINUX_ENTRY_B_BASE_ADDR) | \ 567a9643ea8Slogwang (((info)->read_exec_only == 0) << LINUX_ENTRY_B_READ_EXEC_ONLY) | \ 568a9643ea8Slogwang ((info)->seg_32bit << LINUX_ENTRY_B_SEG32BIT) | \ 569a9643ea8Slogwang ((info)->useable << LINUX_ENTRY_B_USEABLE) | \ 570a9643ea8Slogwang ((info)->limit_in_pages << LINUX_ENTRY_B_LIMIT) | 0x7000) 571a9643ea8Slogwang 572a9643ea8Slogwang #define LINUX_LDT_empty(info) \ 573a9643ea8Slogwang ((info)->base_addr == 0 && \ 574a9643ea8Slogwang (info)->limit == 0 && \ 575a9643ea8Slogwang (info)->contents == 0 && \ 576a9643ea8Slogwang (info)->seg_not_present == 1 && \ 577a9643ea8Slogwang (info)->read_exec_only == 1 && \ 578a9643ea8Slogwang (info)->seg_32bit == 0 && \ 579a9643ea8Slogwang (info)->limit_in_pages == 0 && \ 580a9643ea8Slogwang (info)->useable == 0) 581a9643ea8Slogwang 582a9643ea8Slogwang /* 583a9643ea8Slogwang * Macros for converting segments. 584a9643ea8Slogwang * They do the same as those in arch/i386/kernel/process.c in Linux. 585a9643ea8Slogwang */ 586a9643ea8Slogwang #define LINUX_GET_BASE(desc) \ 587a9643ea8Slogwang ((((desc)->a >> 16) & LINUX_LOWERWORD) | \ 588a9643ea8Slogwang (((desc)->b << 16) & 0x00ff0000) | \ 589a9643ea8Slogwang ((desc)->b & 0xff000000)) 590a9643ea8Slogwang 591a9643ea8Slogwang #define LINUX_GET_LIMIT(desc) \ 592a9643ea8Slogwang (((desc)->a & LINUX_LOWERWORD) | \ 593a9643ea8Slogwang ((desc)->b & 0xf0000)) 594a9643ea8Slogwang 595a9643ea8Slogwang #define LINUX_GET_32BIT(desc) \ 596a9643ea8Slogwang (((desc)->b >> LINUX_ENTRY_B_SEG32BIT) & 1) 597a9643ea8Slogwang #define LINUX_GET_CONTENTS(desc) \ 598a9643ea8Slogwang (((desc)->b >> LINUX_ENTRY_B_CONTENTS) & 3) 599a9643ea8Slogwang #define LINUX_GET_WRITABLE(desc) \ 600a9643ea8Slogwang (((desc)->b >> LINUX_ENTRY_B_READ_EXEC_ONLY) & 1) 601a9643ea8Slogwang #define LINUX_GET_LIMIT_PAGES(desc) \ 602a9643ea8Slogwang (((desc)->b >> LINUX_ENTRY_B_LIMIT) & 1) 603a9643ea8Slogwang #define LINUX_GET_PRESENT(desc) \ 604a9643ea8Slogwang (((desc)->b >> LINUX_ENTRY_B_SEG_NOT_PRESENT) & 1) 605a9643ea8Slogwang #define LINUX_GET_USEABLE(desc) \ 606a9643ea8Slogwang (((desc)->b >> LINUX_ENTRY_B_USEABLE) & 1) 607a9643ea8Slogwang 608a9643ea8Slogwang struct iovec; 609*22ce4affSfengbojiang struct uio; 610a9643ea8Slogwang 611a9643ea8Slogwang struct l_iovec32 { 612a9643ea8Slogwang uint32_t iov_base; 613a9643ea8Slogwang l_size_t iov_len; 614a9643ea8Slogwang }; 615a9643ea8Slogwang 616a9643ea8Slogwang int linux32_copyiniov(struct l_iovec32 *iovp32, l_ulong iovcnt, 617a9643ea8Slogwang struct iovec **iovp, int error); 618*22ce4affSfengbojiang int linux32_copyinuio(struct l_iovec32 *iovp, l_ulong iovcnt, 619*22ce4affSfengbojiang struct uio **uiop); 620a9643ea8Slogwang int linux_copyout_rusage(struct rusage *ru, void *uaddr); 621a9643ea8Slogwang 622a9643ea8Slogwang /* robust futexes */ 623a9643ea8Slogwang struct linux_robust_list { 624a9643ea8Slogwang l_uintptr_t next; 625a9643ea8Slogwang }; 626a9643ea8Slogwang 627a9643ea8Slogwang struct linux_robust_list_head { 628a9643ea8Slogwang struct linux_robust_list list; 629a9643ea8Slogwang l_long futex_offset; 630a9643ea8Slogwang l_uintptr_t pending_list; 631a9643ea8Slogwang }; 632a9643ea8Slogwang 633a9643ea8Slogwang #endif /* !_AMD64_LINUX_H_ */ 634