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_ */ |
---|