fxBoot/src/hypervisor/internal/elf/header.c

75 lines
2.3 KiB
C

//---
// fxBoot:loader:header - Check ELF header
//---
#include "fxBoot/hypervisor.h"
#include "fxBoot/terminal.h"
#include "fxBoot/fs/smemfs.h"
#include "fxBoot/elf.h"
#include "./src/hypervisor/internal/elf.h"
/* error string list */
const struct hel_error_db header_error_db[] = {
{.id = hel_header_valid, .strerror = "valid"},
{.id = hel_header_size_error, .strerror = "size error"},
{.id = hel_header_magic_error, .strerror = "magic error"},
{.id = hel_header_class_error, .strerror = "class error"},
{.id = hel_header_indent_error, .strerror = "indent error"},
{.id = hel_header_type_error, .strerror = "type error"},
{.id = hel_header_machine_error, .strerror = "machine error"},
{.id = hel_header_version_error, .strerror = "version error"},
{.id = 0xdeb0cad0, .strerror = NULL},
};
/* hypervisor_elf_loader_header_error(): Display header error information */
int hypervisor_elf_loader_header_error(int errnum)
{
return (hypervisor_elf_loader_error(header_error_db,
"ELF header", errnum));
}
/* hypervisor_elf_loader_header_get(): Get ELF header and check validity */
int hypervisor_elf_loader_header_get(struct smemfs_inode *inode,
Elf32_Ehdr *header)
{
/* try to read the ELF header */
if (smemfs_pread(inode, header, sizeof(*header), 0) != sizeof(*header))
return (hel_header_size_error);
/* Check magic number */
if (header->e_ident[EI_MAG0] != ELFMAG0
|| header->e_ident[EI_MAG1] != ELFMAG1
|| header->e_ident[EI_MAG2] != ELFMAG2
|| header->e_ident[EI_MAG3] != ELFMAG3) {
return (hel_header_magic_error);
}
/* Check class */
if (header->e_ident[EI_CLASS] != ELFCLASS32)
return (hel_header_class_error);
/* Check data encoding */
if (header->e_ident[EI_DATA] != ELFDATA2MSB)
return (hel_header_indent_error);
/* Check ELF type */
if (header->e_type != ET_DYN && header->e_type != ET_EXEC)
return (hel_header_type_error);
/* Check ELF specifique instruction */
if (header->e_machine != EM_SH)
return (hel_header_machine_error);
/* Check ELF version */
if (header->e_version != EV_CURRENT)
return (hel_header_version_error);
return (hel_header_valid);
}
/* hypervisor_elf_loader_header_check(): Check ELF header validity */
int hypervisor_elf_loader_header_check(struct smemfs_inode *inode)
{
Elf32_Ehdr header;
return (hypervisor_elf_loader_header_get(inode, &header));
}