From 55b3b80b167595b2ad7f696ed21d766fc6567987 Mon Sep 17 00:00:00 2001 From: Sparchatus Date: Wed, 23 Mar 2022 13:50:09 +0000 Subject: [PATCH] Added tests for paging_map_frame_attr and spawn multiple processes --- lib/grading/test_paging.c | 81 ++++++++++++++++++++++++++++----------- lib/grading/test_spawn.c | 12 ++++-- 2 files changed, 68 insertions(+), 25 deletions(-) diff --git a/lib/grading/test_paging.c b/lib/grading/test_paging.c index cf9e38a..3261988 100644 --- a/lib/grading/test_paging.c +++ b/lib/grading/test_paging.c @@ -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()); - - // 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 +static errval_t test_paging_map_frame(struct paging_state *paging_state) { 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 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)); - - debug_printf("TEST: map foreign l3\n"); + if (err_is_fail(err)) { + return err; + } + 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); + } } diff --git a/lib/grading/test_spawn.c b/lib/grading/test_spawn.c index d4663e0..2538ee9 100644 --- a/lib/grading/test_spawn.c +++ b/lib/grading/test_spawn.c @@ -2,8 +2,14 @@ #include #include +#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]))); + } }