diff options
| author | Koakuma <koachan@protonmail.com> | 2021-07-30 21:45:28 +0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-07-30 13:23:41 -0400 |
| commit | 7aaea20e7e5e98bc5b2c4c8ddcf8f6aaa4a9c55d (patch) | |
| tree | 93a149f6f84354f4abaa708c8766b19d9ddb6373 /lib/std/Thread.zig | |
| parent | f6b1fa9e29ccab77a54e92dc13a7eb8e407bdbbc (diff) | |
| download | zig-7aaea20e7e5e98bc5b2c4c8ddcf8f6aaa4a9c55d.tar.gz zig-7aaea20e7e5e98bc5b2c4c8ddcf8f6aaa4a9c55d.zip | |
Add freeAndExit() implementation for Linux/SPARCv9
Diffstat (limited to 'lib/std/Thread.zig')
| -rw-r--r-- | lib/std/Thread.zig | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/lib/std/Thread.zig b/lib/std/Thread.zig index 2584b38072..e10e67c250 100644 --- 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; |
