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 copp_jump_fcontext_v2
62+
63+ copp_jump_fcontext_v2 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
133+ END
0 commit comments