00001
00005 #ifndef __L4SYS__INCLUDE__L4API_FIASCO__IPC_IMPL_H__
00006 #define __L4SYS__INCLUDE__L4API_FIASCO__IPC_IMPL_H__
00007
00008 L4_INLINE int
00009 l4_ipc_call(l4_threadid_t dest,
00010 const void *snd_msg,
00011 l4_umword_t snd_dword0,
00012 l4_umword_t snd_dword1,
00013 void *rcv_msg,
00014 l4_umword_t *rcv_dword0,
00015 l4_umword_t *rcv_dword1,
00016 l4_timeout_t timeout,
00017 l4_msgdope_t *result)
00018 {
00019 l4_msgtag_t dummytag;
00020 return l4_ipc_call_tag(dest, snd_msg, snd_dword0, snd_dword1,
00021 l4_msgtag(0,0,0,0), rcv_msg,
00022 rcv_dword0, rcv_dword1, timeout, result, &dummytag);
00023 }
00024
00025 L4_INLINE int
00026 l4_ipc_reply_and_wait(l4_threadid_t dest,
00027 const void *snd_msg,
00028 l4_umword_t snd_dword0,
00029 l4_umword_t snd_dword1,
00030 l4_threadid_t *src,
00031 void *rcv_msg,
00032 l4_umword_t *rcv_dword0,
00033 l4_umword_t *rcv_dword1,
00034 l4_timeout_t timeout,
00035 l4_msgdope_t *result)
00036 {
00037 l4_msgtag_t dummytag;
00038 return l4_ipc_reply_and_wait_tag(dest, snd_msg, snd_dword0, snd_dword1,
00039 l4_msgtag(0,0,0,0), src,
00040 rcv_msg, rcv_dword0, rcv_dword1,
00041 timeout, result, &dummytag);
00042 }
00043
00044 L4_INLINE int
00045 l4_ipc_wait(l4_threadid_t *src,
00046 void *rcv_msg,
00047 l4_umword_t *rcv_dword0,
00048 l4_umword_t *rcv_dword1,
00049 l4_timeout_t timeout,
00050 l4_msgdope_t *result)
00051 {
00052 l4_msgtag_t dummytag;
00053 return l4_ipc_wait_tag(src, rcv_msg, rcv_dword0, rcv_dword1, timeout, result,
00054 &dummytag);
00055 }
00056
00057 L4_INLINE int
00058 l4_ipc_send(l4_threadid_t dest,
00059 const void *snd_msg,
00060 l4_umword_t snd_dword0,
00061 l4_umword_t snd_dword1,
00062 l4_timeout_t timeout,
00063 l4_msgdope_t *result)
00064 {
00065 return l4_ipc_send_tag(dest, snd_msg, snd_dword0, snd_dword1,
00066 l4_msgtag(0,0,0,0), timeout, result);
00067 }
00068
00069 L4_INLINE int
00070 l4_ipc_receive(l4_threadid_t src,
00071 void *rcv_msg,
00072 l4_umword_t *rcv_dword0,
00073 l4_umword_t *rcv_dword1,
00074 l4_timeout_t timeout,
00075 l4_msgdope_t *result)
00076 {
00077 l4_msgtag_t dummytag;
00078 return l4_ipc_receive_tag(src, rcv_msg, rcv_dword0, rcv_dword1, timeout,
00079 result, &dummytag);
00080 }
00081
00082 L4_INLINE int
00083 l4_ipc_sleep(l4_timeout_t timeout)
00084 {
00085 l4_umword_t dummy;
00086 l4_msgdope_t result;
00087 return l4_ipc_receive(L4_NIL_ID, L4_IPC_SHORT_MSG, &dummy, &dummy,
00088 timeout, &result);
00089 }
00090
00091 L4_INLINE int
00092 l4_ipc_fpage_received(l4_msgdope_t msgdope)
00093 {
00094 return msgdope.md.fpage_received != 0;
00095 }
00096
00097 L4_INLINE int
00098 l4_ipc_is_fpage_granted(l4_fpage_t fp)
00099 {
00100 return fp.fp.grant != 0;
00101 }
00102
00103 L4_INLINE int
00104 l4_ipc_is_fpage_writable(l4_fpage_t fp)
00105 {
00106 return fp.fp.write != 0;
00107 }
00108
00109 L4_INLINE long
00110 l4_is_long_rcv_descr(const void *msg)
00111 {
00112 if (!l4_is_rcv_map_descr(msg))
00113 return (long)msg & ~0x03;
00114 else
00115 return 0;
00116 }
00117
00118 L4_INLINE long
00119 l4_is_rcv_map_descr(const void *msg)
00120 {
00121 return (long)msg & 0x2;
00122 }
00123
00124 L4_INLINE long
00125 l4_is_long_snd_descr(const void *msg)
00126 {
00127 return (long)msg & ~0x03;
00128 }
00129
00130 L4_INLINE const l4_msg_t *
00131 l4_get_snd_msg_from_descr(const void *msg)
00132 {
00133 return (const l4_msg_t *)((l4_addr_t)msg & ~0x03);
00134 }
00135
00136 L4_INLINE l4_msg_t *
00137 l4_get_rcv_msg_from_descr(void *msg)
00138 {
00139 return (l4_msg_t*)((l4_addr_t)msg & ~0x03);
00140 }
00141
00142 #endif