//===-- sanitizer_freebsd.h -------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file is a part of Sanitizer runtime. It contains FreeBSD-specific
// definitions.
//
//===----------------------------------------------------------------------===//

#ifndef SANITIZER_FREEBSD_H
#define SANITIZER_FREEBSD_H

#include "sanitizer_internal_defs.h"

// x86-64 FreeBSD 9.2 and older define 'ucontext_t' incorrectly in
// 32-bit mode.
#if SANITIZER_FREEBSD && (SANITIZER_WORDSIZE == 32)
#include <osreldate.h>
#if __FreeBSD_version <= 902001  // v9.2
#include <link.h>
#include <sys/param.h>
#include <ucontext.h>

namespace __sanitizer {

typedef unsigned long long __xuint64_t;

typedef __int32_t __xregister_t;

typedef struct __xmcontext {
  __xregister_t mc_onstack;
  __xregister_t mc_gs;
  __xregister_t mc_fs;
  __xregister_t mc_es;
  __xregister_t mc_ds;
  __xregister_t mc_edi;
  __xregister_t mc_esi;
  __xregister_t mc_ebp;
  __xregister_t mc_isp;
  __xregister_t mc_ebx;
  __xregister_t mc_edx;
  __xregister_t mc_ecx;
  __xregister_t mc_eax;
  __xregister_t mc_trapno;
  __xregister_t mc_err;
  __xregister_t mc_eip;
  __xregister_t mc_cs;
  __xregister_t mc_eflags;
  __xregister_t mc_esp;
  __xregister_t mc_ss;

  int mc_len;
  int mc_fpformat;
  int mc_ownedfp;
  __xregister_t mc_flags;

  int mc_fpstate[128] __aligned(16);
  __xregister_t mc_fsbase;
  __xregister_t mc_gsbase;
  __xregister_t mc_xfpustate;
  __xregister_t mc_xfpustate_len;

  int mc_spare2[4];
} xmcontext_t;

typedef struct __xucontext {
  sigset_t uc_sigmask;
  xmcontext_t uc_mcontext;

  struct __ucontext *uc_link;
  stack_t uc_stack;
  int uc_flags;
  int __spare__[4];
} xucontext_t;

struct xkinfo_vmentry {
  int kve_structsize;
  int kve_type;
  __xuint64_t kve_start;
  __xuint64_t kve_end;
  __xuint64_t kve_offset;
  __xuint64_t kve_vn_fileid;
  __uint32_t kve_vn_fsid;
  int kve_flags;
  int kve_resident;
  int kve_private_resident;
  int kve_protection;
  int kve_ref_count;
  int kve_shadow_count;
  int kve_vn_type;
  __xuint64_t kve_vn_size;
  __uint32_t kve_vn_rdev;
  __uint16_t kve_vn_mode;
  __uint16_t kve_status;
  int _kve_ispare[12];
  char kve_path[PATH_MAX];
};

typedef struct {
  __uint32_t p_type;
  __uint32_t p_offset;
  __uint32_t p_vaddr;
  __uint32_t p_paddr;
  __uint32_t p_filesz;
  __uint32_t p_memsz;
  __uint32_t p_flags;
  __uint32_t p_align;
} XElf32_Phdr;

struct xdl_phdr_info {
  Elf_Addr dlpi_addr;
  const char *dlpi_name;
  const XElf32_Phdr *dlpi_phdr;
  Elf_Half dlpi_phnum;
  unsigned long long int dlpi_adds;
  unsigned long long int dlpi_subs;
  size_t dlpi_tls_modid;
  void *dlpi_tls_data;
};

typedef int (*__xdl_iterate_hdr_callback)(struct xdl_phdr_info *, size_t,
                                          void *);
typedef int xdl_iterate_phdr_t(__xdl_iterate_hdr_callback, void *);

#define xdl_iterate_phdr(callback, param) \
  (((xdl_iterate_phdr_t *)dl_iterate_phdr)((callback), (param)))

}  // namespace __sanitizer

#endif  // __FreeBSD_version <= 902001
#endif  // SANITIZER_FREEBSD && (SANITIZER_WORDSIZE == 32)

#endif  // SANITIZER_FREEBSD_H
