Added tests for paging_map_frame_attr and spawn multiple processes
This commit is contained in:
parent
a8700b9734
commit
55b3b80b16
@ -113,21 +113,40 @@ static errval_t test_paging_big_regions(struct paging_state *paging_state) {
|
||||
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());
|
||||
static errval_t test_paging_map_frame(struct paging_state *paging_state) {
|
||||
errval_t err;
|
||||
|
||||
// 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);
|
||||
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);
|
||||
}
|
||||
|
||||
debug_printf("TEST: do foreign test\n");
|
||||
// Tet foreign init
|
||||
// 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 cnoderef rootcn;
|
||||
struct cnoderef pagecn;
|
||||
@ -142,24 +161,42 @@ void do_test_paging(void) {
|
||||
};
|
||||
err = vnode_create(l0, ObjType_VNode_AARCH64_l0);
|
||||
assert(err_is_ok(err));
|
||||
|
||||
// initialize foreign state
|
||||
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;
|
||||
|
||||
// map all entries of a single l3 table
|
||||
// map all entries of a single l3 table in the foreign state
|
||||
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)) {
|
||||
USER_PANIC_ERR(err, "Failed frame alloc");
|
||||
return err;
|
||||
}
|
||||
err = paging_map_fixed_attr(&st, vaddr, frame, mapping_size, VREGION_FLAGS_READ_WRITE);
|
||||
if (err_is_fail(err)) {
|
||||
USER_PANIC_ERR(err, "Failed page mapping");
|
||||
return err;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2,8 +2,14 @@
|
||||
#include <test_spawn.h>
|
||||
#include <spawn/spawn.h>
|
||||
|
||||
#define PROCESS_COUNT 5
|
||||
|
||||
void do_test_spawn(void) {
|
||||
struct spawninfo si;
|
||||
domainid_t pid;
|
||||
CHECK_ERR(spawn_load_by_name("hello", &si, &pid));
|
||||
// spawn multiple processes
|
||||
|
||||
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])));
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user