69 lines
2.1 KiB
C
69 lines
2.1 KiB
C
#include "vxBoot/terminal.h"
|
|
#include "vxBoot/fs/smemfs.h"
|
|
#include "vxBoot/loader.h"
|
|
|
|
/* error string list */
|
|
const struct ld_error_db header_error_db[] = {
|
|
{.id = ld_header_valid, .strerror = "valid"},
|
|
{.id = ld_header_size_error, .strerror = "size error"},
|
|
{.id = ld_header_magic_error, .strerror = "magic error"},
|
|
{.id = ld_header_class_error, .strerror = "class error"},
|
|
{.id = ld_header_indent_error, .strerror = "indent error"},
|
|
{.id = ld_header_type_error, .strerror = "type error"},
|
|
{.id = ld_header_machine_error, .strerror = "machine error"},
|
|
{.id = ld_header_version_error, .strerror = "version error"},
|
|
{.id = 0xdeb0cad0, .strerror = NULL},
|
|
};
|
|
|
|
/* loader_header_error(): Display header error information */
|
|
int loader_header_error(int const errnum)
|
|
{
|
|
return (loader_error(header_error_db, "ELF header", errnum));
|
|
}
|
|
|
|
/* loader_header_get(): Get ELF header and check validity */
|
|
int loader_header_get(
|
|
struct smemfs_inode const * restrict const inode,
|
|
Elf32_Ehdr *header
|
|
) {
|
|
/* try to read the ELF header */
|
|
if (smemfs_pread(inode, header, sizeof(*header), 0) != sizeof(*header))
|
|
return (ld_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 (ld_header_magic_error);
|
|
}
|
|
|
|
/* Check class */
|
|
if (header->e_ident[EI_CLASS] != ELFCLASS32)
|
|
return (ld_header_class_error);
|
|
|
|
/* Check data encoding */
|
|
if (header->e_ident[EI_DATA] != ELFDATA2MSB)
|
|
return (ld_header_indent_error);
|
|
|
|
/* Check ELF type */
|
|
if (header->e_type != ET_DYN && header->e_type != ET_EXEC)
|
|
return (ld_header_type_error);
|
|
|
|
/* Check ELF specifique instruction */
|
|
if (header->e_machine != EM_SH)
|
|
return (ld_header_machine_error);
|
|
|
|
/* Check ELF version */
|
|
if (header->e_version != EV_CURRENT)
|
|
return (ld_header_version_error);
|
|
return (ld_header_valid);
|
|
}
|
|
|
|
/* hypervisor_elf_loader_header_check(): Check ELF header validity */
|
|
int loader_header_check(struct smemfs_inode * restrict const inode)
|
|
{
|
|
Elf32_Ehdr header;
|
|
return (loader_header_get(inode, &header));
|
|
}
|