- l4_msgtag_t rtag;
- register l4_umword_t _r __asm__("r4") = src | L4_SYSF_RECV;
- register l4_umword_t _timeout __asm__("r5") = timeout.raw;
- register l4_msgtag_t _tag __asm__("r3");
- register l4_umword_t _flags __asm__("r6") = 0;
- (void)utcb;
-
- _tag.raw = 0;
-
- __asm__ __volatile__
- ("bla %[addr] \n"
- :
- "=r"(_r),
- "=r"(_timeout),
- "=r"(_flags),
- "=r"(_tag)
- :
- [addr] "i"(L4_SYSCALL_INVOKE),
- "0"(_r),
- "1"(_timeout),
- "2"(_flags),
- "3"(_tag)
- :
- "memory", "lr");
- rtag.raw = _tag.raw; // because gcc doesn't return out of registers variables
- return rtag;
-}
-
-// todo: let all calls above use this single call
-L4_INLINE l4_msgtag_t
-l4_ipc(l4_cap_idx_t dest, l4_utcb_t *utcb,
- l4_umword_t flags,
- l4_umword_t slabel,
- l4_msgtag_t tag,
- l4_umword_t *rlabel,
- l4_timeout_t timeout) L4_NOTHROW
-{
- register l4_umword_t _dest __asm__("r4") = dest | flags;
- register l4_umword_t _timeout __asm__("r5") = timeout.raw;
- register l4_msgtag_t _tag __asm__("r3") = tag;
- register l4_umword_t _lab __asm__("r6") = slabel;
- (void)utcb;
-
- __asm__ __volatile__
- ("bla %[addr] \n"
- :
- "=r" (_dest),
- "=r" (_timeout),
- "=r" (_lab),
- "=r" (_tag)
- :
- [addr] "i" (L4_SYSCALL_INVOKE),
- "0" (_dest),
- "1" (_timeout),
- "2" (_lab),
- "3" (_tag)
- :
- "memory", "lr");
- *rlabel = _lab;
- tag.raw = _tag.raw; // because gcc doesn't return out of registers variables
- return tag;
+ l4_msgtag_t t;
+ t.raw = 0;
+ return l4_ipc(src, utcb, L4_SYSF_RECV, 0, t, 0, timeout);