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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
#include <sys/syscall.h>
#include <machine/asm.h>
ENTRY(_tas)
li %r0, 0
mr %r4, %r3
lis %r5, 0xcafe
ori %r5, %r5, 0xbabe
1:
lwarx %r3, %r0, %r4
cmpwi %r3, 0
bne 2f
stwcx. %r5, %r0, %r4
bne- 1b
2:
sync
blr
ENTRY(_getmcontext) /* xxx: instruction scheduling */
mflr %r0
mfcr %r5
mfctr %r6
mfxer %r7
stw %r0, 0*4(%r3)
stw %r5, 1*4(%r3)
stw %r6, 2*4(%r3)
stw %r7, 3*4(%r3)
stw %r1, 4*4(%r3)
stw %r2, 5*4(%r3)
li %r5, 1 /* return value for setmcontext */
stw %r5, 6*4(%r3)
stw %r13, (0+7)*4(%r3) /* callee-save GPRs */
stw %r14, (1+7)*4(%r3) /* xxx: block move */
stw %r15, (2+7)*4(%r3)
stw %r16, (3+7)*4(%r3)
stw %r17, (4+7)*4(%r3)
stw %r18, (5+7)*4(%r3)
stw %r19, (6+7)*4(%r3)
stw %r20, (7+7)*4(%r3)
stw %r21, (8+7)*4(%r3)
stw %r22, (9+7)*4(%r3)
stw %r23, (10+7)*4(%r3)
stw %r24, (11+7)*4(%r3)
stw %r25, (12+7)*4(%r3)
stw %r26, (13+7)*4(%r3)
stw %r27, (14+7)*4(%r3)
stw %r28, (15+7)*4(%r3)
stw %r29, (16+7)*4(%r3)
stw %r30, (17+7)*4(%r3)
stw %r31, (18+7)*4(%r3)
li %r3, 0 /* return */
blr
ENTRY(_setmcontext)
lwz %r13, (0+7)*4(%r3) /* callee-save GPRs */
lwz %r14, (1+7)*4(%r3) /* xxx: block move */
lwz %r15, (2+7)*4(%r3)
lwz %r16, (3+7)*4(%r3)
lwz %r17, (4+7)*4(%r3)
lwz %r18, (5+7)*4(%r3)
lwz %r19, (6+7)*4(%r3)
lwz %r20, (7+7)*4(%r3)
lwz %r21, (8+7)*4(%r3)
lwz %r22, (9+7)*4(%r3)
lwz %r23, (10+7)*4(%r3)
lwz %r24, (11+7)*4(%r3)
lwz %r25, (12+7)*4(%r3)
lwz %r26, (13+7)*4(%r3)
lwz %r27, (14+7)*4(%r3)
lwz %r28, (15+7)*4(%r3)
lwz %r29, (16+7)*4(%r3)
lwz %r30, (17+7)*4(%r3)
lwz %r31, (18+7)*4(%r3)
lwz %r1, 4*4(%r3)
lwz %r2, 5*4(%r3)
lwz %r0, 0*4(%r3)
mtlr %r0
lwz %r0, 1*4(%r3)
mtcr %r0 /* mtcrf 0xFF, %r0 */
lwz %r0, 2*4(%r3)
mtctr %r0
lwz %r0, 3*4(%r3)
mtxer %r0
lwz %r3, 6*4(%r3)
blr
ENTRY(rfork_thread)
/* sanity check */
cmpwi %r4, 0
beq 1f
cmpwi %r5, 0
beq 1f
mr %r7,%r4
/* call rfork */
li %r0, SYS_rfork
sc
cmpwi %r0, 0
bne 2f
/* check if we are parent or child */
cmpwi %r3, 0
bnelr
/* child */
mtlr %r5 /* fp */
mr %r3, %r6 /* arg */
mr %r1, %r7 /* new sp */
blrl
/* child returned, call _exit */
li %r0, SYS_exit
sc
1:
li %r3, -1
2:
b PIC_PLT(_C_LABEL(__cerror))
|