forward rpc calls using urpc
This commit is contained in:
parent
ede347c10b
commit
9c1906082a
@ -68,7 +68,7 @@ errval_t do_aos_urpc(
|
|||||||
if (ret0 != NULL) *ret0 = rpc->meta->a2;
|
if (ret0 != NULL) *ret0 = rpc->meta->a2;
|
||||||
if (ret1 != NULL) *ret1 = rpc->meta->a3;
|
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);
|
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);
|
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;
|
if (err_is_fail(err)) return err;
|
||||||
|
|||||||
@ -10,6 +10,7 @@ extern coreid_t my_core_id;
|
|||||||
rpc_handler_t rpc_handlers[RPC_MTYPE_COUNT];
|
rpc_handler_t rpc_handlers[RPC_MTYPE_COUNT];
|
||||||
extern struct bootinfo *bi;
|
extern struct bootinfo *bi;
|
||||||
|
|
||||||
|
extern struct aos_urpc urpc_to_bsp;
|
||||||
extern struct aos_urpc urpc_to_app;
|
extern struct aos_urpc urpc_to_app;
|
||||||
extern struct waitset urpc_to_app_ws;
|
extern struct waitset urpc_to_app_ws;
|
||||||
|
|
||||||
@ -53,11 +54,31 @@ static void rpc_server_handle_recv(void *arg) {
|
|||||||
if (handler == NULL) {
|
if (handler == NULL) {
|
||||||
err = AOS_ERR_RPC_UNKNOWN_MSG_TYPE;
|
err = AOS_ERR_RPC_UNKNOWN_MSG_TYPE;
|
||||||
} else {
|
} else {
|
||||||
err = handler(
|
if (my_core_id == 0 ||
|
||||||
&rpc->g,
|
(msg.words[0] == RPC_MTYPE_PROCESS_SPAWN && msg.words[1] == my_core_id)/* dont forward spawn rpcs */) {
|
||||||
arg_cap, msg.words[1], msg.words[2], msg.words[3],
|
err = handler(
|
||||||
&rpc->ret_cap, &rpc->ret_size, &rpc->ret0, &rpc->ret1
|
&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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user