aboutsummaryrefslogtreecommitdiff
path: root/lib/std/Thread.zig
diff options
context:
space:
mode:
authorAlex Rønne Petersen <alex@alexrp.com>2025-10-18 22:26:09 +0200
committerGitHub <noreply@github.com>2025-10-18 22:26:09 +0200
commit6bf5b7f2b40be1a92c66fed05e53815b3ab07733 (patch)
tree0d669a74a75571726056f406c79d69a5fe415c3d /lib/std/Thread.zig
parent1466401c153e991cd7cddb0c39b1cd361476e8e5 (diff)
parent3585f79f447a7bdac59dc06dd33ca374e2345900 (diff)
downloadzig-6bf5b7f2b40be1a92c66fed05e53815b3ab07733.tar.gz
zig-6bf5b7f2b40be1a92c66fed05e53815b3ab07733.zip
Merge pull request #25622 from alexrp/inline-asm-fixes
`std`: some miscellaneous inline asm fixes for mips, mips64, mipsn32, and x32
Diffstat (limited to 'lib/std/Thread.zig')
-rw-r--r--lib/std/Thread.zig66
1 files changed, 44 insertions, 22 deletions
diff --git a/lib/std/Thread.zig b/lib/std/Thread.zig
index 6cc377b5bd..c299fb626c 100644
--- a/lib/std/Thread.zig
+++ b/lib/std/Thread.zig
@@ -1191,12 +1191,22 @@ const LinuxThreadImpl = struct {
: [ptr] "r" (@intFromPtr(self.mapped.ptr)),
[len] "r" (self.mapped.len),
: .{ .memory = true }),
- .x86_64 => asm volatile (
- \\ movq $11, %%rax # SYS_munmap
- \\ syscall
- \\ movq $60, %%rax # SYS_exit
- \\ movq $1, %%rdi
- \\ syscall
+ .x86_64 => asm volatile (switch (target.abi) {
+ .gnux32, .muslx32 =>
+ \\ movl $0x4000000b, %%eax # SYS_munmap
+ \\ syscall
+ \\ movl $0x4000003c, %%eax # SYS_exit
+ \\ xor %%rdi, %%rdi
+ \\ syscall
+ ,
+ else =>
+ \\ movl $11, %%eax # SYS_munmap
+ \\ syscall
+ \\ movl $60, %%eax # SYS_exit
+ \\ xor %%rdi, %%rdi
+ \\ syscall
+ ,
+ }
:
: [ptr] "{rdi}" (@intFromPtr(self.mapped.ptr)),
[len] "{rsi}" (self.mapped.len),
@@ -1242,26 +1252,38 @@ const LinuxThreadImpl = struct {
// The bug was introduced in 46e12c07b3b9603c60fc1d421ff18618241cb081 and fixed in
// 7928eb0370d1133d0d8cd2f5ddfca19c309079d5.
.mips, .mipsel => asm volatile (
- \\ move $sp, $25
- \\ li $2, 4091 # SYS_munmap
- \\ move $4, %[ptr]
- \\ move $5, %[len]
- \\ syscall
- \\ li $2, 4001 # SYS_exit
- \\ li $4, 0
- \\ syscall
+ \\ move $sp, $t9
+ \\ li $v0, 4091 # SYS_munmap
+ \\ move $a0, %[ptr]
+ \\ move $a1, %[len]
+ \\ syscall
+ \\ li $v0, 4001 # SYS_exit
+ \\ li $a0, 0
+ \\ syscall
:
: [ptr] "r" (@intFromPtr(self.mapped.ptr)),
[len] "r" (self.mapped.len),
: .{ .memory = true }),
- .mips64, .mips64el => asm volatile (
- \\ li $2, 5011 # SYS_munmap
- \\ move $4, %[ptr]
- \\ move $5, %[len]
- \\ syscall
- \\ li $2, 5058 # SYS_exit
- \\ li $4, 0
- \\ syscall
+ .mips64, .mips64el => asm volatile (switch (target.abi) {
+ .gnuabin32, .muslabin32 =>
+ \\ li $v0, 6011 # SYS_munmap
+ \\ move $a0, %[ptr]
+ \\ move $a1, %[len]
+ \\ syscall
+ \\ li $v0, 6058 # SYS_exit
+ \\ li $a0, 0
+ \\ syscall
+ ,
+ else =>
+ \\ li $v0, 5011 # SYS_munmap
+ \\ move $a0, %[ptr]
+ \\ move $a1, %[len]
+ \\ syscall
+ \\ li $v0, 5058 # SYS_exit
+ \\ li $a0, 0
+ \\ syscall
+ ,
+ }
:
: [ptr] "r" (@intFromPtr(self.mapped.ptr)),
[len] "r" (self.mapped.len),