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