00001
00006 #ifndef __L4SYS__INCLUDE__ARCH_ARM__L4API_L4V2__IPC_H__
00007 #define __L4SYS__INCLUDE__ARCH_ARM__L4API_L4V2__IPC_H__
00008
00009 #define L4_IPC_CAPMAPMSG_BASE 0xf0000100
00010
00011 #include_next <l4/sys/ipc.h>
00012
00013 #ifdef __GNUC__
00014
00015 #include <l4/sys/compiler.h>
00016
00017 #ifndef L4_SYSCALL_MAGIC_OFFSET
00018 # define L4_SYSCALL_MAGIC_OFFSET 8
00019 #endif
00020 #define L4_SYSCALL_IPC (-0x00000004-L4_SYSCALL_MAGIC_OFFSET)
00021
00022 L4_INLINE int
00023 l4_ipc_call_tag(l4_threadid_t dest,
00024 const void *snd_msg,
00025 l4_umword_t snd_w0,
00026 l4_umword_t snd_w1,
00027 l4_msgtag_t tag,
00028 void *rcv_msg,
00029 l4_umword_t *rcv_w0,
00030 l4_umword_t *rcv_w1,
00031 l4_timeout_t timeout,
00032 l4_msgdope_t *result,
00033 l4_msgtag_t *rtag)
00034 {
00035 register l4_umword_t _dest __asm__("r0") = dest.raw;
00036 register l4_umword_t _snd_desc __asm__("r1") = (l4_umword_t)snd_msg;
00037 register l4_umword_t _rcv_desc __asm__("r2") = (l4_umword_t)rcv_msg;
00038 register l4_umword_t _timeout __asm__("r3") = timeout.raw;
00039 register l4_umword_t _w0 __asm__("r5") = snd_w0;
00040 register l4_umword_t _w1 __asm__("r6") = snd_w1;
00041 register l4_umword_t _tag __asm__("r4") = tag.raw;
00042 __asm__ __volatile__
00043 ("@ l4_ipc_call(start) \n\t"
00044 PIC_SAVE_ASM
00045 "stmdb sp!, {fp} \n\t"
00046 "mov lr, pc \n\t"
00047 "mov pc, %7 \n\t"
00048 "ldmia sp!, {fp} \n\t"
00049 PIC_RESTORE_ASM
00050 "@ l4_ipc_call(end) \n\t"
00051 :
00052 "=r" (_dest),
00053 "=r" (_snd_desc),
00054 "=r" (_rcv_desc),
00055 "=r" (_timeout),
00056 "=r" (_w0),
00057 "=r" (_w1),
00058 "=r" (_tag)
00059 :
00060 "i" (L4_SYSCALL_IPC),
00061 "0" (_dest),
00062 "1" (_snd_desc),
00063 "2" (_rcv_desc),
00064 "3" (_timeout),
00065 "4" (_w0),
00066 "5" (_w1),
00067 "6" (_tag)
00068 :
00069 "r7", "r8", "r9" PIC_CLOBBER, "r12", "r14", "memory");
00070
00071 *rcv_w0 = _w0;
00072 *rcv_w1 = _w1;
00073 result->raw = _snd_desc;
00074 rtag->raw = _tag;
00075
00076 return L4_IPC_ERROR(*result);
00077 }
00078
00079 L4_INLINE int
00080 l4_ipc_reply_and_wait_tag(l4_threadid_t dest,
00081 const void *snd_msg,
00082 l4_umword_t snd_w0,
00083 l4_umword_t snd_w1,
00084 l4_msgtag_t tag,
00085 l4_threadid_t *src,
00086 void *rcv_msg,
00087 l4_umword_t *rcv_w0,
00088 l4_umword_t *rcv_w1,
00089 l4_timeout_t timeout,
00090 l4_msgdope_t *result,
00091 l4_msgtag_t *rtag)
00092 {
00093 register l4_umword_t _dest __asm__("r0") = dest.raw;
00094 register l4_umword_t _snd_desc __asm__("r1") = (l4_umword_t)snd_msg;
00095 register l4_umword_t _rcv_desc __asm__("r2") = (l4_umword_t)rcv_msg | L4_IPC_OPEN_IPC;
00096 register l4_umword_t _timeout __asm__("r3") = timeout.raw;
00097 register l4_umword_t _tag __asm__("r4") = tag.raw;
00098 register l4_umword_t _w0 __asm__("r5") = snd_w0;
00099 register l4_umword_t _w1 __asm__("r6") = snd_w1;
00100
00101 __asm__ __volatile__
00102 ("@ l4_ipc_reply_and_wait(start) \n\t"
00103 PIC_SAVE_ASM
00104 "stmdb sp!, {fp} \n\t"
00105 "mov lr, pc \n\t"
00106 "mov pc, %7 \n\t"
00107 "ldmia sp!, {fp} \n\t"
00108 PIC_RESTORE_ASM
00109 "@ l4_ipc_reply_and_wait(end) \n\t"
00110 :
00111 "=r" (_dest),
00112 "=r" (_snd_desc),
00113 "=r" (_rcv_desc),
00114 "=r" (_timeout),
00115 "=r" (_w0),
00116 "=r" (_w1),
00117 "=r" (_tag)
00118 :
00119 "i" (L4_SYSCALL_IPC),
00120 "0" (_dest),
00121 "1" (_snd_desc),
00122 "2" (_rcv_desc),
00123 "3" (_timeout),
00124 "4" (_w0),
00125 "5" (_w1),
00126 "6" (_tag)
00127 :
00128 "r7", "r8", "r9" PIC_CLOBBER, "r12", "r14", "memory");
00129 *rcv_w0 = _w0;
00130 *rcv_w1 = _w1;
00131 src->raw = _dest;
00132 result->raw = _snd_desc;
00133 rtag->raw = _tag;
00134
00135 return L4_IPC_ERROR(*result);
00136 }
00137
00138 L4_INLINE int
00139 l4_ipc_send_tag(l4_threadid_t dest,
00140 const void *snd_msg,
00141 l4_umword_t w0,
00142 l4_umword_t w1,
00143 l4_msgtag_t tag,
00144 l4_timeout_t timeout,
00145 l4_msgdope_t *result)
00146 {
00147 register l4_umword_t _dest __asm__("r0") = dest.raw;
00148 register l4_umword_t _snd_desc __asm__("r1") = (l4_umword_t)snd_msg;
00149 register l4_umword_t _rcv_desc __asm__("r2") = L4_IPC_NIL_DESCRIPTOR;
00150 register l4_umword_t _timeout __asm__("r3") = timeout.raw;
00151 register l4_umword_t _w0 __asm__("r5") = w0;
00152 register l4_umword_t _w1 __asm__("r6") = w1;
00153 register l4_umword_t _tag __asm__("r4") = tag.raw;
00154
00155 __asm__ __volatile__
00156 ("@ l4_ipc_send(start) \n\t"
00157 PIC_SAVE_ASM
00158 "stmdb sp!, {fp} \n\t"
00159 "mov lr, pc \n\t"
00160 "mov pc, %7 \n\t"
00161 "ldmia sp!, {fp} \n\t"
00162 PIC_RESTORE_ASM
00163 "@ l4_ipc_send(end) \n\t"
00164 :
00165 "=r" (_dest),
00166 "=r" (_snd_desc),
00167 "=r" (_rcv_desc),
00168 "=r" (_timeout),
00169 "=r" (_w0),
00170 "=r" (_w1),
00171 "=r" (_tag)
00172 :
00173 "i" (L4_SYSCALL_IPC),
00174 "0" (_dest),
00175 "1" (_snd_desc),
00176 "2" (_rcv_desc),
00177 "3" (_timeout),
00178 "4" (_w0),
00179 "5" (_w1),
00180 "6" (_tag)
00181 :
00182 "r7", "r8", "r9" PIC_CLOBBER, "r12", "r14", "memory");
00183 result->raw = _snd_desc;
00184
00185 return L4_IPC_ERROR(*result);
00186 }
00187
00188 L4_INLINE int
00189 l4_ipc_wait_tag(l4_threadid_t *src,
00190 void *rcv_msg,
00191 l4_umword_t *rcv_w0,
00192 l4_umword_t *rcv_w1,
00193 l4_timeout_t timeout,
00194 l4_msgdope_t *result,
00195 l4_msgtag_t *tag)
00196 {
00197 register l4_umword_t _res __asm__("r0") = 0;
00198 register l4_umword_t _snd_desc __asm__("r1") = L4_IPC_NIL_DESCRIPTOR;
00199 register l4_umword_t _rcv_desc __asm__("r2") = (l4_umword_t)rcv_msg | L4_IPC_OPEN_IPC;
00200 register l4_umword_t _timeout __asm__("r3") = timeout.raw;
00201 register l4_umword_t _tag __asm__("r4");
00202 register l4_umword_t _w0 __asm__("r5");
00203 register l4_umword_t _w1 __asm__("r6");
00204
00205 __asm__ __volatile__
00206 ("@ l4_ipc_wait(start) \n\t"
00207 PIC_SAVE_ASM
00208 "stmdb sp!, {fp} \n\t"
00209 "mov lr, pc \n\t"
00210 "mov pc, %7 \n\t"
00211 "ldmia sp!, {fp} \n\t"
00212 PIC_RESTORE_ASM
00213 "@ l4_ipc_wait(end) \n\t"
00214 :
00215 "=r"(_res),
00216 "=r"(_snd_desc),
00217 "=r"(_rcv_desc),
00218 "=r"(_timeout),
00219 "=r"(_w0),
00220 "=r"(_w1),
00221 "=r"(_tag)
00222 :
00223 "i"(L4_SYSCALL_IPC),
00224 "0"(_res),
00225 "1"(_snd_desc),
00226 "2"(_rcv_desc),
00227 "3"(_timeout)
00228 :
00229 "r7", "r8", "r9" PIC_CLOBBER, "r12", "r14", "memory");
00230 *rcv_w0 = _w0;
00231 *rcv_w1 = _w1;
00232 result->raw = _snd_desc;
00233 src->raw = _res;
00234 tag->raw = _tag;
00235
00236 return L4_IPC_ERROR(*result);
00237 }
00238
00239 L4_INLINE int
00240 l4_ipc_receive_tag(l4_threadid_t src,
00241 void *rcv_msg,
00242 l4_umword_t *rcv_w0,
00243 l4_umword_t *rcv_w1,
00244 l4_timeout_t timeout,
00245 l4_msgdope_t *result,
00246 l4_msgtag_t *tag)
00247 {
00248 register l4_umword_t _res __asm__("r0") = src.raw;
00249 register l4_umword_t _snd_desc __asm__("r1") = L4_IPC_NIL_DESCRIPTOR;
00250 register l4_umword_t _rcv_desc __asm__("r2") = (l4_umword_t)rcv_msg;
00251 register l4_umword_t _timeout __asm__("r3") = timeout.raw;
00252 register l4_umword_t _tag __asm__("r4");
00253 register l4_umword_t _w0 __asm__("r5");
00254 register l4_umword_t _w1 __asm__("r6");
00255
00256 __asm__ __volatile__
00257 ("@ l4_ipc_receive(start) \n\t"
00258 PIC_SAVE_ASM
00259 "stmdb sp!, {fp} \n\t"
00260 "mov lr, pc \n\t"
00261 "mov pc, %7 \n\t"
00262 "ldmia sp!, {fp} \n\t"
00263 PIC_RESTORE_ASM
00264 "@ l4_ipc_receive(end) \n\t"
00265 :
00266 "=r"(_res),
00267 "=r"(_snd_desc),
00268 "=r"(_rcv_desc),
00269 "=r"(_timeout),
00270 "=r"(_w0),
00271 "=r"(_w1),
00272 "=r"(_tag)
00273 :
00274 "i"(L4_SYSCALL_IPC),
00275 "0"(_res),
00276 "1"(_snd_desc),
00277 "2"(_rcv_desc),
00278 "3"(_timeout)
00279 :
00280 "r7", "r8", "r9" PIC_CLOBBER, "r12", "r14", "memory");
00281 *rcv_w0 = _w0;
00282 *rcv_w1 = _w1;
00283 result->raw = _snd_desc;
00284 tag->raw = _tag;
00285
00286 return L4_IPC_ERROR(*result);
00287 }
00288
00289 #include <l4/sys/ipc-impl.h>
00290
00291 #endif //__GNUC__
00292
00293 #endif