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