chiark / gitweb /
[PATCH] volume-id build fix and update
[elogind.git] / klibc / klibc / arch / ia64 / pipe.c
1 /*
2  * pipe.c
3  */
4
5 #include "syscommon.h"
6 #include <klibc/archsys.h>
7
8 #define ASM_CLOBBERS ,"out2", "out3", "out4", "out5", "out6", "out7",    \
9    /* Non-stacked integer registers, minus r8, r9, r10, r15.  */        \
10   "r2", "r3", "r11", "r12", "r13", "r14", "r16", "r17", "r18",          \
11   "r19", "r20", "r21", "r22", "r23", "r24", "r25", "r26", "r27",        \
12   "r28", "r29", "r30", "r31",                                           \
13   /* Predicate registers.  */                                           \
14   "p6", "p7", "p8", "p9", "p10", "p11", "p12", "p13", "p14", "p15",     \
15   /* Non-rotating fp registers.  */                                     \
16   "f6", "f7", "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",     \
17   /* Branch registers.  */                                              \
18   "b6", "b7"
19
20 int pipe(int *filedes)
21 {
22         register long _r8 asm("r8");
23         register long _r9 asm("r9");
24         register long _r10 asm("r10");
25         register long _r15 asm("r15") = __NR_pipe;
26         register long _out0 asm ("out0") = (long)filedes;
27         long _retval;
28         __asm __volatile (__IA64_BREAK
29                           : "=r" (_r8), "=r" (_r10), "=r" (_r15),
30                             "=r" (_out0)
31                           : "2" (_r15), "3" (_out0)
32                           : "memory" ASM_CLOBBERS);
33         if (_r10 == -1) {
34                 errno = _r8;
35                 _retval = -1;
36         } else {
37                 filedes[0] = _r8;
38                 filedes[1] = _r9;
39                 _retval = 0;
40         }
41         return _retval;
42 }