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 /* sigaltstack */ 240 #define LINUX_MINSIGSTKSZ 2048 241 242 typedef void (*l_handler_t)(l_int); 243 typedef l_ulong l_osigset_t; 244 245 typedef struct { 246 l_handler_t lsa_handler; 247 l_osigset_t lsa_mask; 248 l_ulong lsa_flags; 249 void (*lsa_restorer)(void); 250 } l_osigaction_t; 251 252 typedef struct { 253 l_handler_t lsa_handler; 254 l_ulong lsa_flags; 255 void (*lsa_restorer)(void); 256 l_sigset_t lsa_mask; 257 } l_sigaction_t; 258 259 typedef struct { 260 l_uintptr_t ss_sp; 261 l_int ss_flags; 262 l_size_t ss_size; 263 } l_stack_t; 264 265 extern struct sysentvec linux_sysvec; 266 267 /* 268 * arch specific open/fcntl flags 269 */ 270 #define LINUX_F_GETLK64 12 271 #define LINUX_F_SETLK64 13 272 #define LINUX_F_SETLKW64 14 273 274 union l_semun { 275 l_int val; 276 l_uintptr_t buf; 277 l_ushort *array; 278 l_uintptr_t __buf; 279 l_uintptr_t __pad; 280 }; 281 282 struct l_user_desc { 283 l_uint entry_number; 284 l_uint base_addr; 285 l_uint limit; 286 l_uint seg_32bit:1; 287 l_uint contents:2; 288 l_uint read_exec_only:1; 289 l_uint limit_in_pages:1; 290 l_uint seg_not_present:1; 291 l_uint useable:1; 292 }; 293 294 struct l_desc_struct { 295 unsigned long a, b; 296 }; 297 298 #define LINUX_LOWERWORD 0x0000ffff 299 300 /* 301 * Macros which does the same thing as those in Linux include/asm-um/ldt-i386.h. 302 * These convert Linux user space descriptor to machine one. 303 */ 304 #define LINUX_LDT_entry_a(info) \ 305 ((((info)->base_addr & LINUX_LOWERWORD) << 16) | \ 306 ((info)->limit & LINUX_LOWERWORD)) 307 308 #define LINUX_ENTRY_B_READ_EXEC_ONLY 9 309 #define LINUX_ENTRY_B_CONTENTS 10 310 #define LINUX_ENTRY_B_SEG_NOT_PRESENT 15 311 #define LINUX_ENTRY_B_BASE_ADDR 16 312 #define LINUX_ENTRY_B_USEABLE 20 313 #define LINUX_ENTRY_B_SEG32BIT 22 314 #define LINUX_ENTRY_B_LIMIT 23 315 316 #define LINUX_LDT_entry_b(info) \ 317 (((info)->base_addr & 0xff000000) | \ 318 ((info)->limit & 0xf0000) | \ 319 ((info)->contents << LINUX_ENTRY_B_CONTENTS) | \ 320 (((info)->seg_not_present == 0) << LINUX_ENTRY_B_SEG_NOT_PRESENT) | \ 321 (((info)->base_addr & 0x00ff0000) >> LINUX_ENTRY_B_BASE_ADDR) | \ 322 (((info)->read_exec_only == 0) << LINUX_ENTRY_B_READ_EXEC_ONLY) | \ 323 ((info)->seg_32bit << LINUX_ENTRY_B_SEG32BIT) | \ 324 ((info)->useable << LINUX_ENTRY_B_USEABLE) | \ 325 ((info)->limit_in_pages << LINUX_ENTRY_B_LIMIT) | 0x7000) 326 327 #define LINUX_LDT_empty(info) \ 328 ((info)->base_addr == 0 && \ 329 (info)->limit == 0 && \ 330 (info)->contents == 0 && \ 331 (info)->seg_not_present == 1 && \ 332 (info)->read_exec_only == 1 && \ 333 (info)->seg_32bit == 0 && \ 334 (info)->limit_in_pages == 0 && \ 335 (info)->useable == 0) 336 337 /* 338 * Macros for converting segments. 339 * They do the same as those in arch/i386/kernel/process.c in Linux. 340 */ 341 #define LINUX_GET_BASE(desc) \ 342 ((((desc)->a >> 16) & LINUX_LOWERWORD) | \ 343 (((desc)->b << 16) & 0x00ff0000) | \ 344 ((desc)->b & 0xff000000)) 345 346 #define LINUX_GET_LIMIT(desc) \ 347 (((desc)->a & LINUX_LOWERWORD) | \ 348 ((desc)->b & 0xf0000)) 349 350 #define LINUX_GET_32BIT(desc) \ 351 (((desc)->b >> LINUX_ENTRY_B_SEG32BIT) & 1) 352 #define LINUX_GET_CONTENTS(desc) \ 353 (((desc)->b >> LINUX_ENTRY_B_CONTENTS) & 3) 354 #define LINUX_GET_WRITABLE(desc) \ 355 (((desc)->b >> LINUX_ENTRY_B_READ_EXEC_ONLY) & 1) 356 #define LINUX_GET_LIMIT_PAGES(desc) \ 357 (((desc)->b >> LINUX_ENTRY_B_LIMIT) & 1) 358 #define LINUX_GET_PRESENT(desc) \ 359 (((desc)->b >> LINUX_ENTRY_B_SEG_NOT_PRESENT) & 1) 360 #define LINUX_GET_USEABLE(desc) \ 361 (((desc)->b >> LINUX_ENTRY_B_USEABLE) & 1) 362 363 #define linux_copyout_rusage(r, u) copyout(r, u, sizeof(*r)) 364 365 /* This corresponds to 'struct user_regs_struct' in Linux. */ 366 struct linux_pt_regset { 367 l_uint ebx; 368 l_uint ecx; 369 l_uint edx; 370 l_uint esi; 371 l_uint edi; 372 l_uint ebp; 373 l_uint eax; 374 l_uint ds; 375 l_uint es; 376 l_uint fs; 377 l_uint gs; 378 l_uint orig_eax; 379 l_uint eip; 380 l_uint cs; 381 l_uint eflags; 382 l_uint esp; 383 l_uint ss; 384 }; 385 386 #ifdef _KERNEL 387 struct reg; 388 389 void bsd_to_linux_regset(const struct reg *b_reg, 390 struct linux_pt_regset *l_regset); 391 #endif /* _KERNEL */ 392 393 #endif /* !_I386_LINUX_H_ */ 394