diff options
author | Luck, Tony <tony.luck@intel.com> | 2012-03-29 16:46:47 -0700 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2012-03-29 17:28:53 -0700 |
commit | 9469b751d78544ec4ec4522de7a8f6c98c01b035 (patch) | |
tree | 2f1533d2b4abee6c5a905f6c3d8d2c84082c0791 | |
parent | d22ecd7aa2f52666e9b980f2f369be95e618c256 (diff) | |
download | klibc-9469b751d78544ec4ec4522de7a8f6c98c01b035.tar.gz |
[klibc] ia64: Replace pipe.c with pipe.S
There is a concern that use of macros inside "C" versions of
system call stubs could have licensing consequences. Remove
any doubt by re-writing the stub in assember.
[ hpa: specifically, the origin of this particular file is a bit murky
so avoid any and all concerns by just replacing it; all other IA64
system calls are already in pure assembly. ]
Signed-off-by: Tony Luck <tony.luck@intel.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
-rw-r--r-- | usr/klibc/arch/ia64/pipe.S | 29 | ||||
-rw-r--r-- | usr/klibc/arch/ia64/pipe.c | 41 |
2 files changed, 29 insertions, 41 deletions
diff --git a/usr/klibc/arch/ia64/pipe.S b/usr/klibc/arch/ia64/pipe.S new file mode 100644 index 0000000000000..8ecd97277d829 --- /dev/null +++ b/usr/klibc/arch/ia64/pipe.S @@ -0,0 +1,29 @@ +#include <asm/unistd.h> + .align 32 + .proc pipe + .global pipe +pipe: + alloc r16 = ar.pfs, 1, 0, 8, 0 + mov r33 = r32 + mov r15=__NR_pipe + ;; + break 0x100000 // Do the syscall + ;; + + cmp.ne p6, p7 = -1, r10 + mov r15 = r0 + ;; +(p7) addl r14 = @ltoffx(errno), r1 + +(p6) st4 [r32] = r8, 4 +(p7) addl r15 = -1, r0 + ;; + +(p7) ld8.mov r14 = [r14], errno +(p6) st4 [r32] = r9 + ;; + +(p7) st4 [r14] = r8 + mov r8 = r15 + br.ret.sptk.many b0 + .endp pipe diff --git a/usr/klibc/arch/ia64/pipe.c b/usr/klibc/arch/ia64/pipe.c deleted file mode 100644 index 13350321a739b..0000000000000 --- a/usr/klibc/arch/ia64/pipe.c +++ /dev/null @@ -1,41 +0,0 @@ -/* - * pipe.c - */ - -#include <sys/syscall.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("break 0x100000;;\n\t" - :"=r"(_r8), "=r"(_r10), "=r"(_r15), - "=r"(_out0), "=r"(_r9) - :"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; -} |