//--- // 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)); }