HV: Add elf header file for elf loader

Source: https://github.com/freebsd/freebsd-src/blob/main/sys/sys/elf_common.h
Trimed to meet the minimal requirements for the Zephyr elf file to be loaded
Also added elf file header data struct and program/section entry data structs.

Tracked-On: #6323

Signed-off-by: Zhou, Wu <wu.zhou@intel.com>
Reviewed-by: Victor Sun <victor.sun@intel.com>
Acked-by: Eddie Dong <eddie.dong@intel.com>
This commit is contained in:
Zhou, Wu 2021-08-05 15:00:52 +08:00 committed by wenlingz
parent c7a0562cf9
commit 306baa00bf
1 changed files with 161 additions and 0 deletions

View File

@ -0,0 +1,161 @@
/*
* Copyright (C) 2021 Intel Corporation.
*
* SPDX-License-Identifier: BSD-3-Clause
*
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
* Copyright (c) 2017, 2018 Dell EMC
* Copyright (c) 2000, 2001, 2008, 2011, David E. O'Brien
* Copyright (c) 1998 John D. Polstra.
* All rights reserved.
*/
/*
* source:
* https://github.com/freebsd/freebsd-src/blob/main/sys/sys/elf_common.h
*/
#ifndef ELF_H
#define ELF_H
/* Indexes into the e_ident array. Keep synced with
http://www.sco.com/developers/gabi/latest/ch4.eheader.html */
#define EI_MAG0 0 /* Magic number, byte 0. */
#define EI_MAG1 1 /* Magic number, byte 1. */
#define EI_MAG2 2 /* Magic number, byte 2. */
#define EI_MAG3 3 /* Magic number, byte 3. */
#define EI_CLASS 4 /* Class of machine. */
#define EI_DATA 5 /* Data format. */
#define EI_VERSION 6 /* ELF format version. */
#define EI_OSABI 7 /* Operating system / ABI identification */
#define EI_ABIVERSION 8 /* ABI version */
#define OLD_EI_BRAND 8 /* Start of architecture identification. */
#define EI_PAD 9 /* Start of padding (per SVR4 ABI). */
#define EI_NIDENT 16 /* Size of e_ident array. */
/* Values for the magic number bytes. */
#define ELFMAGIC 0x464C457f
/* Values for e_ident[EI_CLASS]. */
#define ELFCLASSNONE 0 /* Unknown class. */
#define ELFCLASS32 1 /* 32-bit architecture. */
#define ELFCLASS64 2 /* 64-bit architecture. */
/* Values for e_type of program entry */
#define ET_NONE 0 /* Unknown type. */
#define ET_REL 1 /* Relocatable. */
#define ET_EXEC 2 /* Executable. */
#define ET_DYN 3 /* Shared object. */
#define ET_CORE 4 /* Core file. */
#define ET_LOOS 0xfe00 /* First operating system specific. */
#define ET_HIOS 0xfeff /* Last operating system-specific. */
#define ET_LOPROC 0xff00 /* First processor-specific. */
#define ET_HIPROC 0xffff /* Last processor-specific. */
/* Values for p_type of program entry */
#define PT_NULL 0 /* Unused entry. */
#define PT_LOAD 1 /* Loadable segment. */
#define PT_DYNAMIC 2 /* Dynamic linking information segment. */
#define PT_INTERP 3 /* Pathname of interpreter. */
#define PT_NOTE 4 /* Auxiliary information. */
#define PT_SHLIB 5 /* Reserved (not used). */
#define PT_PHDR 6 /* Location of program header itself. */
#define PT_TLS 7 /* Thread local storage segment */
/* Header struct for elf64 file */
struct elf64_hdr
{
uint8_t e_ident[EI_NIDENT]; /*ELF identification */
uint16_t e_type; /*Object file type */
uint16_t e_machine; /*Machine type */
uint32_t e_version; /*Object file version */
uint64_t e_entry; /*Entry point address */
uint64_t e_phoff; /*Program header offset */
uint64_t e_shoff; /*Section header offset */
uint32_t e_flags; /*Processor-specific flags */
uint16_t e_ehsize; /*ELF header size */
uint16_t e_phentsize; /*Size of program header entry */
uint16_t e_phnum; /*Number of program header entries */
uint16_t e_shentsize; /*Size of section header entry */
uint16_t e_shnum; /*Number of section header entries */
uint16_t e_shstrndx; /*Section name string table index */
};
/* Program entry struct for elf64, describes segments loaded in ram*/
struct elf64_prog_entry
{
uint32_t p_type; /* Type of segment */
uint32_t p_flags; /* Segment attributes */
uint64_t p_offset; /* Offset in file */
uint64_t p_vaddr; /* Virtual address in memory */
uint64_t p_paddr; /* Physical address in memory */
uint64_t p_filesz; /* Size of segment in file */
uint64_t p_memsz; /* Size of segment in memory */
uint64_t p_align; /* Alignment of segment */
};
/* Section entry struct for elf64, contains sections info of the program*/
struct elf64_sec_entry
{
uint32_t sh_name; /*Section name */
uint32_t sh_type; /*Section type */
uint64_t sh_flags; /*Section attributes */
uint64_t sh_addr; /*Virtual address in memory */
uint64_t sh_offset; /*Offset in file */
uint64_t sh_size; /*Size of section */
uint32_t sh_link; /*Link to other section */
uint32_t sh_info; /*Miscellaneous information */
uint64_t sh_addralign; /*Address alignment boundary */
uint64_t sh_entsize; /*Size of entries, if section has table */
};
/* Header struct for elf32 file */
struct elf32_hdr
{
uint8_t e_ident[EI_NIDENT]; /*ELF identification */
uint16_t e_type; /*Object file type */
uint16_t e_machine; /*Machine type */
uint32_t e_version; /*Object file version */
uint32_t e_entry; /*Entry point address */
uint32_t e_phoff; /*Program header offset */
uint32_t e_shoff; /*Section header offset */
uint32_t e_flags; /*Processor-specific flags */
uint16_t e_ehsize; /*ELF header size */
uint16_t e_phentsize; /*Size of program header entry */
uint16_t e_phnum; /*Number of program header entries */
uint16_t e_shentsize; /*Size of section header entry */
uint16_t e_shnum; /*Number of section header entries */
uint16_t e_shstrndx; /*Section name string table index */
};
/* Program entry struct for elf32, describes segments loaded in ram*/
struct elf32_prog_entry
{
uint32_t p_type; /* Type of segment */
uint32_t p_offset; /* Offset in file */
uint32_t p_vaddr; /* Virtual address in memory */
uint32_t p_paddr; /* Physical address in memory */
uint32_t p_filesz; /* Size of segment in memory */
uint32_t p_memsz; /* Size of segment in file */
uint32_t p_flags; /* Segment attributes */
uint32_t p_align; /* Alignment of segment */
};
/* Section entry struct for elf32, contains sections info of the program*/
struct elf32_sec_entry
{
uint32_t sh_name;
uint32_t sh_type;
uint32_t sh_flags;
uint32_t sh_addr;
uint32_t sh_offset;
uint32_t sh_size;
uint32_t sh_link;
uint32_t sh_info;
uint32_t sh_addralign;
uint32_t sh_entsize;
};
#endif /* !ELF_H */