sanitizer_freebsd.h 3.2 KB

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