43 lines
1.2 KiB
C
43 lines
1.2 KiB
C
/*
|
|
* pipe.c
|
|
*/
|
|
|
|
#include "syscommon.h"
|
|
#include <klibc/archsys.h>
|
|
|
|
#define ASM_CLOBBERS ,"out2", "out3", "out4", "out5", "out6", "out7", \
|
|
/* Non-stacked integer registers, minus r8, r9, r10, r15. */ \
|
|
"r2", "r3", "r11", "r12", "r13", "r14", "r16", "r17", "r18", \
|
|
"r19", "r20", "r21", "r22", "r23", "r24", "r25", "r26", "r27", \
|
|
"r28", "r29", "r30", "r31", \
|
|
/* Predicate registers. */ \
|
|
"p6", "p7", "p8", "p9", "p10", "p11", "p12", "p13", "p14", "p15", \
|
|
/* Non-rotating fp registers. */ \
|
|
"f6", "f7", "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", \
|
|
/* Branch registers. */ \
|
|
"b6", "b7"
|
|
|
|
int pipe(int *filedes)
|
|
{
|
|
register long _r8 asm("r8");
|
|
register long _r9 asm("r9");
|
|
register long _r10 asm("r10");
|
|
register long _r15 asm("r15") = __NR_pipe;
|
|
register long _out0 asm ("out0") = (long)filedes;
|
|
long _retval;
|
|
__asm __volatile (__IA64_BREAK
|
|
: "=r" (_r8), "=r" (_r10), "=r" (_r15),
|
|
"=r" (_out0)
|
|
: "2" (_r15), "3" (_out0)
|
|
: "memory" ASM_CLOBBERS);
|
|
if (_r10 == -1) {
|
|
errno = _r8;
|
|
_retval = -1;
|
|
} else {
|
|
filedes[0] = _r8;
|
|
filedes[1] = _r9;
|
|
_retval = 0;
|
|
}
|
|
return _retval;
|
|
}
|