16a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines//===-- sanitizer_freebsd.h -------------------------------------*- C++ -*-===// 26a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// 36a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// The LLVM Compiler Infrastructure 46a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// 56a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// This file is distributed under the University of Illinois Open Source 66a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// License. See LICENSE.TXT for details. 76a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// 86a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines//===----------------------------------------------------------------------===// 96a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// 106a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// This file is a part of Sanitizer runtime. It contains FreeBSD-specific 116a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// definitions. 126a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// 136a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines//===----------------------------------------------------------------------===// 146a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 156a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#ifndef SANITIZER_FREEBSD_H 166a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#define SANITIZER_FREEBSD_H 176a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 186a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#include "sanitizer_internal_defs.h" 196a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 206a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// x86-64 FreeBSD 9.2 and older define 'ucontext_t' incorrectly in 216a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// 32-bit mode. 226a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#if SANITIZER_FREEBSD && (SANITIZER_WORDSIZE == 32) 236a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines# include <osreldate.h> 246a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines# if __FreeBSD_version <= 902001 // v9.2 256d1862363c88c183b0ed7740fca876342cf0474bStephen Hines# include <link.h> 266d1862363c88c183b0ed7740fca876342cf0474bStephen Hines# include <sys/param.h> 276a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines# include <ucontext.h> 286a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 296a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinesnamespace __sanitizer { 306a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 316d1862363c88c183b0ed7740fca876342cf0474bStephen Hinestypedef unsigned long long __xuint64_t; 326d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 336a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinestypedef __int32_t __xregister_t; 346a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 356a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinestypedef struct __xmcontext { 366a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines __xregister_t mc_onstack; 376a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines __xregister_t mc_gs; 386a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines __xregister_t mc_fs; 396a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines __xregister_t mc_es; 406a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines __xregister_t mc_ds; 416a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines __xregister_t mc_edi; 426a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines __xregister_t mc_esi; 436a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines __xregister_t mc_ebp; 446a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines __xregister_t mc_isp; 456a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines __xregister_t mc_ebx; 466a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines __xregister_t mc_edx; 476a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines __xregister_t mc_ecx; 486a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines __xregister_t mc_eax; 496a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines __xregister_t mc_trapno; 506a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines __xregister_t mc_err; 516a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines __xregister_t mc_eip; 526a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines __xregister_t mc_cs; 536a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines __xregister_t mc_eflags; 546a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines __xregister_t mc_esp; 556a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines __xregister_t mc_ss; 566a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 576a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines int mc_len; 586a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines int mc_fpformat; 596a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines int mc_ownedfp; 606a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines __xregister_t mc_flags; 616a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 626a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines int mc_fpstate[128] __aligned(16); 636a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines __xregister_t mc_fsbase; 646a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines __xregister_t mc_gsbase; 656a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines __xregister_t mc_xfpustate; 666a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines __xregister_t mc_xfpustate_len; 676a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 686a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines int mc_spare2[4]; 696a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines} xmcontext_t; 706a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 716a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinestypedef struct __xucontext { 726a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines sigset_t uc_sigmask; 736a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines xmcontext_t uc_mcontext; 746a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 756a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines struct __ucontext *uc_link; 766a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines stack_t uc_stack; 776a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines int uc_flags; 786a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines int __spare__[4]; 796a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines} xucontext_t; 806a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 816d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesstruct xkinfo_vmentry { 826d1862363c88c183b0ed7740fca876342cf0474bStephen Hines int kve_structsize; 836d1862363c88c183b0ed7740fca876342cf0474bStephen Hines int kve_type; 846d1862363c88c183b0ed7740fca876342cf0474bStephen Hines __xuint64_t kve_start; 856d1862363c88c183b0ed7740fca876342cf0474bStephen Hines __xuint64_t kve_end; 866d1862363c88c183b0ed7740fca876342cf0474bStephen Hines __xuint64_t kve_offset; 876d1862363c88c183b0ed7740fca876342cf0474bStephen Hines __xuint64_t kve_vn_fileid; 886d1862363c88c183b0ed7740fca876342cf0474bStephen Hines __uint32_t kve_vn_fsid; 896d1862363c88c183b0ed7740fca876342cf0474bStephen Hines int kve_flags; 906d1862363c88c183b0ed7740fca876342cf0474bStephen Hines int kve_resident; 916d1862363c88c183b0ed7740fca876342cf0474bStephen Hines int kve_private_resident; 926d1862363c88c183b0ed7740fca876342cf0474bStephen Hines int kve_protection; 936d1862363c88c183b0ed7740fca876342cf0474bStephen Hines int kve_ref_count; 946d1862363c88c183b0ed7740fca876342cf0474bStephen Hines int kve_shadow_count; 956d1862363c88c183b0ed7740fca876342cf0474bStephen Hines int kve_vn_type; 966d1862363c88c183b0ed7740fca876342cf0474bStephen Hines __xuint64_t kve_vn_size; 976d1862363c88c183b0ed7740fca876342cf0474bStephen Hines __uint32_t kve_vn_rdev; 986d1862363c88c183b0ed7740fca876342cf0474bStephen Hines __uint16_t kve_vn_mode; 996d1862363c88c183b0ed7740fca876342cf0474bStephen Hines __uint16_t kve_status; 1006d1862363c88c183b0ed7740fca876342cf0474bStephen Hines int _kve_ispare[12]; 1016d1862363c88c183b0ed7740fca876342cf0474bStephen Hines char kve_path[PATH_MAX]; 1026d1862363c88c183b0ed7740fca876342cf0474bStephen Hines}; 1036d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 1046d1862363c88c183b0ed7740fca876342cf0474bStephen Hinestypedef struct { 1056d1862363c88c183b0ed7740fca876342cf0474bStephen Hines __uint32_t p_type; 1066d1862363c88c183b0ed7740fca876342cf0474bStephen Hines __uint32_t p_offset; 1076d1862363c88c183b0ed7740fca876342cf0474bStephen Hines __uint32_t p_vaddr; 1086d1862363c88c183b0ed7740fca876342cf0474bStephen Hines __uint32_t p_paddr; 1096d1862363c88c183b0ed7740fca876342cf0474bStephen Hines __uint32_t p_filesz; 1106d1862363c88c183b0ed7740fca876342cf0474bStephen Hines __uint32_t p_memsz; 1116d1862363c88c183b0ed7740fca876342cf0474bStephen Hines __uint32_t p_flags; 1126d1862363c88c183b0ed7740fca876342cf0474bStephen Hines __uint32_t p_align; 1136d1862363c88c183b0ed7740fca876342cf0474bStephen Hines} XElf32_Phdr; 1146d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 1156d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesstruct xdl_phdr_info { 1166d1862363c88c183b0ed7740fca876342cf0474bStephen Hines Elf_Addr dlpi_addr; 1176d1862363c88c183b0ed7740fca876342cf0474bStephen Hines const char *dlpi_name; 1186d1862363c88c183b0ed7740fca876342cf0474bStephen Hines const XElf32_Phdr *dlpi_phdr; 1196d1862363c88c183b0ed7740fca876342cf0474bStephen Hines Elf_Half dlpi_phnum; 1206d1862363c88c183b0ed7740fca876342cf0474bStephen Hines unsigned long long int dlpi_adds; 1216d1862363c88c183b0ed7740fca876342cf0474bStephen Hines unsigned long long int dlpi_subs; 1226d1862363c88c183b0ed7740fca876342cf0474bStephen Hines size_t dlpi_tls_modid; 1236d1862363c88c183b0ed7740fca876342cf0474bStephen Hines void *dlpi_tls_data; 1246d1862363c88c183b0ed7740fca876342cf0474bStephen Hines}; 1256d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 1266d1862363c88c183b0ed7740fca876342cf0474bStephen Hinestypedef int (*__xdl_iterate_hdr_callback)(struct xdl_phdr_info*, size_t, void*); 1276d1862363c88c183b0ed7740fca876342cf0474bStephen Hinestypedef int xdl_iterate_phdr_t(__xdl_iterate_hdr_callback, void*); 1286d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 1296d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#define xdl_iterate_phdr(callback, param) \ 1306d1862363c88c183b0ed7740fca876342cf0474bStephen Hines (((xdl_iterate_phdr_t*) dl_iterate_phdr)((callback), (param))) 1316d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 1326a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines} // namespace __sanitizer 1336a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 1346a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines# endif // __FreeBSD_version <= 902001 1356a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#endif // SANITIZER_FREEBSD && (SANITIZER_WORDSIZE == 32) 1366a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 1376a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#endif // SANITIZER_FREEBSD_H 138