- RV64GC and RV32IMA support from a single codebase, selected at build time
- M-mode bare-metal boot path
- S-mode boot path via OpenSBI (SBI ecall wrappers)
- NS16550A UART driver for QEMU virt
- HAL abstraction layer (
platform_*behindhal_*) - Structured logger with levels and source attribution
- Panic handler independent of the logger
- CLINT mtime reader and microsecond busy-wait
- Linker scripts for RV32 and RV64
- Makefile:
build,run,debug,clean,size,disasm - GDB integration via
make debug
- Minimal FDT/DTB parser (read-only traversal, no libfdt)
- Memory region discovery from
/memorynode - UART node discovery with base address extraction
- Platform descriptor populated from DTB at runtime
- Boot log reports discovered memory regions and peripherals
- Kernel image header validation (magic bytes, version field)
- Relocation: copy kernel to execution address if load address differs
- Pre-jump environment: clear BSS, pass hartid and DTB in a0/a1
- Jump-to-kernel with correct privilege level
- Boot log reports load address, entry point, image size
- VirtIO MMIO transport (queue setup, descriptor management)
- VirtIO block driver (read-only, polling mode)
- Load kernel from block device instead of fixed RAM address
- Block read error detection and reporting
- Simple INI-style config parser (no dynamic allocation)
- Boot entry selection with timeout and UART menu
- Boot variables: kernel path, kernel arguments, DTB path override
- Fallback to first valid entry on bad config