From d79e2822b062b98dff6bfd2c4549ec065d9e43d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sun, 18 Aug 2024 02:02:47 +0200 Subject: [PATCH 1/4] std.Thread: Implement freeAndExit() for sparc32. --- lib/std/Thread.zig | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/lib/std/Thread.zig b/lib/std/Thread.zig index 2ed6610bc0..12c22d69a8 100644 --- a/lib/std/Thread.zig +++ b/lib/std/Thread.zig @@ -1188,6 +1188,28 @@ const LinuxThreadImpl = struct { [len] "r" (self.mapped.len), : "memory" ), + .sparc => asm volatile ( + \\ # See sparc64 comments below. + \\ 1: + \\ cmp %%fp, 0 + \\ beq 2f + \\ nop + \\ ba 1b + \\ restore + \\ 2: + \\ mov 73, %%g1 # SYS_munmap + \\ mov %[ptr], %%o0 + \\ mov %[len], %%o1 + \\ t 0x3 # ST_FLUSH_WINDOWS + \\ t 0x10 + \\ mov 1, %%g1 # SYS_exit + \\ mov 0, %%o0 + \\ t 0x10 + : + : [ptr] "r" (@intFromPtr(self.mapped.ptr)), + [len] "r" (self.mapped.len), + : "memory" + ), .sparc64 => asm volatile ( \\ # SPARCs really don't like it when active stack frames \\ # is unmapped (it will result in a segfault), so we From 0f78f8244f3a8fd7a24200eb441287f6e6907d5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sun, 18 Aug 2024 02:03:22 +0200 Subject: [PATCH 2/4] std.Thread: Use zero exit code in freeAndExit() for sparc64. --- lib/std/Thread.zig | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/std/Thread.zig b/lib/std/Thread.zig index 12c22d69a8..323bf22384 100644 --- a/lib/std/Thread.zig +++ b/lib/std/Thread.zig @@ -1215,13 +1215,13 @@ const LinuxThreadImpl = struct { \\ # is unmapped (it will result in a segfault), so we \\ # force-deactivate it by running `restore` until \\ # all frames are cleared. - \\ 1: + \\ 1: \\ cmp %%fp, 0 \\ beq 2f \\ nop \\ ba 1b \\ restore - \\ 2: + \\ 2: \\ mov 73, %%g1 # SYS_munmap \\ mov %[ptr], %%o0 \\ mov %[len], %%o1 @@ -1230,7 +1230,7 @@ const LinuxThreadImpl = struct { \\ flushw \\ t 0x6d \\ mov 1, %%g1 # SYS_exit - \\ mov 1, %%o0 + \\ mov 0, %%o0 \\ t 0x6d : : [ptr] "r" (@intFromPtr(self.mapped.ptr)), From 8e4feca8abbef78567ef789e6c8d8316ebe09119 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sun, 18 Aug 2024 02:22:25 +0200 Subject: [PATCH 3/4] std.Thread: Implement freeAndExit() for s390x. --- lib/std/Thread.zig | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/std/Thread.zig b/lib/std/Thread.zig index 323bf22384..e07c02baa3 100644 --- a/lib/std/Thread.zig +++ b/lib/std/Thread.zig @@ -1188,6 +1188,17 @@ const LinuxThreadImpl = struct { [len] "r" (self.mapped.len), : "memory" ), + .s390x => asm volatile ( + \\ lgr %%r2, %[ptr] + \\ lgr %%r3, %[len] + \\ svc 91 # SYS_munmap + \\ lghi %%r2, 0 + \\ svc 1 # SYS_exit + : + : [ptr] "r" (@intFromPtr(self.mapped.ptr)), + [len] "r" (self.mapped.len), + : "memory" + ), .sparc => asm volatile ( \\ # See sparc64 comments below. \\ 1: From f0d6a211e06cbd3765411e3acd70c0eb037bea62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sun, 18 Aug 2024 02:29:54 +0200 Subject: [PATCH 4/4] std.Thread: Implement freeAndExit() for hexagon. --- lib/std/Thread.zig | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib/std/Thread.zig b/lib/std/Thread.zig index e07c02baa3..87a4eec921 100644 --- a/lib/std/Thread.zig +++ b/lib/std/Thread.zig @@ -1130,6 +1130,19 @@ const LinuxThreadImpl = struct { [len] "r" (self.mapped.len), : "memory" ), + .hexagon => asm volatile ( + \\ r6 = #215 // SYS_munmap + \\ r0 = %[ptr] + \\ r1 = %[len] + \\ trap0(#1) + \\ r6 = #93 // SYS_exit + \\ r0 = #0 + \\ trap0(#1) + : + : [ptr] "r" (@intFromPtr(self.mapped.ptr)), + [len] "r" (self.mapped.len), + : "memory" + ), // We set `sp` to the address of the current function as a workaround for a Linux // kernel bug that caused syscalls to return EFAULT if the stack pointer is invalid. // The bug was introduced in 46e12c07b3b9603c60fc1d421ff18618241cb081 and fixed in