11.4Sdennis/* $NetBSD: SYS.h,v 1.4 2015/01/12 02:48:20 dennis Exp $ */ 21.1Sross 31.1Sross#include <machine/asm.h> 41.1Sross#include <sys/syscall.h> 51.1Sross 61.4Sdennis/* 71.4Sdennis * Inline what __cerror() is generally used to do since branching 81.4Sdennis * to __cerror() can't be done reliably with the powerpc64 ABI. 91.4Sdennis */ 101.4Sdennis#ifdef _REENTRANT 111.4Sdennis#define _DO_CERROR_SF_SZ (SF_SZ + SF_ALIGN(8)) 121.4Sdennis#define _DO_CERROR() mflr %r0 ;\ 131.4Sdennis streg %r31,-8(%r1) ;\ 141.4Sdennis streg %r0,SF_LR(%r1) ;\ 151.4Sdennis stptru %r1,-_DO_CERROR_SF_SZ(%r1) ;\ 161.4Sdennis mr %r31,%r3 ;\ 171.4Sdennis bl PIC_PLT(_C_LABEL(__errno)) ;\ 181.4Sdennis nop ;\ 191.4Sdennis stint %r31,0(%r3) ;\ 201.4Sdennis addi %r1,%r1,_DO_CERROR_SF_SZ ;\ 211.4Sdennis ldreg %r0,SF_LR(%r1) ;\ 221.4Sdennis ldreg %r31,-8(%r1) ;\ 231.4Sdennis mtlr %r0 ;\ 241.4Sdennis li %r3,-1 ;\ 251.4Sdennis li %r4,-1 ;\ 261.4Sdennis blr 271.4Sdennis#else /* !_REENTRANT */ 281.4Sdennis#define _DO_CERROR() lwz %r4,_C_LABEL(errno)@got(%r2) ;\ 291.4Sdennis stw %r3,0(%r4) ;\ 301.4Sdennis li %r3,-1 ;\ 311.4Sdennis li %r4,-1 ;\ 321.4Sdennis blr 331.4Sdennis#endif /* _REENTRANT */ 341.4Sdennis 351.4Sdennis/* Clearly BRANCH_TO_CERROR() no longer does that... */ 361.4Sdennis#define BRANCH_TO_CERROR() _DO_CERROR() 371.3Smatt 381.1Sross#define _DOSYSCALL(x) li %r0,(SYS_ ## x) ;\ 391.1Sross sc 401.1Sross 411.1Sross#define _SYSCALL_NOERROR(x,y) .text ;\ 421.3Smatt .p2align 2 ;\ 431.1Sross ENTRY(x) ;\ 441.1Sross _DOSYSCALL(y) 451.1Sross 461.1Sross#define _SYSCALL(x,y) .text ;\ 471.3Smatt .p2align 2 ;\ 481.4Sdennis 2: _DO_CERROR() ;\ 491.1Sross _SYSCALL_NOERROR(x,y) ;\ 501.1Sross bso 2b 511.1Sross 521.1Sross#define SYSCALL_NOERROR(x) _SYSCALL_NOERROR(x,x) 531.1Sross 541.1Sross#define SYSCALL(x) _SYSCALL(x,x) 551.1Sross 561.1Sross#define PSEUDO_NOERROR(x,y) _SYSCALL_NOERROR(x,y) ;\ 571.3Smatt blr ;\ 581.3Smatt END(x) 591.1Sross 601.1Sross#define PSEUDO(x,y) _SYSCALL_NOERROR(x,y) ;\ 611.1Sross bnslr ;\ 621.4Sdennis _DO_CERROR() ;\ 631.3Smatt END(x) 641.1Sross 651.1Sross#define RSYSCALL_NOERROR(x) PSEUDO_NOERROR(x,x) 661.1Sross 671.1Sross#define RSYSCALL(x) PSEUDO(x,x) 681.1Sross 691.1Sross#define WSYSCALL(weak,strong) WEAK_ALIAS(weak,strong) ;\ 701.1Sross PSEUDO(strong,weak) 71