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