Added tests for paging_map_frame_attr and spawn multiple processes

This commit is contained in:
Sparchatus 2022-03-23 13:50:09 +00:00
parent a8700b9734
commit 55b3b80b16
2 changed files with 68 additions and 25 deletions

View File

@ -113,21 +113,40 @@ static errval_t test_paging_big_regions(struct paging_state *paging_state) {
return SYS_ERR_OK; return SYS_ERR_OK;
} }
void do_test_paging(void) { static errval_t test_paging_map_frame(struct paging_state *paging_state) {
test_paging_run(test_paging_full_l3, "test_paging_full_l3", get_current_paging_state());
test_paging_run(test_paging_full_l2, "test_paging_full_l2", get_current_paging_state());
test_paging_run(test_paging_big_regions, "test_paging_big_regions", get_current_paging_state());
// Test paging
for (int i = 0; i < 40; i++) {
debug_printf("TEST: page %lu\n", i);
char *data = alloc_frame(5176*4096, 16, NULL, NULL);
memset(data, 33, 5176*4096);
}
debug_printf("TEST: do foreign test\n");
// Tet foreign init
errval_t err; errval_t err;
for(size_t mapping_size = BASE_PAGE_SIZE; mapping_size <= VMSAv8_64_PTABLE_NUM_ENTRIES - 1; mapping_size += BASE_PAGE_SIZE) {
void *retaddr;
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_frame_attr(paging_state, &retaddr, mapping_size, frame, 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(retaddr, val, mapping_size);
if(*((uint8_t *)retaddr + (rand() % mapping_size)) != val) {
return ERR_INVALID_ARGS;
}
vaddr += LARGE_PAGE_SIZE;
}
return SYS_ERR_OK;
}
static errval_t test_paging_foreign(struct paging_state *ignored) {
errval_t err;
// setup all the stuff for the test
struct capref rootcn_cap; struct capref rootcn_cap;
struct cnoderef rootcn; struct cnoderef rootcn;
struct cnoderef pagecn; struct cnoderef pagecn;
@ -142,24 +161,42 @@ void do_test_paging(void) {
}; };
err = vnode_create(l0, ObjType_VNode_AARCH64_l0); err = vnode_create(l0, ObjType_VNode_AARCH64_l0);
assert(err_is_ok(err)); assert(err_is_ok(err));
// initialize foreign state
err = paging_init_state_foreign(&st, VADDR_OFFSET, l0, get_default_slot_allocator()); err = paging_init_state_foreign(&st, VADDR_OFFSET, l0, get_default_slot_allocator());
assert(err_is_ok(err)); if (err_is_fail(err)) {
return err;
debug_printf("TEST: map foreign l3\n"); }
size_t mapping_size = BASE_PAGE_SIZE; size_t mapping_size = BASE_PAGE_SIZE;
// map all entries of a single l3 table in the foreign state
// map all entries of a single l3 table
for(size_t i = 0; i < VMSAv8_64_PTABLE_NUM_ENTRIES; ++i) { for(size_t i = 0; i < VMSAv8_64_PTABLE_NUM_ENTRIES; ++i) {
struct capref frame; struct capref frame;
err = frame_alloc(&frame, mapping_size, NULL); err = frame_alloc(&frame, mapping_size, NULL);
if (err_is_fail(err)) { if (err_is_fail(err)) {
USER_PANIC_ERR(err, "Failed frame alloc"); return err;
} }
err = paging_map_fixed_attr(&st, vaddr, frame, mapping_size, VREGION_FLAGS_READ_WRITE); err = paging_map_fixed_attr(&st, vaddr, frame, mapping_size, VREGION_FLAGS_READ_WRITE);
if (err_is_fail(err)) { if (err_is_fail(err)) {
USER_PANIC_ERR(err, "Failed page mapping"); return err;
} }
vaddr += mapping_size; vaddr += mapping_size;
} }
return SYS_ERR_OK;
}
void do_test_paging(void) {
test_paging_run(test_paging_full_l3, "test_paging_full_l3", get_current_paging_state());
test_paging_run(test_paging_full_l2, "test_paging_full_l2", get_current_paging_state());
test_paging_run(test_paging_big_regions, "test_paging_big_regions", get_current_paging_state());
test_paging_run(test_paging_map_frame, "test_paging_map_frame", get_current_paging_state());
test_paging_run(test_paging_foreign, "test_paging_foreign", NULL);
// Test paging
for (int i = 0; i < 40; i++) {
debug_printf("TEST: page %lu\n", i);
char *data = alloc_frame(5176*4096, 16, NULL, NULL);
memset(data, 33, 5176*4096);
}
} }

View File

@ -2,8 +2,14 @@
#include <test_spawn.h> #include <test_spawn.h>
#include <spawn/spawn.h> #include <spawn/spawn.h>
#define PROCESS_COUNT 5
void do_test_spawn(void) { void do_test_spawn(void) {
struct spawninfo si; // spawn multiple processes
domainid_t pid;
CHECK_ERR(spawn_load_by_name("hello", &si, &pid)); struct spawninfo si[PROCESS_COUNT];
domainid_t pid[PROCESS_COUNT];
for(uint i = 0; i < PROCESS_COUNT; ++i) {
CHECK_ERR(spawn_load_by_name("hello", &(si[i]), &(pid[i])));
}
} }