/** @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_ */
