diff options
| author | Alex Rønne Petersen <alex@alexrp.com> | 2025-10-18 22:26:09 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-10-18 22:26:09 +0200 |
| commit | 6bf5b7f2b40be1a92c66fed05e53815b3ab07733 (patch) | |
| tree | 0d669a74a75571726056f406c79d69a5fe415c3d /lib/std/Thread.zig | |
| parent | 1466401c153e991cd7cddb0c39b1cd361476e8e5 (diff) | |
| parent | 3585f79f447a7bdac59dc06dd33ca374e2345900 (diff) | |
| download | zig-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.zig | 66 |
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), |
