X-Git-Url: https://rtime.felk.cvut.cz/gitweb/l4.git/blobdiff_plain/56f5334cc1eaa0194bd91769f57b683f90ba3d76..c08ea499551bb4dd41537ac1241e03757f360759:/l4/pkg/l4sys/include/ARCH-ppc32/L4API-l4f/ipc.h diff --git a/l4/pkg/l4sys/include/ARCH-ppc32/L4API-l4f/ipc.h b/l4/pkg/l4sys/include/ARCH-ppc32/L4API-l4f/ipc.h index e1a3e8293..e06a8140f 100644 --- a/l4/pkg/l4sys/include/ARCH-ppc32/L4API-l4f/ipc.h +++ b/l4/pkg/l4sys/include/ARCH-ppc32/L4API-l4f/ipc.h @@ -36,65 +36,52 @@ #define L4_SYSCALL_INVOKE (-0x00000004-L4_SYSCALL_MAGIC_OFFSET) L4_INLINE l4_msgtag_t -l4_ipc_call(l4_cap_idx_t dest, l4_utcb_t *utcb, - l4_msgtag_t tag, - l4_timeout_t timeout) L4_NOTHROW +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 | L4_SYSF_CALL; + register l4_umword_t _dest __asm__("r4") = dest | flags; register l4_umword_t _timeout __asm__("r5") = timeout.raw; - register l4_umword_t _flags __asm__("r6") = 0; - register l4_msgtag_t _tag __asm__("r3") = tag; + register l4_umword_t _tag __asm__("r3") = tag.raw; + register l4_umword_t _lab __asm__("r6") = slabel; (void)utcb; __asm__ __volatile__ - (" bla %[addr] \n" + ("bla %[addr]" : - "=r" (_dest), - "=r" (_timeout), - "=r" (_flags), - "=r" (_tag) + "+r" (_dest), + "+r" (_timeout), + "+r" (_lab), + "+r" (_tag) : - [addr]"i" (L4_SYSCALL_INVOKE), - "0" (_dest), - "1" (_timeout), - "2" (_flags), - "3" (_tag) + [addr] "i" (L4_SYSCALL_INVOKE) : - "lr", "memory"); + "memory", "lr"); - tag.raw = _tag.raw; // because gcc doesn't return out of registers variables + if (rlabel) + *rlabel = _lab; + tag.raw = _tag; return tag; } + +L4_INLINE l4_msgtag_t +l4_ipc_call(l4_cap_idx_t dest, l4_utcb_t *utcb, + l4_msgtag_t tag, + l4_timeout_t timeout) L4_NOTHROW +{ + return l4_ipc(dest, utcb, L4_SYSF_CALL, 0, tag, 0, timeout); +} + L4_INLINE l4_msgtag_t l4_ipc_reply_and_wait(l4_utcb_t *utcb, l4_msgtag_t tag, l4_umword_t *label, l4_timeout_t timeout) L4_NOTHROW { - register l4_umword_t _dest __asm__("r4") = L4_INVALID_CAP | L4_SYSF_REPLY_AND_WAIT; - register l4_umword_t _timeout __asm__("r5") = timeout.raw; - register l4_msgtag_t _tag __asm__("r3") = tag; - register l4_umword_t _flags __asm__("r6") = 0; - (void)utcb; - - __asm__ __volatile__ - (" bla %[addr] \n" - : - "=r" (_dest), - "=r" (_timeout), - "=r" (_flags), - "=r" (_tag) - : - [addr]"i" (L4_SYSCALL_INVOKE), - "0" (_dest), - "1" (_timeout), - "2" (_flags), - "3" (_tag) - : - "lr", "memory"); - *label = _flags; - tag.raw = _tag.raw; // because gcc doesn't return out of registers variables - return tag; + return l4_ipc(L4_INVALID_CAP, utcb, L4_SYSF_REPLY_AND_WAIT, 0, tag, label, timeout); } L4_INLINE l4_msgtag_t @@ -103,30 +90,7 @@ l4_ipc_send_and_wait(l4_cap_idx_t dest, l4_utcb_t *utcb, l4_umword_t *src, l4_timeout_t timeout) L4_NOTHROW { - register l4_umword_t _dest __asm__("r4") = dest | L4_SYSF_SEND_AND_WAIT; - register l4_umword_t _timeout __asm__("r5") = timeout.raw; - register l4_msgtag_t _tag __asm__("r3") = tag; - register l4_umword_t _flags __asm__("r6") = 0; - (void)utcb; - - __asm__ __volatile__ - (" bla %[addr] \n" - : - "=r" (_dest), - "=r" (_timeout), - "=r" (_flags), - "=r" (_tag) - : - [addr] "i" (L4_SYSCALL_INVOKE), - "0" (_dest), - "1" (_timeout), - "2" (_flags), - "3" (_tag) - : - "memory", "lr"); - *src = _flags; - tag.raw = _tag.raw; // because gcc doesn't return out of registers variables - return tag; + return l4_ipc(dest, utcb, L4_SYSF_SEND_AND_WAIT, 0, tag, src, timeout); } L4_INLINE l4_msgtag_t @@ -134,129 +98,25 @@ l4_ipc_send(l4_cap_idx_t dest, l4_utcb_t *utcb, l4_msgtag_t tag, l4_timeout_t timeout) L4_NOTHROW { - register l4_umword_t _dest __asm__("r4") = dest | L4_SYSF_SEND; - register l4_umword_t _timeout __asm__("r5") = timeout.raw; - register l4_umword_t _flags __asm__("r6") = 0; - register l4_msgtag_t _tag __asm__("r3") = tag; - (void)utcb; - - __asm__ __volatile__ - ("bla %[addr] \n" - : - "=r" (_dest), - "=r" (_timeout), - "=r" (_flags), - "=r" (_tag) - : - [addr] "i" (L4_SYSCALL_INVOKE), - "0" (_dest), - "1" (_timeout), - "2" (_flags), - "3" (_tag) - : - "memory", "lr"); - tag.raw = _tag.raw; // because gcc doesn't return out of registers variables - return tag; + return l4_ipc(dest, utcb, L4_SYSF_SEND, 0, tag, 0, timeout); } L4_INLINE l4_msgtag_t l4_ipc_wait(l4_utcb_t *utcb, l4_umword_t *src, l4_timeout_t timeout) L4_NOTHROW { - l4_msgtag_t rtag; - register l4_umword_t _r __asm__("r4") = L4_INVALID_CAP | L4_SYSF_WAIT; - 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"); - *src = _flags; - rtag.raw = _tag.raw; // because gcc doesn't return out of registers variables - return rtag; + l4_msgtag_t t; + t.raw = 0; + return l4_ipc(L4_INVALID_CAP, utcb, L4_SYSF_WAIT, 0, t, src, timeout); } L4_INLINE l4_msgtag_t l4_ipc_receive(l4_cap_idx_t src, l4_utcb_t *utcb, l4_timeout_t timeout) L4_NOTHROW { - 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); } #include