// vim: ft=c #include #include "vmm.c" void *data; uintptr_t *p4, *p3, *p2, *p1; BEFORE() { data = calloc(PAGE_SIZE, 5); p4 = (void *)(((uintptr_t)data + PAGE_SIZE) & ~(PAGE_SIZE-1)); p3 = &p4[512]; p2 = &p4[1024]; p1 = &p4[1536]; } AFTER() { free(data); } TEST(get_page_returns_correct_address) { p4[0] = (uintptr_t)p3; p4[0] |= PAGE_PRESENT; p3[0] = (uintptr_t)p2; p3[0] |= PAGE_PRESENT; p2[0] = (uintptr_t)p1; p2[0] |= PAGE_PRESENT; p1[0] = 0x1234567890ABC000 | PAGE_PRESENT; uintptr_t ret = vmm_get_page(p4, 0); ASSERT_EQ_PTR(ret, 0x1234567890ABC000); } TEST(get_page_ignores_flags) { p4[0] = (uintptr_t)p3; p4[0] |= PAGE_PRESENT; p3[0] = (uintptr_t)p2; p3[0] |= PAGE_PRESENT; p2[0] = (uintptr_t)p1; p2[0] |= PAGE_PRESENT; p1[0] = 0x1234567890ABC000 | PAGE_PRESENT; uintptr_t ret = vmm_get_page(p4, 0); ASSERT_EQ_PTR(ret, 0x1234567890ABC000); } TEST(get_page_works_for_different_address) { p4[1] = (uintptr_t)p3; p4[1] |= PAGE_PRESENT; p3[2] = (uintptr_t)p2; p3[2] |= PAGE_PRESENT; p2[3] = (uintptr_t)p1; p2[3] |= PAGE_PRESENT; p1[4] = 0x34567890ABCDE000 | PAGE_PRESENT; uintptr_t ret = vmm_get_page(p4, (1UL<<39)+(2UL<<30)+(3UL<<21)+(4UL<<12)); ASSERT_EQ_PTR(ret, 0x34567890ABCDE000); } TEST(get_page_fails_if_PTE_not_present) { p4[0] = (uintptr_t)p3; p4[0] |= PAGE_PRESENT; p3[0] = (uintptr_t)p2; p3[0] |= PAGE_PRESENT; p2[0] = (uintptr_t)p1; p2[0] |= 0; p1[0] = 0x1234567890ABC000 | PAGE_PRESENT; uintptr_t ret = vmm_get_page(p4, 0); ASSERT_EQ_PTR(ret, -1); }