summaryrefslogtreecommitdiff
path: root/config/macintosh/powerpc.s
diff options
context:
space:
mode:
Diffstat (limited to 'config/macintosh/powerpc.s')
-rw-r--r--config/macintosh/powerpc.s52
1 files changed, 52 insertions, 0 deletions
diff --git a/config/macintosh/powerpc.s b/config/macintosh/powerpc.s
new file mode 100644
index 0000000..71724a6
--- /dev/null
+++ b/config/macintosh/powerpc.s
@@ -0,0 +1,52 @@
+# coswitch(old, new, first)
+# GPR3 GPR4 GPR5
+
+# This code is modeled after the ppc_aix context switch
+# it was compared to the Darwin context switch routine to
+# get the syntax correct for the Apple gcc compiler.
+.macro ENTRY
+ .text
+ .align 2
+ .globl $0
+$0:
+.endmacro
+
+ .file "rswitch.s"
+ .set RSIZE, 80 ; room for regs 13-31, rounded up mod16
+
+ ENTRY _coswitch
+
+ stwu r1, -RSIZE(r1) ; allocate stack frame
+
+ ; Save Old Context:
+ stw r1, 0(r3) ; SP
+ stw r2, 4(r3) ; TOC
+ mflr r0
+ stw r0, 8(r3) ; LR (return address)
+ mfcr r0
+ stw r0, 12(r3) ; CR
+ stmw r13, -RSIZE(r1) ; GPRs 13-31 (save on stack)
+
+ cmpi 0, r5, 0
+ beq first ; if first time
+
+ ; Restore new context:
+ lwz r1, 0(r4) ; SP
+ lwz r2, 4(r4) ; TOC
+ lwz r0, 8(r4) ; LR
+ mtlr r0
+ lwz r0, 12(r4) ; CR
+ mtcr r0
+ lmw r13, -RSIZE(r1) ; GPRs 13-31 (from stack)
+
+ addic r1, r1, RSIZE ; deallocate stack frame
+ blr ; return into new context
+
+first: ; First-time call:
+ lwz r1, 0(r4) ; SP as figured by Icon
+ addic r1, r1, -64 ; save area for callee
+ addi r3, 0, 0 ; arg1
+ addi r4, 0, 0 ; arg2
+ bl _new_context ; new_context(0,0)
+ addi r3, 0, 0
+ bl _syserr