//! Narrow live guest test: this identifies ELF bytes, but does not yet load //! or execute an ELF program. Loading needs the later segment/entry gates. use super::*; use turkos_kernel::elf::{self, Error}; const VALID: [u8; 20] = [ 0x7f, b'E', b'L', b'F', 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0xb7, 0, ]; fn fail(reason: &str) -> ! { write_str("TURKOS/ELF-IDENT-ERROR: "); write_line(reason); park() } pub(super) fn smoke_test() -> ! { let accepted = elf::parse_ident(&VALID).unwrap_or_else(|_| fail("valid AArch64 ELF ident")); if accepted.machine != elf::EM_AARCH64 { fail("machine result"); } write_str("TURKOS/ELF-IDENT-ACCEPT: MACHINE=0x"); write_hex(accepted.machine as usize); write_str(" BYTES=0x"); write_hex(VALID.len()); write_str("\r\n"); if elf::parse_ident(&VALID[..19]) != Err(Error::Truncated) { fail("short header read"); } write_line("TURKOS/ELF-IDENT-SHORT: REJECT"); let mut damaged = VALID; damaged[0] = 0; if elf::parse_ident(&damaged) != Err(Error::BadMagic) { fail("bad magic"); } write_line("TURKOS/ELF-IDENT-MAGIC: REJECT"); damaged = VALID; damaged[4] = 1; if elf::parse_ident(&damaged) != Err(Error::WrongClass) { fail("ELFCLASS32"); } write_line("TURKOS/ELF-IDENT-CLASS: REJECT"); damaged = VALID; damaged[5] = 2; if elf::parse_ident(&damaged) != Err(Error::WrongEndian) { fail("big endian"); } write_line("TURKOS/ELF-IDENT-ENDIAN: REJECT"); damaged = VALID; damaged[6] = 2; if elf::parse_ident(&damaged) != Err(Error::WrongVersion) { fail("ident version"); } write_line("TURKOS/ELF-IDENT-VERSION: REJECT"); damaged = VALID; damaged[18] = 62; if elf::parse_ident(&damaged) != Err(Error::WrongMachine) { fail("non-AArch64 machine"); } write_line("TURKOS/ELF-IDENT-MACHINE: REJECT"); write_line("TURKOS/ELF-IDENT: PASS"); park() }