/** @file
Ported ELF include files from FreeBSD

Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent


**/
/*-
 * Copyright (c) 1996-1998 John D. Polstra.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * $FreeBSD: src/sys/sys/elf32.h,v 1.8.14.2 2007/12/03 21:30:36 marius Exp $
 */

#ifndef _SYS_ELF32_H_
#define _SYS_ELF32_H_ 1


/*
 * ELF definitions common to all 32-bit architectures.
 */

typedef UINT32  Elf32_Addr;
typedef UINT16  Elf32_Half;
typedef UINT32  Elf32_Off;
typedef INT32    Elf32_Sword;
typedef UINT32  Elf32_Word;
typedef UINT64  Elf32_Lword;

typedef Elf32_Word  Elf32_Hashelt;

/* Non-standard class-dependent datatype used for abstraction. */
typedef Elf32_Word  Elf32_Size;
typedef Elf32_Sword  Elf32_Ssize;

/*
 * ELF header.
 */

typedef struct {
  unsigned char  e_ident[EI_NIDENT];  /* File identification. */
  Elf32_Half  e_type;    /* File type. */
  Elf32_Half  e_machine;  /* Machine architecture. */
  Elf32_Word  e_version;  /* ELF format version. */
  Elf32_Addr  e_entry;  /* Entry point. */
  Elf32_Off  e_phoff;  /* Program header file offset. */
  Elf32_Off  e_shoff;  /* Section header file offset. */
  Elf32_Word  e_flags;  /* Architecture-specific flags. */
  Elf32_Half  e_ehsize;  /* Size of ELF header in bytes. */
  Elf32_Half  e_phentsize;  /* Size of program header entry. */
  Elf32_Half  e_phnum;  /* Number of program header entries. */
  Elf32_Half  e_shentsize;  /* Size of section header entry. */
  Elf32_Half  e_shnum;  /* Number of section header entries. */
  Elf32_Half  e_shstrndx;  /* Section name strings section. */
} Elf32_Ehdr;

/*
 * Section header.
 */

typedef struct {
  Elf32_Word  sh_name;  /* Section name (index into the
             section header string table). */
  Elf32_Word  sh_type;  /* Section type. */
  Elf32_Word  sh_flags;  /* Section flags. */
  Elf32_Addr  sh_addr;  /* Address in memory image. */
  Elf32_Off  sh_offset;  /* Offset in file. */
  Elf32_Word  sh_size;  /* Size in bytes. */
  Elf32_Word  sh_link;  /* Index of a related section. */
  Elf32_Word  sh_info;  /* Depends on section type. */
  Elf32_Word  sh_addralign;  /* Alignment in bytes. */
  Elf32_Word  sh_entsize;  /* Size of each entry in section. */
} Elf32_Shdr;

/*
 * Program header.
 */

typedef struct {
  Elf32_Word  p_type;    /* Entry type. */
  Elf32_Off  p_offset;  /* File offset of contents. */
  Elf32_Addr  p_vaddr;  /* Virtual address in memory image. */
  Elf32_Addr  p_paddr;  /* Physical address (not used). */
  Elf32_Word  p_filesz;  /* Size of contents in file. */
  Elf32_Word  p_memsz;  /* Size of contents in memory. */
  Elf32_Word  p_flags;  /* Access permission flags. */
  Elf32_Word  p_align;  /* Alignment in memory and file. */
} Elf32_Phdr;

/*
 * Dynamic structure.  The ".dynamic" section contains an array of them.
 */

typedef struct {
  Elf32_Sword  d_tag;    /* Entry type. */
  union {
    Elf32_Word  d_val;  /* Integer value. */
    Elf32_Addr  d_ptr;  /* Address value. */
  } d_un;
} Elf32_Dyn;

/*
 * Relocation entries.
 */

/* Relocations that don't need an addend field. */
typedef struct {
  Elf32_Addr  r_offset;  /* Location to be relocated. */
  Elf32_Word  r_info;    /* Relocation type and symbol index. */
} Elf32_Rel;

