syscall_cp.s raw

   1  	.global __cp_begin
   2  	.hidden __cp_begin
   3  	.global __cp_end
   4  	.hidden __cp_end
   5  	.global __cp_cancel
   6  	.hidden __cp_cancel
   7  	.hidden __cancel
   8  	.global __syscall_cp_asm
   9  	.hidden __syscall_cp_asm
  10  	.text
  11  	.type   __syscall_cp_asm,%function
  12  __syscall_cp_asm:
  13  	# at enter: r3 = pointer to self->cancel, r4: syscall no, r5: first arg, r6: 2nd, r7: 3rd, r8: 4th, r9: 5th, r10: 6th
  14  __cp_begin:
  15  	# if (self->cancel) goto __cp_cancel
  16  	lwz   0, 0(3)
  17  	cmpwi cr7, 0, 0
  18  	bne-  cr7, __cp_cancel
  19  
  20  	# make syscall
  21  	mr    0,  4
  22  	mr    3,  5
  23  	mr    4,  6
  24  	mr    5,  7
  25  	mr    6,  8
  26  	mr    7,  9
  27  	mr    8, 10
  28  	sc
  29  
  30  __cp_end:
  31  	# return error ? -r3 : r3
  32  	bnslr+
  33  	neg 3, 3
  34  	blr
  35  
  36  __cp_cancel:
  37  	mflr 0
  38  	bl 1f
  39  	.long .TOC.-.
  40  1:	mflr 3
  41  	lwa 2, 0(3)
  42  	add 2, 2, 3
  43  	mtlr 0
  44  	b __cancel
  45