Commit b2bc44e0d5

Alex Rønne Petersen <alex@alexrp.com>
2025-10-29 20:44:03
std.os.linux: fix restore for powerpc/powerpc64
sigreturn and rt_sigreturn are distinct syscalls on PowerPC.
1 parent a7119d4
Changed files (2)
lib
lib/std/os/linux/powerpc.zig
@@ -232,7 +232,21 @@ pub fn clone() callconv(.naked) u32 {
     );
 }
 
-pub const restore = restore_rt;
+pub fn restore() callconv(.naked) noreturn {
+    switch (builtin.zig_backend) {
+        .stage2_c => asm volatile (
+            \\ li 0, %[number]
+            \\ sc
+            :
+            : [number] "i" (@intFromEnum(SYS.sigreturn)),
+        ),
+        else => asm volatile (
+            \\ sc
+            :
+            : [number] "{r0}" (@intFromEnum(SYS.sigreturn)),
+        ),
+    }
+}
 
 pub fn restore_rt() callconv(.naked) noreturn {
     switch (builtin.zig_backend) {
lib/std/os/linux/powerpc64.zig
@@ -217,7 +217,21 @@ pub fn clone() callconv(.naked) u64 {
     );
 }
 
-pub const restore = restore_rt;
+pub fn restore() callconv(.naked) noreturn {
+    switch (builtin.zig_backend) {
+        .stage2_c => asm volatile (
+            \\ li 0, %[number]
+            \\ sc
+            :
+            : [number] "i" (@intFromEnum(SYS.sigreturn)),
+        ),
+        else => asm volatile (
+            \\ sc
+            :
+            : [number] "{r0}" (@intFromEnum(SYS.sigreturn)),
+        ),
+    }
+}
 
 pub fn restore_rt() callconv(.naked) noreturn {
     switch (builtin.zig_backend) {