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_uint l_gid_t; 59 typedef l_ushort l_gid16_t; 60 typedef l_ulong l_ino_t; 61 typedef l_int l_key_t; 62 typedef l_longlong l_loff_t; 63 typedef l_ushort l_mode_t; 64 typedef l_long l_off_t; 65 typedef l_int l_pid_t; 66 typedef l_uint l_size_t; 67 typedef l_long l_suseconds_t; 68 typedef l_long l_time_t; 69 typedef l_longlong l_time64_t; 70 typedef l_uint l_uid_t; 71 typedef l_ushort l_uid16_t; 72 typedef l_int l_timer_t; 73 typedef l_int l_mqd_t; 74 typedef l_ulong l_fd_mask; 75 76 #include <compat/linux/linux_siginfo.h> 77 78 typedef struct { 79 l_int val[2]; 80 } l_fsid_t; 81 82 typedef struct { 83 l_time_t tv_sec; 84 l_suseconds_t tv_usec; 85 } l_timeval; 86 87 typedef struct { 88 l_time64_t tv_sec; 89 l_time64_t tv_usec; 90 } l_sock_timeval; 91 92 #define l_fd_set fd_set 93 94 /* 95 * Miscellaneous 96 */ 97 #define LINUX_AT_COUNT 21 /* Count of used aux entry types. 98 * Keep this synchronized with 99 * linux_copyout_auxargs() code. 100 */ 101 struct l___sysctl_args 102 { 103 l_int *name; 104 l_int nlen; 105 void *oldval; 106 l_size_t *oldlenp; 107 void *newval; 108 l_size_t newlen; 109 l_ulong __spare[4]; 110 }; 111 112 /* Resource limits */ 113 #define LINUX_RLIMIT_CPU 0 114 #define LINUX_RLIMIT_FSIZE 1 115 #define LINUX_RLIMIT_DATA 2 116 #define LINUX_RLIMIT_STACK 3 117 #define LINUX_RLIMIT_CORE 4 118 #define LINUX_RLIMIT_RSS 5 119 #define LINUX_RLIMIT_NPROC 6 120 #define LINUX_RLIMIT_NOFILE 7 121 #define LINUX_RLIMIT_MEMLOCK 8 122 #define LINUX_RLIMIT_AS 9 /* Address space limit */ 123 124 #define LINUX_RLIM_NLIMITS 10 125 126 struct l_rlimit { 127 l_ulong rlim_cur; 128 l_ulong rlim_max; 129 }; 130 131 struct l_mmap_argv { 132 l_uintptr_t addr; 133 l_size_t len; 134 l_int prot; 135 l_int flags; 136 l_int fd; 137 l_off_t pgoff; 138 }; 139 140 /* 141 * stat family of syscalls 142 */ 143 struct l_timespec { 144 l_time_t tv_sec; 145 l_long tv_nsec; 146 }; 147 148 /* __kernel_timespec */ 149 struct l_timespec64 { 150 l_time64_t tv_sec; 151 l_longlong tv_nsec; 152 }; 153 154 struct l_newstat { 155 l_ulong st_dev; 156 l_ulong st_ino; 157 l_ushort st_mode; 158 l_ushort st_nlink; 159 l_ushort st_uid; 160 l_ushort st_gid; 161 l_ulong st_rdev; 162 l_ulong st_size; 163 l_ulong st_blksize; 164 l_ulong st_blocks; 165 struct l_timespec st_atim; 166 struct l_timespec st_mtim; 167 struct l_timespec st_ctim; 168 l_ulong __unused4; 169 l_ulong __unused5; 170 }; 171 172 /* __old_kernel_stat now */ 173 struct l_old_stat { 174 l_ushort st_dev; 175 l_ulong st_ino; 176 l_ushort st_mode; 177 l_ushort st_nlink; 178 l_ushort st_uid; 179 l_ushort st_gid; 180 l_ushort st_rdev; 181 l_long st_size; 182 struct l_timespec st_atim; 183 struct l_timespec st_mtim; 184 struct l_timespec st_ctim; 185 l_long st_blksize; 186 l_long st_blocks; 187 l_ulong st_flags; 188 l_ulong st_gen; 189 }; 190 191 struct l_stat64 { 192 l_ulonglong st_dev; 193 u_char __pad0[4]; 194 l_ulong __st_ino; 195 l_uint st_mode; 196 l_uint st_nlink; 197 l_ulong st_uid; 198 l_ulong st_gid; 199 l_ulonglong st_rdev; 200 u_char __pad3[4]; 201 l_longlong st_size; 202 l_ulong st_blksize; 203 l_ulonglong st_blocks; 204 struct l_timespec st_atim; 205 struct l_timespec st_mtim; 206 struct l_timespec st_ctim; 207 l_ulonglong st_ino; 208 }; 209 210 struct l_statfs64 { 211 l_int f_type; 212 l_int f_bsize; 213 uint64_t f_blocks; 214 uint64_t f_bfree; 215 uint64_t f_bavail; 216 uint64_t f_files; 217 uint64_t f_ffree; 218 l_fsid_t f_fsid; 219 l_int f_namelen; 220 l_int f_frsize; 221 l_int f_flags; 222 l_int f_spare[4]; 223 }; 224 225 /* sigaction flags */ 226 #define LINUX_SA_NOCLDSTOP 0x00000001 227 #define LINUX_SA_NOCLDWAIT 0x00000002 228 #define LINUX_SA_SIGINFO 0x00000004 229 #define LINUX_SA_RESTORER 0x04000000 230 #define LINUX_SA_ONSTACK 0x08000000 231 #define LINUX_SA_RESTART 0x10000000 232 #define LINUX_SA_INTERRUPT 0x20000000 233 #define LINUX_SA_NOMASK 0x40000000 234 #define LINUX_SA_ONESHOT 0x80000000 235 236 /* sigaltstack */ 237 #define LINUX_MINSIGSTKSZ 2048 238 239 typedef void (*l_handler_t)(l_int); 240 typedef l_ulong l_osigset_t; 241 242 typedef struct { 243 l_handler_t lsa_handler; 244 l_osigset_t lsa_mask; 245 l_ulong lsa_flags; 246 void (*lsa_restorer)(void); 247 } l_osigaction_t; 248 249 typedef struct { 250 l_handler_t lsa_handler; 251 l_ulong lsa_flags; 252 void (*lsa_restorer)(void); 253 l_sigset_t lsa_mask; 254 } l_sigaction_t; 255 256 typedef struct { 257 l_uintptr_t ss_sp; 258 l_int ss_flags; 259 l_size_t ss_size; 260 } l_stack_t; 261 262 extern struct sysentvec linux_sysvec; 263 264 /* 265 * arch specific open/fcntl flags 266 */ 267 #define LINUX_F_GETLK64 12 268 #define LINUX_F_SETLK64 13 269 #define LINUX_F_SETLKW64 14 270 271 union l_semun { 272 l_int val; 273 l_uintptr_t buf; 274 l_ushort *array; 275 l_uintptr_t __buf; 276 l_uintptr_t __pad; 277 }; 278 279 struct l_user_desc { 280 l_uint entry_number; 281 l_uint base_addr; 282 l_uint limit; 283 l_uint seg_32bit:1; 284 l_uint contents:2; 285 l_uint read_exec_only:1; 286 l_uint limit_in_pages:1; 287 l_uint seg_not_present:1; 288 l_uint useable:1; 289 }; 290 291 struct l_desc_struct { 292 unsigned long a, b; 293 }; 294 295 #define LINUX_LOWERWORD 0x0000ffff 296 297 /* 298 * Macros which does the same thing as those in Linux include/asm-um/ldt-i386.h. 299 * These convert Linux user space descriptor to machine one. 300 */ 301 #define LINUX_LDT_entry_a(info) \ 302 ((((info)->base_addr & LINUX_LOWERWORD) << 16) | \ 303 ((info)->limit & LINUX_LOWERWORD)) 304 305 #define LINUX_ENTRY_B_READ_EXEC_ONLY 9 306 #define LINUX_ENTRY_B_CONTENTS 10 307 #define LINUX_ENTRY_B_SEG_NOT_PRESENT 15 308 #define LINUX_ENTRY_B_BASE_ADDR 16 309 #define LINUX_ENTRY_B_USEABLE 20 310 #define LINUX_ENTRY_B_SEG32BIT 22 311 #define LINUX_ENTRY_B_LIMIT 23 312 313 #define LINUX_LDT_entry_b(info) \ 314 (((info)->base_addr & 0xff000000) | \ 315 ((info)->limit & 0xf0000) | \ 316 ((info)->contents << LINUX_ENTRY_B_CONTENTS) | \ 317 (((info)->seg_not_present == 0) << LINUX_ENTRY_B_SEG_NOT_PRESENT) | \ 318 (((info)->base_addr & 0x00ff0000) >> LINUX_ENTRY_B_BASE_ADDR) | \ 319 (((info)->read_exec_only == 0) << LINUX_ENTRY_B_READ_EXEC_ONLY) | \ 320 ((info)->seg_32bit << LINUX_ENTRY_B_SEG32BIT) | \ 321 ((info)->useable << LINUX_ENTRY_B_USEABLE) | \ 322 ((info)->limit_in_pages << LINUX_ENTRY_B_LIMIT) | 0x7000) 323 324 #define LINUX_LDT_empty(info) \ 325 ((info)->base_addr == 0 && \ 326 (info)->limit == 0 && \ 327 (info)->contents == 0 && \ 328 (info)->seg_not_present == 1 && \ 329 (info)->read_exec_only == 1 && \ 330 (info)->seg_32bit == 0 && \ 331 (info)->limit_in_pages == 0 && \ 332 (info)->useable == 0) 333 334 /* 335 * Macros for converting segments. 336 * They do the same as those in arch/i386/kernel/process.c in Linux. 337 */ 338 #define LINUX_GET_BASE(desc) \ 339 ((((desc)->a >> 16) & LINUX_LOWERWORD) | \ 340 (((desc)->b << 16) & 0x00ff0000) | \ 341 ((desc)->b & 0xff000000)) 342 343 #define LINUX_GET_LIMIT(desc) \ 344 (((desc)->a & LINUX_LOWERWORD) | \ 345 ((desc)->b & 0xf0000)) 346 347 #define LINUX_GET_32BIT(desc) \ 348 (((desc)->b >> LINUX_ENTRY_B_SEG32BIT) & 1) 349 #define LINUX_GET_CONTENTS(desc) \ 350 (((desc)->b >> LINUX_ENTRY_B_CONTENTS) & 3) 351 #define LINUX_GET_WRITABLE(desc) \ 352 (((desc)->b >> LINUX_ENTRY_B_READ_EXEC_ONLY) & 1) 353 #define LINUX_GET_LIMIT_PAGES(desc) \ 354 (((desc)->b >> LINUX_ENTRY_B_LIMIT) & 1) 355 #define LINUX_GET_PRESENT(desc) \ 356 (((desc)->b >> LINUX_ENTRY_B_SEG_NOT_PRESENT) & 1) 357 #define LINUX_GET_USEABLE(desc) \ 358 (((desc)->b >> LINUX_ENTRY_B_USEABLE) & 1) 359 360 #define linux_copyout_rusage(r, u) copyout(r, u, sizeof(*r)) 361 362 /* This corresponds to 'struct user_regs_struct' in Linux. */ 363 struct linux_pt_regset { 364 l_uint ebx; 365 l_uint ecx; 366 l_uint edx; 367 l_uint esi; 368 l_uint edi; 369 l_uint ebp; 370 l_uint eax; 371 l_uint ds; 372 l_uint es; 373 l_uint fs; 374 l_uint gs; 375 l_uint orig_eax; 376 l_uint eip; 377 l_uint cs; 378 l_uint eflags; 379 l_uint esp; 380 l_uint ss; 381 }; 382 383 #ifdef _KERNEL 384 struct reg; 385 386 void bsd_to_linux_regset(const struct reg *b_reg, 387 struct linux_pt_regset *l_regset); 388 #endif /* _KERNEL */ 389 390 #endif /* !_I386_LINUX_H_ */ 391