From 9c1906082a437f74f4842c964630d0569b238f06 Mon Sep 17 00:00:00 2001 From: Aurel Feer Date: Wed, 4 May 2022 16:08:13 +0200 Subject: [PATCH] forward rpc calls using urpc --- lib/aos/aos_urpc.c | 2 +- lib/spawn/rpc_server.c | 31 ++++++++++++++++++++++++++----- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/lib/aos/aos_urpc.c b/lib/aos/aos_urpc.c index 4d1f098..8af34df 100644 --- a/lib/aos/aos_urpc.c +++ b/lib/aos/aos_urpc.c @@ -68,7 +68,7 @@ errval_t do_aos_urpc( if (ret0 != NULL) *ret0 = rpc->meta->a2; if (ret1 != NULL) *ret1 = rpc->meta->a3; - if(ret_cap != NULL) { + if(ret_cap != NULL && rpc->meta->cap.type != ObjType_Null) { assert(rpc->meta->cap.type == ObjType_RAM); err = ram_forge(*ret_cap, rpc->meta->cap.u.ram.base, rpc->meta->cap.u.ram.bytes, my_core_id); if (err_is_fail(err)) return err; diff --git a/lib/spawn/rpc_server.c b/lib/spawn/rpc_server.c index b23d900..da72f28 100644 --- a/lib/spawn/rpc_server.c +++ b/lib/spawn/rpc_server.c @@ -10,6 +10,7 @@ extern coreid_t my_core_id; rpc_handler_t rpc_handlers[RPC_MTYPE_COUNT]; extern struct bootinfo *bi; +extern struct aos_urpc urpc_to_bsp; extern struct aos_urpc urpc_to_app; extern struct waitset urpc_to_app_ws; @@ -53,11 +54,31 @@ static void rpc_server_handle_recv(void *arg) { if (handler == NULL) { err = AOS_ERR_RPC_UNKNOWN_MSG_TYPE; } else { - err = handler( - &rpc->g, - arg_cap, msg.words[1], msg.words[2], msg.words[3], - &rpc->ret_cap, &rpc->ret_size, &rpc->ret0, &rpc->ret1 - ); + if (my_core_id == 0 || + (msg.words[0] == RPC_MTYPE_PROCESS_SPAWN && msg.words[1] == my_core_id)/* dont forward spawn rpcs */) { + err = handler( + &rpc->g, + arg_cap, msg.words[1], msg.words[2], msg.words[3], + &rpc->ret_cap, &rpc->ret_size, &rpc->ret0, &rpc->ret1 + ); + } else { + //forward rpc to urpc + if (msg.words[1] > 0) { + assert(msg.words[1] <= RPC_SHARED_SIZE); + memcpy(urpc_to_bsp.shared_mem, rpc->g.shared_mem, msg.words[1]); + } + + err = do_aos_urpc( + &urpc_to_bsp, msg.words[0], + arg_cap, msg.words[1], msg.words[2], msg.words[3], + &rpc->ret_cap, &rpc->ret_size, &rpc->ret0, &rpc->ret1 + ); + + if (rpc->ret_size > 0) { + assert(rpc->ret_size <= RPC_SHARED_SIZE); + memcpy(rpc->g.shared_mem, urpc_to_bsp.shared_mem, rpc->ret_size); + } + } } }