aboutsummaryrefslogtreecommitdiff
path: root/lib/std/os/linux/powerpc.zig
diff options
context:
space:
mode:
authorAlex Rønne Petersen <alex@alexrp.com>2024-12-13 03:09:24 +0100
committerGitHub <noreply@github.com>2024-12-13 03:09:24 +0100
commit130f7c2ed8e3358e24bb2fc7cca57f7a6f1f85c3 (patch)
treeebb88312b13fb8b1e67b852bcb0e42903ad11193 /lib/std/os/linux/powerpc.zig
parentd48611ba67c7871cb348f28a01b89d8771170dd8 (diff)
parentc666ebb1f8aac440a4d0d554e9f8aa836bf58060 (diff)
downloadzig-130f7c2ed8e3358e24bb2fc7cca57f7a6f1f85c3.tar.gz
zig-130f7c2ed8e3358e24bb2fc7cca57f7a6f1f85c3.zip
Merge pull request #22035 from alexrp/unwind-fixes
Better unwind table support + unwind protection in `_start()` and `clone()`
Diffstat (limited to 'lib/std/os/linux/powerpc.zig')
-rw-r--r--lib/std/os/linux/powerpc.zig40
1 files changed, 20 insertions, 20 deletions
diff --git a/lib/std/os/linux/powerpc.zig b/lib/std/os/linux/powerpc.zig
index 7b56b94823..9dde326e1b 100644
--- a/lib/std/os/linux/powerpc.zig
+++ b/lib/std/os/linux/powerpc.zig
@@ -133,14 +133,14 @@ pub fn clone() callconv(.Naked) usize {
// syscall(SYS_clone, flags, stack, ptid, tls, ctid)
// 0 3, 4, 5, 6, 7
asm volatile (
- \\ # store non-volatile regs r30, r31 on stack in order to put our
+ \\ # store non-volatile regs r29, r30 on stack in order to put our
\\ # start func and its arg there
- \\ stwu 30, -16(1)
- \\ stw 31, 4(1)
+ \\ stwu 29, -16(1)
+ \\ stw 30, 4(1)
\\
- \\ # save r3 (func) into r30, and r6(arg) into r31
- \\ mr 30, 3
- \\ mr 31, 6
+ \\ # save r3 (func) into r29, and r6(arg) into r30
+ \\ mr 29, 3
+ \\ mr 30, 6
\\
\\ # create initial stack frame for new thread
\\ clrrwi 4, 4, 4
@@ -167,28 +167,28 @@ pub fn clone() callconv(.Naked) usize {
\\ # compare sc result with 0
\\ cmpwi cr7, 3, 0
\\
- \\ # if not 0, jump to end
- \\ bne cr7, 2f
+ \\ # if not 0, restore stack and return
+ \\ beq cr7, 2f
+ \\ lwz 29, 0(1)
+ \\ lwz 30, 4(1)
+ \\ addi 1, 1, 16
+ \\ blr
\\
\\ #else: we're the child
+ \\ 2:
+ \\ .cfi_undefined lr
+ \\ li 31, 0
+ \\ mtlr 0
+ \\
\\ #call funcptr: move arg (d) into r3
- \\ mr 3, 31
- \\ #move r30 (funcptr) into CTR reg
- \\ mtctr 30
+ \\ mr 3, 30
+ \\ #move r29 (funcptr) into CTR reg
+ \\ mtctr 29
\\ # call CTR reg
\\ bctrl
\\ # mov SYS_exit into r0 (the exit param is already in r3)
\\ li 0, 1
\\ sc
- \\
- \\ 2:
- \\
- \\ # restore stack
- \\ lwz 30, 0(1)
- \\ lwz 31, 4(1)
- \\ addi 1, 1, 16
- \\
- \\ blr
);
}