diff --git a/lib/std/os/linux/sparc.zig b/lib/std/os/linux/sparc.zig index 4a2e7188a6b2a9cf582edddf204ce8fc61d4fb95..c8addd36c45bfc08aff71672c2aeef42bb948f06 100644 --- a/lib/std/os/linux/sparc.zig +++ b/lib/std/os/linux/sparc.zig @@ -260,13 +260,16 @@ pub fn clone() callconv(.naked) u32 { pub const restore = restore_rt; -// Need to use C ABI here instead of naked -// to prevent an infinite loop when calling rt_sigreturn. -pub fn restore_rt() callconv(.c) void { - return asm volatile ("t 0x10" +pub fn restore_rt() callconv(.naked) noreturn { + asm volatile ( + \\ nop + \\ nop + ); + asm volatile ( + \\ t 0x10 : : [number] "{g1}" (@backingInt(SYS.rt_sigreturn)), - : .{ .memory = true, .xcc = true, .o0 = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true }); + ); } pub const VDSO = struct { diff --git a/lib/std/os/linux/sparc64.zig b/lib/std/os/linux/sparc64.zig index f7e859cc72abfe37dfee1f5ab5927979c2625615..955ae477c3f81d1f190ad7cb440108747cff9b56 100644 --- a/lib/std/os/linux/sparc64.zig +++ b/lib/std/os/linux/sparc64.zig @@ -259,13 +259,16 @@ pub fn clone() callconv(.naked) u64 { pub const restore = restore_rt; -// Need to use C ABI here instead of naked -// to prevent an infinite loop when calling rt_sigreturn. -pub fn restore_rt() callconv(.c) void { - return asm volatile ("t 0x6d" +pub fn restore_rt() callconv(.naked) noreturn { + asm volatile ( + \\ nop + \\ nop + ); + asm volatile ( + \\ t 0x6d : : [number] "{g1}" (@backingInt(SYS.rt_sigreturn)), - : .{ .memory = true, .xcc = true, .o0 = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true }); + ); } pub const VDSO = struct {