xref: /aosp_15_r20/external/musl/src/thread/powerpc/syscall_cp.s (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker.global __cp_begin
2*c9945492SAndroid Build Coastguard Worker.hidden __cp_begin
3*c9945492SAndroid Build Coastguard Worker.global __cp_end
4*c9945492SAndroid Build Coastguard Worker.hidden __cp_end
5*c9945492SAndroid Build Coastguard Worker.global __cp_cancel
6*c9945492SAndroid Build Coastguard Worker.hidden __cp_cancel
7*c9945492SAndroid Build Coastguard Worker.hidden __cancel
8*c9945492SAndroid Build Coastguard Worker.global __syscall_cp_asm
9*c9945492SAndroid Build Coastguard Worker.hidden __syscall_cp_asm
10*c9945492SAndroid Build Coastguard Worker
11*c9945492SAndroid Build Coastguard Worker#r0: volatile. may be modified during linkage.
12*c9945492SAndroid Build Coastguard Worker#r1: stack frame: 16 byte alignment.
13*c9945492SAndroid Build Coastguard Worker#r2: tls/thread pointer on pp32
14*c9945492SAndroid Build Coastguard Worker#r3,r4: return values, first args
15*c9945492SAndroid Build Coastguard Worker#r5-r10: args
16*c9945492SAndroid Build Coastguard Worker#r11-r12: volatile. may be modified during linkage
17*c9945492SAndroid Build Coastguard Worker#r13: "small data area" pointer
18*c9945492SAndroid Build Coastguard Worker#r14 - r30: local vars
19*c9945492SAndroid Build Coastguard Worker#r31: local or environment pointer
20*c9945492SAndroid Build Coastguard Worker
21*c9945492SAndroid Build Coastguard Worker#r1, r14-31: belong to the caller, must be saved and restored
22*c9945492SAndroid Build Coastguard Worker#r0, r3-r12, ctr, xer: volatile, not preserved
23*c9945492SAndroid Build Coastguard Worker#r0,r11,r12: may be altered by cross-module call,
24*c9945492SAndroid Build Coastguard Worker#"a func cannot depend on that these regs have the values placed by the caller"
25*c9945492SAndroid Build Coastguard Worker
26*c9945492SAndroid Build Coastguard Worker#the fields CR2,CR2,CR4 of the cond reg must be preserved
27*c9945492SAndroid Build Coastguard Worker#LR (link reg) shall contain the funcs return address
28*c9945492SAndroid Build Coastguard Worker	.text
29*c9945492SAndroid Build Coastguard Worker	.type   __syscall_cp_asm,%function
30*c9945492SAndroid Build Coastguard Worker__syscall_cp_asm:
31*c9945492SAndroid Build Coastguard Worker	# at enter: r3 = pointer to self->cancel, r4: syscall no, r5: first arg, r6: 2nd, r7: 3rd, r8: 4th, r9: 5th, r10: 6th
32*c9945492SAndroid Build Coastguard Worker__cp_begin:
33*c9945492SAndroid Build Coastguard Worker	# r3 holds first argument, its a pointer to self->cancel.
34*c9945492SAndroid Build Coastguard Worker	# we must compare the dereferenced value with 0 and jump to __cancel if its not
35*c9945492SAndroid Build Coastguard Worker
36*c9945492SAndroid Build Coastguard Worker	lwz 0, 0(3) #deref pointer into r0
37*c9945492SAndroid Build Coastguard Worker
38*c9945492SAndroid Build Coastguard Worker	cmpwi cr7, 0, 0 #compare r0 with 0, store result in cr7.
39*c9945492SAndroid Build Coastguard Worker	beq+ cr7, 1f #jump to label 1 if r0 was 0
40*c9945492SAndroid Build Coastguard Worker
41*c9945492SAndroid Build Coastguard Worker	b __cp_cancel #else call cancel
42*c9945492SAndroid Build Coastguard Worker1:
43*c9945492SAndroid Build Coastguard Worker	#ok, the cancel flag was not set
44*c9945492SAndroid Build Coastguard Worker	# syscall: number goes to r0, the rest 3-8
45*c9945492SAndroid Build Coastguard Worker	mr      0, 4                  # put the system call number into r0
46*c9945492SAndroid Build Coastguard Worker	mr      3, 5                  # Shift the arguments: arg1
47*c9945492SAndroid Build Coastguard Worker	mr      4, 6                  # arg2
48*c9945492SAndroid Build Coastguard Worker	mr      5, 7                  # arg3
49*c9945492SAndroid Build Coastguard Worker	mr      6, 8                  # arg4
50*c9945492SAndroid Build Coastguard Worker	mr      7, 9                  # arg5
51*c9945492SAndroid Build Coastguard Worker	mr      8, 10                  # arg6
52*c9945492SAndroid Build Coastguard Worker	sc
53*c9945492SAndroid Build Coastguard Worker__cp_end:
54*c9945492SAndroid Build Coastguard Worker	bnslr+ # return if no summary overflow.
55*c9945492SAndroid Build Coastguard Worker	#else negate result.
56*c9945492SAndroid Build Coastguard Worker	neg 3, 3
57*c9945492SAndroid Build Coastguard Worker	blr
58*c9945492SAndroid Build Coastguard Worker__cp_cancel:
59*c9945492SAndroid Build Coastguard Worker	b __cancel
60