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