117 lines
3.5 KiB
C
117 lines
3.5 KiB
C
#include <aos/aos.h>
|
|
#include <test_paging.h>
|
|
#include <aos/paging.h>
|
|
|
|
// ASSESSMENT M1: these lines show mapping to fixed locations and read/write
|
|
|
|
// used to avoid conflicts between tests
|
|
lvaddr_t vaddr = 0x0000100000000000L;
|
|
|
|
uint8_t test_paging_run(errval_t func(void), char *name) {
|
|
errval_t err;
|
|
|
|
// debug_printf("TEST_PAGING %19s: start\n", name);
|
|
err = func();
|
|
|
|
if (err_is_ok(err)) {
|
|
debug_printf("TEST_PAGING %23s: OK\n", name);
|
|
return 1;
|
|
} else {
|
|
debug_printf("TEST_PAGING %23s: ERR\n", name);
|
|
DEBUG_ERR(err, "Test Failed with Error");
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
errval_t test_paging_full_l3(void) {
|
|
errval_t err;
|
|
|
|
size_t mapping_size = BASE_PAGE_SIZE;
|
|
|
|
// map all entries of a single l3 table
|
|
for(size_t i = 0; i < VMSAv8_64_PTABLE_NUM_ENTRIES; ++i) {
|
|
struct capref frame;
|
|
err = frame_alloc(&frame, mapping_size, NULL);
|
|
if (err_is_fail(err)) {
|
|
return err_push(err, LIB_ERR_FRAME_ALLOC);
|
|
}
|
|
err = paging_map_fixed_attr(get_current_paging_state(), vaddr, frame, mapping_size, VREGION_FLAGS_READ_WRITE);
|
|
if (err_is_fail(err)) {
|
|
return err_push(err, LIB_ERR_PMAP_NOT_MAPPED);
|
|
}
|
|
|
|
// verify mapping using a random value at a random location
|
|
uint8_t val = rand() % 256;
|
|
memset((void *) vaddr, val, mapping_size);
|
|
if(*((uint8_t *) vaddr + (rand() % mapping_size)) != val) {
|
|
return ERR_INVALID_ARGS;
|
|
}
|
|
|
|
vaddr += mapping_size;
|
|
}
|
|
|
|
return SYS_ERR_OK;
|
|
}
|
|
|
|
errval_t test_paging_full_l2(void) {
|
|
errval_t err;
|
|
|
|
size_t mapping_size = BASE_PAGE_SIZE;
|
|
|
|
// map a page in all slots of a single l2 node (the 0-th slot was already used in a previous test)
|
|
for(size_t i = 1; i < VMSAv8_64_PTABLE_NUM_ENTRIES; ++i) {
|
|
struct capref frame;
|
|
err = frame_alloc(&frame, mapping_size, NULL);
|
|
if (err_is_fail(err)) {
|
|
return err_push(err, LIB_ERR_FRAME_ALLOC);
|
|
}
|
|
err = paging_map_fixed_attr(get_current_paging_state(), vaddr, frame, mapping_size, VREGION_FLAGS_READ_WRITE);
|
|
if (err_is_fail(err)) {
|
|
return err_push(err, LIB_ERR_PMAP_NOT_MAPPED);
|
|
}
|
|
|
|
// verify mapping using a random value at a random location
|
|
uint8_t val = rand() % 256;
|
|
memset((void *) vaddr, val, mapping_size);
|
|
if(*((uint8_t *) vaddr + (rand() % mapping_size)) != val) {
|
|
return ERR_INVALID_ARGS;
|
|
}
|
|
|
|
vaddr += LARGE_PAGE_SIZE;
|
|
}
|
|
|
|
return SYS_ERR_OK;
|
|
}
|
|
|
|
errval_t test_paging_big_regions(void) {
|
|
errval_t err;
|
|
|
|
size_t mapping_size;
|
|
|
|
// map larger areas
|
|
for(size_t i = 1; i <= VMSAv8_64_PTABLE_NUM_ENTRIES - 1; ++i) {
|
|
mapping_size = i * BASE_PAGE_SIZE;
|
|
|
|
struct capref frame;
|
|
err = frame_alloc(&frame, mapping_size, NULL);
|
|
if (err_is_fail(err)) {
|
|
return err_push(err, LIB_ERR_FRAME_ALLOC);
|
|
}
|
|
err = paging_map_fixed_attr(get_current_paging_state(), vaddr, frame, mapping_size, VREGION_FLAGS_READ_WRITE);
|
|
if (err_is_fail(err)) {
|
|
return err_push(err, LIB_ERR_PMAP_NOT_MAPPED);
|
|
}
|
|
|
|
// verify mapping using a random value at a random location
|
|
uint8_t val = rand() % 256;
|
|
memset((void *) vaddr, val, mapping_size);
|
|
if(*((uint8_t *) vaddr + (rand() % mapping_size)) != val) {
|
|
return ERR_INVALID_ARGS;
|
|
}
|
|
|
|
vaddr += LARGE_PAGE_SIZE;
|
|
}
|
|
|
|
return SYS_ERR_OK;
|
|
}
|