/*-
 * 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.13 2006/10/17 05:43:30 jkoshy Exp $
 */

#ifndef _SYS_ELF32_H_
#define _SYS_ELF32_H_ 1

#include "elf_common.h"

/*
 * ELF definitions common to all 32-bit architectures.
 */

typedef uint32_t	Elf32_Addr;
typedef uint16_t	Elf32_Half;
typedef uint32_t	Elf32_Off;
typedef int32_t		Elf32_Sword;
typedef uint32_t	Elf32_Word;
typedef uint64_t	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_ */
