Skip to content
This repository was archived by the owner on Feb 8, 2024. It is now read-only.

Commit e383a9b

Browse files
committed
Add callWithStackShell() for Linux/PPC32.
The implementation was only available as a separate patch.
1 parent c8f80e1 commit e383a9b

File tree

1 file changed

+109
-5
lines changed

1 file changed

+109
-5
lines changed

src/core/threadasm.S

Lines changed: 109 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,110 @@ _D4core6thread18callWithStackShellFNbMDFNbPvZvZv:
175175

176176
#elif defined( __ppc__ ) || defined( __PPC__ ) || defined( __powerpc__ )
177177

178+
.section ".text"
179+
180+
/**
181+
* callWithStackShell
182+
*
183+
* Called with:
184+
* r3: pointer context
185+
* r4: pointer to function
186+
*/
187+
.align 2
188+
.globl _D4core6thread18callWithStackShellFNbMDFNbPvZvZv
189+
.type _D4core6thread18callWithStackShellFNbMDFNbPvZvZv, @function
190+
_D4core6thread18callWithStackShellFNbMDFNbPvZvZv:
191+
mflr 0
192+
stw 0, 8(1) // save LR
193+
stwu 1, -256(1) // stack size: 18*8 + 112 = 256
194+
195+
/* Save r14-r31 in general register save area */
196+
stw 14, (112 + 0 * 4)(1)
197+
stw 15, (112 + 1 * 4)(1)
198+
stw 16, (112 + 2 * 4)(1)
199+
stw 17, (112 + 3 * 4)(1)
200+
stw 18, (112 + 4 * 4)(1)
201+
stw 19, (112 + 5 * 4)(1)
202+
stw 20, (112 + 6 * 4)(1)
203+
stw 21, (112 + 7 * 4)(1)
204+
stw 22, (112 + 8 * 4)(1)
205+
stw 23, (112 + 9 * 4)(1)
206+
stw 24, (112 + 10 * 4)(1)
207+
stw 25, (112 + 11 * 4)(1)
208+
stw 26, (112 + 12 * 4)(1)
209+
stw 27, (112 + 13 * 4)(1)
210+
stw 28, (112 + 14 * 4)(1)
211+
stw 29, (112 + 15 * 4)(1)
212+
stw 30, (112 + 16 * 4)(1)
213+
stw 31, (112 + 17 * 4)(1)
214+
215+
/* Save r3-r10 in parameter save area of caller */
216+
stw 3, (256 + 48 + 0 * 4)(1)
217+
stw 4, (256 + 48 + 1 * 4)(1)
218+
stw 5, (256 + 48 + 2 * 4)(1)
219+
stw 6, (256 + 48 + 3 * 4)(1)
220+
stw 7, (256 + 48 + 4 * 4)(1)
221+
stw 8, (256 + 48 + 5 * 4)(1)
222+
stw 9, (256 + 48 + 6 * 4)(1)
223+
stw 10, (256 + 48 + 7 * 4)(1)
224+
225+
/* Save r2 in TOC save area */
226+
stw 2, 40(1)
227+
228+
/* Do not save r11, r12 and r13. */
229+
230+
/* Call delegate:
231+
* r3: pointer to context
232+
* r4: pointer to stack
233+
*/
234+
mr 5, 4
235+
mr 4, 1
236+
lwz 6, 0(5)
237+
lwz 11, 16(5)
238+
lwz 2, 8(5)
239+
mtctr 6
240+
bctrl
241+
nop
242+
243+
/* Restore r2 from TOC save area */
244+
lwz 2, 40(1)
245+
246+
/* Restore r3-r10 from local variable space */
247+
lwz 3, (256 + 48 + 0 * 4)(1)
248+
lwz 4, (256 + 48 + 1 * 4)(1)
249+
lwz 5, (256 + 48 + 2 * 4)(1)
250+
lwz 6, (256 + 48 + 3 * 4)(1)
251+
lwz 7, (256 + 48 + 4 * 4)(1)
252+
lwz 8, (256 + 48 + 5 * 4)(1)
253+
lwz 9, (256 + 48 + 6 * 4)(1)
254+
lwz 10, (256 + 48 + 7 * 4)(1)
255+
256+
/* Restore r14-r31 from general register save area */
257+
lwz 14, (112 + 0 * 4)(1)
258+
lwz 15, (112 + 1 * 4)(1)
259+
lwz 16, (112 + 2 * 4)(1)
260+
lwz 17, (112 + 3 * 4)(1)
261+
lwz 18, (112 + 4 * 4)(1)
262+
lwz 19, (112 + 5 * 4)(1)
263+
lwz 20, (112 + 6 * 4)(1)
264+
lwz 21, (112 + 7 * 4)(1)
265+
lwz 22, (112 + 8 * 4)(1)
266+
lwz 23, (112 + 9 * 4)(1)
267+
lwz 24, (112 + 10 * 4)(1)
268+
lwz 25, (112 + 11 * 4)(1)
269+
lwz 26, (112 + 12 * 4)(1)
270+
lwz 27, (112 + 13 * 4)(1)
271+
lwz 28, (112 + 14 * 4)(1)
272+
lwz 29, (112 + 15 * 4)(1)
273+
lwz 30, (112 + 16 * 4)(1)
274+
lwz 31, (112 + 17 * 4)(1)
275+
276+
addi 1, 1, 256
277+
lwz 0, 16(1)
278+
mtlr 0
279+
blr
280+
.size _D4core6thread18callWithStackShellFNbMDFNbPvZvZv,.-_D4core6thread18callWithStackShellFNbMDFNbPvZvZv
281+
178282

179283
/**
180284
* Performs a context switch.
@@ -183,11 +287,10 @@ _D4core6thread18callWithStackShellFNbMDFNbPvZvZv:
183287
* r4 - new context pointer
184288
*
185289
*/
186-
.text
187-
.align 2
188-
.globl _fiber_switchContext
189-
_fiber_switchContext:
190-
290+
.align 2
291+
.globl fiber_switchContext
292+
.type fiber_switchContext, @function
293+
fiber_switchContext:
191294
/* Save linkage area */
192295
mflr 0
193296
mfcr 5
@@ -298,6 +401,7 @@ _fiber_switchContext:
298401

299402
/* Return and switch context */
300403
blr
404+
.size fiber_switchContext,.-fiber_switchContext
301405

302406
#elif defined(__mips__) && _MIPS_SIM == _ABIO32
303407
/************************************************************************************

0 commit comments

Comments
 (0)