linux.h revision 330897
1227614Sluigi/*- 2227614Sluigi * SPDX-License-Identifier: BSD-3-Clause 3227614Sluigi * 4227614Sluigi * Copyright (c) 2004 Tim J. Robbins 5227614Sluigi * Copyright (c) 2001 Doug Rabson 6227614Sluigi * Copyright (c) 1994-1996 S��ren Schmidt 7227614Sluigi * All rights reserved. 8227614Sluigi * 9227614Sluigi * Redistribution and use in source and binary forms, with or without 10227614Sluigi * modification, are permitted provided that the following conditions 11227614Sluigi * are met: 12227614Sluigi * 1. Redistributions of source code must retain the above copyright 13227614Sluigi * notice, this list of conditions and the following disclaimer 14227614Sluigi * in this position and unchanged. 15227614Sluigi * 2. Redistributions in binary form must reproduce the above copyright 16227614Sluigi * notice, this list of conditions and the following disclaimer in the 17227614Sluigi * documentation and/or other materials provided with the distribution. 18227614Sluigi * 3. The name of the author may not be used to endorse or promote products 19227614Sluigi * derived from this software without specific prior written permission 20227614Sluigi * 21227614Sluigi * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22227614Sluigi * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23227614Sluigi * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24227614Sluigi * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25227614Sluigi * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26232238Sluigi * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27227614Sluigi * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28227614Sluigi * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29227614Sluigi * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30232238Sluigi * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31228276Sluigi * 32232238Sluigi * $FreeBSD: stable/11/sys/amd64/linux32/linux.h 330897 2018-03-14 03:19:51Z eadler $ 33227614Sluigi */ 34227614Sluigi 35227614Sluigi#ifndef _AMD64_LINUX_H_ 36227614Sluigi#define _AMD64_LINUX_H_ 37227614Sluigi 38227614Sluigi#include <compat/linux/linux.h> 39227614Sluigi#include <amd64/linux32/linux32_syscall.h> 40227614Sluigi 41227614Sluigi/* 42227614Sluigi * debugging support 43231594Sluigi */ 44227614Sluigiextern u_char linux_debug_map[]; 45231594Sluigi#define ldebug(name) isclr(linux_debug_map, LINUX32_SYS_linux_ ## name) 46227614Sluigi#define ARGS(nm, fmt) "linux(%ld/%ld): "#nm"("fmt")\n", \ 47227614Sluigi (long)td->td_proc->p_pid, (long)td->td_tid 48227614Sluigi#define LMSG(fmt) "linux(%ld/%ld): "fmt"\n", \ 49227614Sluigi (long)td->td_proc->p_pid, (long)td->td_tid 50227614Sluigi#define LINUX_DTRACE linuxulator32 51227614Sluigi 52227614Sluigi#define LINUX32_MAXUSER ((1ul << 32) - PAGE_SIZE) 53227614Sluigi#define LINUX32_SHAREDPAGE (LINUX32_MAXUSER - PAGE_SIZE) 54227614Sluigi#define LINUX32_USRSTACK LINUX32_SHAREDPAGE 55227614Sluigi 56227614Sluigi/* XXX 16 = sizeof(linux32_ps_strings) */ 57227614Sluigi#define LINUX32_PS_STRINGS (LINUX32_USRSTACK - 16) 58227614Sluigi#define LINUX32_MAXDSIZ (512 * 1024 * 1024) /* 512MB */ 59227614Sluigi#define LINUX32_MAXSSIZ (64 * 1024 * 1024) /* 64MB */ 60227614Sluigi#define LINUX32_MAXVMEM 0 /* Unlimited */ 61227614Sluigi 62227614Sluigi#define PTRIN(v) (void *)(uintptr_t)(v) 63227614Sluigi#define PTROUT(v) (l_uintptr_t)(uintptr_t)(v) 64227614Sluigi 65227614Sluigi#define CP(src,dst,fld) do { (dst).fld = (src).fld; } while (0) 66227614Sluigi#define CP2(src,dst,sfld,dfld) do { (dst).dfld = (src).sfld; } while (0) 67227614Sluigi#define PTRIN_CP(src,dst,fld) \ 68227614Sluigi do { (dst).fld = PTRIN((src).fld); } while (0) 69227614Sluigi 70227614Sluigi/* 71227614Sluigi * Provide a separate set of types for the Linux types. 72232238Sluigi */ 73227614Sluigitypedef int l_int; 74227614Sluigitypedef int32_t l_long; 75228276Sluigitypedef int64_t l_longlong; 76228276Sluigitypedef short l_short; 77228276Sluigitypedef unsigned int l_uint; 78228276Sluigitypedef uint32_t l_ulong; 79228276Sluigitypedef uint64_t l_ulonglong; 80228276Sluigitypedef unsigned short l_ushort; 81228276Sluigi 82232238Sluigitypedef l_ulong l_uintptr_t; 83228276Sluigitypedef l_long l_clock_t; 84228276Sluigitypedef l_int l_daddr_t; 85228276Sluigitypedef l_ushort l_dev_t; 86228276Sluigitypedef l_uint l_gid_t; 87228276Sluigitypedef l_ushort l_gid16_t; 88228276Sluigitypedef l_ulong l_ino_t; 89228276Sluigitypedef l_int l_key_t; 90228276Sluigitypedef l_longlong l_loff_t; 91228276Sluigitypedef l_ushort l_mode_t; 92228276Sluigitypedef l_long l_off_t; 93228276Sluigitypedef l_int l_pid_t; 94228276Sluigitypedef l_uint l_size_t; 95228276Sluigitypedef l_long l_suseconds_t; 96228276Sluigitypedef l_long l_time_t; 97228276Sluigitypedef l_uint l_uid_t; 98228276Sluigitypedef l_ushort l_uid16_t; 99228276Sluigitypedef l_int l_timer_t; 100228276Sluigitypedef l_int l_mqd_t; 101228276Sluigitypedef l_ulong l_fd_mask; 102228276Sluigi 103228276Sluigitypedef struct { 104228276Sluigi l_int val[2]; 105228276Sluigi} __packed l_fsid_t; 106228276Sluigi 107231778Sluigitypedef struct { 108228276Sluigi l_time_t tv_sec; 109228276Sluigi l_suseconds_t tv_usec; 110231778Sluigi} l_timeval; 111228276Sluigi 112228276Sluigi#define l_fd_set fd_set 113228276Sluigi 114228276Sluigi/* 115228276Sluigi * Miscellaneous 116228276Sluigi */ 117228276Sluigi#define LINUX_AT_COUNT 20 /* Count of used aux entry types. 118228276Sluigi * Keep this synchronized with 119228276Sluigi * elf_linux_fixup() code. 120228276Sluigi */ 121228276Sluigistruct l___sysctl_args 122232238Sluigi{ 123228276Sluigi l_uintptr_t name; 124228276Sluigi l_int nlen; 125231594Sluigi l_uintptr_t oldval; 126227614Sluigi l_uintptr_t oldlenp; 127231594Sluigi l_uintptr_t newval; 128232238Sluigi l_size_t newlen; 129231796Sluigi l_ulong __spare[4]; 130227614Sluigi} __packed; 131232238Sluigi 132227614Sluigi/* Resource limits */ 133227614Sluigi#define LINUX_RLIMIT_CPU 0 134227614Sluigi#define LINUX_RLIMIT_FSIZE 1 135227614Sluigi#define LINUX_RLIMIT_DATA 2 136232238Sluigi#define LINUX_RLIMIT_STACK 3 137227614Sluigi#define LINUX_RLIMIT_CORE 4 138228276Sluigi#define LINUX_RLIMIT_RSS 5 139227614Sluigi#define LINUX_RLIMIT_NPROC 6 140227614Sluigi#define LINUX_RLIMIT_NOFILE 7 141227614Sluigi#define LINUX_RLIMIT_MEMLOCK 8 142227614Sluigi#define LINUX_RLIMIT_AS 9 /* Address space limit */ 143227614Sluigi 144227614Sluigi#define LINUX_RLIM_NLIMITS 10 145232238Sluigi 146232238Sluigistruct l_rlimit { 147232238Sluigi l_ulong rlim_cur; 148231778Sluigi l_ulong rlim_max; 149231778Sluigi} __packed; 150232238Sluigi 151232238Sluigistruct l_rusage { 152231881Sluigi l_timeval ru_utime; 153232238Sluigi l_timeval ru_stime; 154227614Sluigi l_long ru_maxrss; 155232238Sluigi l_long ru_ixrss; 156228276Sluigi l_long ru_idrss; 157228276Sluigi l_long ru_isrss; 158227614Sluigi l_long ru_minflt; 159227614Sluigi l_long ru_majflt; 160227614Sluigi l_long ru_nswap; 161231778Sluigi l_long ru_inblock; 162231778Sluigi l_long ru_oublock; 163232238Sluigi l_long ru_msgsnd; 164227614Sluigi l_long ru_msgrcv; 165227614Sluigi l_long ru_nsignals; 166227614Sluigi l_long ru_nvcsw; 167227614Sluigi l_long ru_nivcsw; 168227614Sluigi} __packed; 169227614Sluigi 170227614Sluigistruct l_mmap_argv { 171228276Sluigi l_uintptr_t addr; 172227614Sluigi l_size_t len; 173228276Sluigi l_int prot; 174229939Sluigi l_int flags; 175232238Sluigi l_int fd; 176227614Sluigi l_ulong pgoff; 177227614Sluigi}; 178232238Sluigi 179232238Sluigi/* 180232238Sluigi * stat family of syscalls 181232238Sluigi */ 182227614Sluigistruct l_timespec { 183227614Sluigi l_time_t tv_sec; 184228276Sluigi l_long tv_nsec; 185227614Sluigi} __packed; 186228276Sluigi 187227614Sluigistruct l_newstat { 188232238Sluigi l_ushort st_dev; 189228276Sluigi l_ushort __pad1; 190227614Sluigi l_ulong st_ino; 191227614Sluigi l_ushort st_mode; 192228276Sluigi l_ushort st_nlink; 193227614Sluigi l_ushort st_uid; 194228276Sluigi l_ushort st_gid; 195227614Sluigi l_ushort st_rdev; 196228276Sluigi l_ushort __pad2; 197228276Sluigi l_ulong st_size; 198228276Sluigi l_ulong st_blksize; 199228276Sluigi l_ulong st_blocks; 200228276Sluigi struct l_timespec st_atim; 201228276Sluigi struct l_timespec st_mtim; 202231778Sluigi struct l_timespec st_ctim; 203228276Sluigi l_ulong __unused4; 204228276Sluigi l_ulong __unused5; 205228276Sluigi} __packed; 206228276Sluigi 207228276Sluigistruct l_stat { 208232238Sluigi l_ushort st_dev; 209228276Sluigi l_ulong st_ino; 210228276Sluigi l_ushort st_mode; 211228276Sluigi l_ushort st_nlink; 212228276Sluigi l_ushort st_uid; 213228276Sluigi l_ushort st_gid; 214228276Sluigi l_ushort st_rdev; 215232238Sluigi l_long st_size; 216231778Sluigi struct l_timespec st_atim; 217231198Sluigi struct l_timespec st_mtim; 218227614Sluigi struct l_timespec st_ctim; 219227614Sluigi l_long st_blksize; 220227614Sluigi l_long st_blocks; 221227614Sluigi l_ulong st_flags; 222227614Sluigi l_ulong st_gen; 223227614Sluigi}; 224227614Sluigi 225228276Sluigistruct l_stat64 { 226227614Sluigi l_ushort st_dev; 227227614Sluigi u_char __pad0[10]; 228231594Sluigi l_ulong __st_ino; 229227614Sluigi l_uint st_mode; 230231594Sluigi l_uint st_nlink; 231232238Sluigi l_ulong st_uid; 232231796Sluigi l_ulong st_gid; 233227614Sluigi l_ushort st_rdev; 234232238Sluigi u_char __pad3[10]; 235232238Sluigi l_longlong st_size; 236232238Sluigi l_ulong st_blksize; 237227614Sluigi l_ulong st_blocks; 238228276Sluigi l_ulong __pad4; 239227614Sluigi struct l_timespec st_atim; 240227614Sluigi struct l_timespec st_mtim; 241227614Sluigi struct l_timespec st_ctim; 242227614Sluigi l_ulonglong st_ino; 243231778Sluigi} __packed; 244227614Sluigi 245227614Sluigistruct l_statfs64 { 246227614Sluigi l_int f_type; 247227614Sluigi l_int f_bsize; 248232238Sluigi uint64_t f_blocks; 249232238Sluigi uint64_t f_bfree; 250232238Sluigi uint64_t f_bavail; 251231778Sluigi uint64_t f_files; 252231778Sluigi uint64_t f_ffree; 253232238Sluigi l_fsid_t f_fsid; 254232238Sluigi l_int f_namelen; 255245579Sluigi l_int f_frsize; 256245579Sluigi l_int f_flags; 257232238Sluigi l_int f_spare[4]; 258232238Sluigi} __packed; 259232238Sluigi 260232238Sluigi/* sigaction flags */ 261227614Sluigi#define LINUX_SA_NOCLDSTOP 0x00000001 262232238Sluigi#define LINUX_SA_NOCLDWAIT 0x00000002 263232238Sluigi#define LINUX_SA_SIGINFO 0x00000004 264232238Sluigi#define LINUX_SA_RESTORER 0x04000000 265232238Sluigi#define LINUX_SA_ONSTACK 0x08000000 266232238Sluigi#define LINUX_SA_RESTART 0x10000000 267232238Sluigi#define LINUX_SA_INTERRUPT 0x20000000 268232238Sluigi#define LINUX_SA_NOMASK 0x40000000 269232238Sluigi#define LINUX_SA_ONESHOT 0x80000000 270245579Sluigi 271232238Sluigi/* sigprocmask actions */ 272232238Sluigi#define LINUX_SIG_BLOCK 0 273232238Sluigi#define LINUX_SIG_UNBLOCK 1 274232238Sluigi#define LINUX_SIG_SETMASK 2 275232238Sluigi 276227614Sluigi/* sigaltstack */ 277232238Sluigi#define LINUX_MINSIGSTKSZ 2048 278232238Sluigi 279232238Sluigitypedef l_uintptr_t l_handler_t; 280232238Sluigitypedef l_ulong l_osigset_t; 281232238Sluigi 282227614Sluigitypedef struct { 283227614Sluigi l_handler_t lsa_handler; 284232238Sluigi l_osigset_t lsa_mask; 285231796Sluigi l_ulong lsa_flags; 286232238Sluigi l_uintptr_t lsa_restorer; 287232238Sluigi} __packed l_osigaction_t; 288232238Sluigi 289232238Sluigitypedef struct { 290232238Sluigi l_handler_t lsa_handler; 291232238Sluigi l_ulong lsa_flags; 292232238Sluigi l_uintptr_t lsa_restorer; 293232238Sluigi l_sigset_t lsa_mask; 294232238Sluigi} __packed l_sigaction_t; 295231881Sluigi 296227614Sluigitypedef struct { 297228276Sluigi l_uintptr_t ss_sp; 298228276Sluigi l_int ss_flags; 299229939Sluigi l_size_t ss_size; 300229939Sluigi} __packed l_stack_t; 301227614Sluigi 302227614Sluigi/* The Linux sigcontext, pretty much a standard 386 trapframe. */ 303227614Sluigistruct l_sigcontext { 304227614Sluigi l_uint sc_gs; 305227614Sluigi l_uint sc_fs; 306227614Sluigi l_uint sc_es; 307231778Sluigi l_uint sc_ds; 308227614Sluigi l_uint sc_edi; 309231796Sluigi l_uint sc_esi; 310229939Sluigi l_uint sc_ebp; 311232238Sluigi l_uint sc_esp; 312227614Sluigi l_uint sc_ebx; 313227614Sluigi l_uint sc_edx; 314232238Sluigi l_uint sc_ecx; 315227614Sluigi l_uint sc_eax; 316227614Sluigi l_uint sc_trapno; 317228276Sluigi l_uint sc_err; 318227614Sluigi l_uint sc_eip; 319227614Sluigi l_uint sc_cs; 320228276Sluigi l_uint sc_eflags; 321227614Sluigi l_uint sc_esp_at_signal; 322227614Sluigi l_uint sc_ss; 323228276Sluigi l_uint sc_387; 324227614Sluigi l_uint sc_mask; 325228276Sluigi l_uint sc_cr2; 326227614Sluigi} __packed; 327227614Sluigi 328228276Sluigistruct l_ucontext { 329227614Sluigi l_ulong uc_flags; 330228276Sluigi l_uintptr_t uc_link; 331228276Sluigi l_stack_t uc_stack; 332227614Sluigi struct l_sigcontext uc_mcontext; 333227614Sluigi l_sigset_t uc_sigmask; 334232238Sluigi} __packed; 335227614Sluigi 336227614Sluigi#define LINUX_SI_MAX_SIZE 128 337227614Sluigi#define LINUX_SI_PAD_SIZE ((LINUX_SI_MAX_SIZE/sizeof(l_int)) - 3) 338227614Sluigi 339232238Sluigitypedef union l_sigval { 340232238Sluigi l_int sival_int; 341232238Sluigi l_uintptr_t sival_ptr; 342232238Sluigi} l_sigval_t; 343232238Sluigi 344232238Sluigitypedef struct l_siginfo { 345232238Sluigi l_int lsi_signo; 346232238Sluigi l_int lsi_errno; 347232238Sluigi l_int lsi_code; 348232238Sluigi union { 349232238Sluigi l_int _pad[LINUX_SI_PAD_SIZE]; 350232238Sluigi 351232238Sluigi struct { 352232238Sluigi l_pid_t _pid; 353232238Sluigi l_uid_t _uid; 354232238Sluigi } __packed _kill; 355232238Sluigi 356232238Sluigi struct { 357232238Sluigi l_timer_t _tid; 358232238Sluigi l_int _overrun; 359231198Sluigi char _pad[sizeof(l_uid_t) - sizeof(l_int)]; 360 l_sigval_t _sigval; 361 l_int _sys_private; 362 } __packed _timer; 363 364 struct { 365 l_pid_t _pid; /* sender's pid */ 366 l_uid_t _uid; /* sender's uid */ 367 l_sigval_t _sigval; 368 } __packed _rt; 369 370 struct { 371 l_pid_t _pid; /* which child */ 372 l_uid_t _uid; /* sender's uid */ 373 l_int _status; /* exit code */ 374 l_clock_t _utime; 375 l_clock_t _stime; 376 } __packed _sigchld; 377 378 struct { 379 l_uintptr_t _addr; /* Faulting insn/memory ref. */ 380 } __packed _sigfault; 381 382 struct { 383 l_long _band; /* POLL_IN,POLL_OUT,POLL_MSG */ 384 l_int _fd; 385 } __packed _sigpoll; 386 } _sifields; 387} __packed l_siginfo_t; 388 389#define lsi_pid _sifields._kill._pid 390#define lsi_uid _sifields._kill._uid 391#define lsi_tid _sifields._timer._tid 392#define lsi_overrun _sifields._timer._overrun 393#define lsi_sys_private _sifields._timer._sys_private 394#define lsi_status _sifields._sigchld._status 395#define lsi_utime _sifields._sigchld._utime 396#define lsi_stime _sifields._sigchld._stime 397#define lsi_value _sifields._rt._sigval 398#define lsi_int _sifields._rt._sigval.sival_int 399#define lsi_ptr _sifields._rt._sigval.sival_ptr 400#define lsi_addr _sifields._sigfault._addr 401#define lsi_band _sifields._sigpoll._band 402#define lsi_fd _sifields._sigpoll._fd 403 404struct l_fpreg { 405 u_int16_t significand[4]; 406 u_int16_t exponent; 407} __packed; 408 409struct l_fpxreg { 410 u_int16_t significand[4]; 411 u_int16_t exponent; 412 u_int16_t padding[3]; 413} __packed; 414 415struct l_xmmreg { 416 u_int32_t element[4]; 417} __packed; 418 419struct l_fpstate { 420 /* Regular FPU environment */ 421 u_int32_t cw; 422 u_int32_t sw; 423 u_int32_t tag; 424 u_int32_t ipoff; 425 u_int32_t cssel; 426 u_int32_t dataoff; 427 u_int32_t datasel; 428 struct l_fpreg _st[8]; 429 u_int16_t status; 430 u_int16_t magic; /* 0xffff = regular FPU data */ 431 432 /* FXSR FPU environment */ 433 u_int32_t _fxsr_env[6]; /* env is ignored. */ 434 u_int32_t mxcsr; 435 u_int32_t reserved; 436 struct l_fpxreg _fxsr_st[8]; /* reg data is ignored. */ 437 struct l_xmmreg _xmm[8]; 438 u_int32_t padding[56]; 439} __packed; 440 441/* 442 * We make the stack look like Linux expects it when calling a signal 443 * handler, but use the BSD way of calling the handler and sigreturn(). 444 * This means that we need to pass the pointer to the handler too. 445 * It is appended to the frame to not interfere with the rest of it. 446 */ 447struct l_sigframe { 448 l_int sf_sig; 449 struct l_sigcontext sf_sc; 450 struct l_fpstate sf_fpstate; 451 l_uint sf_extramask[1]; 452 l_handler_t sf_handler; 453} __packed; 454 455struct l_rt_sigframe { 456 l_int sf_sig; 457 l_uintptr_t sf_siginfo; 458 l_uintptr_t sf_ucontext; 459 l_siginfo_t sf_si; 460 struct l_ucontext sf_sc; 461 l_handler_t sf_handler; 462} __packed; 463 464/* 465 * arch specific open/fcntl flags 466 */ 467#define LINUX_F_GETLK64 12 468#define LINUX_F_SETLK64 13 469#define LINUX_F_SETLKW64 14 470 471union l_semun { 472 l_int val; 473 l_uintptr_t buf; 474 l_uintptr_t array; 475 l_uintptr_t __buf; 476 l_uintptr_t __pad; 477} __packed; 478 479struct l_sockaddr { 480 l_ushort sa_family; 481 char sa_data[14]; 482} __packed; 483 484struct l_ifmap { 485 l_ulong mem_start; 486 l_ulong mem_end; 487 l_ushort base_addr; 488 u_char irq; 489 u_char dma; 490 u_char port; 491} __packed; 492 493#define LINUX_IFHWADDRLEN 6 494#define LINUX_IFNAMSIZ 16 495 496struct l_ifreq { 497 union { 498 char ifrn_name[LINUX_IFNAMSIZ]; 499 } ifr_ifrn; 500 501 union { 502 struct l_sockaddr ifru_addr; 503 struct l_sockaddr ifru_dstaddr; 504 struct l_sockaddr ifru_broadaddr; 505 struct l_sockaddr ifru_netmask; 506 struct l_sockaddr ifru_hwaddr; 507 l_short ifru_flags[1]; 508 l_int ifru_ivalue; 509 l_int ifru_mtu; 510 struct l_ifmap ifru_map; 511 char ifru_slave[LINUX_IFNAMSIZ]; 512 l_uintptr_t ifru_data; 513 } ifr_ifru; 514} __packed; 515 516#define ifr_name ifr_ifrn.ifrn_name /* Interface name */ 517#define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */ 518#define ifr_ifindex ifr_ifru.ifru_ivalue /* Interface index */ 519 520struct l_ifconf { 521 int ifc_len; 522 union { 523 l_uintptr_t ifcu_buf; 524 l_uintptr_t ifcu_req; 525 } ifc_ifcu; 526} __packed; 527 528#define ifc_buf ifc_ifcu.ifcu_buf 529#define ifc_req ifc_ifcu.ifcu_req 530 531/* 532 * poll() 533 */ 534#define LINUX_POLLIN 0x0001 535#define LINUX_POLLPRI 0x0002 536#define LINUX_POLLOUT 0x0004 537#define LINUX_POLLERR 0x0008 538#define LINUX_POLLHUP 0x0010 539#define LINUX_POLLNVAL 0x0020 540#define LINUX_POLLRDNORM 0x0040 541#define LINUX_POLLRDBAND 0x0080 542#define LINUX_POLLWRNORM 0x0100 543#define LINUX_POLLWRBAND 0x0200 544#define LINUX_POLLMSG 0x0400 545 546struct l_pollfd { 547 l_int fd; 548 l_short events; 549 l_short revents; 550} __packed; 551 552struct l_user_desc { 553 l_uint entry_number; 554 l_uint base_addr; 555 l_uint limit; 556 l_uint seg_32bit:1; 557 l_uint contents:2; 558 l_uint read_exec_only:1; 559 l_uint limit_in_pages:1; 560 l_uint seg_not_present:1; 561 l_uint useable:1; 562}; 563 564#define LINUX_LOWERWORD 0x0000ffff 565 566/* 567 * Macros which does the same thing as those in Linux include/asm-um/ldt-i386.h. 568 * These convert Linux user space descriptor to machine one. 569 */ 570#define LINUX_LDT_entry_a(info) \ 571 ((((info)->base_addr & LINUX_LOWERWORD) << 16) | \ 572 ((info)->limit & LINUX_LOWERWORD)) 573 574#define LINUX_ENTRY_B_READ_EXEC_ONLY 9 575#define LINUX_ENTRY_B_CONTENTS 10 576#define LINUX_ENTRY_B_SEG_NOT_PRESENT 15 577#define LINUX_ENTRY_B_BASE_ADDR 16 578#define LINUX_ENTRY_B_USEABLE 20 579#define LINUX_ENTRY_B_SEG32BIT 22 580#define LINUX_ENTRY_B_LIMIT 23 581 582#define LINUX_LDT_entry_b(info) \ 583 (((info)->base_addr & 0xff000000) | \ 584 ((info)->limit & 0xf0000) | \ 585 ((info)->contents << LINUX_ENTRY_B_CONTENTS) | \ 586 (((info)->seg_not_present == 0) << LINUX_ENTRY_B_SEG_NOT_PRESENT) | \ 587 (((info)->base_addr & 0x00ff0000) >> LINUX_ENTRY_B_BASE_ADDR) | \ 588 (((info)->read_exec_only == 0) << LINUX_ENTRY_B_READ_EXEC_ONLY) | \ 589 ((info)->seg_32bit << LINUX_ENTRY_B_SEG32BIT) | \ 590 ((info)->useable << LINUX_ENTRY_B_USEABLE) | \ 591 ((info)->limit_in_pages << LINUX_ENTRY_B_LIMIT) | 0x7000) 592 593#define LINUX_LDT_empty(info) \ 594 ((info)->base_addr == 0 && \ 595 (info)->limit == 0 && \ 596 (info)->contents == 0 && \ 597 (info)->seg_not_present == 1 && \ 598 (info)->read_exec_only == 1 && \ 599 (info)->seg_32bit == 0 && \ 600 (info)->limit_in_pages == 0 && \ 601 (info)->useable == 0) 602 603/* 604 * Macros for converting segments. 605 * They do the same as those in arch/i386/kernel/process.c in Linux. 606 */ 607#define LINUX_GET_BASE(desc) \ 608 ((((desc)->a >> 16) & LINUX_LOWERWORD) | \ 609 (((desc)->b << 16) & 0x00ff0000) | \ 610 ((desc)->b & 0xff000000)) 611 612#define LINUX_GET_LIMIT(desc) \ 613 (((desc)->a & LINUX_LOWERWORD) | \ 614 ((desc)->b & 0xf0000)) 615 616#define LINUX_GET_32BIT(desc) \ 617 (((desc)->b >> LINUX_ENTRY_B_SEG32BIT) & 1) 618#define LINUX_GET_CONTENTS(desc) \ 619 (((desc)->b >> LINUX_ENTRY_B_CONTENTS) & 3) 620#define LINUX_GET_WRITABLE(desc) \ 621 (((desc)->b >> LINUX_ENTRY_B_READ_EXEC_ONLY) & 1) 622#define LINUX_GET_LIMIT_PAGES(desc) \ 623 (((desc)->b >> LINUX_ENTRY_B_LIMIT) & 1) 624#define LINUX_GET_PRESENT(desc) \ 625 (((desc)->b >> LINUX_ENTRY_B_SEG_NOT_PRESENT) & 1) 626#define LINUX_GET_USEABLE(desc) \ 627 (((desc)->b >> LINUX_ENTRY_B_USEABLE) & 1) 628 629struct iovec; 630struct uio; 631 632struct l_iovec32 { 633 uint32_t iov_base; 634 l_size_t iov_len; 635}; 636 637int linux32_copyiniov(struct l_iovec32 *iovp32, l_ulong iovcnt, 638 struct iovec **iovp, int error); 639int linux32_copyinuio(struct l_iovec32 *iovp, l_ulong iovcnt, 640 struct uio **uiop); 641int linux_copyout_rusage(struct rusage *ru, void *uaddr); 642 643/* robust futexes */ 644struct linux_robust_list { 645 l_uintptr_t next; 646}; 647 648struct linux_robust_list_head { 649 struct linux_robust_list list; 650 l_long futex_offset; 651 l_uintptr_t pending_list; 652}; 653 654#endif /* !_AMD64_LINUX_H_ */ 655