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
+ ; ported by Yun Dou <[email protected] > 2021
7
+
8
+ ;*******************************************************
9
+ ;* *
10
+ ;* ------------------------------------------------- *
11
+ ;* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
12
+ ;* ------------------------------------------------- *
13
+ ;* | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c| *
14
+ ;* ------------------------------------------------- *
15
+ ;* | d8 | d9 | d10 | d11 | *
16
+ ;* ------------------------------------------------- *
17
+ ;* ------------------------------------------------- *
18
+ ;* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
19
+ ;* ------------------------------------------------- *
20
+ ;* | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
21
+ ;* ------------------------------------------------- *
22
+ ;* | d12 | d13 | d14 | d15 | *
23
+ ;* ------------------------------------------------- *
24
+ ;* ------------------------------------------------- *
25
+ ;* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
26
+ ;* ------------------------------------------------- *
27
+ ;* | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c| *
28
+ ;* ------------------------------------------------- *
29
+ ;* | x19 | x20 | x21 | x22 | *
30
+ ;* ------------------------------------------------- *
31
+ ;* ------------------------------------------------- *
32
+ ;* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
33
+ ;* ------------------------------------------------- *
34
+ ;* | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c| *
35
+ ;* ------------------------------------------------- *
36
+ ;* | x23 | x24 | x25 | x26 | *
37
+ ;* ------------------------------------------------- *
38
+ ;* ------------------------------------------------- *
39
+ ;* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
40
+ ;* ------------------------------------------------- *
41
+ ;* | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c| *
42
+ ;* ------------------------------------------------- *
43
+ ;* | x27 | x28 | FP | LR | *
44
+ ;* ------------------------------------------------- *
45
+ ;* ------------------------------------------------- *
46
+ ;* | 40 | 41 | 42 | 43 | | | *
47
+ ;* ------------------------------------------------- *
48
+ ;* | 0xa0| 0xa4| 0xa8| 0xac| | | *
49
+ ;* ------------------------------------------------- *
50
+ ;* | PC | align | | | *
51
+ ;* ------------------------------------------------- *
52
+ ;* *
53
+ ;*******************************************************
54
+
55
+ AREA |.text| , CODE , READONLY , ALIGN= 4 , CODEALIGN
56
+ EXPORT jump_fcontext
57
+ jump_fcontext proc
58
+ ; prepare stack for GP + FPU
59
+ sub sp , sp , # 0xb0
60
+
61
+ ; save d8 - d15
62
+ stp d8 , d9 , [ sp , # 0x00 ]
63
+ stp d10 , d11 , [ sp , # 0x10 ]
64
+ stp d12 , d13 , [ sp , # 0x20 ]
65
+ stp d14 , d15 , [ sp , # 0x30 ]
66
+
67
+ ; save x19-x30
68
+ stp x19 , x20 , [ sp , # 0x40 ]
69
+ stp x21 , x22 , [ sp , # 0x50 ]
70
+ stp x23 , x24 , [ sp , # 0x60 ]
71
+ stp x25 , x26 , [ sp , # 0x70 ]
72
+ stp x27 , x28 , [ sp , # 0x80 ]
73
+ stp x29 , x30 , [ sp , # 0x90 ]
74
+
75
+ ; save LR as PC
76
+ str x30 , [ sp , # 0xa0 ]
77
+
78
+ ; store RSP (pointing to context-data) in X0
79
+ mov x4 , sp
80
+
81
+ ; restore RSP (pointing to context-data) from X1
82
+ mov sp , x0
83
+
84
+ ; load d8 - d15
85
+ ldp d8 , d9 , [ sp , # 0x00 ]
86
+ ldp d10 , d11 , [ sp , # 0x10 ]
87
+ ldp d12 , d13 , [ sp , # 0x20 ]
88
+ ldp d14 , d15 , [ sp , # 0x30 ]
89
+
90
+ ; load x19-x30
91
+ ldp x19 , x20 , [ sp , # 0x40 ]
92
+ ldp x21 , x22 , [ sp , # 0x50 ]
93
+ ldp x23 , x24 , [ sp , # 0x60 ]
94
+ ldp x25 , x26 , [ sp , # 0x70 ]
95
+ ldp x27 , x28 , [ sp , # 0x80 ]
96
+ ldp x29 , x30 , [ sp , # 0x90 ]
97
+
98
+ ; return transfer_t from jump
99
+ ; pass transfer_t as first arg in context function
100
+ ; X0 == FCTX, X1 == DATA
101
+ mov x0 , x4
102
+
103
+ ; load pc
104
+ ldr x4 , [ sp , # 0xa0 ]
105
+
106
+ ; restore stack from GP + FPU
107
+ add sp , sp , # 0xb0
108
+
109
+ ret x4
110
+ ENDP
111
+ END
0 commit comments