mirror of
https://github.com/genodelabs/genode.git
synced 2025-01-19 11:16:57 +00:00
parent
46a6cb680a
commit
8037277447
@ -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); }
|
||||
|
||||
|
||||
/**
|
||||
|
@ -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();
|
||||
|
@ -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: {
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user