env: avoid leaving dangling pointers in __env_map
[musl.git] / src / setjmp / powerpc / longjmp.s
blobbab1751176ecdde88458de482bcb9c04617454d6
1 .global _longjmp
2 .global longjmp
3 .type _longjmp,@function
4 .type longjmp,@function
5 _longjmp:
6 longjmp:
7 # void longjmp(jmp_buf env, int val);
8 # put val into return register and restore the env saved in setjmp
9 # if val(r4) is 0, put 1 there.
10 # 0) move old return address into r0
11 lwz 0, 0(3)
12 # 1) put it into link reg
13 mtlr 0
14 #2 ) restore stack ptr
15 lwz 1, 4(3)
16 #3) restore control reg
17 lwz 0, 8(3)
18 mtcr 0
19 #4) restore r14-r31
20 lwz 14, 12(3)
21 lwz 15, 16(3)
22 lwz 16, 20(3)
23 lwz 17, 24(3)
24 lwz 18, 28(3)
25 lwz 19, 32(3)
26 lwz 20, 36(3)
27 lwz 21, 40(3)
28 lwz 22, 44(3)
29 lwz 23, 48(3)
30 lwz 24, 52(3)
31 lwz 25, 56(3)
32 lwz 26, 60(3)
33 lwz 27, 64(3)
34 lwz 28, 68(3)
35 lwz 29, 72(3)
36 lwz 30, 76(3)
37 lwz 31, 80(3)
38 lfd 14,88(3)
39 lfd 15,96(3)
40 lfd 16,104(3)
41 lfd 17,112(3)
42 lfd 18,120(3)
43 lfd 19,128(3)
44 lfd 20,136(3)
45 lfd 21,144(3)
46 lfd 22,152(3)
47 lfd 23,160(3)
48 lfd 24,168(3)
49 lfd 25,176(3)
50 lfd 26,184(3)
51 lfd 27,192(3)
52 lfd 28,200(3)
53 lfd 29,208(3)
54 lfd 30,216(3)
55 lfd 31,224(3)
56 #5) put val into return reg r3
57 mr 3, 4
59 #6) check if return value is 0, make it 1 in that case
60 cmpwi cr7, 4, 0
61 bne cr7, 1f
62 li 3, 1
64 blr