1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2deae26bfSKyle McMartin #ifndef _ASM_PARISC_UNISTD_H_ 3deae26bfSKyle McMartin #define _ASM_PARISC_UNISTD_H_ 4deae26bfSKyle McMartin 570c1674fSDavid Howells #include <uapi/asm/unistd.h> 6deae26bfSKyle McMartin 7dbf91a54SFiroz Khan #define __NR_Linux_syscalls __NR_syscalls 8dbf91a54SFiroz Khan 9deae26bfSKyle McMartin #ifndef __ASSEMBLY__ 10deae26bfSKyle McMartin 11deae26bfSKyle McMartin #define SYS_ify(syscall_name) __NR_##syscall_name 12deae26bfSKyle McMartin 13dfddd1a8SFiroz Khan #define __IGNORE_fadvise64 /* fadvise64_64 */ 14dfddd1a8SFiroz Khan 15deae26bfSKyle McMartin #ifndef ASM_LINE_SEP 16deae26bfSKyle McMartin # define ASM_LINE_SEP ; 17deae26bfSKyle McMartin #endif 18deae26bfSKyle McMartin 19deae26bfSKyle McMartin /* Definition taken from glibc 2.3.3 20deae26bfSKyle McMartin * sysdeps/unix/sysv/linux/hppa/sysdep.h 21deae26bfSKyle McMartin */ 22deae26bfSKyle McMartin 23deae26bfSKyle McMartin #ifdef PIC 24deae26bfSKyle McMartin /* WARNING: CANNOT BE USED IN A NOP! */ 25deae26bfSKyle McMartin # define K_STW_ASM_PIC " copy %%r19, %%r4\n" 26deae26bfSKyle McMartin # define K_LDW_ASM_PIC " copy %%r4, %%r19\n" 27deae26bfSKyle McMartin # define K_USING_GR4 "%r4", 28deae26bfSKyle McMartin #else 29deae26bfSKyle McMartin # define K_STW_ASM_PIC " \n" 30deae26bfSKyle McMartin # define K_LDW_ASM_PIC " \n" 31deae26bfSKyle McMartin # define K_USING_GR4 32deae26bfSKyle McMartin #endif 33deae26bfSKyle McMartin 34deae26bfSKyle McMartin /* GCC has to be warned that a syscall may clobber all the ABI 35deae26bfSKyle McMartin registers listed as "caller-saves", see page 8, Table 2 36deae26bfSKyle McMartin in section 2.2.6 of the PA-RISC RUN-TIME architecture 37deae26bfSKyle McMartin document. However! r28 is the result and will conflict with 38deae26bfSKyle McMartin the clobber list so it is left out. Also the input arguments 39deae26bfSKyle McMartin registers r20 -> r26 will conflict with the list so they 40deae26bfSKyle McMartin are treated specially. Although r19 is clobbered by the syscall 41deae26bfSKyle McMartin we cannot say this because it would violate ABI, thus we say 42deae26bfSKyle McMartin r4 is clobbered and use that register to save/restore r19 43deae26bfSKyle McMartin across the syscall. */ 44deae26bfSKyle McMartin 45deae26bfSKyle McMartin #define K_CALL_CLOB_REGS "%r1", "%r2", K_USING_GR4 \ 46deae26bfSKyle McMartin "%r20", "%r29", "%r31" 47deae26bfSKyle McMartin 48deae26bfSKyle McMartin #undef K_INLINE_SYSCALL 49deae26bfSKyle McMartin #define K_INLINE_SYSCALL(name, nr, args...) ({ \ 50deae26bfSKyle McMartin long __sys_res; \ 51deae26bfSKyle McMartin { \ 52deae26bfSKyle McMartin register unsigned long __res __asm__("r28"); \ 53deae26bfSKyle McMartin K_LOAD_ARGS_##nr(args) \ 54deae26bfSKyle McMartin /* FIXME: HACK stw/ldw r19 around syscall */ \ 55deae26bfSKyle McMartin __asm__ volatile( \ 56deae26bfSKyle McMartin K_STW_ASM_PIC \ 57deae26bfSKyle McMartin " ble 0x100(%%sr2, %%r0)\n" \ 58deae26bfSKyle McMartin " ldi %1, %%r20\n" \ 59deae26bfSKyle McMartin K_LDW_ASM_PIC \ 60deae26bfSKyle McMartin : "=r" (__res) \ 61deae26bfSKyle McMartin : "i" (SYS_ify(name)) K_ASM_ARGS_##nr \ 62deae26bfSKyle McMartin : "memory", K_CALL_CLOB_REGS K_CLOB_ARGS_##nr \ 63deae26bfSKyle McMartin ); \ 64deae26bfSKyle McMartin __sys_res = (long)__res; \ 65deae26bfSKyle McMartin } \ 66deae26bfSKyle McMartin __sys_res; \ 67deae26bfSKyle McMartin }) 68deae26bfSKyle McMartin 69deae26bfSKyle McMartin #define K_LOAD_ARGS_0() 70deae26bfSKyle McMartin #define K_LOAD_ARGS_1(r26) \ 71deae26bfSKyle McMartin register unsigned long __r26 __asm__("r26") = (unsigned long)(r26); \ 72deae26bfSKyle McMartin K_LOAD_ARGS_0() 73deae26bfSKyle McMartin #define K_LOAD_ARGS_2(r26,r25) \ 74deae26bfSKyle McMartin register unsigned long __r25 __asm__("r25") = (unsigned long)(r25); \ 75deae26bfSKyle McMartin K_LOAD_ARGS_1(r26) 76deae26bfSKyle McMartin #define K_LOAD_ARGS_3(r26,r25,r24) \ 77deae26bfSKyle McMartin register unsigned long __r24 __asm__("r24") = (unsigned long)(r24); \ 78deae26bfSKyle McMartin K_LOAD_ARGS_2(r26,r25) 79deae26bfSKyle McMartin #define K_LOAD_ARGS_4(r26,r25,r24,r23) \ 80deae26bfSKyle McMartin register unsigned long __r23 __asm__("r23") = (unsigned long)(r23); \ 81deae26bfSKyle McMartin K_LOAD_ARGS_3(r26,r25,r24) 82deae26bfSKyle McMartin #define K_LOAD_ARGS_5(r26,r25,r24,r23,r22) \ 83deae26bfSKyle McMartin register unsigned long __r22 __asm__("r22") = (unsigned long)(r22); \ 84deae26bfSKyle McMartin K_LOAD_ARGS_4(r26,r25,r24,r23) 85deae26bfSKyle McMartin #define K_LOAD_ARGS_6(r26,r25,r24,r23,r22,r21) \ 86deae26bfSKyle McMartin register unsigned long __r21 __asm__("r21") = (unsigned long)(r21); \ 87deae26bfSKyle McMartin K_LOAD_ARGS_5(r26,r25,r24,r23,r22) 88deae26bfSKyle McMartin 89deae26bfSKyle McMartin /* Even with zero args we use r20 for the syscall number */ 90deae26bfSKyle McMartin #define K_ASM_ARGS_0 91deae26bfSKyle McMartin #define K_ASM_ARGS_1 K_ASM_ARGS_0, "r" (__r26) 92deae26bfSKyle McMartin #define K_ASM_ARGS_2 K_ASM_ARGS_1, "r" (__r25) 93deae26bfSKyle McMartin #define K_ASM_ARGS_3 K_ASM_ARGS_2, "r" (__r24) 94deae26bfSKyle McMartin #define K_ASM_ARGS_4 K_ASM_ARGS_3, "r" (__r23) 95deae26bfSKyle McMartin #define K_ASM_ARGS_5 K_ASM_ARGS_4, "r" (__r22) 96deae26bfSKyle McMartin #define K_ASM_ARGS_6 K_ASM_ARGS_5, "r" (__r21) 97deae26bfSKyle McMartin 98deae26bfSKyle McMartin /* The registers not listed as inputs but clobbered */ 99deae26bfSKyle McMartin #define K_CLOB_ARGS_6 100deae26bfSKyle McMartin #define K_CLOB_ARGS_5 K_CLOB_ARGS_6, "%r21" 101deae26bfSKyle McMartin #define K_CLOB_ARGS_4 K_CLOB_ARGS_5, "%r22" 102deae26bfSKyle McMartin #define K_CLOB_ARGS_3 K_CLOB_ARGS_4, "%r23" 103deae26bfSKyle McMartin #define K_CLOB_ARGS_2 K_CLOB_ARGS_3, "%r24" 104deae26bfSKyle McMartin #define K_CLOB_ARGS_1 K_CLOB_ARGS_2, "%r25" 105deae26bfSKyle McMartin #define K_CLOB_ARGS_0 K_CLOB_ARGS_1, "%r26" 106deae26bfSKyle McMartin 107deae26bfSKyle McMartin #define _syscall0(type,name) \ 108deae26bfSKyle McMartin type name(void) \ 109deae26bfSKyle McMartin { \ 110deae26bfSKyle McMartin return K_INLINE_SYSCALL(name, 0); \ 111deae26bfSKyle McMartin } 112deae26bfSKyle McMartin 113deae26bfSKyle McMartin #define _syscall1(type,name,type1,arg1) \ 114deae26bfSKyle McMartin type name(type1 arg1) \ 115deae26bfSKyle McMartin { \ 116deae26bfSKyle McMartin return K_INLINE_SYSCALL(name, 1, arg1); \ 117deae26bfSKyle McMartin } 118deae26bfSKyle McMartin 119deae26bfSKyle McMartin #define _syscall2(type,name,type1,arg1,type2,arg2) \ 120deae26bfSKyle McMartin type name(type1 arg1, type2 arg2) \ 121deae26bfSKyle McMartin { \ 122deae26bfSKyle McMartin return K_INLINE_SYSCALL(name, 2, arg1, arg2); \ 123deae26bfSKyle McMartin } 124deae26bfSKyle McMartin 125deae26bfSKyle McMartin #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \ 126deae26bfSKyle McMartin type name(type1 arg1, type2 arg2, type3 arg3) \ 127deae26bfSKyle McMartin { \ 128deae26bfSKyle McMartin return K_INLINE_SYSCALL(name, 3, arg1, arg2, arg3); \ 129deae26bfSKyle McMartin } 130deae26bfSKyle McMartin 131deae26bfSKyle McMartin #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ 132deae26bfSKyle McMartin type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \ 133deae26bfSKyle McMartin { \ 134deae26bfSKyle McMartin return K_INLINE_SYSCALL(name, 4, arg1, arg2, arg3, arg4); \ 135deae26bfSKyle McMartin } 136deae26bfSKyle McMartin 137deae26bfSKyle McMartin /* select takes 5 arguments */ 138deae26bfSKyle McMartin #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \ 139deae26bfSKyle McMartin type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \ 140deae26bfSKyle McMartin { \ 141deae26bfSKyle McMartin return K_INLINE_SYSCALL(name, 5, arg1, arg2, arg3, arg4, arg5); \ 142deae26bfSKyle McMartin } 143deae26bfSKyle McMartin 14482b355d1SArnd Bergmann #define __ARCH_WANT_NEW_STAT 145deae26bfSKyle McMartin #define __ARCH_WANT_STAT64 146deae26bfSKyle McMartin #define __ARCH_WANT_SYS_ALARM 147deae26bfSKyle McMartin #define __ARCH_WANT_SYS_GETHOSTNAME 148deae26bfSKyle McMartin #define __ARCH_WANT_SYS_PAUSE 149deae26bfSKyle McMartin #define __ARCH_WANT_SYS_SIGNAL 150d33c577cSArnd Bergmann #define __ARCH_WANT_SYS_TIME32 151e27da28aSHelge Deller #define __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL 1524faea239SArnd Bergmann #define __ARCH_WANT_SYS_UTIME32 153deae26bfSKyle McMartin #define __ARCH_WANT_SYS_WAITPID 154deae26bfSKyle McMartin #define __ARCH_WANT_SYS_SOCKETCALL 155deae26bfSKyle McMartin #define __ARCH_WANT_SYS_FADVISE64 156deae26bfSKyle McMartin #define __ARCH_WANT_SYS_GETPGRP 157deae26bfSKyle McMartin #define __ARCH_WANT_SYS_NICE 158deae26bfSKyle McMartin #define __ARCH_WANT_SYS_SIGPENDING 159deae26bfSKyle McMartin #define __ARCH_WANT_SYS_SIGPROCMASK 160415bfae9SAl Viro #define __ARCH_WANT_SYS_FORK 161415bfae9SAl Viro #define __ARCH_WANT_SYS_VFORK 162415bfae9SAl Viro #define __ARCH_WANT_SYS_CLONE 16345800fb4SHelge Deller #define __ARCH_WANT_SYS_CLONE3 164f03d70a7SHelge Deller #define __ARCH_WANT_COMPAT_SYS_SENDFILE 165*f18ed30dSGuo Ren #define __ARCH_WANT_COMPAT_STAT 166deae26bfSKyle McMartin 167d33c577cSArnd Bergmann #ifdef CONFIG_64BIT 168d33c577cSArnd Bergmann #define __ARCH_WANT_SYS_TIME 169d33c577cSArnd Bergmann #define __ARCH_WANT_SYS_UTIME 170d33c577cSArnd Bergmann #endif 171d33c577cSArnd Bergmann 172deae26bfSKyle McMartin #endif /* __ASSEMBLY__ */ 173deae26bfSKyle McMartin 174deae26bfSKyle McMartin #undef STR 175deae26bfSKyle McMartin 176deae26bfSKyle McMartin #endif /* _ASM_PARISC_UNISTD_H_ */ 177