File tree 1 file changed +93
-0
lines changed
1 file changed +93
-0
lines changed Original file line number Diff line number Diff line change 32
32
33
33
// Saving all ABI non-vol registers here
34
34
35
+ #ifdef __LP64__
36
+
35
37
unsigned int nlr_push (nlr_buf_t * nlr ) {
36
38
37
39
__asm__ volatile (
@@ -118,4 +120,95 @@ NORETURN void nlr_jump(void *val) {
118
120
MP_UNREACHABLE ;
119
121
}
120
122
123
+ #else
124
+ // Saving all ABI non-vol registers here
125
+
126
+ unsigned int nlr_push (nlr_buf_t * nlr ) {
127
+
128
+ __asm__ volatile (
129
+ "li 4, 0x4eed ; " // Store canary
130
+ "stw 4, 0x00(%0) ;"
131
+ "stw 0, 0x04(%0) ;"
132
+ "stw 1, 0x08(%0) ;"
133
+ "stw 2, 0x0c(%0) ;"
134
+ "stw 14, 0x10(%0) ;"
135
+ "stw 15, 0x14(%0) ;"
136
+ "stw 16, 0x18(%0) ;"
137
+ "stw 17, 0x1c(%0) ;"
138
+ "stw 18, 0x20(%0) ;"
139
+ "stw 19, 0x24(%0) ;"
140
+ "stw 20, 0x28(%0) ;"
141
+ "stw 21, 0x2c(%0) ;"
142
+ "stw 22, 0x30(%0) ;"
143
+ "stw 23, 0x34(%0) ;"
144
+ "stw 24, 0x38(%0) ;"
145
+ "stw 25, 0x3c(%0) ;"
146
+ "stw 26, 0x40(%0) ;"
147
+ "stw 27, 0x44(%0) ;"
148
+ "stw 28, 0x48(%0) ;"
149
+ "stw 29, 0x4c(%0) ;"
150
+ "stw 30, 0x50(%0) ;"
151
+ "stw 31, 0x54(%0) ;"
152
+
153
+ "mfcr 4 ; "
154
+ "stw 4, 0x58(%0) ;"
155
+ "mflr 4 ;"
156
+ "stw 4, 0x5c(%0) ;"
157
+ "li 4, nlr_push_tail@l ;"
158
+ "oris 4, 4, nlr_push_tail@h ;"
159
+ "mtctr 4 ;"
160
+ "mr 3, %1 ; "
161
+ "bctr ;"
162
+ :
163
+ : "r" (& nlr -> regs ), "r" (nlr )
164
+ :
165
+ );
166
+
167
+ return 0 ;
168
+ }
169
+
170
+ NORETURN void nlr_jump (void * val ) {
171
+ MP_NLR_JUMP_HEAD (val , top )
172
+
173
+ __asm__ volatile (
174
+ "l 3, 0x0(%0) ;"
175
+ "cmpdi 3, 0x4eed ; " // Check canary
176
+ "bne . ; "
177
+ "l 0, 0x04(%0) ;"
178
+ "l 1, 0x08(%0) ;"
179
+ "l 2, 0x0c(%0) ;"
180
+ "l 14, 0x10(%0) ;"
181
+ "l 15, 0x14(%0) ;"
182
+ "l 16, 0x18(%0) ;"
183
+ "l 17, 0x1c(%0) ;"
184
+ "l 18, 0x20(%0) ;"
185
+ "l 19, 0x24(%0) ;"
186
+ "l 20, 0x28(%0) ;"
187
+ "l 21, 0x2c(%0) ;"
188
+ "l 22, 0x30(%0) ;"
189
+ "l 23, 0x34(%0) ;"
190
+ "l 24, 0x38(%0) ;"
191
+ "l 25, 0x3c(%0) ;"
192
+ "l 26, 0x40(%0) ;"
193
+ "l 27, 0x44(%0) ;"
194
+ "l 28, 0x48(%0) ;"
195
+ "l 29, 0x4c(%0) ;"
196
+ "l 30, 0x50(%0) ;"
197
+ "l 31, 0x54(%0) ;"
198
+ "l 3, 0x58(%0) ;"
199
+ "mtcr 3 ;"
200
+ "l 3, 0x5c(%0) ;"
201
+ "mtlr 3 ; "
202
+ "li 3, 1;"
203
+ "blr ;"
204
+ :
205
+ : "r" (& top -> regs )
206
+ :
207
+ );
208
+
209
+ MP_UNREACHABLE ;
210
+ }
211
+
212
+ #endif // __LP64__
213
+
121
214
#endif // MICROPY_NLR_POWERPC
You can’t perform that action at this time.
0 commit comments