1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
#include <asm.h>
#include <regdef.h>
#define COMPAT_43
#include <syscall.h>
#undef SYSCALL
/* Kernel syscall interface:
Input:
v0 - system call number
a* - arguments, as in C
Output:
a3 - zero iff successful
v0 - errno value on failure, else result
This macro is similar to SYSCALL in asm.h, but not completely.
There's room for optimization, if we assume this will continue to
be assembled as one file.
This macro expansions does not include the return instruction.
If there's no other work to be done, use something like:
SYSCALL(foo) ; ret
If there is other work to do (in fork, maybe?), do it after the
SYSCALL invocation. */
#define SYSCALL(x) \
.align 4 ;\
.globl machdep_sys_##x ;\
.ent machdep_sys_##x, 0 ;\
machdep_sys_##x: ;\
.frame sp,0,ra ;\
ldiq v0, SYS_##x ;\
CHMK() ;\
beq a3, 2f ;\
br gp, 1f ;\
1: ;\
/* Load gp so we can find cerror to jump to. */;\
ldgp gp, 0(gp) ;\
jmp zero, machdep_cerror ;\
2:
#define XSYSCALL(x) SYSCALL(x) ; ret ; .end machdep_sys_##x
.globl machdep_cerror
machdep_cerror:
br t0, 1f
1:
ldgp gp, 0(t0)
stl v0, errno
#if 0
ldiq v0, -1
#else
subq zero, v0, v0
#endif
ret
/* The fork system call is special... */
SYSCALL(fork)
cmovne a4, 0, v0
ret
.end machdep_sys_fork
/* So is the sigsuspend system call */
.align 4
.globl machdep_sys_sigsuspend
.ent machdep_sys_sigsuspend, 0
machdep_sys_sigsuspend:
.frame sp,0,ra
bis a0, a0, a1
ldq a0, 0(a1)
ldiq v0, SYS_sigsuspend
CHMK()
ret
.end machdep_sys_sigsuspend
/* More stuff ... */
.align 4
.globl machdep_restore_from_setjmp
.ent machdep_restore_from_setjmp, 0
machdep_restore_from_setjmp:
.frame sp, 16, ra
ldgp gp, 0(t12)
lda sp, -16(sp)
stq ra, 0(sp)
ldq v0, 280(a0)
subq v0, 0x00000000acedbade, t0
bne t0, botch
cmoveq a1, 0x1, a1
stq a1, 32(a0)
ldiq v0, 0x67
call_pal 0x83
botch:
/* This should cause the program to crash. Eventually, fix it
up to print a message first. */
jsr abort
.end machdep_restore_from_setjmp
|