1- ; Copyright Edward Nevill + Oliver Kowalke 2015
2- ; Distributed under the Boost Software License, Version 1.0.
3- ; (See accompanying file LICENSE_1_0.txt or copy at
4- ; http://www.boost.org/LICENSE_1_0.txt)
5-
6- ;*******************************************************
7- ;* *
8- ;* ------------------------------------------------- *
9- ;* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
10- ;* ------------------------------------------------- *
11- ;* | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c| *
12- ;* ------------------------------------------------- *
13- ;* | d8 | d9 | d10 | d11 | *
14- ;* ------------------------------------------------- *
15- ;* ------------------------------------------------- *
16- ;* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
17- ;* ------------------------------------------------- *
18- ;* | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
19- ;* ------------------------------------------------- *
20- ;* | d12 | d13 | d14 | d15 | *
21- ;* ------------------------------------------------- *
22- ;* ------------------------------------------------- *
23- ;* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
24- ;* ------------------------------------------------- *
25- ;* | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c| *
26- ;* ------------------------------------------------- *
27- ;* | x19 | x20 | x21 | x22 | *
28- ;* ------------------------------------------------- *
29- ;* ------------------------------------------------- *
30- ;* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
31- ;* ------------------------------------------------- *
32- ;* | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c| *
33- ;* ------------------------------------------------- *
34- ;* | x23 | x24 | x25 | x26 | *
35- ;* ------------------------------------------------- *
36- ;* ------------------------------------------------- *
37- ;* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
38- ;* ------------------------------------------------- *
39- ;* | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c| *
40- ;* ------------------------------------------------- *
41- ;* | x27 | x28 | FP | LR | *
42- ;* ------------------------------------------------- *
43- ;* ------------------------------------------------- *
44- ;* | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
45- ;* ------------------------------------------------- *
46- ;* | 0xa0| 0xa4| 0xa8| 0xac| 0xb0| 0xb4| 0xb8| 0xbc| *
47- ;* ------------------------------------------------- *
48- ;* | fiber data| base | limit | dealloc | *
49- ;* ------------------------------------------------- *
50- ;* ------------------------------------------------- *
51- ;* | 48 | 49 | 50 | 51 | | | *
52- ;* ------------------------------------------------- *
53- ;* | 0xc0| 0xc4| 0xc8| 0xcc| | | *
54- ;* ------------------------------------------------- *
55- ;* | PC | align | | | *
56- ;* ------------------------------------------------- *
57- ;* *
58- ;*******************************************************
59-
60- AREA |.text| , CODE , READONLY , ALIGN= 4 , CODEALIGN
61- EXPORT jump_fcontext
62-
63- jump_fcontext proc
64- ; prepare stack for GP + FPU
65- sub sp , sp , # 0xd0
66-
67- ; save d8 - d15
68- stp d8 , d9 , [ sp , # 0x00 ]
69- stp d10 , d11 , [ sp , # 0x10 ]
70- stp d12 , d13 , [ sp , # 0x20 ]
71- stp d14 , d15 , [ sp , # 0x30 ]
72-
73- ; save x19-x30
74- stp x19 , x20 , [ sp , # 0x40 ]
75- stp x21 , x22 , [ sp , # 0x50 ]
76- stp x23 , x24 , [ sp , # 0x60 ]
77- stp x25 , x26 , [ sp , # 0x70 ]
78- stp x27 , x28 , [ sp , # 0x80 ]
79- stp x29 , x30 , [ sp , # 0x90 ]
80-
81- ; save LR as PC
82- str x30 , [ sp , # 0xc0 ]
83-
84- ; save current stack base and limit
85- ldp x5 , x6 , [ x18 , # 0x08 ] ; TeStackBase and TeStackLimit at ksarm64.h
86- stp x5 , x6 , [ sp , # 0xa0 ]
87- ; save current fiber data and deallocation stack
88- ldr x5 , [ x18 , # 0x1478 ] ; TeDeallocationStack at ksarm64.h
89- ldr x6 , [ x18 , # 0x20 ] ; TeFiberData at ksarm64.h
90- stp x5 , x6 , [ sp , # 0xb0 ]
91-
92- ; store RSP (pointing to context-data) in X0
93- mov x4 , sp
94-
95- ; restore RSP (pointing to context-data) from X1
96- mov sp , x0
97-
98- ; restore stack base and limit
99- ldp x5 , x6 , [ sp , # 0xa0 ]
100- stp x5 , x6 , [ x18 , # 0x08 ] ; TeStackBase and TeStackLimit at ksarm64.h
101- ; restore fiber data and deallocation stack
102- ldp x5 , x6 , [ sp , # 0xb0 ]
103- str x5 , [ x18 , # 0x1478 ] ; TeDeallocationStack at ksarm64.h
104- str x6 , [ x18 , # 0x20 ] ; TeFiberData at ksarm64.h
105-
106- ; load d8 - d15
107- ldp d8 , d9 , [ sp , # 0x00 ]
108- ldp d10 , d11 , [ sp , # 0x10 ]
109- ldp d12 , d13 , [ sp , # 0x20 ]
110- ldp d14 , d15 , [ sp , # 0x30 ]
111-
112- ; load x19-x30
113- ldp x19 , x20 , [ sp , # 0x40 ]
114- ldp x21 , x22 , [ sp , # 0x50 ]
115- ldp x23 , x24 , [ sp , # 0x60 ]
116- ldp x25 , x26 , [ sp , # 0x70 ]
117- ldp x27 , x28 , [ sp , # 0x80 ]
118- ldp x29 , x30 , [ sp , # 0x90 ]
119-
120- ; return transfer_t from jump
121- ; pass transfer_t as first arg in context function
122- ; X0 == FCTX, X1 == DATA
123- mov x0 , x4
124-
125- ; load pc
126- ldr x4 , [ sp , # 0xc0 ]
127-
128- ; restore stack from GP + FPU
129- add sp , sp , # 0xd0
130-
131- ret x4
132- ENDP
1+ ; Copyright Edward Nevill + Oliver Kowalke 2015
2+ ; Distributed under the Boost Software License, Version 1.0.
3+ ; (See accompanying file LICENSE_1_0.txt or copy at
4+ ; http://www.boost.org/LICENSE_1_0.txt)
5+
6+ ;*******************************************************
7+ ;* *
8+ ;* ------------------------------------------------- *
9+ ;* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
10+ ;* ------------------------------------------------- *
11+ ;* | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c| *
12+ ;* ------------------------------------------------- *
13+ ;* | d8 | d9 | d10 | d11 | *
14+ ;* ------------------------------------------------- *
15+ ;* ------------------------------------------------- *
16+ ;* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
17+ ;* ------------------------------------------------- *
18+ ;* | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
19+ ;* ------------------------------------------------- *
20+ ;* | d12 | d13 | d14 | d15 | *
21+ ;* ------------------------------------------------- *
22+ ;* ------------------------------------------------- *
23+ ;* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
24+ ;* ------------------------------------------------- *
25+ ;* | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c| *
26+ ;* ------------------------------------------------- *
27+ ;* | x19 | x20 | x21 | x22 | *
28+ ;* ------------------------------------------------- *
29+ ;* ------------------------------------------------- *
30+ ;* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
31+ ;* ------------------------------------------------- *
32+ ;* | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c| *
33+ ;* ------------------------------------------------- *
34+ ;* | x23 | x24 | x25 | x26 | *
35+ ;* ------------------------------------------------- *
36+ ;* ------------------------------------------------- *
37+ ;* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
38+ ;* ------------------------------------------------- *
39+ ;* | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c| *
40+ ;* ------------------------------------------------- *
41+ ;* | x27 | x28 | FP | LR | *
42+ ;* ------------------------------------------------- *
43+ ;* ------------------------------------------------- *
44+ ;* | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
45+ ;* ------------------------------------------------- *
46+ ;* | 0xa0| 0xa4| 0xa8| 0xac| 0xb0| 0xb4| 0xb8| 0xbc| *
47+ ;* ------------------------------------------------- *
48+ ;* | fiber data| base | limit | dealloc | *
49+ ;* ------------------------------------------------- *
50+ ;* ------------------------------------------------- *
51+ ;* | 48 | 49 | 50 | 51 | | | *
52+ ;* ------------------------------------------------- *
53+ ;* | 0xc0| 0xc4| 0xc8| 0xcc| | | *
54+ ;* ------------------------------------------------- *
55+ ;* | PC | align | | | *
56+ ;* ------------------------------------------------- *
57+ ;* *
58+ ;*******************************************************
59+
60+ AREA |.text| , CODE , READONLY , ALIGN= 4 , CODEALIGN
61+ EXPORT jump_fcontext
62+
63+ jump_fcontext proc
64+ ; prepare stack for GP + FPU
65+ sub sp , sp , # 0xd0
66+
67+ ; save d8 - d15
68+ stp d8 , d9 , [ sp , # 0x00 ]
69+ stp d10 , d11 , [ sp , # 0x10 ]
70+ stp d12 , d13 , [ sp , # 0x20 ]
71+ stp d14 , d15 , [ sp , # 0x30 ]
72+
73+ ; save x19-x30
74+ stp x19 , x20 , [ sp , # 0x40 ]
75+ stp x21 , x22 , [ sp , # 0x50 ]
76+ stp x23 , x24 , [ sp , # 0x60 ]
77+ stp x25 , x26 , [ sp , # 0x70 ]
78+ stp x27 , x28 , [ sp , # 0x80 ]
79+ stp x29 , x30 , [ sp , # 0x90 ]
80+
81+ ; save LR as PC
82+ str x30 , [ sp , # 0xc0 ]
83+
84+ ; save current stack base and limit
85+ ldp x5 , x6 , [ x18 , # 0x08 ] ; TeStackBase and TeStackLimit at ksarm64.h
86+ stp x5 , x6 , [ sp , # 0xa0 ]
87+ ; save current fiber data and deallocation stack
88+ ldr x5 , [ x18 , # 0x1478 ] ; TeDeallocationStack at ksarm64.h
89+ ldr x6 , [ x18 , # 0x20 ] ; TeFiberData at ksarm64.h
90+ stp x5 , x6 , [ sp , # 0xb0 ]
91+
92+ ; store RSP (pointing to context-data) in X0
93+ mov x4 , sp
94+
95+ ; restore RSP (pointing to context-data) from X1
96+ mov sp , x0
97+
98+ ; restore stack base and limit
99+ ldp x5 , x6 , [ sp , # 0xa0 ]
100+ stp x5 , x6 , [ x18 , # 0x08 ] ; TeStackBase and TeStackLimit at ksarm64.h
101+ ; restore fiber data and deallocation stack
102+ ldp x5 , x6 , [ sp , # 0xb0 ]
103+ str x5 , [ x18 , # 0x1478 ] ; TeDeallocationStack at ksarm64.h
104+ str x6 , [ x18 , # 0x20 ] ; TeFiberData at ksarm64.h
105+
106+ ; load d8 - d15
107+ ldp d8 , d9 , [ sp , # 0x00 ]
108+ ldp d10 , d11 , [ sp , # 0x10 ]
109+ ldp d12 , d13 , [ sp , # 0x20 ]
110+ ldp d14 , d15 , [ sp , # 0x30 ]
111+
112+ ; load x19-x30
113+ ldp x19 , x20 , [ sp , # 0x40 ]
114+ ldp x21 , x22 , [ sp , # 0x50 ]
115+ ldp x23 , x24 , [ sp , # 0x60 ]
116+ ldp x25 , x26 , [ sp , # 0x70 ]
117+ ldp x27 , x28 , [ sp , # 0x80 ]
118+ ldp x29 , x30 , [ sp , # 0x90 ]
119+
120+ ; return transfer_t from jump
121+ ; pass transfer_t as first arg in context function
122+ ; X0 == FCTX, X1 == DATA
123+ mov x0 , x4
124+
125+ ; load pc
126+ ldr x4 , [ sp , # 0xc0 ]
127+
128+ ; restore stack from GP + FPU
129+ add sp , sp , # 0xd0
130+
131+ ret x4
132+ ENDP
133133 END
0 commit comments