| 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 "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      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 | ??? Of course this scheme breaks down if we need to support 6 or more args. | 
|---|
| 60 |  | 
|---|
| 61 | And of course the system calls aren't *really* reentrant.  The intent | 
|---|
| 62 | is to exercise the reentrancy framework rather than provide/claim | 
|---|
| 63 | real reentrancy for this port. | 
|---|
| 64 | */ | 
|---|
| 65 |  | 
|---|
| 66 | #define defsyscall_r(name, n) \ | 
|---|
| 67 | TEXT_SECTION ;                  \ | 
|---|
| 68 | ALIGN (4) ;                     \ | 
|---|
| 69 | GLOBAL (ASM_SYMBOL (name)) ;    \ | 
|---|
| 70 | ASM_SYMBOL (name):                      \ | 
|---|
| 71 | mov     n,%g1 ;                 \ | 
|---|
| 72 | mov     %o0,%o5 ;               \ | 
|---|
| 73 | mov     %o1,%o0 ;               \ | 
|---|
| 74 | mov     %o2,%o1 ;               \ | 
|---|
| 75 | mov     %o3,%o2 ;               \ | 
|---|
| 76 | mov     %o4,%o3 ;               \ | 
|---|
| 77 | ta      SYSCALL_TRAP ;          \ | 
|---|
| 78 | bcc     noerr ;                 \ | 
|---|
| 79 | sethi   %hi (ASM_PRIVATE_SYMBOL (cerror_r)),%g1 ;       \ | 
|---|
| 80 | or      %g1,%lo (ASM_PRIVATE_SYMBOL (cerror_r)),%g1 ;   \ | 
|---|
| 81 | jmpl    %g1+%g0,%g0 ;           \ | 
|---|
| 82 | mov     %o5,%o1 ;               \ | 
|---|
| 83 | noerr:                                  \ | 
|---|
| 84 | jmpl    %o7+8,%g0 ;             \ | 
|---|
| 85 | nop | 
|---|
| 86 |  | 
|---|
| 87 | #define seterrno() \ | 
|---|
| 88 | sethi   %hi (ASM_PRIVATE_SYMBOL (cerror)),%g1 ;         \ | 
|---|
| 89 | or      %g1,%lo (ASM_PRIVATE_SYMBOL (cerror)),%g1 ;     \ | 
|---|
| 90 | jmpl    %g1+%g0,%g0 ;           \ | 
|---|
| 91 | nop | 
|---|
| 92 |  | 
|---|
| 93 | #endif /* _SYSCALLASM_H_ */ | 
|---|