#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)) | |