.global __cp_begin | |
.hidden __cp_begin | |
.global __cp_end | |
.hidden __cp_end | |
.global __cp_cancel | |
.hidden __cp_cancel | |
.hidden __cancel | |
.global __syscall_cp_asm | |
.hidden __syscall_cp_asm | |
.text | |
.type __syscall_cp_asm,%function | |
__syscall_cp_asm: | |
# at enter: r3 = pointer to self->cancel, r4: syscall no, r5: first arg, r6: 2nd, r7: 3rd, r8: 4th, r9: 5th, r10: 6th | |
__cp_begin: | |
# if (self->cancel) goto __cp_cancel | |
lwz 0, 0(3) | |
cmpwi cr7, 0, 0 | |
bne- cr7, __cp_cancel | |
# make syscall | |
mr 0, 4 | |
mr 3, 5 | |
mr 4, 6 | |
mr 5, 7 | |
mr 6, 8 | |
mr 7, 9 | |
mr 8, 10 | |
sc | |
__cp_end: | |
# return error ? -r3 : r3 | |
bnslr+ | |
neg 3, 3 | |
blr | |
__cp_cancel: | |
b __cancel |