1 /*- 2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3 * 4 * Copyright (c) 1994-1996 Søren Schmidt 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 * $FreeBSD$ 28 */ 29 30 #ifndef _I386_LINUX_H_ 31 #define _I386_LINUX_H_ 32 33 #include <sys/abi_compat.h> 34 35 #include <compat/linux/linux.h> 36 #include <i386/linux/linux_syscall.h> 37 38 #define LINUX_LEGACY_SYSCALLS 39 40 #define LINUX_DTRACE linuxulator 41 42 /* 43 * Provide a separate set of types for the Linux types. 44 */ 45 typedef int l_int; 46 typedef int32_t l_long; 47 typedef int64_t l_longlong; 48 typedef short l_short; 49 typedef unsigned int l_uint; 50 typedef uint32_t l_ulong; 51 typedef uint64_t l_ulonglong; 52 typedef unsigned short l_ushort; 53 54 typedef char *l_caddr_t; 55 typedef l_ulong l_uintptr_t; 56 typedef l_long l_clock_t; 57 typedef l_int l_daddr_t; 58 typedef l_ushort l_dev_t; 59 typedef l_uint l_gid_t; 60 typedef l_ushort l_gid16_t; 61 typedef l_ulong l_ino_t; 62 typedef l_int l_key_t; 63 typedef l_longlong l_loff_t; 64 typedef l_ushort l_mode_t; 65 typedef l_long l_off_t; 66 typedef l_int l_pid_t; 67 typedef l_uint l_size_t; 68 typedef l_long l_suseconds_t; 69 typedef l_long l_time_t; 70 typedef l_longlong l_time64_t; 71 typedef l_uint l_uid_t; 72 typedef l_ushort l_uid16_t; 73 typedef l_int l_timer_t; 74 typedef l_int l_mqd_t; 75 typedef l_ulong l_fd_mask; 76 77 #include <compat/linux/linux_siginfo.h> 78 79 typedef struct { 80 l_int val[2]; 81 } l_fsid_t; 82 83 typedef struct { 84 l_time_t tv_sec; 85 l_suseconds_t tv_usec; 86 } l_timeval; 87 88 typedef struct { 89 l_time64_t tv_sec; 90 l_time64_t tv_usec; 91 } l_sock_timeval; 92 93 #define l_fd_set fd_set 94 95 /* 96 * Miscellaneous 97 */ 98 #define LINUX_AT_COUNT 20 /* Count of used aux entry types. 99 * Keep this synchronized with 100 * linux_fixup_elf() code. 101 */ 102 struct l___sysctl_args 103 { 104 l_int *name; 105 l_int nlen; 106 void *oldval; 107 l_size_t *oldlenp; 108 void *newval; 109 l_size_t newlen; 110 l_ulong __spare[4]; 111 }; 112 113 /* Resource limits */ 114 #define LINUX_RLIMIT_CPU 0 115 #define LINUX_RLIMIT_FSIZE 1 116 #define LINUX_RLIMIT_DATA 2 117 #define LINUX_RLIMIT_STACK 3 118 #define LINUX_RLIMIT_CORE 4 119 #define LINUX_RLIMIT_RSS 5 120 #define LINUX_RLIMIT_NPROC 6 121 #define LINUX_RLIMIT_NOFILE 7 122 #define LINUX_RLIMIT_MEMLOCK 8 123 #define LINUX_RLIMIT_AS 9 /* Address space limit */ 124 125 #define LINUX_RLIM_NLIMITS 10 126 127 struct l_rlimit { 128 l_ulong rlim_cur; 129 l_ulong rlim_max; 130 }; 131 132 struct l_mmap_argv { 133 l_uintptr_t addr; 134 l_size_t len; 135 l_int prot; 136 l_int flags; 137 l_int fd; 138 l_off_t pgoff; 139 }; 140 141 /* 142 * stat family of syscalls 143 */ 144 struct l_timespec { 145 l_time_t tv_sec; 146 l_long tv_nsec; 147 }; 148 149 /* __kernel_timespec */ 150 struct l_timespec64 { 151 l_time64_t tv_sec; 152 l_longlong tv_nsec; 153 }; 154 155 struct l_newstat { 156 l_ushort st_dev; 157 l_ushort __pad1; 158 l_ulong st_ino; 159 l_ushort st_mode; 160 l_ushort st_nlink; 161 l_ushort st_uid; 162 l_ushort st_gid; 163 l_ushort st_rdev; 164 l_ushort __pad2; 165 l_ulong st_size; 166 l_ulong st_blksize; 167 l_ulong st_blocks; 168 struct l_timespec st_atim; 169 struct l_timespec st_mtim; 170 struct l_timespec st_ctim; 171 l_ulong __unused4; 172 l_ulong __unused5; 173 }; 174 175 struct l_stat { 176 l_ushort st_dev; 177 l_ulong st_ino; 178 l_ushort st_mode; 179 l_ushort st_nlink; 180 l_ushort st_uid; 181 l_ushort st_gid; 182 l_ushort st_rdev; 183 l_long st_size; 184 struct l_timespec st_atim; 185 struct l_timespec st_mtim; 186 struct l_timespec st_ctim; 187 l_long st_blksize; 188 l_long st_blocks; 189 l_ulong st_flags; 190 l_ulong st_gen; 191 }; 192 193 struct l_stat64 { 194 l_ushort st_dev; 195 u_char __pad0[10]; 196 l_ulong __st_ino; 197 l_uint st_mode; 198 l_uint st_nlink; 199 l_ulong st_uid; 200 l_ulong st_gid; 201 l_ushort st_rdev; 202 u_char __pad3[10]; 203 l_longlong st_size; 204 l_ulong st_blksize; 205 l_ulong st_blocks; 206 l_ulong __pad4; 207 struct l_timespec st_atim; 208 struct l_timespec st_mtim; 209 struct l_timespec st_ctim; 210 l_ulonglong st_ino; 211 }; 212 213 struct l_statfs64 { 214 l_int f_type; 215 l_int f_bsize; 216 uint64_t f_blocks; 217 uint64_t f_bfree; 218 uint64_t f_bavail; 219 uint64_t f_files; 220 uint64_t f_ffree; 221 l_fsid_t f_fsid; 222 l_int f_namelen; 223 l_int f_frsize; 224 l_int f_flags; 225 l_int f_spare[4]; 226 }; 227 228 /* sigaction flags */ 229 #define LINUX_SA_NOCLDSTOP 0x00000001 230 #define LINUX_SA_NOCLDWAIT 0x00000002 231 #define LINUX_SA_SIGINFO 0x00000004 232 #define LINUX_SA_RESTORER 0x04000000 233 #define LINUX_SA_ONSTACK 0x08000000 234 #define LINUX_SA_RESTART 0x10000000 235 #define LINUX_SA_INTERRUPT 0x20000000 236 #define LINUX_SA_NOMASK 0x40000000 237 #define LINUX_SA_ONESHOT 0x80000000 238 239 /* sigprocmask actions */ 240 #define LINUX_SIG_BLOCK 0 241 #define LINUX_SIG_UNBLOCK 1 242 #define LINUX_SIG_SETMASK 2 243 244 /* sigaltstack */ 245 #define LINUX_MINSIGSTKSZ 2048 246 247 typedef void (*l_handler_t)(l_int); 248 typedef l_ulong l_osigset_t; 249 250 typedef struct { 251 l_handler_t lsa_handler; 252 l_osigset_t lsa_mask; 253 l_ulong lsa_flags; 254 void (*lsa_restorer)(void); 255 } l_osigaction_t; 256 257 typedef struct { 258 l_handler_t lsa_handler; 259 l_ulong lsa_flags; 260 void (*lsa_restorer)(void); 261 l_sigset_t lsa_mask; 262 } l_sigaction_t; 263 264 typedef struct { 265 l_uintptr_t ss_sp; 266 l_int ss_flags; 267 l_size_t ss_size; 268 } l_stack_t; 269 270 extern struct sysentvec linux_sysvec; 271 272 /* 273 * arch specific open/fcntl flags 274 */ 275 #define LINUX_F_GETLK64 12 276 #define LINUX_F_SETLK64 13 277 #define LINUX_F_SETLKW64 14 278 279 union l_semun { 280 l_int val; 281 l_uintptr_t buf; 282 l_ushort *array; 283 l_uintptr_t __buf; 284 l_uintptr_t __pad; 285 }; 286 287 struct l_ifmap { 288 l_ulong mem_start; 289 l_ulong mem_end; 290 l_ushort base_addr; 291 u_char irq; 292 u_char dma; 293 u_char port; 294 }; 295 296 struct l_ifreq { 297 union { 298 char ifrn_name[LINUX_IFNAMSIZ]; 299 } ifr_ifrn; 300 301 union { 302 struct l_sockaddr ifru_addr; 303 struct l_sockaddr ifru_dstaddr; 304 struct l_sockaddr ifru_broadaddr; 305 struct l_sockaddr ifru_netmask; 306 struct l_sockaddr ifru_hwaddr; 307 l_short ifru_flags[1]; 308 l_int ifru_ivalue; 309 l_int ifru_mtu; 310 struct l_ifmap ifru_map; 311 char ifru_slave[LINUX_IFNAMSIZ]; 312 l_caddr_t ifru_data; 313 } ifr_ifru; 314 }; 315 316 #define ifr_name ifr_ifrn.ifrn_name /* Interface name */ 317 #define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */ 318 #define ifr_ifindex ifr_ifru.ifru_ivalue /* Interface index */ 319 320 struct l_user_desc { 321 l_uint entry_number; 322 l_uint base_addr; 323 l_uint limit; 324 l_uint seg_32bit:1; 325 l_uint contents:2; 326 l_uint read_exec_only:1; 327 l_uint limit_in_pages:1; 328 l_uint seg_not_present:1; 329 l_uint useable:1; 330 }; 331 332 struct l_desc_struct { 333 unsigned long a, b; 334 }; 335 336 #define LINUX_LOWERWORD 0x0000ffff 337 338 /* 339 * Macros which does the same thing as those in Linux include/asm-um/ldt-i386.h. 340 * These convert Linux user space descriptor to machine one. 341 */ 342 #define LINUX_LDT_entry_a(info) \ 343 ((((info)->base_addr & LINUX_LOWERWORD) << 16) | \ 344 ((info)->limit & LINUX_LOWERWORD)) 345 346 #define LINUX_ENTRY_B_READ_EXEC_ONLY 9 347 #define LINUX_ENTRY_B_CONTENTS 10 348 #define LINUX_ENTRY_B_SEG_NOT_PRESENT 15 349 #define LINUX_ENTRY_B_BASE_ADDR 16 350 #define LINUX_ENTRY_B_USEABLE 20 351 #define LINUX_ENTRY_B_SEG32BIT 22 352 #define LINUX_ENTRY_B_LIMIT 23 353 354 #define LINUX_LDT_entry_b(info) \ 355 (((info)->base_addr & 0xff000000) | \ 356 ((info)->limit & 0xf0000) | \ 357 ((info)->contents << LINUX_ENTRY_B_CONTENTS) | \ 358 (((info)->seg_not_present == 0) << LINUX_ENTRY_B_SEG_NOT_PRESENT) | \ 359 (((info)->base_addr & 0x00ff0000) >> LINUX_ENTRY_B_BASE_ADDR) | \ 360 (((info)->read_exec_only == 0) << LINUX_ENTRY_B_READ_EXEC_ONLY) | \ 361 ((info)->seg_32bit << LINUX_ENTRY_B_SEG32BIT) | \ 362 ((info)->useable << LINUX_ENTRY_B_USEABLE) | \ 363 ((info)->limit_in_pages << LINUX_ENTRY_B_LIMIT) | 0x7000) 364 365 #define LINUX_LDT_empty(info) \ 366 ((info)->base_addr == 0 && \ 367 (info)->limit == 0 && \ 368 (info)->contents == 0 && \ 369 (info)->seg_not_present == 1 && \ 370 (info)->read_exec_only == 1 && \ 371 (info)->seg_32bit == 0 && \ 372 (info)->limit_in_pages == 0 && \ 373 (info)->useable == 0) 374 375 /* 376 * Macros for converting segments. 377 * They do the same as those in arch/i386/kernel/process.c in Linux. 378 */ 379 #define LINUX_GET_BASE(desc) \ 380 ((((desc)->a >> 16) & LINUX_LOWERWORD) | \ 381 (((desc)->b << 16) & 0x00ff0000) | \ 382 ((desc)->b & 0xff000000)) 383 384 #define LINUX_GET_LIMIT(desc) \ 385 (((desc)->a & LINUX_LOWERWORD) | \ 386 ((desc)->b & 0xf0000)) 387 388 #define LINUX_GET_32BIT(desc) \ 389 (((desc)->b >> LINUX_ENTRY_B_SEG32BIT) & 1) 390 #define LINUX_GET_CONTENTS(desc) \ 391 (((desc)->b >> LINUX_ENTRY_B_CONTENTS) & 3) 392 #define LINUX_GET_WRITABLE(desc) \ 393 (((desc)->b >> LINUX_ENTRY_B_READ_EXEC_ONLY) & 1) 394 #define LINUX_GET_LIMIT_PAGES(desc) \ 395 (((desc)->b >> LINUX_ENTRY_B_LIMIT) & 1) 396 #define LINUX_GET_PRESENT(desc) \ 397 (((desc)->b >> LINUX_ENTRY_B_SEG_NOT_PRESENT) & 1) 398 #define LINUX_GET_USEABLE(desc) \ 399 (((desc)->b >> LINUX_ENTRY_B_USEABLE) & 1) 400 401 #define linux_copyout_rusage(r, u) copyout(r, u, sizeof(*r)) 402 403 /* robust futexes */ 404 struct linux_robust_list { 405 struct linux_robust_list *next; 406 }; 407 408 struct linux_robust_list_head { 409 struct linux_robust_list list; 410 l_long futex_offset; 411 struct linux_robust_list *pending_list; 412 }; 413 414 #endif /* !_I386_LINUX_H_ */ 415