75 lines
2.3 KiB
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));
|
|
}
|