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