1 #ifndef _SYSCALLASM_H_ 2 #define _SYSCALLASM_H_ 3 4 /* 5 * This file defines the system calls for SPARC for the assembler. 6 * Anything C-ish is not allowed in this file. 7 * C files should include syscall.h. 8 */ 9 10 #include <sys/syscall.h> 11 12 /* Some macros for writing assember syscall stubs. */ 13 14 #ifdef __svr4__ 15 #define TEXT_SECTION .section ".text" 16 #define DATA_SECTION .section ".data" 17 #define ALIGN(x) .align x 18 #define GLOBAL(sym) .global sym 19 #define WORD(x) .long x 20 #define ASM_SYMBOL(name) name 21 #define ASM_PRIVATE_SYMBOL(name) _##name 22 #define SYSCALL_TRAP 8 23 #else 24 #define TEXT_SECTION .text 25 #define DATA_SECTION .data 26 #define ALIGN(x) .align x 27 #define GLOBAL(sym) .global sym 28 #define WORD(x) .word x 29 #define ASM_SYMBOL(name) _##name 30 #define ASM_PRIVATE_SYMBOL(name) name 31 #define SYSCALL_TRAP 0 32 #endif 33 34 #define defsyscall(name, n) \ 35 TEXT_SECTION ; \ 36 ALIGN (4) ; \ 37 GLOBAL (ASM_SYMBOL (name)) ; \ 38 ASM_SYMBOL (name): \ 39 mov n,%g1 ; \ 40 ta %icc,SYSCALL_TRAP ; \ 41 bcc noerr ; \ 42 sethi %hi (ASM_PRIVATE_SYMBOL (cerror)),%g1 ; \ 43 or %g1,%lo (ASM_PRIVATE_SYMBOL (cerror)),%g1 ; \ 44 jmpl %g1+%g0,%g0 ; \ 45 nop ; \ 46 noerr: \ 47 jmpl %o7+8,%g0 ; \ 48 nop 49 50 /* Support for reentrant syscalls. The "struct _reent *" arg is always the 51 the first one. After that we allow up to four additional args. We could 52 allow more, but that's all we need for now. 53 54 It may seem inefficient to have the reent arg be the first one as it means 55 copying all the other args into place (as opposed to making the reent arg 56 the last one in which case there wouldn't be any copying). I chose a clean 57 design over an extra four instructions in a system call. All other 58 reentrant functions use the first arg this way. */ 59 60 #define defsyscall_r(name, n) \ 61 TEXT_SECTION ; \ 62 ALIGN (4) ; \ 63 GLOBAL (ASM_SYMBOL (name)) ; \ 64 ASM_SYMBOL (name): \ 65 mov n,%g1 ; \ 66 mov %o0,%o5 ; \ 67 mov %o1,%o0 ; \ 68 mov %o2,%o1 ; \ 69 mov %o3,%o2 ; \ 70 mov %o4,%o3 ; \ 71 ta %icc,SYSCALL_TRAP ; \ 72 bcc noerr ; \ 73 sethi %hi (ASM_PRIVATE_SYMBOL (cerror_r)),%g1 ; \ 74 or %g1,%lo (ASM_PRIVATE_SYMBOL (cerror_r)),%g1 ; \ 75 jmpl %g1+%g0,%g0 ; \ 76 mov %o5,%o1 ; \ 77 noerr: \ 78 jmpl %o7+8,%g0 ; \ 79 nop 80 81 #define seterrno() \ 82 sethi %hi (ASM_PRIVATE_SYMBOL (cerror)),%g1 ; \ 83 or %g1,%lo (ASM_PRIVATE_SYMBOL (cerror)),%g1 ; \ 84 jmpl %g1+%g0,%g0 ; \ 85 nop 86 87 #endif /* _SYSCALLASM_H_ */ 88