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