SYS.h revision 1.4
1/* $NetBSD: SYS.h,v 1.4 2015/01/12 02:48:20 dennis Exp $ */ 2 3#include <machine/asm.h> 4#include <sys/syscall.h> 5 6/* 7 * Inline what __cerror() is generally used to do since branching 8 * to __cerror() can't be done reliably with the powerpc64 ABI. 9 */ 10#ifdef _REENTRANT 11#define _DO_CERROR_SF_SZ (SF_SZ + SF_ALIGN(8)) 12#define _DO_CERROR() mflr %r0 ;\ 13 streg %r31,-8(%r1) ;\ 14 streg %r0,SF_LR(%r1) ;\ 15 stptru %r1,-_DO_CERROR_SF_SZ(%r1) ;\ 16 mr %r31,%r3 ;\ 17 bl PIC_PLT(_C_LABEL(__errno)) ;\ 18 nop ;\ 19 stint %r31,0(%r3) ;\ 20 addi %r1,%r1,_DO_CERROR_SF_SZ ;\ 21 ldreg %r0,SF_LR(%r1) ;\ 22 ldreg %r31,-8(%r1) ;\ 23 mtlr %r0 ;\ 24 li %r3,-1 ;\ 25 li %r4,-1 ;\ 26 blr 27#else /* !_REENTRANT */ 28#define _DO_CERROR() lwz %r4,_C_LABEL(errno)@got(%r2) ;\ 29 stw %r3,0(%r4) ;\ 30 li %r3,-1 ;\ 31 li %r4,-1 ;\ 32 blr 33#endif /* _REENTRANT */ 34 35/* Clearly BRANCH_TO_CERROR() no longer does that... */ 36#define BRANCH_TO_CERROR() _DO_CERROR() 37 38#define _DOSYSCALL(x) li %r0,(SYS_ ## x) ;\ 39 sc 40 41#define _SYSCALL_NOERROR(x,y) .text ;\ 42 .p2align 2 ;\ 43 ENTRY(x) ;\ 44 _DOSYSCALL(y) 45 46#define _SYSCALL(x,y) .text ;\ 47 .p2align 2 ;\ 48 2: _DO_CERROR() ;\ 49 _SYSCALL_NOERROR(x,y) ;\ 50 bso 2b 51 52#define SYSCALL_NOERROR(x) _SYSCALL_NOERROR(x,x) 53 54#define SYSCALL(x) _SYSCALL(x,x) 55 56#define PSEUDO_NOERROR(x,y) _SYSCALL_NOERROR(x,y) ;\ 57 blr ;\ 58 END(x) 59 60#define PSEUDO(x,y) _SYSCALL_NOERROR(x,y) ;\ 61 bnslr ;\ 62 _DO_CERROR() ;\ 63 END(x) 64 65#define RSYSCALL_NOERROR(x) PSEUDO_NOERROR(x,x) 66 67#define RSYSCALL(x) PSEUDO(x,x) 68 69#define WSYSCALL(weak,strong) WEAK_ALIAS(weak,strong) ;\ 70 PSEUDO(strong,weak) 71