/* Relocations that need an addend field. */
typedef struct {
  Elf32_Addr  r_offset;  /* Location to be relocated. */
  Elf32_Word  r_info;    /* Relocation type and symbol index. */
  Elf32_Sword  r_addend;  /* Addend. */
} Elf32_Rela;

/* Macros for accessing the fields of r_info. */
#define ELF32_R_SYM(info)  ((info) >> 8)
#define ELF32_R_TYPE(info)  ((unsigned char)(info))

/* Macro for constructing r_info from field values. */
#define ELF32_R_INFO(sym, type)  (((sym) << 8) + (unsigned char)(type))

/*
 *  Note entry header
 */
typedef Elf_Note Elf32_Nhdr;

/*
 *  Move entry
 */
typedef struct {
  Elf32_Lword  m_value;  /* symbol value */
  Elf32_Word   m_info;    /* size + index */
  Elf32_Word  m_poffset;  /* symbol offset */
  Elf32_Half  m_repeat;  /* repeat count */
  Elf32_Half  m_stride;  /* stride info */
} Elf32_Move;

/*
 *  The macros compose and decompose values for Move.r_info
 *
 *  sym = ELF32_M_SYM(M.m_info)
 *  size = ELF32_M_SIZE(M.m_info)
 *  M.m_info = ELF32_M_INFO(sym, size)
 */
#define  ELF32_M_SYM(info)  ((info)>>8)
#define  ELF32_M_SIZE(info)  ((unsigned char)(info))
#define  ELF32_M_INFO(sym, size)  (((sym)<<8)+(unsigned char)(size))

/*
 *  Hardware/Software capabilities entry
 */
typedef struct {
  Elf32_Word  c_tag;    /* how to interpret value */
  union {
    Elf32_Word  c_val;
    Elf32_Addr  c_ptr;
  } c_un;
} Elf32_Cap;

/*
 * Symbol table entries.
 */

typedef struct {
  Elf32_Word  st_name;  /* String table index of name. */
  Elf32_Addr  st_value;  /* Symbol value. */
  Elf32_Word  st_size;  /* Size of associated object. */
  unsigned char  st_info;  /* Type and binding information. */
  unsigned char  st_other;  /* Reserved (not used). */
  Elf32_Half  st_shndx;  /* Section index of symbol. */
} Elf32_Sym;

/* Macros for accessing the fields of st_info. */
#define ELF32_ST_BIND(info)    ((info) >> 4)
#define ELF32_ST_TYPE(info)    ((info) & 0xf)

/* Macro for constructing st_info from field values. */
#define ELF32_ST_INFO(bind, type)  (((bind) << 4) + ((type) & 0xf))

/* Macro for accessing the fields of st_other. */
#define ELF32_ST_VISIBILITY(oth)  ((oth) & 0x3)

/* Structures used by Sun & GNU symbol versioning. */
typedef struct
{
  Elf32_Half  vd_version;
  Elf32_Half  vd_flags;
  Elf32_Half  vd_ndx;
  Elf32_Half  vd_cnt;
  Elf32_Word  vd_hash;
  Elf32_Word  vd_aux;
  Elf32_Word  vd_next;
} Elf32_Verdef;

typedef struct
{
  Elf32_Word  vda_name;
  Elf32_Word  vda_next;
} Elf32_Verdaux;

typedef struct
{
  Elf32_Half  vn_version;
  Elf32_Half  vn_cnt;
  Elf32_Word  vn_file;
  Elf32_Word  vn_aux;
  Elf32_Word  vn_next;
} Elf32_Verneed;

typedef struct
{
  Elf32_Word  vna_hash;
  Elf32_Half  vna_flags;
  Elf32_Half  vna_other;
  Elf32_Word  vna_name;
  Elf32_Word  vna_next;
} Elf32_Vernaux;

typedef Elf32_Half Elf32_Versym;

typedef struct {
  Elf32_Half  si_boundto;  /* direct bindings - symbol bound to */
  Elf32_Half  si_flags;  /* per symbol flags */
} Elf32_Syminfo;

#endif /* !_SYS_ELF32_H_ */
