zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 7aaea20e7e5e98bc5b2c4c8ddcf8f6aaa4a9c55d (tree)
parent f6b1fa9e29ccab77a54e92dc13a7eb8e407bdbbc
Author: Koakuma <koachan@protonmail.com>
Date:   Fri, 30 Jul 2021 21:45:28 +0700

Add freeAndExit() implementation for Linux/SPARCv9

Diffstat:
Mlib/std/Thread.zig | 26++++++++++++++++++++++++++
1 file changed, 26 insertions(+), 0 deletions(-)

diff --git a/lib/std/Thread.zig b/lib/std/Thread.zig @@ -798,6 +798,32 @@ const LinuxThreadImpl = struct { [len] "r" (self.mapped.len) : "memory" ), + .sparcv9 => asm volatile ( + \\ # SPARCs really don't like it when active stack frames + \\ # is unmapped (it will result in a segfault), so we + \\ # force-deactivate it by running `restore` until + \\ # all frames are cleared. + \\ 1: + \\ cmp %%sp, 0 + \\ beq 2f + \\ restore + \\ ba 1f + \\ 2: + \\ mov 73, %%g1 + \\ mov %[ptr], %%o0 + \\ mov %[len], %%o1 + \\ # Flush register window contents to prevent background + \\ # memory access before unmapping the stack. + \\ flushw + \\ t 0x6d + \\ mov 1, %%g1 + \\ mov 1, %%o0 + \\ t 0x6d + : + : [ptr] "r" (@ptrToInt(self.mapped.ptr)), + [len] "r" (self.mapped.len) + : "memory" + ), else => |cpu_arch| @compileError("Unsupported linux arch: " ++ @tagName(cpu_arch)), } unreachable;