1*7c3d14c8STreehugger Robot //===-- sanitizer_freebsd.h -------------------------------------*- C++ -*-===// 2*7c3d14c8STreehugger Robot // 3*7c3d14c8STreehugger Robot // The LLVM Compiler Infrastructure 4*7c3d14c8STreehugger Robot // 5*7c3d14c8STreehugger Robot // This file is distributed under the University of Illinois Open Source 6*7c3d14c8STreehugger Robot // License. See LICENSE.TXT for details. 7*7c3d14c8STreehugger Robot // 8*7c3d14c8STreehugger Robot //===----------------------------------------------------------------------===// 9*7c3d14c8STreehugger Robot // 10*7c3d14c8STreehugger Robot // This file is a part of Sanitizer runtime. It contains FreeBSD-specific 11*7c3d14c8STreehugger Robot // definitions. 12*7c3d14c8STreehugger Robot // 13*7c3d14c8STreehugger Robot //===----------------------------------------------------------------------===// 14*7c3d14c8STreehugger Robot 15*7c3d14c8STreehugger Robot #ifndef SANITIZER_FREEBSD_H 16*7c3d14c8STreehugger Robot #define SANITIZER_FREEBSD_H 17*7c3d14c8STreehugger Robot 18*7c3d14c8STreehugger Robot #include "sanitizer_internal_defs.h" 19*7c3d14c8STreehugger Robot 20*7c3d14c8STreehugger Robot // x86-64 FreeBSD 9.2 and older define 'ucontext_t' incorrectly in 21*7c3d14c8STreehugger Robot // 32-bit mode. 22*7c3d14c8STreehugger Robot #if SANITIZER_FREEBSD && (SANITIZER_WORDSIZE == 32) 23*7c3d14c8STreehugger Robot # include <osreldate.h> 24*7c3d14c8STreehugger Robot # if __FreeBSD_version <= 902001 // v9.2 25*7c3d14c8STreehugger Robot # include <link.h> 26*7c3d14c8STreehugger Robot # include <sys/param.h> 27*7c3d14c8STreehugger Robot # include <ucontext.h> 28*7c3d14c8STreehugger Robot 29*7c3d14c8STreehugger Robot namespace __sanitizer { 30*7c3d14c8STreehugger Robot 31*7c3d14c8STreehugger Robot typedef unsigned long long __xuint64_t; 32*7c3d14c8STreehugger Robot 33*7c3d14c8STreehugger Robot typedef __int32_t __xregister_t; 34*7c3d14c8STreehugger Robot 35*7c3d14c8STreehugger Robot typedef struct __xmcontext { 36*7c3d14c8STreehugger Robot __xregister_t mc_onstack; 37*7c3d14c8STreehugger Robot __xregister_t mc_gs; 38*7c3d14c8STreehugger Robot __xregister_t mc_fs; 39*7c3d14c8STreehugger Robot __xregister_t mc_es; 40*7c3d14c8STreehugger Robot __xregister_t mc_ds; 41*7c3d14c8STreehugger Robot __xregister_t mc_edi; 42*7c3d14c8STreehugger Robot __xregister_t mc_esi; 43*7c3d14c8STreehugger Robot __xregister_t mc_ebp; 44*7c3d14c8STreehugger Robot __xregister_t mc_isp; 45*7c3d14c8STreehugger Robot __xregister_t mc_ebx; 46*7c3d14c8STreehugger Robot __xregister_t mc_edx; 47*7c3d14c8STreehugger Robot __xregister_t mc_ecx; 48*7c3d14c8STreehugger Robot __xregister_t mc_eax; 49*7c3d14c8STreehugger Robot __xregister_t mc_trapno; 50*7c3d14c8STreehugger Robot __xregister_t mc_err; 51*7c3d14c8STreehugger Robot __xregister_t mc_eip; 52*7c3d14c8STreehugger Robot __xregister_t mc_cs; 53*7c3d14c8STreehugger Robot __xregister_t mc_eflags; 54*7c3d14c8STreehugger Robot __xregister_t mc_esp; 55*7c3d14c8STreehugger Robot __xregister_t mc_ss; 56*7c3d14c8STreehugger Robot 57*7c3d14c8STreehugger Robot int mc_len; 58*7c3d14c8STreehugger Robot int mc_fpformat; 59*7c3d14c8STreehugger Robot int mc_ownedfp; 60*7c3d14c8STreehugger Robot __xregister_t mc_flags; 61*7c3d14c8STreehugger Robot 62*7c3d14c8STreehugger Robot int mc_fpstate[128] __aligned(16); 63*7c3d14c8STreehugger Robot __xregister_t mc_fsbase; 64*7c3d14c8STreehugger Robot __xregister_t mc_gsbase; 65*7c3d14c8STreehugger Robot __xregister_t mc_xfpustate; 66*7c3d14c8STreehugger Robot __xregister_t mc_xfpustate_len; 67*7c3d14c8STreehugger Robot 68*7c3d14c8STreehugger Robot int mc_spare2[4]; 69*7c3d14c8STreehugger Robot } xmcontext_t; 70*7c3d14c8STreehugger Robot 71*7c3d14c8STreehugger Robot typedef struct __xucontext { 72*7c3d14c8STreehugger Robot sigset_t uc_sigmask; 73*7c3d14c8STreehugger Robot xmcontext_t uc_mcontext; 74*7c3d14c8STreehugger Robot 75*7c3d14c8STreehugger Robot struct __ucontext *uc_link; 76*7c3d14c8STreehugger Robot stack_t uc_stack; 77*7c3d14c8STreehugger Robot int uc_flags; 78*7c3d14c8STreehugger Robot int __spare__[4]; 79*7c3d14c8STreehugger Robot } xucontext_t; 80*7c3d14c8STreehugger Robot 81*7c3d14c8STreehugger Robot struct xkinfo_vmentry { 82*7c3d14c8STreehugger Robot int kve_structsize; 83*7c3d14c8STreehugger Robot int kve_type; 84*7c3d14c8STreehugger Robot __xuint64_t kve_start; 85*7c3d14c8STreehugger Robot __xuint64_t kve_end; 86*7c3d14c8STreehugger Robot __xuint64_t kve_offset; 87*7c3d14c8STreehugger Robot __xuint64_t kve_vn_fileid; 88*7c3d14c8STreehugger Robot __uint32_t kve_vn_fsid; 89*7c3d14c8STreehugger Robot int kve_flags; 90*7c3d14c8STreehugger Robot int kve_resident; 91*7c3d14c8STreehugger Robot int kve_private_resident; 92*7c3d14c8STreehugger Robot int kve_protection; 93*7c3d14c8STreehugger Robot int kve_ref_count; 94*7c3d14c8STreehugger Robot int kve_shadow_count; 95*7c3d14c8STreehugger Robot int kve_vn_type; 96*7c3d14c8STreehugger Robot __xuint64_t kve_vn_size; 97*7c3d14c8STreehugger Robot __uint32_t kve_vn_rdev; 98*7c3d14c8STreehugger Robot __uint16_t kve_vn_mode; 99*7c3d14c8STreehugger Robot __uint16_t kve_status; 100*7c3d14c8STreehugger Robot int _kve_ispare[12]; 101*7c3d14c8STreehugger Robot char kve_path[PATH_MAX]; 102*7c3d14c8STreehugger Robot }; 103*7c3d14c8STreehugger Robot 104*7c3d14c8STreehugger Robot typedef struct { 105*7c3d14c8STreehugger Robot __uint32_t p_type; 106*7c3d14c8STreehugger Robot __uint32_t p_offset; 107*7c3d14c8STreehugger Robot __uint32_t p_vaddr; 108*7c3d14c8STreehugger Robot __uint32_t p_paddr; 109*7c3d14c8STreehugger Robot __uint32_t p_filesz; 110*7c3d14c8STreehugger Robot __uint32_t p_memsz; 111*7c3d14c8STreehugger Robot __uint32_t p_flags; 112*7c3d14c8STreehugger Robot __uint32_t p_align; 113*7c3d14c8STreehugger Robot } XElf32_Phdr; 114*7c3d14c8STreehugger Robot 115*7c3d14c8STreehugger Robot struct xdl_phdr_info { 116*7c3d14c8STreehugger Robot Elf_Addr dlpi_addr; 117*7c3d14c8STreehugger Robot const char *dlpi_name; 118*7c3d14c8STreehugger Robot const XElf32_Phdr *dlpi_phdr; 119*7c3d14c8STreehugger Robot Elf_Half dlpi_phnum; 120*7c3d14c8STreehugger Robot unsigned long long int dlpi_adds; 121*7c3d14c8STreehugger Robot unsigned long long int dlpi_subs; 122*7c3d14c8STreehugger Robot size_t dlpi_tls_modid; 123*7c3d14c8STreehugger Robot void *dlpi_tls_data; 124*7c3d14c8STreehugger Robot }; 125*7c3d14c8STreehugger Robot 126*7c3d14c8STreehugger Robot typedef int (*__xdl_iterate_hdr_callback)(struct xdl_phdr_info*, size_t, void*); 127*7c3d14c8STreehugger Robot typedef int xdl_iterate_phdr_t(__xdl_iterate_hdr_callback, void*); 128*7c3d14c8STreehugger Robot 129*7c3d14c8STreehugger Robot #define xdl_iterate_phdr(callback, param) \ 130*7c3d14c8STreehugger Robot (((xdl_iterate_phdr_t*) dl_iterate_phdr)((callback), (param))) 131*7c3d14c8STreehugger Robot 132*7c3d14c8STreehugger Robot } // namespace __sanitizer 133*7c3d14c8STreehugger Robot 134*7c3d14c8STreehugger Robot # endif // __FreeBSD_version <= 902001 135*7c3d14c8STreehugger Robot #endif // SANITIZER_FREEBSD && (SANITIZER_WORDSIZE == 32) 136*7c3d14c8STreehugger Robot 137*7c3d14c8STreehugger Robot #endif // SANITIZER_FREEBSD_H 138