/** * \file * \brief init process for child spawning */ /* * Copyright (c) 2016, ETH Zurich. * All rights reserved. * * This file is distributed under the terms in the attached LICENSE file. * If you do not find this file, copies can be found by writing to: * ETH Zurich D-INFK, Universitaetsstrasse 6, CH-8092 Zurich. Attn: Systems Group. */ #include #include #include #include #include #include static struct aos_rpc *init_rpc, *mem_rpc; const char *str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, " "sed do eiusmod tempor incididunt ut labore et dolore magna " "aliqua. Ut enim ad minim veniam, quis nostrud exercitation " "ullamco laboris nisi ut aliquip ex ea commodo consequat. " "Duis aute irure dolor in reprehenderit in voluptate velit " "esse cillum dolore eu fugiat nulla pariatur. Excepteur sint " "occaecat cupidatat non proident, sunt in culpa qui officia " "deserunt mollit anim id est laborum."; static errval_t request_and_map_memory(void) { errval_t err; size_t bytes; struct frame_identity id; debug_printf("testing memory server...\n"); struct paging_state *pstate = get_current_paging_state(); debug_printf("obtaining cap of %" PRIu32 " bytes...\n", BASE_PAGE_SIZE); struct capref cap1; err = aos_rpc_get_ram_cap(mem_rpc, BASE_PAGE_SIZE, BASE_PAGE_SIZE, &cap1, &bytes); if (err_is_fail(err)) { DEBUG_ERR(err, "could not get BASE_PAGE_SIZE cap\n"); return err; } struct capref cap1_frame; err = slot_alloc(&cap1_frame); assert(err_is_ok(err)); debug_printf("Retype to frame \n"); err = cap_retype(cap1_frame, cap1, 0, ObjType_Frame, BASE_PAGE_SIZE, 1); if (err_is_fail(err)) { DEBUG_ERR(err, "could not retype RAM cap to frame cap\n"); return err; } err = frame_identify(cap1_frame, &id); assert(err_is_ok(err)); debug_printf("Mapping frame \n"); void *buf1; err = paging_map_frame(pstate, &buf1, BASE_PAGE_SIZE, cap1_frame); if (err_is_fail(err)) { DEBUG_ERR(err, "could not map BASE_PAGE_SIZE cap\n"); return err; } debug_printf("got frame: 0x%" PRIxGENPADDR " mapped at %p\n", id.base, buf1); debug_printf("performing memset.\n"); memset(buf1, 0x00, BASE_PAGE_SIZE); debug_printf("obtaining cap of %" PRIu32 " bytes using frame alloc...\n", LARGE_PAGE_SIZE); struct capref cap2; err = frame_alloc(&cap2, LARGE_PAGE_SIZE, &bytes); if (err_is_fail(err)) { DEBUG_ERR(err, "could not get BASE_PAGE_SIZE cap\n"); return err; } err = frame_identify(cap2, &id); assert(err_is_ok(err)); void *buf2; err = paging_map_frame(pstate, &buf2, LARGE_PAGE_SIZE, cap2); if (err_is_fail(err)) { DEBUG_ERR(err, "could not get BASE_PAGE_SIZE cap\n"); return err; } debug_printf("got frame: 0x%" PRIxGENPADDR " mapped at %p\n", id.base, buf1); debug_printf("performing memset.\n"); memset(buf2, 0x00, LARGE_PAGE_SIZE); return SYS_ERR_OK; } static errval_t test_basic_rpc(void) { errval_t err; debug_printf("RPC: testing basic RPCs...\n"); debug_printf("RPC: sending number...\n"); err = aos_rpc_send_number(init_rpc, 42); if (err_is_fail(err)) { DEBUG_ERR(err, "could not send a string\n"); return err; } debug_printf("RPC: sending small string...\n"); err = aos_rpc_send_string(init_rpc, "Hello init"); if (err_is_fail(err)) { DEBUG_ERR(err, "could not send a string\n"); return err; } debug_printf("RPC: sending large string...\n"); err = aos_rpc_send_string(init_rpc, str); if (err_is_fail(err)) { DEBUG_ERR(err, "could not send a string\n"); return err; } debug_printf("RPC: testing basic RPCs. SUCCESS\n"); return SYS_ERR_OK; } int main(int argc, char *argv[]) { errval_t err = SYS_ERR_OK; debug_printf("memeater started....\n"); init_rpc = aos_rpc_get_init_channel(); if (!init_rpc) { USER_PANIC_ERR(err, "init RPC channel NULL?\n"); } mem_rpc = aos_rpc_get_memory_channel(); if (!mem_rpc) { USER_PANIC_ERR(err, "memory RPC channel NULL?\n"); } err = test_basic_rpc(); if (err_is_fail(err)) { USER_PANIC_ERR(err, "failure in testing basic RPC\n"); } err = request_and_map_memory(); if (err_is_fail(err)) { USER_PANIC_ERR(err, "could not request and map memory\n"); } /* test printf functionality */ debug_printf("testing terminal printf function...\n"); printf("Hello world using terminal service\n"); debug_printf("memeater terminated....\n"); return EXIT_SUCCESS; }