From f2fb4d5d0135ec7f1ab5ef4923909d662ecc69dd Mon Sep 17 00:00:00 2001 From: Aurel Feer Date: Wed, 30 Mar 2022 16:23:39 +0200 Subject: [PATCH] start memory server --- include/aos/aos_rpc.h | 2 ++ lib/aos/init.c | 3 ++- lib/aos/ram_alloc.c | 13 +++++++++++-- lib/spawn/spawn.c | 13 +++++++++++++ 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/include/aos/aos_rpc.h b/include/aos/aos_rpc.h index a12128d..ceacc4c 100644 --- a/include/aos/aos_rpc.h +++ b/include/aos/aos_rpc.h @@ -20,6 +20,8 @@ // define some message types #define RPC_MTYPE_CHILD_ENDPOINT 1UL #define RPC_MTYPE_CHILD_ENDPOINT_OK 2UL +#define RPC_MTYPE_GET_RAM_CAP 3UL +#define RPC_MTYPE_GET_RAM_CAP_OK 4UL /* An RPC binding, which may be transported over LMP or UMP. */ diff --git a/lib/aos/init.c b/lib/aos/init.c index ac0e409..2e72f9a 100644 --- a/lib/aos/init.c +++ b/lib/aos/init.c @@ -96,6 +96,7 @@ static int event_init_dispatch_thread(void *arg) } // TODO rueegges: putting it here for now. Not sure how to do rcp abstraction yet +// receive messages sent by the init static void handle_init_recv(void *arg) { errval_t err; @@ -129,7 +130,7 @@ static void handle_init_recv(void *arg) err = lmp_endpoint_register(init_chan->endpoint, get_default_waitset(), MKCLOSURE(handle_init_recv, init_chan)); if (err_is_fail(err)) { - USER_PANIC_ERR(err, "Could not reregister after failed init_chan cap receive"); + USER_PANIC_ERR(err, "[handle_init_recv]: Could not register endpoint after receiving message"); } } diff --git a/lib/aos/ram_alloc.c b/lib/aos/ram_alloc.c index 1df7d64..a7f92d9 100644 --- a/lib/aos/ram_alloc.c +++ b/lib/aos/ram_alloc.c @@ -17,10 +17,19 @@ #include /* remote (indirect through a channel) version of ram_alloc, for most domains */ +// call to the memory server to give us some ram static errval_t ram_alloc_remote(struct capref *ret, size_t size, size_t alignment) { - //TODO(M3): Implement me! - return LIB_ERR_NOT_IMPLEMENTED; + errval_t err; + // afeer: hää? + slot_alloc(ret); + + // afeer, script page 133: get ram using rpc + struct aos_rpc *memchan = aos_rpc_get_memory_channel(); + err = aos_rpc_get_ram_cap(memchan, size, alignment, ret, NULL); + if (err_is_fail(err)) return LIB_ERR_RAM_ALLOC; + + return SYS_ERR_OK; } diff --git a/lib/spawn/spawn.c b/lib/spawn/spawn.c index 3914133..9a187be 100644 --- a/lib/spawn/spawn.c +++ b/lib/spawn/spawn.c @@ -47,6 +47,7 @@ static void armv8_set_registers(void *arch_load_info, disabled_area->regs[REG_OFFSET(PIC_REGISTER)] = got_base; } +// receive messages sent by the child static void handle_child_recv(void *arg) { errval_t err; struct lmp_chan *init_chan = (struct lmp_chan *)arg; @@ -76,6 +77,18 @@ static void handle_child_recv(void *arg) { USER_PANIC_ERR(err, "Failed to send RPC_MTYPE_CHILD_ENDPOINT_OK"); } break; + case RPC_MTYPE_GET_RAM_CAP: + debug_printf("[handle_init_recv]: RPC_MTYPE_GET_RAM_CAP\n"); + + size_t requested_size = msg.words[1]; + struct capref new_ram_cap; + frame_alloc(&new_ram_cap, requested_size, NULL); + + err = lmp_chan_send1(init_chan, LMP_FLAG_YIELD | LMP_FLAG_SYNC, NULL_CAP, RPC_MTYPE_GET_RAM_CAP_OK); + if (err_is_fail(err)) { + USER_PANIC_ERR(err, "Failed to send RPC_MTYPE_GET_RAM_CAP_OK"); + } + break; default: USER_PANIC("Unknown rpc message type."); break;