78 lines
1.5 KiB
C
78 lines
1.5 KiB
C
// vim: ft=c
|
|
#include <ttest.h>
|
|
|
|
#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);
|
|
}
|