diff --git a/base-hw/include/kernel/syscalls.h b/base-hw/include/kernel/syscalls.h index ee91f8622..b05d37f52 100644 --- a/base-hw/include/kernel/syscalls.h +++ b/base-hw/include/kernel/syscalls.h @@ -48,7 +48,7 @@ namespace Kernel /* interprocess communication */ REQUEST_AND_WAIT = 8, - REPLY_AND_WAIT = 9, + REPLY = 9, WAIT_FOR_REQUEST = 10, /* management of resource protection-domains */ @@ -310,14 +310,17 @@ namespace Kernel /** - * Send reply of the last received request and wait for next request + * Reply to last IPC request * - * \param size reply-message size (beginning with the callers UTCB base) + * \param size reply size (beginning with the callers UTCB base) + * \param await_request if the call shall await and fetch next request * - * \return size of received request (beginning with the callers UTCB base) + * \return request size (beginning with the callers UTCB base) + * if await_request was set */ - inline unsigned long reply_and_wait(unsigned long const size) - { return (unsigned long)syscall(REPLY_AND_WAIT, size); } + inline unsigned long reply(unsigned long const size, + bool const await_request) { + return (unsigned long)syscall(REPLY, size, await_request); } /** diff --git a/base-hw/src/base/ipc.cc b/base-hw/src/base/ipc.cc index 5b8cfce08..b888d89cb 100644 --- a/base-hw/src/base/ipc.cc +++ b/base-hw/src/base/ipc.cc @@ -194,11 +194,7 @@ void Ipc_server::_wait() } -void Ipc_server::_reply() -{ - kernel_log() << __PRETTY_FUNCTION__ << ": Unexpected call\n"; - while (1) ; -} +void Ipc_server::_reply() { Kernel::reply(_write_offset, 0); } void Ipc_server::_reply_wait() @@ -212,7 +208,7 @@ void Ipc_server::_reply_wait() /* send reply and receive next request */ copy_msgbuf_to_utcb(_snd_msg, _write_offset, Ipc_ostream::_dst.local_name()); - copy_utcb_to_msgbuf(_rcv_msg, Kernel::reply_and_wait(_write_offset)); + copy_utcb_to_msgbuf(_rcv_msg, Kernel::reply(_write_offset, 1)); /* update server state */ _prepare_next_reply_wait(); diff --git a/base-hw/src/base/pager.cc b/base-hw/src/base/pager.cc index d8df0347a..53286c9f6 100644 --- a/base-hw/src/base/pager.cc +++ b/base-hw/src/base/pager.cc @@ -114,7 +114,7 @@ void Ipc_pager::wait_for_fault() /* resume faulter, send ack to RM and get the next message */ Kernel::resume_thread(msg->pager_object->badge()); - s = Kernel::reply_and_wait(0); + s = Kernel::reply(0, 1); continue; } default: { diff --git a/base-hw/src/core/kernel.cc b/base-hw/src/core/kernel.cc index 6e56b8ffd..3507e977f 100644 --- a/base-hw/src/core/kernel.cc +++ b/base-hw/src/core/kernel.cc @@ -531,25 +531,19 @@ namespace Kernel } /** - * Reply last request if there's any and await next request + * Reply to last request if there's any * * \param reply_base base of the reply payload * \param reply_size size of the reply payload - * \param inbuf_base base of the request buffer - * \param inbuf_size size of the request buffer */ - inline void send_reply_await_request(void * const reply_base, - size_t const reply_size, - void * const inbuf_base, - size_t const inbuf_size) + inline void send_reply(void * const reply_base, + size_t const reply_size) { /* reply to the last request if we have to */ if (_state == PREPARE_REPLY) { _inbuf.origin->_receive_reply(reply_base, reply_size); _state = INACTIVE; } - /* await next request */ - await_request(inbuf_base, inbuf_size); } /** @@ -1232,13 +1226,15 @@ namespace Kernel } /** - * Reply to the last request and await the next one + * Reply to the last request */ - void reply_and_wait(size_t const size) + void reply(size_t const size, bool const await_request) { - Ipc_node::send_reply_await_request(phys_utcb()->base(), size, - phys_utcb()->base(), - phys_utcb()->size()); + Ipc_node::send_reply(phys_utcb()->base(), size); + if (await_request) + Ipc_node::await_request(phys_utcb()->base(), + phys_utcb()->size()); + else user_arg_0(0); } /** @@ -1828,8 +1824,8 @@ namespace Kernel /** * Do specific syscall for 'user', for details see 'syscall.h' */ - void do_reply_and_wait(Thread * const user) - { user->reply_and_wait((size_t)user->user_arg_1()); } + void do_reply(Thread * const user) { + user->reply((size_t)user->user_arg_1(), (bool)user->user_arg_2()); } /** @@ -2075,7 +2071,7 @@ namespace Kernel /* 6 */ do_current_thread_id, /* 7 */ do_yield_thread, /* 8 */ do_request_and_wait, - /* 9 */ do_reply_and_wait, + /* 9 */ do_reply, /* 10 */ do_wait_for_request, /* 11 */ do_set_pager, /* 12 */ do_update_pd,