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