blob: 232bd12e023bb199097a45f76b0e4c553c78a1a0 (
plain) (
tree)
|
|
void pf_allocate_on_demand(pagedir_t *pd, struct region_info *r, void* addr) {
ASSERT(pd_get_frame(addr) == 0); // if error is of another type (RO, protected), we don't do anyting
uint32_t f = frame_alloc(1);
if (f == 0) PANIC("Out Of Memory");
bool map_ok = pd_map_page(addr, f, 1);
if (!map_ok) PANIC("Could not map frame (OOM)");
}
void test_region_2() {
BEGIN_TEST("region-test-2");
// allocate a big region and try to write into it
const size_t n = 200;
void* p0 = region_alloc(n * PAGE_SIZE, "Test big region", pf_allocate_on_demand);
for (size_t i = 0; i < n; i++) {
uint32_t *x = (uint32_t*)(p0 + i * PAGE_SIZE);
x[0] = 12;
x[1] = (i * 20422) % 122;
}
// unmap memory
for (size_t i = 0; i < n; i++) {
void* p = p0 + i * PAGE_SIZE;
uint32_t *x = (uint32_t*)p;
ASSERT(x[1] == (i * 20422) % 122);
uint32_t f = pd_get_frame(p);
ASSERT(f != 0);
pd_unmap_page(p);
ASSERT(pd_get_frame(p) == 0);
frame_free(f, 1);
}
region_free(p0);
TEST_OK;
}
#undef TEST_PLACEHOLDER_AFTER_REGION
#define TEST_PLACEHOLDER_AFTER_REGION { test_region_2(); }
/* vim: set ts=4 sw=4 tw=0 noet :*/
|