#include "hv/allocator.h" #include "hv/arch.h" #include "hv/config.h" #include "hv/el2_mmu.h" #include "hv/log.h" #include "hv/panic.h" #include "hv/policy.h" #include "hv/selftest.h" #include "hv/stage2.h" #include "hv/sysreg.h" static void require(bool ok, const char *name) { if (!ok) { panic(name); } log_simple(LOG_SELFTEST, 0u, (uint64_t)(uintptr_t)name, 0u); } void selftests_run_or_panic(void) { require(hv_is_aligned_u64((uint64_t)(uintptr_t)__vectors_el2, 2048u), "selftest vectors alignment"); require(stage2_selftest(), "selftest stage2 descriptors"); require(el2_mmu_selftest(), "selftest el2 mmu plan"); require(CONFIG_GUEST_RAM_SIZE != 0u && hv_is_aligned_u64(CONFIG_GUEST_RAM_BASE, CONFIG_PAGE_SIZE), "selftest guest memory bounds"); require(policy_selftest(), "selftest policy table"); require(sysreg_selftest(), "selftest sysreg decoder"); require(log_selftest(), "selftest log wraparound"); require(allocator_selftest(), "selftest allocator"); uint64_t hcr; uint64_t sctlr; uint64_t vttbr; __asm__ volatile("mrs %0, hcr_el2" : "=r"(hcr)); __asm__ volatile("mrs %0, sctlr_el2" : "=r"(sctlr)); __asm__ volatile("mrs %0, vttbr_el2" : "=r"(vttbr)); require((hcr & HV_BIT(0)) != 0u && (hcr & HV_BIT(31)) != 0u, "selftest hcr trap sanity"); require((sctlr & (HV_BIT(0) | HV_BIT(2) | HV_BIT(12))) == (HV_BIT(0) | HV_BIT(2) | HV_BIT(12)), "selftest sctlr el2 mmu enabled"); require((vttbr & 0x0000fffffffff000ull) == stage2_vttbr(), "selftest vttbr root"); }