| author | |
| committer | |
| log | 6217b02f2540e32acedee8d0f2f3830ea8ae0d28 |
| tree | c96b867a46dc16a336d77c62cf9aad1fa7030c9a |
| parent | f6e32d1b3a5de1626c3fdf5527b565dae1c501a0 |
| parent | 8217f26ef8ddab9eb02a9d380d6509c39ac2d0f3 |
Reviewed-on: https://codeberg.org/ziglang/zig/pulls/3645928 files changed, 657 insertions(+), 737 deletions(-)
lib/libc/musl/src/thread/powerpc/clone.s+5-4| ... | @@ -16,8 +16,9 @@ __clone: | ... | @@ -16,8 +16,9 @@ __clone: |
| 16 | 16 | ||
| 17 | # store non-volatile regs r30, r31 on stack in order to put our | 17 | # store non-volatile regs r30, r31 on stack in order to put our |
| 18 | # start func and its arg there | 18 | # start func and its arg there |
| 19 | stwu 30, -16(1) | 19 | stwu 1, -16(1) |
| 20 | stw 31, 4(1) | 20 | stw 30, 8(1) |
| 21 | stw 31, 12(1) | ||
| 21 | 22 | ||
| 22 | # save r3 (func) into r30, and r6(arg) into r31 | 23 | # save r3 (func) into r30, and r6(arg) into r31 |
| 23 | mr 30, 3 | 24 | mr 30, 3 |
| ... | @@ -51,8 +52,8 @@ cmpwi cr7, 3, 0 | ... | @@ -51,8 +52,8 @@ cmpwi cr7, 3, 0 |
| 51 | # if not 0, restore stack and return | 52 | # if not 0, restore stack and return |
| 52 | beq cr7, 2f | 53 | beq cr7, 2f |
| 53 | 54 | ||
| 54 | lwz 30, 0(1) | 55 | lwz 30, 8(1) |
| 55 | lwz 31, 4(1) | 56 | lwz 31, 12(1) |
| 56 | addi 1, 1, 16 | 57 | addi 1, 1, 16 |
| 57 | 58 | ||
| 58 | blr | 59 | blr |
lib/std/Thread.zig+51-57| ... | @@ -1166,29 +1166,29 @@ const LinuxThreadImpl = struct { | ... | @@ -1166,29 +1166,29 @@ const LinuxThreadImpl = struct { |
| 1166 | posix.sigprocmask(std.posix.SIG.BLOCK, &std.os.linux.sigfillset(), null); | 1166 | posix.sigprocmask(std.posix.SIG.BLOCK, &std.os.linux.sigfillset(), null); |
| 1167 | switch (target.cpu.arch) { | 1167 | switch (target.cpu.arch) { |
| 1168 | .x86 => asm volatile ( | 1168 | .x86 => asm volatile ( |
| 1169 | \\ movl $91, %%eax # SYS_munmap | 1169 | \\ movl $91, %%eax # SYS_munmap |
| 1170 | \\ int $128 | 1170 | \\ int $128 |
| 1171 | \\ movl $1, %%eax # SYS_exit | 1171 | \\ movl $1, %%eax # SYS_exit |
| 1172 | \\ movl $0, %%ebx | 1172 | \\ movl $0, %%ebx |
| 1173 | \\ int $128 | 1173 | \\ int $128 |
| 1174 | : | 1174 | : |
| 1175 | : [ptr] "{ebx}" (@intFromPtr(self.mapped.ptr)), | 1175 | : [ptr] "{ebx}" (@intFromPtr(self.mapped.ptr)), |
| 1176 | [len] "{ecx}" (self.mapped.len), | 1176 | [len] "{ecx}" (self.mapped.len), |
| 1177 | ), | 1177 | ), |
| 1178 | .x86_64 => asm volatile (switch (target.abi) { | 1178 | .x86_64 => asm volatile (switch (target.abi) { |
| 1179 | .gnux32, .muslx32, .x32 => | 1179 | .gnux32, .muslx32, .x32 => |
| 1180 | \\ movl $0x4000000b, %%eax # SYS_munmap | 1180 | \\ movl $0x4000000b, %%eax # SYS_munmap |
| 1181 | \\ syscall | 1181 | \\ syscall |
| 1182 | \\ movl $0x4000003c, %%eax # SYS_exit | 1182 | \\ movl $0x4000003c, %%eax # SYS_exit |
| 1183 | \\ xor %%rdi, %%rdi | 1183 | \\ xor %%rdi, %%rdi |
| 1184 | \\ syscall | 1184 | \\ syscall |
| 1185 | , | 1185 | , |
| 1186 | else => | 1186 | else => |
| 1187 | \\ movl $11, %%eax # SYS_munmap | 1187 | \\ movl $11, %%eax # SYS_munmap |
| 1188 | \\ syscall | 1188 | \\ syscall |
| 1189 | \\ movl $60, %%eax # SYS_exit | 1189 | \\ movl $60, %%eax # SYS_exit |
| 1190 | \\ xor %%rdi, %%rdi | 1190 | \\ xor %%rdi, %%rdi |
| 1191 | \\ syscall | 1191 | \\ syscall |
| 1192 | , | 1192 | , |
| 1193 | } | 1193 | } |
| 1194 | : | 1194 | : |
| ... | @@ -1196,21 +1196,21 @@ const LinuxThreadImpl = struct { | ... | @@ -1196,21 +1196,21 @@ const LinuxThreadImpl = struct { |
| 1196 | [len] "{rsi}" (self.mapped.len), | 1196 | [len] "{rsi}" (self.mapped.len), |
| 1197 | ), | 1197 | ), |
| 1198 | .arm, .armeb, .thumb, .thumbeb => asm volatile ( | 1198 | .arm, .armeb, .thumb, .thumbeb => asm volatile ( |
| 1199 | \\ mov r7, #91 // SYS_munmap | 1199 | \\ mov r7, #91 // SYS_munmap |
| 1200 | \\ svc 0 | 1200 | \\ svc 0 |
| 1201 | \\ mov r7, #1 // SYS_exit | 1201 | \\ mov r7, #1 // SYS_exit |
| 1202 | \\ mov r0, #0 | 1202 | \\ mov r0, #0 |
| 1203 | \\ svc 0 | 1203 | \\ svc 0 |
| 1204 | : | 1204 | : |
| 1205 | : [ptr] "{r0}" (@intFromPtr(self.mapped.ptr)), | 1205 | : [ptr] "{r0}" (@intFromPtr(self.mapped.ptr)), |
| 1206 | [len] "{r1}" (self.mapped.len), | 1206 | [len] "{r1}" (self.mapped.len), |
| 1207 | ), | 1207 | ), |
| 1208 | .aarch64, .aarch64_be => asm volatile ( | 1208 | .aarch64, .aarch64_be => asm volatile ( |
| 1209 | \\ mov x8, #215 // SYS_munmap | 1209 | \\ mov x8, #215 // SYS_munmap |
| 1210 | \\ svc 0 | 1210 | \\ svc 0 |
| 1211 | \\ mov x8, #93 // SYS_exit | 1211 | \\ mov x8, #93 // SYS_exit |
| 1212 | \\ mov x0, #0 | 1212 | \\ mov x0, #0 |
| 1213 | \\ svc 0 | 1213 | \\ svc 0 |
| 1214 | : | 1214 | : |
| 1215 | : [ptr] "{x0}" (@intFromPtr(self.mapped.ptr)), | 1215 | : [ptr] "{x0}" (@intFromPtr(self.mapped.ptr)), |
| 1216 | [len] "{x1}" (self.mapped.len), | 1216 | [len] "{x1}" (self.mapped.len), |
| ... | @@ -1236,21 +1236,21 @@ const LinuxThreadImpl = struct { | ... | @@ -1236,21 +1236,21 @@ const LinuxThreadImpl = struct { |
| 1236 | [len] "{r1}" (self.mapped.len), | 1236 | [len] "{r1}" (self.mapped.len), |
| 1237 | ), | 1237 | ), |
| 1238 | .hexagon => asm volatile ( | 1238 | .hexagon => asm volatile ( |
| 1239 | \\ r6 = #215 // SYS_munmap | 1239 | \\ r6 = #215 // SYS_munmap |
| 1240 | \\ trap0(#1) | 1240 | \\ trap0(#1) |
| 1241 | \\ r6 = #93 // SYS_exit | 1241 | \\ r6 = #93 // SYS_exit |
| 1242 | \\ r0 = #0 | 1242 | \\ r0 = #0 |
| 1243 | \\ trap0(#1) | 1243 | \\ trap0(#1) |
| 1244 | : | 1244 | : |
| 1245 | : [ptr] "{r0}" (@intFromPtr(self.mapped.ptr)), | 1245 | : [ptr] "{r0}" (@intFromPtr(self.mapped.ptr)), |
| 1246 | [len] "{r1}" (self.mapped.len), | 1246 | [len] "{r1}" (self.mapped.len), |
| 1247 | ), | 1247 | ), |
| 1248 | .hppa => asm volatile ( | 1248 | .hppa => asm volatile ( |
| 1249 | \\ ldi 91, %%r20 /* SYS_munmap */ | ||
| 1250 | \\ ble 0x100(%%sr2, %%r0) | 1249 | \\ ble 0x100(%%sr2, %%r0) |
| 1251 | \\ ldi 1, %%r20 /* SYS_exit */ | 1250 | \\ ldi 91, %%r20 /* SYS_munmap */ |
| 1252 | \\ ldi 0, %%r26 | 1251 | \\ ldi 0, %%r26 |
| 1253 | \\ ble 0x100(%%sr2, %%r0) | 1252 | \\ ble 0x100(%%sr2, %%r0) |
| 1253 | \\ ldi 1, %%r20 /* SYS_exit */ | ||
| 1254 | : | 1254 | : |
| 1255 | : [ptr] "{r26}" (@intFromPtr(self.mapped.ptr)), | 1255 | : [ptr] "{r26}" (@intFromPtr(self.mapped.ptr)), |
| 1256 | [len] "{r25}" (self.mapped.len), | 1256 | [len] "{r25}" (self.mapped.len), |
| ... | @@ -1275,12 +1275,7 @@ const LinuxThreadImpl = struct { | ... | @@ -1275,12 +1275,7 @@ const LinuxThreadImpl = struct { |
| 1275 | : [ptr] "{r5}" (@intFromPtr(self.mapped.ptr)), | 1275 | : [ptr] "{r5}" (@intFromPtr(self.mapped.ptr)), |
| 1276 | [len] "{r6}" (self.mapped.len), | 1276 | [len] "{r6}" (self.mapped.len), |
| 1277 | ), | 1277 | ), |
| 1278 | // We set `sp` to the address of the current function as a workaround for a Linux | ||
| 1279 | // kernel bug that caused syscalls to return EFAULT if the stack pointer is invalid. | ||
| 1280 | // The bug was introduced in 46e12c07b3b9603c60fc1d421ff18618241cb081 and fixed in | ||
| 1281 | // 7928eb0370d1133d0d8cd2f5ddfca19c309079d5. | ||
| 1282 | .mips, .mipsel => asm volatile ( | 1278 | .mips, .mipsel => asm volatile ( |
| 1283 | \\ move $sp, $t9 | ||
| 1284 | \\ li $v0, 4091 # SYS_munmap | 1279 | \\ li $v0, 4091 # SYS_munmap |
| 1285 | \\ syscall | 1280 | \\ syscall |
| 1286 | \\ li $v0, 4001 # SYS_exit | 1281 | \\ li $v0, 4001 # SYS_exit |
| ... | @@ -1314,37 +1309,36 @@ const LinuxThreadImpl = struct { | ... | @@ -1314,37 +1309,36 @@ const LinuxThreadImpl = struct { |
| 1314 | \\ l.ori r11, r0, 215 # SYS_munmap | 1309 | \\ l.ori r11, r0, 215 # SYS_munmap |
| 1315 | \\ l.sys 1 | 1310 | \\ l.sys 1 |
| 1316 | \\ l.ori r11, r0, 93 # SYS_exit | 1311 | \\ l.ori r11, r0, 93 # SYS_exit |
| 1317 | \\ l.ori r3, r0, r0 | 1312 | \\ l.ori r3, r0, 0 |
| 1318 | \\ l.sys 1 | 1313 | \\ l.sys 1 |
| 1319 | : | 1314 | : |
| 1320 | : [ptr] "{r3}" (@intFromPtr(self.mapped.ptr)), | 1315 | : [ptr] "{r3}" (@intFromPtr(self.mapped.ptr)), |
| 1321 | [len] "{r4}" (self.mapped.len), | 1316 | [len] "{r4}" (self.mapped.len), |
| 1322 | ), | 1317 | ), |
| 1323 | .powerpc, .powerpcle, .powerpc64, .powerpc64le => asm volatile ( | 1318 | .powerpc, .powerpcle, .powerpc64, .powerpc64le => asm volatile ( |
| 1324 | \\ li 0, 91 # SYS_munmap | 1319 | \\ li 0, 91 # SYS_munmap |
| 1325 | \\ sc | 1320 | \\ sc |
| 1326 | \\ li 0, 1 # SYS_exit | 1321 | \\ li 0, 1 # SYS_exit |
| 1327 | \\ li 3, 0 | 1322 | \\ li 3, 0 |
| 1328 | \\ sc | 1323 | \\ sc |
| 1329 | \\ blr | ||
| 1330 | : | 1324 | : |
| 1331 | : [ptr] "{r3}" (@intFromPtr(self.mapped.ptr)), | 1325 | : [ptr] "{r3}" (@intFromPtr(self.mapped.ptr)), |
| 1332 | [len] "{r4}" (self.mapped.len), | 1326 | [len] "{r4}" (self.mapped.len), |
| 1333 | ), | 1327 | ), |
| 1334 | .riscv32, .riscv64 => asm volatile ( | 1328 | .riscv32, .riscv64 => asm volatile ( |
| 1335 | \\ li a7, 215 # SYS_munmap | 1329 | \\ li a7, 215 # SYS_munmap |
| 1336 | \\ ecall | 1330 | \\ ecall |
| 1337 | \\ li a7, 93 # SYS_exit | 1331 | \\ li a7, 93 # SYS_exit |
| 1338 | \\ mv a0, zero | 1332 | \\ mv a0, zero |
| 1339 | \\ ecall | 1333 | \\ ecall |
| 1340 | : | 1334 | : |
| 1341 | : [ptr] "{a0}" (@intFromPtr(self.mapped.ptr)), | 1335 | : [ptr] "{a0}" (@intFromPtr(self.mapped.ptr)), |
| 1342 | [len] "{a1}" (self.mapped.len), | 1336 | [len] "{a1}" (self.mapped.len), |
| 1343 | ), | 1337 | ), |
| 1344 | .s390x => asm volatile ( | 1338 | .s390x => asm volatile ( |
| 1345 | \\ svc 91 # SYS_munmap | 1339 | \\ svc 91 # SYS_munmap |
| 1346 | \\ lghi %%r2, 0 | 1340 | \\ lghi %%r2, 0 |
| 1347 | \\ svc 1 # SYS_exit | 1341 | \\ svc 1 # SYS_exit |
| 1348 | : | 1342 | : |
| 1349 | : [ptr] "{r2}" (@intFromPtr(self.mapped.ptr)), | 1343 | : [ptr] "{r2}" (@intFromPtr(self.mapped.ptr)), |
| 1350 | [len] "{r3}" (self.mapped.len), | 1344 | [len] "{r3}" (self.mapped.len), |
| ... | @@ -1384,7 +1378,7 @@ const LinuxThreadImpl = struct { | ... | @@ -1384,7 +1378,7 @@ const LinuxThreadImpl = struct { |
| 1384 | : [ptr] "{g1}" (@intFromPtr(self.mapped.ptr)), | 1378 | : [ptr] "{g1}" (@intFromPtr(self.mapped.ptr)), |
| 1385 | [len] "{g2}" (self.mapped.len), | 1379 | [len] "{g2}" (self.mapped.len), |
| 1386 | [stack] "{g3}" (&sparc_exit_stack), | 1380 | [stack] "{g3}" (&sparc_exit_stack), |
| 1387 | : .{ .memory = true }), | 1381 | ), |
| 1388 | .sparc64 => asm volatile ( | 1382 | .sparc64 => asm volatile ( |
| 1389 | \\ // Ensure that the kernel only has to flush the current register window. | 1383 | \\ // Ensure that the kernel only has to flush the current register window. |
| 1390 | \\ flushw | 1384 | \\ flushw |
| ... | @@ -1403,7 +1397,7 @@ const LinuxThreadImpl = struct { | ... | @@ -1403,7 +1397,7 @@ const LinuxThreadImpl = struct { |
| 1403 | : [ptr] "{g1}" (@intFromPtr(self.mapped.ptr)), | 1397 | : [ptr] "{g1}" (@intFromPtr(self.mapped.ptr)), |
| 1404 | [len] "{g2}" (self.mapped.len), | 1398 | [len] "{g2}" (self.mapped.len), |
| 1405 | [stack] "{g3}" (&sparc_exit_stack), | 1399 | [stack] "{g3}" (&sparc_exit_stack), |
| 1406 | : .{ .memory = true }), | 1400 | ), |
| 1407 | .loongarch32, .loongarch64 => asm volatile ( | 1401 | .loongarch32, .loongarch64 => asm volatile ( |
| 1408 | \\ ori $a7, $zero, 215 # SYS_munmap | 1402 | \\ ori $a7, $zero, 215 # SYS_munmap |
| 1409 | \\ syscall 0 # call munmap | 1403 | \\ syscall 0 # call munmap |
| ... | @@ -1413,7 +1407,7 @@ const LinuxThreadImpl = struct { | ... | @@ -1413,7 +1407,7 @@ const LinuxThreadImpl = struct { |
| 1413 | : | 1407 | : |
| 1414 | : [ptr] "{r4}" (@intFromPtr(self.mapped.ptr)), | 1408 | : [ptr] "{r4}" (@intFromPtr(self.mapped.ptr)), |
| 1415 | [len] "{r5}" (self.mapped.len), | 1409 | [len] "{r5}" (self.mapped.len), |
| 1416 | : .{ .memory = true }), | 1410 | ), |
| 1417 | .csky => asm volatile ( | 1411 | .csky => asm volatile ( |
| 1418 | \\ movi r7, 215 # SYS_munmap | 1412 | \\ movi r7, 215 # SYS_munmap |
| 1419 | \\ trap 0 | 1413 | \\ trap 0 |
| ... | @@ -1423,7 +1417,7 @@ const LinuxThreadImpl = struct { | ... | @@ -1423,7 +1417,7 @@ const LinuxThreadImpl = struct { |
| 1423 | : | 1417 | : |
| 1424 | : [ptr] "{r0}" (@intFromPtr(self.mapped.ptr)), | 1418 | : [ptr] "{r0}" (@intFromPtr(self.mapped.ptr)), |
| 1425 | [len] "{r1}" (self.mapped.len), | 1419 | [len] "{r1}" (self.mapped.len), |
| 1426 | : .{ .memory = true }), | 1420 | ), |
| 1427 | .xtensa, .xtensaeb => asm volatile ( | 1421 | .xtensa, .xtensaeb => asm volatile ( |
| 1428 | \\ movi a2, 81 // SYS_munmap | 1422 | \\ movi a2, 81 // SYS_munmap |
| 1429 | \\ syscall | 1423 | \\ syscall |
| ... | @@ -1433,7 +1427,7 @@ const LinuxThreadImpl = struct { | ... | @@ -1433,7 +1427,7 @@ const LinuxThreadImpl = struct { |
| 1433 | : | 1427 | : |
| 1434 | : [ptr] "{a6}" (@intFromPtr(self.mapped.ptr)), | 1428 | : [ptr] "{a6}" (@intFromPtr(self.mapped.ptr)), |
| 1435 | [len] "{a3}" (self.mapped.len), | 1429 | [len] "{a3}" (self.mapped.len), |
| 1436 | : .{ .memory = true }), | 1430 | ), |
| 1437 | else => |cpu_arch| @compileError("Unsupported linux arch: " ++ @tagName(cpu_arch)), | 1431 | else => |cpu_arch| @compileError("Unsupported linux arch: " ++ @tagName(cpu_arch)), |
| 1438 | } | 1432 | } |
| 1439 | unreachable; | 1433 | unreachable; |
lib/std/atomic.zig+19-2| ... | @@ -377,13 +377,16 @@ pub inline fn spinLoopHint() void { | ... | @@ -377,13 +377,16 @@ pub inline fn spinLoopHint() void { |
| 377 | .aarch64_be, | 377 | .aarch64_be, |
| 378 | => asm volatile ("isb"), | 378 | => asm volatile ("isb"), |
| 379 | 379 | ||
| 380 | // `yield` was introduced in v6k but is also available on v6m. | ||
| 381 | // https://www.keil.com/support/man/docs/armasm/armasm_dom1361289926796.htm | 380 | // https://www.keil.com/support/man/docs/armasm/armasm_dom1361289926796.htm |
| 382 | .arm, | 381 | .arm, |
| 383 | .armeb, | 382 | .armeb, |
| 383 | => if (comptime builtin.cpu.has(.arm, .has_v6k)) { | ||
| 384 | asm volatile ("yield"); | ||
| 385 | }, | ||
| 386 | |||
| 384 | .thumb, | 387 | .thumb, |
| 385 | .thumbeb, | 388 | .thumbeb, |
| 386 | => if (comptime builtin.cpu.hasAny(.arm, &.{ .has_v6k, .has_v6m })) { | 389 | => if (comptime builtin.cpu.hasAny(.arm, &.{ .has_v6m, .thumb2 })) { |
| 387 | asm volatile ("yield"); | 390 | asm volatile ("yield"); |
| 388 | }, | 391 | }, |
| 389 | 392 | ||
| ... | @@ -392,6 +395,14 @@ pub inline fn spinLoopHint() void { | ... | @@ -392,6 +395,14 @@ pub inline fn spinLoopHint() void { |
| 392 | .hexagon, | 395 | .hexagon, |
| 393 | => asm volatile ("pause(#1)"), | 396 | => asm volatile ("pause(#1)"), |
| 394 | 397 | ||
| 398 | .mips, | ||
| 399 | .mipsel, | ||
| 400 | .mips64, | ||
| 401 | .mips64el, | ||
| 402 | => if (comptime builtin.cpu.has(.mips, .mips32r2)) { | ||
| 403 | asm volatile ("pause"); | ||
| 404 | }, | ||
| 405 | |||
| 395 | .riscv32, | 406 | .riscv32, |
| 396 | .riscv32be, | 407 | .riscv32be, |
| 397 | .riscv64, | 408 | .riscv64, |
| ... | @@ -400,6 +411,12 @@ pub inline fn spinLoopHint() void { | ... | @@ -400,6 +411,12 @@ pub inline fn spinLoopHint() void { |
| 400 | asm volatile ("pause"); | 411 | asm volatile ("pause"); |
| 401 | }, | 412 | }, |
| 402 | 413 | ||
| 414 | .sparc, | ||
| 415 | .sparc64, | ||
| 416 | => if (comptime builtin.cpu.hasAny(.sparc, &.{ .v8plus, .v9 })) { | ||
| 417 | asm volatile ("rd %%ccr, %%g0"); | ||
| 418 | }, | ||
| 419 | |||
| 403 | else => {}, | 420 | else => {}, |
| 404 | } | 421 | } |
| 405 | } | 422 | } |
lib/std/debug/Dwarf.zig+1-1| ... | @@ -1462,7 +1462,7 @@ pub fn ipRegNum(arch: std.Target.Cpu.Arch) ?u16 { | ... | @@ -1462,7 +1462,7 @@ pub fn ipRegNum(arch: std.Target.Cpu.Arch) ?u16 { |
| 1462 | .powerpc, .powerpcle, .powerpc64, .powerpc64le => 67, | 1462 | .powerpc, .powerpcle, .powerpc64, .powerpc64le => 67, |
| 1463 | .riscv32, .riscv32be, .riscv64, .riscv64be => 65, | 1463 | .riscv32, .riscv32be, .riscv64, .riscv64be => 65, |
| 1464 | .s390x => 65, | 1464 | .s390x => 65, |
| 1465 | .sparc, .sparc64 => 32, | 1465 | .sparc, .sparc64 => 65, |
| 1466 | .ve => 144, | 1466 | .ve => 144, |
| 1467 | .x86 => 8, | 1467 | .x86 => 8, |
| 1468 | .x86_64 => 16, | 1468 | .x86_64 => 16, |
lib/std/debug/cpu_context.zig+102-92| ... | @@ -349,6 +349,7 @@ const Alpha = extern struct { | ... | @@ -349,6 +349,7 @@ const Alpha = extern struct { |
| 349 | \\ stq $28, 0x0e0($0) | 349 | \\ stq $28, 0x0e0($0) |
| 350 | \\ stq $29, 0x0e8($0) | 350 | \\ stq $29, 0x0e8($0) |
| 351 | \\ stq $30, 0x0f0($0) | 351 | \\ stq $30, 0x0f0($0) |
| 352 | \\ stq $31, 0x0f8($0) | ||
| 352 | \\ | 353 | \\ |
| 353 | \\ br $1, 1f | 354 | \\ br $1, 1f |
| 354 | \\1: | 355 | \\1: |
| ... | @@ -463,10 +464,11 @@ const Arm = struct { | ... | @@ -463,10 +464,11 @@ const Arm = struct { |
| 463 | \\ stm r0, {r0-r12} | 464 | \\ stm r0, {r0-r12} |
| 464 | \\ str r13, [r0, #0x34] | 465 | \\ str r13, [r0, #0x34] |
| 465 | \\ str r14, [r0, #0x38] | 466 | \\ str r14, [r0, #0x38] |
| 466 | \\ str r15, [r0, #0x3c] | 467 | \\ mov r1, pc |
| 468 | \\ str r1, [r0, #0x3c] | ||
| 467 | : | 469 | : |
| 468 | : [r] "{r0}" (&ctx.r), | 470 | : [r] "{r0}" (&ctx.r), |
| 469 | : .{ .memory = true }); | 471 | : .{ .r1 = true, .memory = true }); |
| 470 | return ctx; | 472 | return ctx; |
| 471 | } | 473 | } |
| 472 | 474 | ||
| ... | @@ -636,8 +638,8 @@ const Hexagon = extern struct { | ... | @@ -636,8 +638,8 @@ const Hexagon = extern struct { |
| 636 | /// This is an `extern struct` so that inline assembly in `current` can use field offsets. | 638 | /// This is an `extern struct` so that inline assembly in `current` can use field offsets. |
| 637 | const Kvx = extern struct { | 639 | const Kvx = extern struct { |
| 638 | r: [64]Gpr, | 640 | r: [64]Gpr, |
| 639 | ra: Gpr, | ||
| 640 | pc: Gpr, | 641 | pc: Gpr, |
| 642 | ra: Gpr, | ||
| 641 | 643 | ||
| 642 | pub const Gpr = u64; | 644 | pub const Gpr = u64; |
| 643 | 645 | ||
| ... | @@ -716,38 +718,38 @@ const Lanai = extern struct { | ... | @@ -716,38 +718,38 @@ const Lanai = extern struct { |
| 716 | pub inline fn current() Lanai { | 718 | pub inline fn current() Lanai { |
| 717 | var ctx: Lanai = undefined; | 719 | var ctx: Lanai = undefined; |
| 718 | asm volatile ( | 720 | asm volatile ( |
| 719 | \\ st %%r0, 0[r9] | 721 | \\ st %%r0, 0[%%r9] |
| 720 | \\ st %%r1, 4[r9] | 722 | \\ st %%r1, 4[%%r9] |
| 721 | \\ st %%r2, 8[r9] | 723 | \\ st %%r2, 8[%%r9] |
| 722 | \\ st %%r3, 12[r9] | 724 | \\ st %%r3, 12[%%r9] |
| 723 | \\ st %%r4, 16[r9] | 725 | \\ st %%r4, 16[%%r9] |
| 724 | \\ st %%r5, 20[r9] | 726 | \\ st %%r5, 20[%%r9] |
| 725 | \\ st %%r6, 24[r9] | 727 | \\ st %%r6, 24[%%r9] |
| 726 | \\ st %%r7, 28[r9] | 728 | \\ st %%r7, 28[%%r9] |
| 727 | \\ st %%r8, 32[r9] | 729 | \\ st %%r8, 32[%%r9] |
| 728 | \\ st %%r9, 36[r9] | 730 | \\ st %%r9, 36[%%r9] |
| 729 | \\ st %%r10, 40[r9] | 731 | \\ st %%r10, 40[%%r9] |
| 730 | \\ st %%r11, 44[r9] | 732 | \\ st %%r11, 44[%%r9] |
| 731 | \\ st %%r12, 48[r9] | 733 | \\ st %%r12, 48[%%r9] |
| 732 | \\ st %%r13, 52[r9] | 734 | \\ st %%r13, 52[%%r9] |
| 733 | \\ st %%r14, 56[r9] | 735 | \\ st %%r14, 56[%%r9] |
| 734 | \\ st %%r15, 60[r9] | 736 | \\ st %%r15, 60[%%r9] |
| 735 | \\ st %%r16, 64[r9] | 737 | \\ st %%r16, 64[%%r9] |
| 736 | \\ st %%r17, 68[r9] | 738 | \\ st %%r17, 68[%%r9] |
| 737 | \\ st %%r18, 72[r9] | 739 | \\ st %%r18, 72[%%r9] |
| 738 | \\ st %%r19, 76[r9] | 740 | \\ st %%r19, 76[%%r9] |
| 739 | \\ st %%r20, 80[r9] | 741 | \\ st %%r20, 80[%%r9] |
| 740 | \\ st %%r21, 84[r9] | 742 | \\ st %%r21, 84[%%r9] |
| 741 | \\ st %%r22, 88[r9] | 743 | \\ st %%r22, 88[%%r9] |
| 742 | \\ st %%r23, 92[r9] | 744 | \\ st %%r23, 92[%%r9] |
| 743 | \\ st %%r24, 96[r9] | 745 | \\ st %%r24, 96[%%r9] |
| 744 | \\ st %%r25, 100[r9] | 746 | \\ st %%r25, 100[%%r9] |
| 745 | \\ st %%r26, 104[r9] | 747 | \\ st %%r26, 104[%%r9] |
| 746 | \\ st %%r27, 108[r9] | 748 | \\ st %%r27, 108[%%r9] |
| 747 | \\ st %%r28, 112[r9] | 749 | \\ st %%r28, 112[%%r9] |
| 748 | \\ st %%r29, 116[r9] | 750 | \\ st %%r29, 116[%%r9] |
| 749 | \\ st %%r30, 120[r9] | 751 | \\ st %%r30, 120[%%r9] |
| 750 | \\ st %%r31, 124[r9] | 752 | \\ st %%r31, 124[%%r9] |
| 751 | : | 753 | : |
| 752 | : [ctx] "{r9}" (&ctx), | 754 | : [ctx] "{r9}" (&ctx), |
| 753 | : .{ .memory = true }); | 755 | : .{ .memory = true }); |
| ... | @@ -763,7 +765,7 @@ const Lanai = extern struct { | ... | @@ -763,7 +765,7 @@ const Lanai = extern struct { |
| 763 | 765 | ||
| 764 | pub fn dwarfRegisterBytes(ctx: *Lanai, register_num: u16) DwarfRegisterError![]u8 { | 766 | pub fn dwarfRegisterBytes(ctx: *Lanai, register_num: u16) DwarfRegisterError![]u8 { |
| 765 | switch (register_num) { | 767 | switch (register_num) { |
| 766 | 0...31 => return @ptrCast(&ctx.s[register_num]), | 768 | 0...31 => return @ptrCast(&ctx.r[register_num]), |
| 767 | 769 | ||
| 768 | else => return error.InvalidRegister, | 770 | else => return error.InvalidRegister, |
| 769 | } | 771 | } |
| ... | @@ -1039,6 +1041,7 @@ const Mips = extern struct { | ... | @@ -1039,6 +1041,7 @@ const Mips = extern struct { |
| 1039 | \\ sd $fp, 240($t0) | 1041 | \\ sd $fp, 240($t0) |
| 1040 | \\ sd $ra, 248($t0) | 1042 | \\ sd $ra, 248($t0) |
| 1041 | \\ bal 1f | 1043 | \\ bal 1f |
| 1044 | \\ nop | ||
| 1042 | \\1: | 1045 | \\1: |
| 1043 | \\ sd $ra, 256($t0) | 1046 | \\ sd $ra, 256($t0) |
| 1044 | \\ .set pop | 1047 | \\ .set pop |
| ... | @@ -1080,6 +1083,7 @@ const Mips = extern struct { | ... | @@ -1080,6 +1083,7 @@ const Mips = extern struct { |
| 1080 | \\ sw $fp, 120($t4) | 1083 | \\ sw $fp, 120($t4) |
| 1081 | \\ sw $ra, 124($t4) | 1084 | \\ sw $ra, 124($t4) |
| 1082 | \\ bal 1f | 1085 | \\ bal 1f |
| 1086 | \\ nop | ||
| 1083 | \\1: | 1087 | \\1: |
| 1084 | \\ sw $ra, 128($t4) | 1088 | \\ sw $ra, 128($t4) |
| 1085 | \\ .set pop | 1089 | \\ .set pop |
| ... | @@ -1164,6 +1168,7 @@ const Or1k = extern struct { | ... | @@ -1164,6 +1168,7 @@ const Or1k = extern struct { |
| 1164 | \\ l.sw 120(r15), r30 | 1168 | \\ l.sw 120(r15), r30 |
| 1165 | \\ l.sw 124(r15), r31 | 1169 | \\ l.sw 124(r15), r31 |
| 1166 | \\ l.jal 1f | 1170 | \\ l.jal 1f |
| 1171 | \\ l.nop | ||
| 1167 | \\1: | 1172 | \\1: |
| 1168 | \\ l.sw 128(r15), r9 | 1173 | \\ l.sw 128(r15), r9 |
| 1169 | : | 1174 | : |
| ... | @@ -1512,7 +1517,7 @@ const S390x = extern struct { | ... | @@ -1512,7 +1517,7 @@ const S390x = extern struct { |
| 1512 | 1517 | ||
| 1513 | /// This is an `extern struct` so that inline assembly in `current` can use field offsets. | 1518 | /// This is an `extern struct` so that inline assembly in `current` can use field offsets. |
| 1514 | const Sparc = extern struct { | 1519 | const Sparc = extern struct { |
| 1515 | g: [8]Gpr, | 1520 | g: [8]Gpr align(8), // Align to make `std` safe on 32-bit. |
| 1516 | o: [8]Gpr, | 1521 | o: [8]Gpr, |
| 1517 | l: [8]Gpr, | 1522 | l: [8]Gpr, |
| 1518 | i: [8]Gpr, | 1523 | i: [8]Gpr, |
| ... | @@ -1525,61 +1530,63 @@ const Sparc = extern struct { | ... | @@ -1525,61 +1530,63 @@ const Sparc = extern struct { |
| 1525 | 1530 | ||
| 1526 | var ctx: Sparc = undefined; | 1531 | var ctx: Sparc = undefined; |
| 1527 | asm volatile (if (Gpr == u64) | 1532 | asm volatile (if (Gpr == u64) |
| 1528 | \\ stx %g0, [%l0 + 0] | 1533 | \\ stx %%g0, [%%l0 + 0] |
| 1529 | \\ stx %g1, [%l0 + 8] | 1534 | \\ stx %%g1, [%%l0 + 8] |
| 1530 | \\ stx %g2, [%l0 + 16] | 1535 | \\ stx %%g2, [%%l0 + 16] |
| 1531 | \\ stx %g3, [%l0 + 24] | 1536 | \\ stx %%g3, [%%l0 + 24] |
| 1532 | \\ stx %g4, [%l0 + 32] | 1537 | \\ stx %%g4, [%%l0 + 32] |
| 1533 | \\ stx %g5, [%l0 + 40] | 1538 | \\ stx %%g5, [%%l0 + 40] |
| 1534 | \\ stx %g6, [%l0 + 48] | 1539 | \\ stx %%g6, [%%l0 + 48] |
| 1535 | \\ stx %g7, [%l0 + 56] | 1540 | \\ stx %%g7, [%%l0 + 56] |
| 1536 | \\ stx %o0, [%l0 + 64] | 1541 | \\ stx %%o0, [%%l0 + 64] |
| 1537 | \\ stx %o1, [%l0 + 72] | 1542 | \\ stx %%o1, [%%l0 + 72] |
| 1538 | \\ stx %o2, [%l0 + 80] | 1543 | \\ stx %%o2, [%%l0 + 80] |
| 1539 | \\ stx %o3, [%l0 + 88] | 1544 | \\ stx %%o3, [%%l0 + 88] |
| 1540 | \\ stx %o4, [%l0 + 96] | 1545 | \\ stx %%o4, [%%l0 + 96] |
| 1541 | \\ stx %o5, [%l0 + 104] | 1546 | \\ stx %%o5, [%%l0 + 104] |
| 1542 | \\ stx %o6, [%l0 + 112] | 1547 | \\ stx %%o6, [%%l0 + 112] |
| 1543 | \\ stx %o7, [%l0 + 120] | 1548 | \\ stx %%o7, [%%l0 + 120] |
| 1544 | \\ stx %l0, [%l0 + 128] | 1549 | \\ stx %%l0, [%%l0 + 128] |
| 1545 | \\ stx %l1, [%l0 + 136] | 1550 | \\ stx %%l1, [%%l0 + 136] |
| 1546 | \\ stx %l2, [%l0 + 144] | 1551 | \\ stx %%l2, [%%l0 + 144] |
| 1547 | \\ stx %l3, [%l0 + 152] | 1552 | \\ stx %%l3, [%%l0 + 152] |
| 1548 | \\ stx %l4, [%l0 + 160] | 1553 | \\ stx %%l4, [%%l0 + 160] |
| 1549 | \\ stx %l5, [%l0 + 168] | 1554 | \\ stx %%l5, [%%l0 + 168] |
| 1550 | \\ stx %l6, [%l0 + 176] | 1555 | \\ stx %%l6, [%%l0 + 176] |
| 1551 | \\ stx %l7, [%l0 + 184] | 1556 | \\ stx %%l7, [%%l0 + 184] |
| 1552 | \\ stx %i0, [%l0 + 192] | 1557 | \\ stx %%i0, [%%l0 + 192] |
| 1553 | \\ stx %i1, [%l0 + 200] | 1558 | \\ stx %%i1, [%%l0 + 200] |
| 1554 | \\ stx %i2, [%l0 + 208] | 1559 | \\ stx %%i2, [%%l0 + 208] |
| 1555 | \\ stx %i3, [%l0 + 216] | 1560 | \\ stx %%i3, [%%l0 + 216] |
| 1556 | \\ stx %i4, [%l0 + 224] | 1561 | \\ stx %%i4, [%%l0 + 224] |
| 1557 | \\ stx %i5, [%l0 + 232] | 1562 | \\ stx %%i5, [%%l0 + 232] |
| 1558 | \\ stx %i6, [%l0 + 240] | 1563 | \\ stx %%i6, [%%l0 + 240] |
| 1559 | \\ stx %i7, [%l0 + 248] | 1564 | \\ stx %%i7, [%%l0 + 248] |
| 1560 | \\ call 1f | 1565 | \\ call 1f |
| 1566 | \\ nop | ||
| 1561 | \\1: | 1567 | \\1: |
| 1562 | \\ stx %o7, [%l0 + 256] | 1568 | \\ stx %%o7, [%%l0 + 256] |
| 1563 | else | 1569 | else |
| 1564 | \\ std %g0, [%l0 + 0] | 1570 | \\ std %%g0, [%%l0 + 0] |
| 1565 | \\ std %g2, [%l0 + 8] | 1571 | \\ std %%g2, [%%l0 + 8] |
| 1566 | \\ std %g4, [%l0 + 16] | 1572 | \\ std %%g4, [%%l0 + 16] |
| 1567 | \\ std %g6, [%l0 + 24] | 1573 | \\ std %%g6, [%%l0 + 24] |
| 1568 | \\ std %o0, [%l0 + 32] | 1574 | \\ std %%o0, [%%l0 + 32] |
| 1569 | \\ std %o2, [%l0 + 40] | 1575 | \\ std %%o2, [%%l0 + 40] |
| 1570 | \\ std %o4, [%l0 + 48] | 1576 | \\ std %%o4, [%%l0 + 48] |
| 1571 | \\ std %o6, [%l0 + 56] | 1577 | \\ std %%o6, [%%l0 + 56] |
| 1572 | \\ std %l0, [%l0 + 64] | 1578 | \\ std %%l0, [%%l0 + 64] |
| 1573 | \\ std %l2, [%l0 + 72] | 1579 | \\ std %%l2, [%%l0 + 72] |
| 1574 | \\ std %l4, [%l0 + 80] | 1580 | \\ std %%l4, [%%l0 + 80] |
| 1575 | \\ std %l6, [%l0 + 88] | 1581 | \\ std %%l6, [%%l0 + 88] |
| 1576 | \\ std %i0, [%l0 + 96] | 1582 | \\ std %%i0, [%%l0 + 96] |
| 1577 | \\ std %i2, [%l0 + 104] | 1583 | \\ std %%i2, [%%l0 + 104] |
| 1578 | \\ std %i4, [%l0 + 112] | 1584 | \\ std %%i4, [%%l0 + 112] |
| 1579 | \\ std %i6, [%l0 + 120] | 1585 | \\ std %%i6, [%%l0 + 120] |
| 1580 | \\ call 1f | 1586 | \\ call 1f |
| 1587 | \\ nop | ||
| 1581 | \\1: | 1588 | \\1: |
| 1582 | \\ st %o7, [%l0 + 128] | 1589 | \\ st %%o7, [%%l0 + 128] |
| 1583 | : | 1590 | : |
| 1584 | : [ctx] "{l0}" (&ctx), | 1591 | : [ctx] "{l0}" (&ctx), |
| 1585 | : .{ .o7 = true, .memory = true }); | 1592 | : .{ .o7 = true, .memory = true }); |
| ... | @@ -1608,7 +1615,11 @@ const Sparc = extern struct { | ... | @@ -1608,7 +1615,11 @@ const Sparc = extern struct { |
| 1608 | 8...15 => return @ptrCast(&ctx.o[register_num - 8]), | 1615 | 8...15 => return @ptrCast(&ctx.o[register_num - 8]), |
| 1609 | 16...23 => return @ptrCast(&ctx.l[register_num - 16]), | 1616 | 16...23 => return @ptrCast(&ctx.l[register_num - 16]), |
| 1610 | 24...31 => return @ptrCast(&ctx.i[register_num - 24]), | 1617 | 24...31 => return @ptrCast(&ctx.i[register_num - 24]), |
| 1611 | 32 => return @ptrCast(&ctx.pc), | 1618 | 65 => return @ptrCast(&ctx.pc), |
| 1619 | |||
| 1620 | 32...63 => return error.UnsupportedRegister, // F0-F31 | ||
| 1621 | 64 => return error.UnsupportedRegister, // Y | ||
| 1622 | 72...87 => return error.UnsupportedRegister, // D0-D15 | ||
| 1612 | 1623 | ||
| 1613 | else => return error.InvalidRegister, | 1624 | else => return error.InvalidRegister, |
| 1614 | } | 1625 | } |
| ... | @@ -1689,9 +1700,8 @@ const Ve = extern struct { | ... | @@ -1689,9 +1700,8 @@ const Ve = extern struct { |
| 1689 | \\ st %%s61, 488(, %%s8) | 1700 | \\ st %%s61, 488(, %%s8) |
| 1690 | \\ st %%s62, 496(, %%s8) | 1701 | \\ st %%s62, 496(, %%s8) |
| 1691 | \\ st %%s63, 504(, %%s8) | 1702 | \\ st %%s63, 504(, %%s8) |
| 1692 | \\ br.l 1f | 1703 | \\ sic %%s10 |
| 1693 | \\1: | 1704 | \\ st %%s10, 512(, %%s8) |
| 1694 | \\ st %%lr, 512(, %%s8) | ||
| 1695 | : | 1705 | : |
| 1696 | : [ctx] "{s8}" (&ctx), | 1706 | : [ctx] "{s8}" (&ctx), |
| 1697 | : .{ .s10 = true, .memory = true }); | 1707 | : .{ .s10 = true, .memory = true }); |
| ... | @@ -1758,7 +1768,7 @@ const X86_16 = struct { | ... | @@ -1758,7 +1768,7 @@ const X86_16 = struct { |
| 1758 | switch (register_num) { | 1768 | switch (register_num) { |
| 1759 | 4 => return @ptrCast(ctx.regs.getPtr(.sp)), | 1769 | 4 => return @ptrCast(ctx.regs.getPtr(.sp)), |
| 1760 | 5 => return @ptrCast(ctx.regs.getPtr(.bp)), | 1770 | 5 => return @ptrCast(ctx.regs.getPtr(.bp)), |
| 1761 | 6 => return @ptrCast(ctx.regs.getPtr(.ip)), | 1771 | 8 => return @ptrCast(ctx.regs.getPtr(.ip)), |
| 1762 | 41 => return @ptrCast(ctx.regs.getPtr(.cs)), | 1772 | 41 => return @ptrCast(ctx.regs.getPtr(.cs)), |
| 1763 | 42 => return @ptrCast(ctx.regs.getPtr(.ss)), | 1773 | 42 => return @ptrCast(ctx.regs.getPtr(.ss)), |
| 1764 | else => return error.InvalidRegister, | 1774 | else => return error.InvalidRegister, |
lib/std/os/linux/aarch64.zig+27-34| ... | @@ -116,55 +116,48 @@ pub fn clone() callconv(.naked) u64 { | ... | @@ -116,55 +116,48 @@ pub fn clone() callconv(.naked) u64 { |
| 116 | // syscall(SYS_clone, flags, stack, ptid, tls, ctid) | 116 | // syscall(SYS_clone, flags, stack, ptid, tls, ctid) |
| 117 | // x8, x0, x1, x2, x3, x4 | 117 | // x8, x0, x1, x2, x3, x4 |
| 118 | asm volatile ( | 118 | asm volatile ( |
| 119 | \\ // align stack and save func,arg | 119 | \\ // align stack and save func,arg |
| 120 | \\ and x1,x1,#-16 | 120 | \\ and x1,x1,#-16 |
| 121 | \\ stp x0,x3,[x1,#-16]! | 121 | \\ stp x0,x3,[x1,#-16]! |
| 122 | \\ | 122 | \\ |
| 123 | \\ // syscall | 123 | \\ // syscall |
| 124 | \\ uxtw x0,w2 | 124 | \\ uxtw x0,w2 |
| 125 | \\ mov x2,x4 | 125 | \\ mov x2,x4 |
| 126 | \\ mov x3,x5 | 126 | \\ mov x3,x5 |
| 127 | \\ mov x4,x6 | 127 | \\ mov x4,x6 |
| 128 | \\ mov x8,#220 // SYS_clone | 128 | \\ mov x8,#220 // SYS_clone |
| 129 | \\ svc #0 | 129 | \\ svc #0 |
| 130 | \\ | 130 | \\ |
| 131 | \\ cbz x0,1f | 131 | \\ cbz x0,1f |
| 132 | \\ // parent | 132 | \\ // parent |
| 133 | \\ ret | 133 | \\ ret |
| 134 | \\ | 134 | \\ |
| 135 | \\ // child | 135 | \\ // child |
| 136 | \\1: | 136 | \\1: |
| 137 | ); | 137 | ); |
| 138 | if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile ( | 138 | if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile ( |
| 139 | \\ .cfi_undefined lr | 139 | \\ .cfi_undefined lr |
| 140 | ); | 140 | ); |
| 141 | asm volatile ( | 141 | asm volatile ( |
| 142 | \\ mov fp, 0 | 142 | \\ mov fp, 0 |
| 143 | \\ mov lr, 0 | 143 | \\ mov lr, 0 |
| 144 | \\ | 144 | \\ |
| 145 | \\ ldp x1,x0,[sp],#16 | 145 | \\ ldp x1,x0,[sp],#16 |
| 146 | \\ blr x1 | 146 | \\ blr x1 |
| 147 | \\ mov x8,#93 // SYS_exit | 147 | \\ mov x8,#93 // SYS_exit |
| 148 | \\ svc #0 | 148 | \\ svc #0 |
| 149 | ); | 149 | ); |
| 150 | } | 150 | } |
| 151 | 151 | ||
| 152 | pub const restore = restore_rt; | 152 | pub const restore = restore_rt; |
| 153 | 153 | ||
| 154 | pub fn restore_rt() callconv(.naked) noreturn { | 154 | pub fn restore_rt() callconv(.naked) noreturn { |
| 155 | switch (builtin.zig_backend) { | 155 | asm volatile ( |
| 156 | .stage2_c => asm volatile ( | 156 | \\ mov w8, %[number] |
| 157 | \\ mov w8, %[number] | 157 | \\ svc #0 |
| 158 | \\ svc #0 | 158 | : |
| 159 | : | 159 | : [number] "i" (@backingInt(SYS.rt_sigreturn)), |
| 160 | : [number] "i" (@backingInt(SYS.rt_sigreturn)), | 160 | ); |
| 161 | ), | ||
| 162 | else => asm volatile ( | ||
| 163 | \\ svc #0 | ||
| 164 | : | ||
| 165 | : [number] "{x8}" (@backingInt(SYS.rt_sigreturn)), | ||
| 166 | ), | ||
| 167 | } | ||
| 168 | } | 161 | } |
| 169 | 162 | ||
| 170 | pub const VDSO = struct { | 163 | pub const VDSO = struct { |
lib/std/os/linux/alpha.zig+8-8| ... | @@ -295,8 +295,8 @@ pub fn clone() callconv(.naked) u64 { | ... | @@ -295,8 +295,8 @@ pub fn clone() callconv(.naked) u64 { |
| 295 | // a0 = $16, a1 = $17, a2 = $18, a3 = $19, | 295 | // a0 = $16, a1 = $17, a2 = $18, a3 = $19, |
| 296 | // a4 = $20, a5 = $21, sp = $30, v0 = $0 | 296 | // a4 = $20, a5 = $21, sp = $30, v0 = $0 |
| 297 | \\ # Save function pointer and argument pointer on new thread stack | 297 | \\ # Save function pointer and argument pointer on new thread stack |
| 298 | \\ ldi $1, -8 | 298 | \\ ldi $1, -16 |
| 299 | \\ and $17, $17, $1 | 299 | \\ and $17, $1, $17 |
| 300 | \\ lda $17, -16($17) | 300 | \\ lda $17, -16($17) |
| 301 | \\ stq $16, 0($17) | 301 | \\ stq $16, 0($17) |
| 302 | \\ stq $19, 8($17) | 302 | \\ stq $19, 8($17) |
| ... | @@ -323,16 +323,16 @@ pub fn clone() callconv(.naked) u64 { | ... | @@ -323,16 +323,16 @@ pub fn clone() callconv(.naked) u64 { |
| 323 | \\ .cfi_undefined $26 | 323 | \\ .cfi_undefined $26 |
| 324 | ); | 324 | ); |
| 325 | asm volatile ( | 325 | asm volatile ( |
| 326 | // v0 = $0, t9 = $23, a0 = $16, ra = $26, sp = $30, fp = $15 | 326 | // v0 = $0, a0 = $16, ra = $26, sp = $30, fp = $15, pv = $27 |
| 327 | \\ mov 0, $15 | 327 | \\ mov 0, $15 |
| 328 | \\ | 328 | \\ |
| 329 | \\ ldq $23, 0($30) | 329 | \\ ldq $27, 0($30) |
| 330 | \\ ldq $16, 8($30) | 330 | \\ ldq $16, 8($30) |
| 331 | \\ lda $30, 16($30) | 331 | \\ lda $30, 16($30) |
| 332 | \\ jsr $26, ($23) | 332 | \\ jsr $26, ($27) |
| 333 | \\ | 333 | \\ |
| 334 | \\ mov $0, $16 | 334 | \\ mov $0, $16 |
| 335 | \\ ldi $0, 1 # SYS_EXIT | 335 | \\ ldi $0, 1 # SYS_exit |
| 336 | \\ callsys | 336 | \\ callsys |
| 337 | ); | 337 | ); |
| 338 | } | 338 | } |
| ... | @@ -341,7 +341,7 @@ pub fn restore() noreturn { | ... | @@ -341,7 +341,7 @@ pub fn restore() noreturn { |
| 341 | asm volatile ( | 341 | asm volatile ( |
| 342 | // v0 = $0, a0 = $16, sp = $30 | 342 | // v0 = $0, a0 = $16, sp = $30 |
| 343 | \\ mov $30, $16 | 343 | \\ mov $30, $16 |
| 344 | \\ ldi $0, 103 # SIGRETURN | 344 | \\ ldi $0, 103 # SYS_sigreturn |
| 345 | \\ callsys | 345 | \\ callsys |
| 346 | ); | 346 | ); |
| 347 | } | 347 | } |
| ... | @@ -350,7 +350,7 @@ pub fn restore_rt() noreturn { | ... | @@ -350,7 +350,7 @@ pub fn restore_rt() noreturn { |
| 350 | asm volatile ( | 350 | asm volatile ( |
| 351 | // v0 = $0, a0 = $16, sp = $30 | 351 | // v0 = $0, a0 = $16, sp = $30 |
| 352 | \\ mov $30, $16 | 352 | \\ mov $30, $16 |
| 353 | \\ ldi $0, 351 # RT_SIGRETURN | 353 | \\ ldi $0, 351 # SYS_rt_sigreturn |
| 354 | \\ callsys | 354 | \\ callsys |
| 355 | ); | 355 | ); |
| 356 | } | 356 | } |
lib/std/os/linux/arc.zig+29-36| ... | @@ -116,56 +116,49 @@ pub fn clone() callconv(.naked) u32 { | ... | @@ -116,56 +116,49 @@ pub fn clone() callconv(.naked) u32 { |
| 116 | // syscall(SYS_clone, flags, stack, ptid, tls, ctid) | 116 | // syscall(SYS_clone, flags, stack, ptid, tls, ctid) |
| 117 | // r8 r0, r1, r2, r3, r4 | 117 | // r8 r0, r1, r2, r3, r4 |
| 118 | asm volatile ( | 118 | asm volatile ( |
| 119 | \\ // Align stack pointer | 119 | \\ // Align stack pointer |
| 120 | \\ and r1, r1, -16 | 120 | \\ and r1, r1, -16 |
| 121 | \\ mov r10, r0 | 121 | \\ mov r10, r0 |
| 122 | \\ mov r11, r3 | 122 | \\ mov r11, r3 |
| 123 | \\ // Setup the arguments | 123 | \\ // Setup the arguments |
| 124 | \\ mov r0, r2 | 124 | \\ mov r0, r2 |
| 125 | \\ mov r2, r4 | 125 | \\ mov r2, r4 |
| 126 | \\ mov r3, r5 | 126 | \\ mov r3, r5 |
| 127 | \\ mov r4, r6 | 127 | \\ mov r4, r6 |
| 128 | \\ mov r8, 220 // SYS_clone | 128 | \\ mov r8, 220 // SYS_clone |
| 129 | \\ trap_s 0 | 129 | \\ trap_s 0 |
| 130 | \\ cmp r0, 0 | 130 | \\ cmp r0, 0 |
| 131 | \\ beq 1f | 131 | \\ beq 1f |
| 132 | \\ j [blink] | 132 | \\ j [blink] |
| 133 | \\ // Child | 133 | \\ // Child |
| 134 | \\ 1: | 134 | \\1: |
| 135 | ); | 135 | ); |
| 136 | if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile ( | 136 | if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile ( |
| 137 | \\ .cfi_undefined blink | 137 | \\ .cfi_undefined blink |
| 138 | ); | 138 | ); |
| 139 | 139 | ||
| 140 | asm volatile ( | 140 | asm volatile ( |
| 141 | \\ mov fp, 0 | 141 | \\ mov fp, 0 |
| 142 | \\ mov blink, 0 | 142 | \\ mov blink, 0 |
| 143 | \\ | 143 | \\ |
| 144 | \\ mov r0, r11 | 144 | \\ mov r0, r11 |
| 145 | \\ jl [r10] | 145 | \\ jl [r10] |
| 146 | \\ | 146 | \\ |
| 147 | \\ // Exit | 147 | \\ // Exit |
| 148 | \\ mov r8, 93 // SYS_exit | 148 | \\ mov r8, 93 // SYS_exit |
| 149 | \\ trap_s 0 | 149 | \\ trap_s 0 |
| 150 | ); | 150 | ); |
| 151 | } | 151 | } |
| 152 | 152 | ||
| 153 | pub const restore = restore_rt; | 153 | pub const restore = restore_rt; |
| 154 | 154 | ||
| 155 | pub fn restore_rt() callconv(.naked) noreturn { | 155 | pub fn restore_rt() callconv(.naked) noreturn { |
| 156 | switch (builtin.zig_backend) { | 156 | asm volatile ( |
| 157 | .stage2_c => asm volatile ( | 157 | \\ mov r8, %[number] |
| 158 | \\ mov r8, %[number] | 158 | \\ trap_s 0 |
| 159 | \\ trap_s 0 | 159 | : |
| 160 | : | 160 | : [number] "I" (@backingInt(SYS.rt_sigreturn)), |
| 161 | : [number] "I" (@backingInt(SYS.rt_sigreturn)), | 161 | ); |
| 162 | ), | ||
| 163 | else => asm volatile ( | ||
| 164 | \\ trap_s 0 | ||
| 165 | : | ||
| 166 | : [number] "{r8}" (@backingInt(SYS.rt_sigreturn)), | ||
| 167 | ), | ||
| 168 | } | ||
| 169 | } | 162 | } |
| 170 | 163 | ||
| 171 | pub const time_t = i64; | 164 | pub const time_t = i64; |
lib/std/os/linux/arm.zig+37-49| ... | @@ -116,65 +116,53 @@ pub fn clone() callconv(.naked) u32 { | ... | @@ -116,65 +116,53 @@ pub fn clone() callconv(.naked) u32 { |
| 116 | // syscall(SYS_clone, flags, stack, ptid, tls, ctid) | 116 | // syscall(SYS_clone, flags, stack, ptid, tls, ctid) |
| 117 | // r7 r0, r1, r2, r3, r4 | 117 | // r7 r0, r1, r2, r3, r4 |
| 118 | asm volatile ( | 118 | asm volatile ( |
| 119 | \\ stmfd sp!,{r4,r5,r6,r7} | 119 | \\ stmfd sp!,{r4,r5,r6,r7} |
| 120 | \\ mov r7,#120 // SYS_clone | 120 | \\ mov r7,#120 // SYS_clone |
| 121 | \\ mov r6,r3 | 121 | \\ mov r6,r3 |
| 122 | \\ mov r5,r0 | 122 | \\ mov r5,r0 |
| 123 | \\ mov r0,r2 | 123 | \\ mov r0,r2 |
| 124 | \\ and r1,r1,#-16 | 124 | \\ and r1,r1,#-16 |
| 125 | \\ ldr r2,[sp,#16] | 125 | \\ ldr r2,[sp,#16] |
| 126 | \\ ldr r3,[sp,#20] | 126 | \\ ldr r3,[sp,#20] |
| 127 | \\ ldr r4,[sp,#24] | 127 | \\ ldr r4,[sp,#24] |
| 128 | \\ svc 0 | 128 | \\ svc 0 |
| 129 | \\ tst r0,r0 | 129 | \\ tst r0,r0 |
| 130 | \\ beq 1f | 130 | \\ beq 1f |
| 131 | \\ ldmfd sp!,{r4,r5,r6,r7} | 131 | \\ ldmfd sp!,{r4,r5,r6,r7} |
| 132 | \\ bx lr | 132 | \\ bx lr |
| 133 | \\ | 133 | \\ |
| 134 | \\ // https://github.com/llvm/llvm-project/issues/115891 | 134 | \\ // https://github.com/llvm/llvm-project/issues/115891 |
| 135 | \\1: mov r7, #0 | 135 | \\1: |
| 136 | \\ mov r11, #0 | 136 | \\ mov r7, #0 |
| 137 | \\ mov lr, #0 | 137 | \\ mov r11, #0 |
| 138 | \\ mov lr, #0 | ||
| 138 | \\ | 139 | \\ |
| 139 | \\ mov r0,r6 | 140 | \\ mov r0,r6 |
| 140 | \\ bl 3f | 141 | \\ bl 3f |
| 141 | \\ mov r7,#1 // SYS_exit | 142 | \\ mov r7,#1 // SYS_exit |
| 142 | \\ svc 0 | 143 | \\ svc 0 |
| 143 | \\ | 144 | \\ |
| 144 | \\3: bx r5 | 145 | \\3: |
| 146 | \\ bx r5 | ||
| 145 | ); | 147 | ); |
| 146 | } | 148 | } |
| 147 | 149 | ||
| 148 | pub fn restore() callconv(.naked) noreturn { | 150 | pub fn restore() callconv(.naked) noreturn { |
| 149 | switch (builtin.zig_backend) { | 151 | asm volatile ( |
| 150 | .stage2_c => asm volatile ( | 152 | \\ mov r7, %[number] |
| 151 | \\ mov r7, %[number] | 153 | \\ svc #0 |
| 152 | \\ svc #0 | 154 | : |
| 153 | : | 155 | : [number] "I" (@backingInt(SYS.sigreturn)), |
| 154 | : [number] "I" (@backingInt(SYS.sigreturn)), | 156 | ); |
| 155 | ), | ||
| 156 | else => asm volatile ( | ||
| 157 | \\ svc #0 | ||
| 158 | : | ||
| 159 | : [number] "{r7}" (@backingInt(SYS.sigreturn)), | ||
| 160 | ), | ||
| 161 | } | ||
| 162 | } | 157 | } |
| 163 | 158 | ||
| 164 | pub fn restore_rt() callconv(.naked) noreturn { | 159 | pub fn restore_rt() callconv(.naked) noreturn { |
| 165 | switch (builtin.zig_backend) { | 160 | asm volatile ( |
| 166 | .stage2_c => asm volatile ( | 161 | \\ mov r7, %[number] |
| 167 | \\ mov r7, %[number] | 162 | \\ svc #0 |
| 168 | \\ svc #0 | 163 | : |
| 169 | : | 164 | : [number] "I" (@backingInt(SYS.rt_sigreturn)), |
| 170 | : [number] "I" (@backingInt(SYS.rt_sigreturn)), | 165 | ); |
| 171 | ), | ||
| 172 | else => asm volatile ( | ||
| 173 | \\ svc #0 | ||
| 174 | : | ||
| 175 | : [number] "{r7}" (@backingInt(SYS.rt_sigreturn)), | ||
| 176 | ), | ||
| 177 | } | ||
| 178 | } | 166 | } |
| 179 | 167 | ||
| 180 | pub const VDSO = struct { | 168 | pub const VDSO = struct { |
lib/std/os/linux/csky.zig+3-3| ... | @@ -113,14 +113,14 @@ pub fn clone() callconv(.naked) u32 { | ... | @@ -113,14 +113,14 @@ pub fn clone() callconv(.naked) u32 { |
| 113 | // __clone(func, stack, flags, arg, ptid, tls, ctid) | 113 | // __clone(func, stack, flags, arg, ptid, tls, ctid) |
| 114 | // r0, r1, r2, r3, +0, +4, +8 | 114 | // r0, r1, r2, r3, +0, +4, +8 |
| 115 | // | 115 | // |
| 116 | // syscall(SYS_clone, flags, stack, ptid, tls, ctid) | 116 | // syscall(SYS_clone, flags, stack, ptid, ctid, tls) |
| 117 | // r7 r0, r1, r2, r3, r4 | 117 | // r7 r0, r1, r2, r3, r4 |
| 118 | asm volatile ( | 118 | asm volatile ( |
| 119 | \\ // Preserve callee-saved registers. | 119 | \\ // Preserve callee-saved registers. |
| 120 | \\ mov t0, r4 | 120 | \\ mov t0, r4 |
| 121 | \\ mov t1, r7 | 121 | \\ mov t1, r7 |
| 122 | \\ | 122 | \\ |
| 123 | \\ andi r1, r1, -8 | 123 | \\ andni r1, r1, 7 |
| 124 | \\ | 124 | \\ |
| 125 | \\ subi r1, 8 | 125 | \\ subi r1, 8 |
| 126 | \\ stw r0, (r1, 0) | 126 | \\ stw r0, (r1, 0) |
lib/std/os/linux/mips.zig-10| ... | @@ -10,7 +10,6 @@ pub fn syscall0( | ... | @@ -10,7 +10,6 @@ pub fn syscall0( |
| 10 | return asm volatile ( | 10 | return asm volatile ( |
| 11 | \\ syscall | 11 | \\ syscall |
| 12 | \\ beq $a3, $zero, 1f | 12 | \\ beq $a3, $zero, 1f |
| 13 | \\ blez $v0, 1f | ||
| 14 | \\ subu $v0, $zero, $v0 | 13 | \\ subu $v0, $zero, $v0 |
| 15 | \\1: | 14 | \\1: |
| 16 | : [ret] "={$2}" (-> u32), | 15 | : [ret] "={$2}" (-> u32), |
| ... | @@ -25,7 +24,6 @@ pub fn syscall1( | ... | @@ -25,7 +24,6 @@ pub fn syscall1( |
| 25 | return asm volatile ( | 24 | return asm volatile ( |
| 26 | \\ syscall | 25 | \\ syscall |
| 27 | \\ beq $a3, $zero, 1f | 26 | \\ beq $a3, $zero, 1f |
| 28 | \\ blez $v0, 1f | ||
| 29 | \\ subu $v0, $zero, $v0 | 27 | \\ subu $v0, $zero, $v0 |
| 30 | \\1: | 28 | \\1: |
| 31 | : [ret] "={$2}" (-> u32), | 29 | : [ret] "={$2}" (-> u32), |
| ... | @@ -42,7 +40,6 @@ pub fn syscall2( | ... | @@ -42,7 +40,6 @@ pub fn syscall2( |
| 42 | return asm volatile ( | 40 | return asm volatile ( |
| 43 | \\ syscall | 41 | \\ syscall |
| 44 | \\ beq $a3, $zero, 1f | 42 | \\ beq $a3, $zero, 1f |
| 45 | \\ blez $v0, 1f | ||
| 46 | \\ subu $v0, $zero, $v0 | 43 | \\ subu $v0, $zero, $v0 |
| 47 | \\1: | 44 | \\1: |
| 48 | : [ret] "={$2}" (-> u32), | 45 | : [ret] "={$2}" (-> u32), |
| ... | @@ -61,7 +58,6 @@ pub fn syscall3( | ... | @@ -61,7 +58,6 @@ pub fn syscall3( |
| 61 | return asm volatile ( | 58 | return asm volatile ( |
| 62 | \\ syscall | 59 | \\ syscall |
| 63 | \\ beq $a3, $zero, 1f | 60 | \\ beq $a3, $zero, 1f |
| 64 | \\ blez $v0, 1f | ||
| 65 | \\ subu $v0, $zero, $v0 | 61 | \\ subu $v0, $zero, $v0 |
| 66 | \\1: | 62 | \\1: |
| 67 | : [ret] "={$2}" (-> u32), | 63 | : [ret] "={$2}" (-> u32), |
| ... | @@ -82,7 +78,6 @@ pub fn syscall4( | ... | @@ -82,7 +78,6 @@ pub fn syscall4( |
| 82 | return asm volatile ( | 78 | return asm volatile ( |
| 83 | \\ syscall | 79 | \\ syscall |
| 84 | \\ beq $a3, $zero, 1f | 80 | \\ beq $a3, $zero, 1f |
| 85 | \\ blez $v0, 1f | ||
| 86 | \\ subu $v0, $zero, $v0 | 81 | \\ subu $v0, $zero, $v0 |
| 87 | \\1: | 82 | \\1: |
| 88 | : [ret] "={$2}" (-> u32), | 83 | : [ret] "={$2}" (-> u32), |
| ... | @@ -111,7 +106,6 @@ pub fn syscall5( | ... | @@ -111,7 +106,6 @@ pub fn syscall5( |
| 111 | \\ syscall | 106 | \\ syscall |
| 112 | \\ addu $sp, $sp, 24 | 107 | \\ addu $sp, $sp, 24 |
| 113 | \\ beq $a3, $zero, 1f | 108 | \\ beq $a3, $zero, 1f |
| 114 | \\ blez $v0, 1f | ||
| 115 | \\ subu $v0, $zero, $v0 | 109 | \\ subu $v0, $zero, $v0 |
| 116 | \\1: | 110 | \\1: |
| 117 | : [ret] "={$2}" (-> u32), | 111 | : [ret] "={$2}" (-> u32), |
| ... | @@ -140,7 +134,6 @@ pub fn syscall6( | ... | @@ -140,7 +134,6 @@ pub fn syscall6( |
| 140 | \\ syscall | 134 | \\ syscall |
| 141 | \\ addu $sp, $sp, 24 | 135 | \\ addu $sp, $sp, 24 |
| 142 | \\ beq $a3, $zero, 1f | 136 | \\ beq $a3, $zero, 1f |
| 143 | \\ blez $v0, 1f | ||
| 144 | \\ subu $v0, $zero, $v0 | 137 | \\ subu $v0, $zero, $v0 |
| 145 | \\1: | 138 | \\1: |
| 146 | : [ret] "={$2}" (-> u32), | 139 | : [ret] "={$2}" (-> u32), |
| ... | @@ -172,7 +165,6 @@ pub fn syscall7( | ... | @@ -172,7 +165,6 @@ pub fn syscall7( |
| 172 | \\ syscall | 165 | \\ syscall |
| 173 | \\ addu $sp, $sp, 32 | 166 | \\ addu $sp, $sp, 32 |
| 174 | \\ beq $a3, $zero, 1f | 167 | \\ beq $a3, $zero, 1f |
| 175 | \\ blez $v0, 1f | ||
| 176 | \\ subu $v0, $zero, $v0 | 168 | \\ subu $v0, $zero, $v0 |
| 177 | \\1: | 169 | \\1: |
| 178 | : [ret] "={$2}" (-> u32), | 170 | : [ret] "={$2}" (-> u32), |
| ... | @@ -193,7 +185,6 @@ pub fn syscall_pipe( | ... | @@ -193,7 +185,6 @@ pub fn syscall_pipe( |
| 193 | return asm volatile ( | 185 | return asm volatile ( |
| 194 | \\ syscall | 186 | \\ syscall |
| 195 | \\ beq $a3, $zero, 1f | 187 | \\ beq $a3, $zero, 1f |
| 196 | \\ blez $v0, 2f | ||
| 197 | \\ subu $v0, $zero, $v0 | 188 | \\ subu $v0, $zero, $v0 |
| 198 | \\ b 2f | 189 | \\ b 2f |
| 199 | \\1: | 190 | \\1: |
| ... | @@ -229,7 +220,6 @@ pub fn clone() callconv(.naked) u32 { | ... | @@ -229,7 +220,6 @@ pub fn clone() callconv(.naked) u32 { |
| 229 | \\ li $v0, 4120 # SYS_clone | 220 | \\ li $v0, 4120 # SYS_clone |
| 230 | \\ syscall | 221 | \\ syscall |
| 231 | \\ beq $a3, $zero, 1f | 222 | \\ beq $a3, $zero, 1f |
| 232 | \\ blez $v0, 2f | ||
| 233 | \\ subu $v0, $zero, $v0 | 223 | \\ subu $v0, $zero, $v0 |
| 234 | \\ b 2f | 224 | \\ b 2f |
| 235 | \\1: | 225 | \\1: |
lib/std/os/linux/mips64.zig-9| ... | @@ -10,7 +10,6 @@ pub fn syscall0( | ... | @@ -10,7 +10,6 @@ pub fn syscall0( |
| 10 | return asm volatile ( | 10 | return asm volatile ( |
| 11 | \\ syscall | 11 | \\ syscall |
| 12 | \\ beq $a3, $zero, 1f | 12 | \\ beq $a3, $zero, 1f |
| 13 | \\ blez $v0, 1f | ||
| 14 | \\ dsubu $v0, $zero, $v0 | 13 | \\ dsubu $v0, $zero, $v0 |
| 15 | \\1: | 14 | \\1: |
| 16 | : [ret] "={$2}" (-> u64), | 15 | : [ret] "={$2}" (-> u64), |
| ... | @@ -25,7 +24,6 @@ pub fn syscall1( | ... | @@ -25,7 +24,6 @@ pub fn syscall1( |
| 25 | return asm volatile ( | 24 | return asm volatile ( |
| 26 | \\ syscall | 25 | \\ syscall |
| 27 | \\ beq $a3, $zero, 1f | 26 | \\ beq $a3, $zero, 1f |
| 28 | \\ blez $v0, 1f | ||
| 29 | \\ dsubu $v0, $zero, $v0 | 27 | \\ dsubu $v0, $zero, $v0 |
| 30 | \\1: | 28 | \\1: |
| 31 | : [ret] "={$2}" (-> u64), | 29 | : [ret] "={$2}" (-> u64), |
| ... | @@ -42,7 +40,6 @@ pub fn syscall2( | ... | @@ -42,7 +40,6 @@ pub fn syscall2( |
| 42 | return asm volatile ( | 40 | return asm volatile ( |
| 43 | \\ syscall | 41 | \\ syscall |
| 44 | \\ beq $a3, $zero, 1f | 42 | \\ beq $a3, $zero, 1f |
| 45 | \\ blez $v0, 1f | ||
| 46 | \\ dsubu $v0, $zero, $v0 | 43 | \\ dsubu $v0, $zero, $v0 |
| 47 | \\1: | 44 | \\1: |
| 48 | : [ret] "={$2}" (-> u64), | 45 | : [ret] "={$2}" (-> u64), |
| ... | @@ -61,7 +58,6 @@ pub fn syscall3( | ... | @@ -61,7 +58,6 @@ pub fn syscall3( |
| 61 | return asm volatile ( | 58 | return asm volatile ( |
| 62 | \\ syscall | 59 | \\ syscall |
| 63 | \\ beq $a3, $zero, 1f | 60 | \\ beq $a3, $zero, 1f |
| 64 | \\ blez $v0, 1f | ||
| 65 | \\ dsubu $v0, $zero, $v0 | 61 | \\ dsubu $v0, $zero, $v0 |
| 66 | \\1: | 62 | \\1: |
| 67 | : [ret] "={$2}" (-> u64), | 63 | : [ret] "={$2}" (-> u64), |
| ... | @@ -82,7 +78,6 @@ pub fn syscall4( | ... | @@ -82,7 +78,6 @@ pub fn syscall4( |
| 82 | return asm volatile ( | 78 | return asm volatile ( |
| 83 | \\ syscall | 79 | \\ syscall |
| 84 | \\ beq $a3, $zero, 1f | 80 | \\ beq $a3, $zero, 1f |
| 85 | \\ blez $v0, 1f | ||
| 86 | \\ dsubu $v0, $zero, $v0 | 81 | \\ dsubu $v0, $zero, $v0 |
| 87 | \\1: | 82 | \\1: |
| 88 | : [ret] "={$2}" (-> u64), | 83 | : [ret] "={$2}" (-> u64), |
| ... | @@ -105,7 +100,6 @@ pub fn syscall5( | ... | @@ -105,7 +100,6 @@ pub fn syscall5( |
| 105 | return asm volatile ( | 100 | return asm volatile ( |
| 106 | \\ syscall | 101 | \\ syscall |
| 107 | \\ beq $a3, $zero, 1f | 102 | \\ beq $a3, $zero, 1f |
| 108 | \\ blez $v0, 1f | ||
| 109 | \\ dsubu $v0, $zero, $v0 | 103 | \\ dsubu $v0, $zero, $v0 |
| 110 | \\1: | 104 | \\1: |
| 111 | : [ret] "={$2}" (-> u64), | 105 | : [ret] "={$2}" (-> u64), |
| ... | @@ -130,7 +124,6 @@ pub fn syscall6( | ... | @@ -130,7 +124,6 @@ pub fn syscall6( |
| 130 | return asm volatile ( | 124 | return asm volatile ( |
| 131 | \\ syscall | 125 | \\ syscall |
| 132 | \\ beq $a3, $zero, 1f | 126 | \\ beq $a3, $zero, 1f |
| 133 | \\ blez $v0, 1f | ||
| 134 | \\ dsubu $v0, $zero, $v0 | 127 | \\ dsubu $v0, $zero, $v0 |
| 135 | \\1: | 128 | \\1: |
| 136 | : [ret] "={$2}" (-> u64), | 129 | : [ret] "={$2}" (-> u64), |
| ... | @@ -150,7 +143,6 @@ pub fn syscall_pipe( | ... | @@ -150,7 +143,6 @@ pub fn syscall_pipe( |
| 150 | return asm volatile ( | 143 | return asm volatile ( |
| 151 | \\ syscall | 144 | \\ syscall |
| 152 | \\ beq $a3, $zero, 1f | 145 | \\ beq $a3, $zero, 1f |
| 153 | \\ blez $v0, 2f | ||
| 154 | \\ dsubu $v0, $zero, $v0 | 146 | \\ dsubu $v0, $zero, $v0 |
| 155 | \\ b 2f | 147 | \\ b 2f |
| 156 | \\1: | 148 | \\1: |
| ... | @@ -184,7 +176,6 @@ pub fn clone() callconv(.naked) u64 { | ... | @@ -184,7 +176,6 @@ pub fn clone() callconv(.naked) u64 { |
| 184 | \\ li $v0, 5055 # SYS_clone | 176 | \\ li $v0, 5055 # SYS_clone |
| 185 | \\ syscall | 177 | \\ syscall |
| 186 | \\ beq $a3, $zero, 1f | 178 | \\ beq $a3, $zero, 1f |
| 187 | \\ blez $v0, 2f | ||
| 188 | \\ dsubu $v0, $zero, $v0 | 179 | \\ dsubu $v0, $zero, $v0 |
| 189 | \\ b 2f | 180 | \\ b 2f |
| 190 | \\1: | 181 | \\1: |
lib/std/os/linux/mipsn32.zig-10| ... | @@ -10,7 +10,6 @@ pub fn syscall0( | ... | @@ -10,7 +10,6 @@ pub fn syscall0( |
| 10 | return asm volatile ( | 10 | return asm volatile ( |
| 11 | \\ syscall | 11 | \\ syscall |
| 12 | \\ beq $a3, $zero, 1f | 12 | \\ beq $a3, $zero, 1f |
| 13 | \\ blez $v0, 1f | ||
| 14 | \\ subu $v0, $zero, $v0 | 13 | \\ subu $v0, $zero, $v0 |
| 15 | \\1: | 14 | \\1: |
| 16 | : [ret] "={$2}" (-> u32), | 15 | : [ret] "={$2}" (-> u32), |
| ... | @@ -25,7 +24,6 @@ pub fn syscall1( | ... | @@ -25,7 +24,6 @@ pub fn syscall1( |
| 25 | return asm volatile ( | 24 | return asm volatile ( |
| 26 | \\ syscall | 25 | \\ syscall |
| 27 | \\ beq $a3, $zero, 1f | 26 | \\ beq $a3, $zero, 1f |
| 28 | \\ blez $v0, 1f | ||
| 29 | \\ subu $v0, $zero, $v0 | 27 | \\ subu $v0, $zero, $v0 |
| 30 | \\1: | 28 | \\1: |
| 31 | : [ret] "={$2}" (-> u32), | 29 | : [ret] "={$2}" (-> u32), |
| ... | @@ -42,7 +40,6 @@ pub fn syscall2( | ... | @@ -42,7 +40,6 @@ pub fn syscall2( |
| 42 | return asm volatile ( | 40 | return asm volatile ( |
| 43 | \\ syscall | 41 | \\ syscall |
| 44 | \\ beq $a3, $zero, 1f | 42 | \\ beq $a3, $zero, 1f |
| 45 | \\ blez $v0, 1f | ||
| 46 | \\ subu $v0, $zero, $v0 | 43 | \\ subu $v0, $zero, $v0 |
| 47 | \\1: | 44 | \\1: |
| 48 | : [ret] "={$2}" (-> u32), | 45 | : [ret] "={$2}" (-> u32), |
| ... | @@ -61,7 +58,6 @@ pub fn syscall3( | ... | @@ -61,7 +58,6 @@ pub fn syscall3( |
| 61 | return asm volatile ( | 58 | return asm volatile ( |
| 62 | \\ syscall | 59 | \\ syscall |
| 63 | \\ beq $a3, $zero, 1f | 60 | \\ beq $a3, $zero, 1f |
| 64 | \\ blez $v0, 1f | ||
| 65 | \\ subu $v0, $zero, $v0 | 61 | \\ subu $v0, $zero, $v0 |
| 66 | \\1: | 62 | \\1: |
| 67 | : [ret] "={$2}" (-> u32), | 63 | : [ret] "={$2}" (-> u32), |
| ... | @@ -82,7 +78,6 @@ pub fn syscall4( | ... | @@ -82,7 +78,6 @@ pub fn syscall4( |
| 82 | return asm volatile ( | 78 | return asm volatile ( |
| 83 | \\ syscall | 79 | \\ syscall |
| 84 | \\ beq $a3, $zero, 1f | 80 | \\ beq $a3, $zero, 1f |
| 85 | \\ blez $v0, 1f | ||
| 86 | \\ subu $v0, $zero, $v0 | 81 | \\ subu $v0, $zero, $v0 |
| 87 | \\1: | 82 | \\1: |
| 88 | : [ret] "={$2}" (-> u32), | 83 | : [ret] "={$2}" (-> u32), |
| ... | @@ -105,7 +100,6 @@ pub fn syscall5( | ... | @@ -105,7 +100,6 @@ pub fn syscall5( |
| 105 | return asm volatile ( | 100 | return asm volatile ( |
| 106 | \\ syscall | 101 | \\ syscall |
| 107 | \\ beq $a3, $zero, 1f | 102 | \\ beq $a3, $zero, 1f |
| 108 | \\ blez $v0, 1f | ||
| 109 | \\ subu $v0, $zero, $v0 | 103 | \\ subu $v0, $zero, $v0 |
| 110 | \\1: | 104 | \\1: |
| 111 | : [ret] "={$2}" (-> u32), | 105 | : [ret] "={$2}" (-> u32), |
| ... | @@ -130,7 +124,6 @@ pub fn syscall6( | ... | @@ -130,7 +124,6 @@ pub fn syscall6( |
| 130 | return asm volatile ( | 124 | return asm volatile ( |
| 131 | \\ syscall | 125 | \\ syscall |
| 132 | \\ beq $a3, $zero, 1f | 126 | \\ beq $a3, $zero, 1f |
| 133 | \\ blez $v0, 1f | ||
| 134 | \\ subu $v0, $zero, $v0 | 127 | \\ subu $v0, $zero, $v0 |
| 135 | \\1: | 128 | \\1: |
| 136 | : [ret] "={$2}" (-> u32), | 129 | : [ret] "={$2}" (-> u32), |
| ... | @@ -150,7 +143,6 @@ pub fn syscall_pipe( | ... | @@ -150,7 +143,6 @@ pub fn syscall_pipe( |
| 150 | return asm volatile ( | 143 | return asm volatile ( |
| 151 | \\ syscall | 144 | \\ syscall |
| 152 | \\ beq $a3, $zero, 1f | 145 | \\ beq $a3, $zero, 1f |
| 153 | \\ blez $v0, 2f | ||
| 154 | \\ subu $v0, $zero, $v0 | 146 | \\ subu $v0, $zero, $v0 |
| 155 | \\ b 2f | 147 | \\ b 2f |
| 156 | \\1: | 148 | \\1: |
| ... | @@ -171,7 +163,6 @@ pub fn syscall_lseek( | ... | @@ -171,7 +163,6 @@ pub fn syscall_lseek( |
| 171 | return asm volatile ( | 163 | return asm volatile ( |
| 172 | \\ syscall | 164 | \\ syscall |
| 173 | \\ beq $a3, $zero, 1f | 165 | \\ beq $a3, $zero, 1f |
| 174 | \\ blez $v0, 1f | ||
| 175 | \\ dsubu $v0, $zero, $v0 | 166 | \\ dsubu $v0, $zero, $v0 |
| 176 | \\1: | 167 | \\1: |
| 177 | : [ret] "={$2}" (-> u64), | 168 | : [ret] "={$2}" (-> u64), |
| ... | @@ -203,7 +194,6 @@ pub fn clone() callconv(.naked) u32 { | ... | @@ -203,7 +194,6 @@ pub fn clone() callconv(.naked) u32 { |
| 203 | \\ li $v0, 6055 # SYS_clone | 194 | \\ li $v0, 6055 # SYS_clone |
| 204 | \\ syscall | 195 | \\ syscall |
| 205 | \\ beq $a3, $zero, 1f | 196 | \\ beq $a3, $zero, 1f |
| 206 | \\ blez $v0, 2f | ||
| 207 | \\ subu $v0, $zero, $v0 | 197 | \\ subu $v0, $zero, $v0 |
| 208 | \\ b 2f | 198 | \\ b 2f |
| 209 | \\1: | 199 | \\1: |
lib/std/os/linux/or1k.zig+5-1| ... | @@ -124,7 +124,8 @@ pub fn clone() callconv(.naked) u32 { | ... | @@ -124,7 +124,8 @@ pub fn clone() callconv(.naked) u32 { |
| 124 | // r11 r3, r4, r5, r6, r7 | 124 | // r11 r3, r4, r5, r6, r7 |
| 125 | asm volatile ( | 125 | asm volatile ( |
| 126 | \\ # Save function pointer and argument pointer on new thread stack | 126 | \\ # Save function pointer and argument pointer on new thread stack |
| 127 | \\ l.andi r4, r4, -4 | 127 | \\ l.addi r13, r0, -4 |
| 128 | \\ l.and r4, r4, r13 | ||
| 128 | \\ l.addi r4, r4, -8 | 129 | \\ l.addi r4, r4, -8 |
| 129 | \\ l.sw 0(r4), r3 | 130 | \\ l.sw 0(r4), r3 |
| 130 | \\ l.sw 4(r4), r6 | 131 | \\ l.sw 4(r4), r6 |
| ... | @@ -138,7 +139,9 @@ pub fn clone() callconv(.naked) u32 { | ... | @@ -138,7 +139,9 @@ pub fn clone() callconv(.naked) u32 { |
| 138 | \\ l.sys 1 | 139 | \\ l.sys 1 |
| 139 | \\ l.sfeqi r11, 0 | 140 | \\ l.sfeqi r11, 0 |
| 140 | \\ l.bf 1f | 141 | \\ l.bf 1f |
| 142 | \\ l.nop | ||
| 141 | \\ l.jr r9 | 143 | \\ l.jr r9 |
| 144 | \\ l.nop | ||
| 142 | \\1: | 145 | \\1: |
| 143 | ); | 146 | ); |
| 144 | if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile ( | 147 | if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile ( |
| ... | @@ -151,6 +154,7 @@ pub fn clone() callconv(.naked) u32 { | ... | @@ -151,6 +154,7 @@ pub fn clone() callconv(.naked) u32 { |
| 151 | \\ l.lwz r11, 0(r1) | 154 | \\ l.lwz r11, 0(r1) |
| 152 | \\ l.lwz r3, 4(r1) | 155 | \\ l.lwz r3, 4(r1) |
| 153 | \\ l.jalr r11 | 156 | \\ l.jalr r11 |
| 157 | \\ l.nop | ||
| 154 | \\ | 158 | \\ |
| 155 | \\ l.ori r3, r11, 0 | 159 | \\ l.ori r3, r11, 0 |
| 156 | \\ l.ori r11, r0, 93 # SYS_exit | 160 | \\ l.ori r11, r0, 93 # SYS_exit |
lib/std/os/linux/powerpc.zig+25-38| ... | @@ -16,7 +16,7 @@ pub fn syscall0( | ... | @@ -16,7 +16,7 @@ pub fn syscall0( |
| 16 | \\ sc | 16 | \\ sc |
| 17 | \\ bns+ 1f | 17 | \\ bns+ 1f |
| 18 | \\ neg 3, 3 | 18 | \\ neg 3, 3 |
| 19 | \\ 1: | 19 | \\1: |
| 20 | : [ret] "={r3}" (-> u32), | 20 | : [ret] "={r3}" (-> u32), |
| 21 | [r0_out] "={r0}" (r0_out), | 21 | [r0_out] "={r0}" (r0_out), |
| 22 | : [number] "{r0}" (@backingInt(number)), | 22 | : [number] "{r0}" (@backingInt(number)), |
| ... | @@ -33,7 +33,7 @@ pub fn syscall1( | ... | @@ -33,7 +33,7 @@ pub fn syscall1( |
| 33 | \\ sc | 33 | \\ sc |
| 34 | \\ bns+ 1f | 34 | \\ bns+ 1f |
| 35 | \\ neg 3, 3 | 35 | \\ neg 3, 3 |
| 36 | \\ 1: | 36 | \\1: |
| 37 | : [ret] "={r3}" (-> u32), | 37 | : [ret] "={r3}" (-> u32), |
| 38 | [r0_out] "={r0}" (r0_out), | 38 | [r0_out] "={r0}" (r0_out), |
| 39 | : [number] "{r0}" (@backingInt(number)), | 39 | : [number] "{r0}" (@backingInt(number)), |
| ... | @@ -53,7 +53,7 @@ pub fn syscall2( | ... | @@ -53,7 +53,7 @@ pub fn syscall2( |
| 53 | \\ sc | 53 | \\ sc |
| 54 | \\ bns+ 1f | 54 | \\ bns+ 1f |
| 55 | \\ neg 3, 3 | 55 | \\ neg 3, 3 |
| 56 | \\ 1: | 56 | \\1: |
| 57 | : [ret] "={r3}" (-> u32), | 57 | : [ret] "={r3}" (-> u32), |
| 58 | [r0_out] "={r0}" (r0_out), | 58 | [r0_out] "={r0}" (r0_out), |
| 59 | [r4_out] "={r4}" (r4_out), | 59 | [r4_out] "={r4}" (r4_out), |
| ... | @@ -77,7 +77,7 @@ pub fn syscall3( | ... | @@ -77,7 +77,7 @@ pub fn syscall3( |
| 77 | \\ sc | 77 | \\ sc |
| 78 | \\ bns+ 1f | 78 | \\ bns+ 1f |
| 79 | \\ neg 3, 3 | 79 | \\ neg 3, 3 |
| 80 | \\ 1: | 80 | \\1: |
| 81 | : [ret] "={r3}" (-> u32), | 81 | : [ret] "={r3}" (-> u32), |
| 82 | [r0_out] "={r0}" (r0_out), | 82 | [r0_out] "={r0}" (r0_out), |
| 83 | [r4_out] "={r4}" (r4_out), | 83 | [r4_out] "={r4}" (r4_out), |
| ... | @@ -105,7 +105,7 @@ pub fn syscall4( | ... | @@ -105,7 +105,7 @@ pub fn syscall4( |
| 105 | \\ sc | 105 | \\ sc |
| 106 | \\ bns+ 1f | 106 | \\ bns+ 1f |
| 107 | \\ neg 3, 3 | 107 | \\ neg 3, 3 |
| 108 | \\ 1: | 108 | \\1: |
| 109 | : [ret] "={r3}" (-> u32), | 109 | : [ret] "={r3}" (-> u32), |
| 110 | [r0_out] "={r0}" (r0_out), | 110 | [r0_out] "={r0}" (r0_out), |
| 111 | [r4_out] "={r4}" (r4_out), | 111 | [r4_out] "={r4}" (r4_out), |
| ... | @@ -137,7 +137,7 @@ pub fn syscall5( | ... | @@ -137,7 +137,7 @@ pub fn syscall5( |
| 137 | \\ sc | 137 | \\ sc |
| 138 | \\ bns+ 1f | 138 | \\ bns+ 1f |
| 139 | \\ neg 3, 3 | 139 | \\ neg 3, 3 |
| 140 | \\ 1: | 140 | \\1: |
| 141 | : [ret] "={r3}" (-> u32), | 141 | : [ret] "={r3}" (-> u32), |
| 142 | [r0_out] "={r0}" (r0_out), | 142 | [r0_out] "={r0}" (r0_out), |
| 143 | [r4_out] "={r4}" (r4_out), | 143 | [r4_out] "={r4}" (r4_out), |
| ... | @@ -173,7 +173,7 @@ pub fn syscall6( | ... | @@ -173,7 +173,7 @@ pub fn syscall6( |
| 173 | \\ sc | 173 | \\ sc |
| 174 | \\ bns+ 1f | 174 | \\ bns+ 1f |
| 175 | \\ neg 3, 3 | 175 | \\ neg 3, 3 |
| 176 | \\ 1: | 176 | \\1: |
| 177 | : [ret] "={r3}" (-> u32), | 177 | : [ret] "={r3}" (-> u32), |
| 178 | [r0_out] "={r0}" (r0_out), | 178 | [r0_out] "={r0}" (r0_out), |
| 179 | [r4_out] "={r4}" (r4_out), | 179 | [r4_out] "={r4}" (r4_out), |
| ... | @@ -200,8 +200,9 @@ pub fn clone() callconv(.naked) u32 { | ... | @@ -200,8 +200,9 @@ pub fn clone() callconv(.naked) u32 { |
| 200 | asm volatile ( | 200 | asm volatile ( |
| 201 | \\ # store non-volatile regs r29, r30 on stack in order to put our | 201 | \\ # store non-volatile regs r29, r30 on stack in order to put our |
| 202 | \\ # start func and its arg there | 202 | \\ # start func and its arg there |
| 203 | \\ stwu 29, -16(1) | 203 | \\ stwu 1, -16(1) |
| 204 | \\ stw 30, 4(1) | 204 | \\ stw 29, 8(1) |
| 205 | \\ stw 30, 12(1) | ||
| 205 | \\ | 206 | \\ |
| 206 | \\ # save r3 (func) into r29, and r6(arg) into r30 | 207 | \\ # save r3 (func) into r29, and r6(arg) into r30 |
| 207 | \\ mr 29, 3 | 208 | \\ mr 29, 3 |
| ... | @@ -234,8 +235,8 @@ pub fn clone() callconv(.naked) u32 { | ... | @@ -234,8 +235,8 @@ pub fn clone() callconv(.naked) u32 { |
| 234 | \\ | 235 | \\ |
| 235 | \\ # if not 0, restore stack and return | 236 | \\ # if not 0, restore stack and return |
| 236 | \\ beq cr7, 2f | 237 | \\ beq cr7, 2f |
| 237 | \\ lwz 29, 0(1) | 238 | \\ lwz 29, 8(1) |
| 238 | \\ lwz 30, 4(1) | 239 | \\ lwz 30, 12(1) |
| 239 | \\ addi 1, 1, 16 | 240 | \\ addi 1, 1, 16 |
| 240 | \\ blr | 241 | \\ blr |
| 241 | \\ | 242 | \\ |
| ... | @@ -247,7 +248,7 @@ pub fn clone() callconv(.naked) u32 { | ... | @@ -247,7 +248,7 @@ pub fn clone() callconv(.naked) u32 { |
| 247 | ); | 248 | ); |
| 248 | asm volatile ( | 249 | asm volatile ( |
| 249 | \\ li 31, 0 | 250 | \\ li 31, 0 |
| 250 | \\ mtlr 0 | 251 | \\ mtlr 31 |
| 251 | \\ | 252 | \\ |
| 252 | \\ #call funcptr: move arg (d) into r3 | 253 | \\ #call funcptr: move arg (d) into r3 |
| 253 | \\ mr 3, 30 | 254 | \\ mr 3, 30 |
| ... | @@ -262,35 +263,21 @@ pub fn clone() callconv(.naked) u32 { | ... | @@ -262,35 +263,21 @@ pub fn clone() callconv(.naked) u32 { |
| 262 | } | 263 | } |
| 263 | 264 | ||
| 264 | pub fn restore() callconv(.naked) noreturn { | 265 | pub fn restore() callconv(.naked) noreturn { |
| 265 | switch (builtin.zig_backend) { | 266 | asm volatile ( |
| 266 | .stage2_c => asm volatile ( | 267 | \\ li 0, %[number] |
| 267 | \\ li 0, %[number] | 268 | \\ sc |
| 268 | \\ sc | 269 | : |
| 269 | : | 270 | : [number] "i" (@backingInt(SYS.sigreturn)), |
| 270 | : [number] "i" (@backingInt(SYS.sigreturn)), | 271 | ); |
| 271 | ), | ||
| 272 | else => asm volatile ( | ||
| 273 | \\ sc | ||
| 274 | : | ||
| 275 | : [number] "{r0}" (@backingInt(SYS.sigreturn)), | ||
| 276 | ), | ||
| 277 | } | ||
| 278 | } | 272 | } |
| 279 | 273 | ||
| 280 | pub fn restore_rt() callconv(.naked) noreturn { | 274 | pub fn restore_rt() callconv(.naked) noreturn { |
| 281 | switch (builtin.zig_backend) { | 275 | asm volatile ( |
| 282 | .stage2_c => asm volatile ( | 276 | \\ li 0, %[number] |
| 283 | \\ li 0, %[number] | 277 | \\ sc |
| 284 | \\ sc | 278 | : |
| 285 | : | 279 | : [number] "i" (@backingInt(SYS.rt_sigreturn)), |
| 286 | : [number] "i" (@backingInt(SYS.rt_sigreturn)), | 280 | ); |
| 287 | ), | ||
| 288 | else => asm volatile ( | ||
| 289 | \\ sc | ||
| 290 | : | ||
| 291 | : [number] "{r0}" (@backingInt(SYS.rt_sigreturn)), | ||
| 292 | ), | ||
| 293 | } | ||
| 294 | } | 281 | } |
| 295 | 282 | ||
| 296 | pub const VDSO = struct { | 283 | pub const VDSO = struct { |
lib/std/os/linux/powerpc64.zig+52-66| ... | @@ -16,7 +16,7 @@ pub fn syscall0( | ... | @@ -16,7 +16,7 @@ pub fn syscall0( |
| 16 | \\ sc | 16 | \\ sc |
| 17 | \\ bns+ 1f | 17 | \\ bns+ 1f |
| 18 | \\ neg 3, 3 | 18 | \\ neg 3, 3 |
| 19 | \\ 1: | 19 | \\1: |
| 20 | : [ret] "={r3}" (-> u64), | 20 | : [ret] "={r3}" (-> u64), |
| 21 | [r0_out] "={r0}" (r0_out), | 21 | [r0_out] "={r0}" (r0_out), |
| 22 | : [number] "{r0}" (@backingInt(number)), | 22 | : [number] "{r0}" (@backingInt(number)), |
| ... | @@ -33,7 +33,7 @@ pub fn syscall1( | ... | @@ -33,7 +33,7 @@ pub fn syscall1( |
| 33 | \\ sc | 33 | \\ sc |
| 34 | \\ bns+ 1f | 34 | \\ bns+ 1f |
| 35 | \\ neg 3, 3 | 35 | \\ neg 3, 3 |
| 36 | \\ 1: | 36 | \\1: |
| 37 | : [ret] "={r3}" (-> u64), | 37 | : [ret] "={r3}" (-> u64), |
| 38 | [r0_out] "={r0}" (r0_out), | 38 | [r0_out] "={r0}" (r0_out), |
| 39 | : [number] "{r0}" (@backingInt(number)), | 39 | : [number] "{r0}" (@backingInt(number)), |
| ... | @@ -53,7 +53,7 @@ pub fn syscall2( | ... | @@ -53,7 +53,7 @@ pub fn syscall2( |
| 53 | \\ sc | 53 | \\ sc |
| 54 | \\ bns+ 1f | 54 | \\ bns+ 1f |
| 55 | \\ neg 3, 3 | 55 | \\ neg 3, 3 |
| 56 | \\ 1: | 56 | \\1: |
| 57 | : [ret] "={r3}" (-> u64), | 57 | : [ret] "={r3}" (-> u64), |
| 58 | [r0_out] "={r0}" (r0_out), | 58 | [r0_out] "={r0}" (r0_out), |
| 59 | [r4_out] "={r4}" (r4_out), | 59 | [r4_out] "={r4}" (r4_out), |
| ... | @@ -77,7 +77,7 @@ pub fn syscall3( | ... | @@ -77,7 +77,7 @@ pub fn syscall3( |
| 77 | \\ sc | 77 | \\ sc |
| 78 | \\ bns+ 1f | 78 | \\ bns+ 1f |
| 79 | \\ neg 3, 3 | 79 | \\ neg 3, 3 |
| 80 | \\ 1: | 80 | \\1: |
| 81 | : [ret] "={r3}" (-> u64), | 81 | : [ret] "={r3}" (-> u64), |
| 82 | [r0_out] "={r0}" (r0_out), | 82 | [r0_out] "={r0}" (r0_out), |
| 83 | [r4_out] "={r4}" (r4_out), | 83 | [r4_out] "={r4}" (r4_out), |
| ... | @@ -105,7 +105,7 @@ pub fn syscall4( | ... | @@ -105,7 +105,7 @@ pub fn syscall4( |
| 105 | \\ sc | 105 | \\ sc |
| 106 | \\ bns+ 1f | 106 | \\ bns+ 1f |
| 107 | \\ neg 3, 3 | 107 | \\ neg 3, 3 |
| 108 | \\ 1: | 108 | \\1: |
| 109 | : [ret] "={r3}" (-> u64), | 109 | : [ret] "={r3}" (-> u64), |
| 110 | [r0_out] "={r0}" (r0_out), | 110 | [r0_out] "={r0}" (r0_out), |
| 111 | [r4_out] "={r4}" (r4_out), | 111 | [r4_out] "={r4}" (r4_out), |
| ... | @@ -137,7 +137,7 @@ pub fn syscall5( | ... | @@ -137,7 +137,7 @@ pub fn syscall5( |
| 137 | \\ sc | 137 | \\ sc |
| 138 | \\ bns+ 1f | 138 | \\ bns+ 1f |
| 139 | \\ neg 3, 3 | 139 | \\ neg 3, 3 |
| 140 | \\ 1: | 140 | \\1: |
| 141 | : [ret] "={r3}" (-> u64), | 141 | : [ret] "={r3}" (-> u64), |
| 142 | [r0_out] "={r0}" (r0_out), | 142 | [r0_out] "={r0}" (r0_out), |
| 143 | [r4_out] "={r4}" (r4_out), | 143 | [r4_out] "={r4}" (r4_out), |
| ... | @@ -173,7 +173,7 @@ pub fn syscall6( | ... | @@ -173,7 +173,7 @@ pub fn syscall6( |
| 173 | \\ sc | 173 | \\ sc |
| 174 | \\ bns+ 1f | 174 | \\ bns+ 1f |
| 175 | \\ neg 3, 3 | 175 | \\ neg 3, 3 |
| 176 | \\ 1: | 176 | \\1: |
| 177 | : [ret] "={r3}" (-> u64), | 177 | : [ret] "={r3}" (-> u64), |
| 178 | [r0_out] "={r0}" (r0_out), | 178 | [r0_out] "={r0}" (r0_out), |
| 179 | [r4_out] "={r4}" (r4_out), | 179 | [r4_out] "={r4}" (r4_out), |
| ... | @@ -198,84 +198,70 @@ pub fn clone() callconv(.naked) u64 { | ... | @@ -198,84 +198,70 @@ pub fn clone() callconv(.naked) u64 { |
| 198 | // syscall(SYS_clone, flags, stack, ptid, tls, ctid) | 198 | // syscall(SYS_clone, flags, stack, ptid, tls, ctid) |
| 199 | // 0 3, 4, 5, 6, 7 | 199 | // 0 3, 4, 5, 6, 7 |
| 200 | asm volatile ( | 200 | asm volatile ( |
| 201 | \\ # create initial stack frame for new thread | 201 | \\ # create initial stack frame for new thread |
| 202 | \\ clrrdi 4, 4, 4 | 202 | \\ clrrdi 4, 4, 4 |
| 203 | \\ li 0, 0 | 203 | \\ li 0, 0 |
| 204 | \\ stdu 0,-32(4) | 204 | \\ stdu 0,-32(4) |
| 205 | \\ | 205 | \\ |
| 206 | \\ # save fn and arg to child stack | 206 | \\ # save fn and arg to child stack |
| 207 | \\ std 3, 8(4) | 207 | \\ std 3, 8(4) |
| 208 | \\ std 6, 16(4) | 208 | \\ std 6, 16(4) |
| 209 | \\ | 209 | \\ |
| 210 | \\ # shuffle args into correct registers and call SYS_clone | 210 | \\ # shuffle args into correct registers and call SYS_clone |
| 211 | \\ mr 3, 5 | 211 | \\ mr 3, 5 |
| 212 | \\ #mr 4, 4 | 212 | \\ #mr 4, 4 |
| 213 | \\ mr 5, 7 | 213 | \\ mr 5, 7 |
| 214 | \\ mr 6, 8 | 214 | \\ mr 6, 8 |
| 215 | \\ mr 7, 9 | 215 | \\ mr 7, 9 |
| 216 | \\ li 0, 120 # SYS_clone = 120 | 216 | \\ li 0, 120 # SYS_clone = 120 |
| 217 | \\ sc | 217 | \\ sc |
| 218 | \\ | 218 | \\ |
| 219 | \\ # if error, negate return (errno) | 219 | \\ # if error, negate return (errno) |
| 220 | \\ bns+ 1f | 220 | \\ bns+ 1f |
| 221 | \\ neg 3, 3 | 221 | \\ neg 3, 3 |
| 222 | \\ | 222 | \\ |
| 223 | \\1: | 223 | \\1: |
| 224 | \\ # if we're the parent, return | 224 | \\ # if we're the parent, return |
| 225 | \\ cmpwi cr7, 3, 0 | 225 | \\ cmpwi cr7, 3, 0 |
| 226 | \\ bnelr cr7 | 226 | \\ bnelr cr7 |
| 227 | \\ | 227 | \\ |
| 228 | \\ # we're the child | 228 | \\ # we're the child |
| 229 | ); | 229 | ); |
| 230 | if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile ( | 230 | if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile ( |
| 231 | \\ .cfi_undefined lr | 231 | \\ .cfi_undefined lr |
| 232 | ); | 232 | ); |
| 233 | asm volatile ( | 233 | asm volatile ( |
| 234 | \\ li 31, 0 | 234 | \\ li 31, 0 |
| 235 | \\ mtlr 0 | 235 | \\ mtlr 31 |
| 236 | \\ | 236 | \\ |
| 237 | \\ # call fn(arg) | 237 | \\ # call fn(arg) |
| 238 | \\ ld 3, 16(1) | 238 | \\ ld 3, 16(1) |
| 239 | \\ ld 12, 8(1) | 239 | \\ ld 12, 8(1) |
| 240 | \\ mtctr 12 | 240 | \\ mtctr 12 |
| 241 | \\ bctrl | 241 | \\ bctrl |
| 242 | \\ | 242 | \\ |
| 243 | \\ # call SYS_exit. exit code is already in r3 from fn return value | 243 | \\ # call SYS_exit. exit code is already in r3 from fn return value |
| 244 | \\ li 0, 1 # SYS_exit = 1 | 244 | \\ li 0, 1 # SYS_exit = 1 |
| 245 | \\ sc | 245 | \\ sc |
| 246 | ); | 246 | ); |
| 247 | } | 247 | } |
| 248 | 248 | ||
| 249 | pub fn restore() callconv(.naked) noreturn { | 249 | pub fn restore() callconv(.naked) noreturn { |
| 250 | switch (builtin.zig_backend) { | 250 | asm volatile ( |
| 251 | .stage2_c => asm volatile ( | 251 | \\ li 0, %[number] |
| 252 | \\ li 0, %[number] | 252 | \\ sc |
| 253 | \\ sc | 253 | : |
| 254 | : | 254 | : [number] "i" (@backingInt(SYS.sigreturn)), |
| 255 | : [number] "i" (@backingInt(SYS.sigreturn)), | 255 | ); |
| 256 | ), | ||
| 257 | else => asm volatile ( | ||
| 258 | \\ sc | ||
| 259 | : | ||
| 260 | : [number] "{r0}" (@backingInt(SYS.sigreturn)), | ||
| 261 | ), | ||
| 262 | } | ||
| 263 | } | 256 | } |
| 264 | 257 | ||
| 265 | pub fn restore_rt() callconv(.naked) noreturn { | 258 | pub fn restore_rt() callconv(.naked) noreturn { |
| 266 | switch (builtin.zig_backend) { | 259 | asm volatile ( |
| 267 | .stage2_c => asm volatile ( | 260 | \\ li 0, %[number] |
| 268 | \\ li 0, %[number] | 261 | \\ sc |
| 269 | \\ sc | 262 | : |
| 270 | : | 263 | : [number] "i" (@backingInt(SYS.rt_sigreturn)), |
| 271 | : [number] "i" (@backingInt(SYS.rt_sigreturn)), | 264 | ); |
| 272 | ), | ||
| 273 | else => asm volatile ( | ||
| 274 | \\ sc | ||
| 275 | : | ||
| 276 | : [number] "{r0}" (@backingInt(SYS.rt_sigreturn)), | ||
| 277 | ), | ||
| 278 | } | ||
| 279 | } | 265 | } |
| 280 | 266 | ||
| 281 | pub const VDSO = struct { | 267 | pub const VDSO = struct { |
lib/std/os/linux/riscv32.zig+25-24| ... | @@ -116,40 +116,41 @@ pub fn clone() callconv(.naked) u32 { | ... | @@ -116,40 +116,41 @@ pub fn clone() callconv(.naked) u32 { |
| 116 | // syscall(SYS_clone, flags, stack, ptid, tls, ctid) | 116 | // syscall(SYS_clone, flags, stack, ptid, tls, ctid) |
| 117 | // a7 a0, a1, a2, a3, a4 | 117 | // a7 a0, a1, a2, a3, a4 |
| 118 | asm volatile ( | 118 | asm volatile ( |
| 119 | \\ # Save func and arg to stack | 119 | \\ andi a1, a1, -16 |
| 120 | \\ addi a1, a1, -8 | 120 | \\ # Save func and arg to stack |
| 121 | \\ sw a0, 0(a1) | 121 | \\ addi a1, a1, -16 |
| 122 | \\ sw a3, 4(a1) | 122 | \\ sw a0, 0(a1) |
| 123 | \\ sw a3, 4(a1) | ||
| 123 | \\ | 124 | \\ |
| 124 | \\ # Call SYS_clone | 125 | \\ # Call SYS_clone |
| 125 | \\ mv a0, a2 | 126 | \\ mv a0, a2 |
| 126 | \\ mv a2, a4 | 127 | \\ mv a2, a4 |
| 127 | \\ mv a3, a5 | 128 | \\ mv a3, a5 |
| 128 | \\ mv a4, a6 | 129 | \\ mv a4, a6 |
| 129 | \\ li a7, 220 # SYS_clone | 130 | \\ li a7, 220 # SYS_clone |
| 130 | \\ ecall | 131 | \\ ecall |
| 131 | \\ | 132 | \\ |
| 132 | \\ beqz a0, 1f | 133 | \\ beqz a0, 1f |
| 133 | \\ # Parent | 134 | \\ # Parent |
| 134 | \\ ret | 135 | \\ ret |
| 135 | \\ | 136 | \\ |
| 136 | \\ # Child | 137 | \\ # Child |
| 137 | \\1: | 138 | \\1: |
| 138 | ); | 139 | ); |
| 139 | if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile ( | 140 | if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile ( |
| 140 | \\ .cfi_undefined ra | 141 | \\ .cfi_undefined ra |
| 141 | ); | 142 | ); |
| 142 | asm volatile ( | 143 | asm volatile ( |
| 143 | \\ mv fp, zero | 144 | \\ mv fp, zero |
| 144 | \\ mv ra, zero | 145 | \\ mv ra, zero |
| 145 | \\ | 146 | \\ |
| 146 | \\ lw a1, 0(sp) | 147 | \\ lw a1, 0(sp) |
| 147 | \\ lw a0, 4(sp) | 148 | \\ lw a0, 4(sp) |
| 148 | \\ jalr a1 | 149 | \\ jalr a1 |
| 149 | \\ | 150 | \\ |
| 150 | \\ # Exit | 151 | \\ # Exit |
| 151 | \\ li a7, 93 # SYS_exit | 152 | \\ li a7, 93 # SYS_exit |
| 152 | \\ ecall | 153 | \\ ecall |
| 153 | ); | 154 | ); |
| 154 | } | 155 | } |
| 155 | 156 |
lib/std/os/linux/riscv64.zig+25-24| ... | @@ -116,40 +116,41 @@ pub fn clone() callconv(.naked) u64 { | ... | @@ -116,40 +116,41 @@ pub fn clone() callconv(.naked) u64 { |
| 116 | // syscall(SYS_clone, flags, stack, ptid, tls, ctid) | 116 | // syscall(SYS_clone, flags, stack, ptid, tls, ctid) |
| 117 | // a7 a0, a1, a2, a3, a4 | 117 | // a7 a0, a1, a2, a3, a4 |
| 118 | asm volatile ( | 118 | asm volatile ( |
| 119 | \\ # Save func and arg to stack | 119 | \\ andi a1, a1, -16 |
| 120 | \\ addi a1, a1, -16 | 120 | \\ # Save func and arg to stack |
| 121 | \\ sd a0, 0(a1) | 121 | \\ addi a1, a1, -16 |
| 122 | \\ sd a3, 8(a1) | 122 | \\ sd a0, 0(a1) |
| 123 | \\ sd a3, 8(a1) | ||
| 123 | \\ | 124 | \\ |
| 124 | \\ # Call SYS_clone | 125 | \\ # Call SYS_clone |
| 125 | \\ mv a0, a2 | 126 | \\ mv a0, a2 |
| 126 | \\ mv a2, a4 | 127 | \\ mv a2, a4 |
| 127 | \\ mv a3, a5 | 128 | \\ mv a3, a5 |
| 128 | \\ mv a4, a6 | 129 | \\ mv a4, a6 |
| 129 | \\ li a7, 220 # SYS_clone | 130 | \\ li a7, 220 # SYS_clone |
| 130 | \\ ecall | 131 | \\ ecall |
| 131 | \\ | 132 | \\ |
| 132 | \\ beqz a0, 1f | 133 | \\ beqz a0, 1f |
| 133 | \\ # Parent | 134 | \\ # Parent |
| 134 | \\ ret | 135 | \\ ret |
| 135 | \\ | 136 | \\ |
| 136 | \\ # Child | 137 | \\ # Child |
| 137 | \\1: | 138 | \\1: |
| 138 | ); | 139 | ); |
| 139 | if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile ( | 140 | if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile ( |
| 140 | \\ .cfi_undefined ra | 141 | \\ .cfi_undefined ra |
| 141 | ); | 142 | ); |
| 142 | asm volatile ( | 143 | asm volatile ( |
| 143 | \\ mv fp, zero | 144 | \\ mv fp, zero |
| 144 | \\ mv ra, zero | 145 | \\ mv ra, zero |
| 145 | \\ | 146 | \\ |
| 146 | \\ ld a1, 0(sp) | 147 | \\ ld a1, 0(sp) |
| 147 | \\ ld a0, 8(sp) | 148 | \\ ld a0, 8(sp) |
| 148 | \\ jalr a1 | 149 | \\ jalr a1 |
| 149 | \\ | 150 | \\ |
| 150 | \\ # Exit | 151 | \\ # Exit |
| 151 | \\ li a7, 93 # SYS_exit | 152 | \\ li a7, 93 # SYS_exit |
| 152 | \\ ecall | 153 | \\ ecall |
| 153 | ); | 154 | ); |
| 154 | } | 155 | } |
| 155 | 156 |
lib/std/os/linux/s390x.zig+57-72| ... | @@ -111,98 +111,83 @@ pub fn syscall6( | ... | @@ -111,98 +111,83 @@ pub fn syscall6( |
| 111 | 111 | ||
| 112 | pub fn clone() callconv(.naked) u64 { | 112 | pub fn clone() callconv(.naked) u64 { |
| 113 | asm volatile ( | 113 | asm volatile ( |
| 114 | \\# int clone( | 114 | \\ # int clone( |
| 115 | \\# fn, a = r2 | 115 | \\ # fn, a = r2 |
| 116 | \\# stack, b = r3 | 116 | \\ # stack, b = r3 |
| 117 | \\# flags, c = r4 | 117 | \\ # flags, c = r4 |
| 118 | \\# arg, d = r5 | 118 | \\ # arg, d = r5 |
| 119 | \\# ptid, e = r6 | 119 | \\ # ptid, e = r6 |
| 120 | \\# tls, f = *(r15+160) | 120 | \\ # tls, f = *(r15+160) |
| 121 | \\# ctid) g = *(r15+168) | 121 | \\ # ctid) g = *(r15+168) |
| 122 | \\# | 122 | \\ # |
| 123 | \\# pseudo C code: | 123 | \\ # pseudo C code: |
| 124 | \\# tid = syscall(SYS_clone,b,c,e,g,f); | 124 | \\ # tid = syscall(SYS_clone,b,c,e,g,f); |
| 125 | \\# if (!tid) syscall(SYS_exit, a(d)); | 125 | \\ # if (!tid) syscall(SYS_exit, a(d)); |
| 126 | \\# return tid; | 126 | \\ # return tid; |
| 127 | \\ | 127 | \\ |
| 128 | \\# preserve call-saved register used as syscall arg | 128 | \\ # preserve call-saved register used as syscall arg |
| 129 | \\stg %%r6, 48(%%r15) | 129 | \\ stg %%r6, 48(%%r15) |
| 130 | \\ | 130 | \\ |
| 131 | \\# create initial stack frame for new thread | 131 | \\ # create initial stack frame for new thread |
| 132 | \\nill %%r3, 0xfff8 | 132 | \\ nill %%r3, 0xfff8 |
| 133 | \\aghi %%r3, -160 | 133 | \\ aghi %%r3, -160 |
| 134 | \\lghi %%r0, 0 | 134 | \\ lghi %%r0, 0 |
| 135 | \\stg %%r0, 0(%%r3) | 135 | \\ stg %%r0, 0(%%r3) |
| 136 | \\ | 136 | \\ |
| 137 | \\# save fn and arg to child stack | 137 | \\ # save fn and arg to child stack |
| 138 | \\stg %%r2, 8(%%r3) | 138 | \\ stg %%r2, 8(%%r3) |
| 139 | \\stg %%r5, 16(%%r3) | 139 | \\ stg %%r5, 16(%%r3) |
| 140 | \\ | 140 | \\ |
| 141 | \\# shuffle args into correct registers and call SYS_clone | 141 | \\ # shuffle args into correct registers and call SYS_clone |
| 142 | \\lgr %%r2, %%r3 | 142 | \\ lgr %%r2, %%r3 |
| 143 | \\lgr %%r3, %%r4 | 143 | \\ lgr %%r3, %%r4 |
| 144 | \\lgr %%r4, %%r6 | 144 | \\ lgr %%r4, %%r6 |
| 145 | \\lg %%r5, 168(%%r15) | 145 | \\ lg %%r5, 168(%%r15) |
| 146 | \\lg %%r6, 160(%%r15) | 146 | \\ lg %%r6, 160(%%r15) |
| 147 | \\svc 120 | 147 | \\ svc 120 |
| 148 | \\ | 148 | \\ |
| 149 | \\# restore call-saved register | 149 | \\ # restore call-saved register |
| 150 | \\lg %%r6, 48(%%r15) | 150 | \\ lg %%r6, 48(%%r15) |
| 151 | \\ | 151 | \\ |
| 152 | \\# if error or if we're the parent, return | 152 | \\ # if error or if we're the parent, return |
| 153 | \\ltgr %%r2, %%r2 | 153 | \\ ltgr %%r2, %%r2 |
| 154 | \\bnzr %%r14 | 154 | \\ bnzr %%r14 |
| 155 | \\ | 155 | \\ |
| 156 | \\# we're the child | 156 | \\ # we're the child |
| 157 | ); | 157 | ); |
| 158 | if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile ( | 158 | if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile ( |
| 159 | \\.cfi_undefined %%r14 | 159 | \\ .cfi_undefined %%r14 |
| 160 | ); | 160 | ); |
| 161 | asm volatile ( | 161 | asm volatile ( |
| 162 | \\lghi %%r11, 0 | 162 | \\ lghi %%r11, 0 |
| 163 | \\lghi %%r14, 0 | 163 | \\ lghi %%r14, 0 |
| 164 | \\ | 164 | \\ |
| 165 | \\# call fn(arg) | 165 | \\ # call fn(arg) |
| 166 | \\lg %%r1, 8(%%r15) | 166 | \\ lg %%r1, 8(%%r15) |
| 167 | \\lg %%r2, 16(%%r15) | 167 | \\ lg %%r2, 16(%%r15) |
| 168 | \\basr %%r14, %%r1 | 168 | \\ basr %%r14, %%r1 |
| 169 | \\ | ||
| 170 | \\# call SYS_exit. exit code is already in r2 from fn return value | ||
| 171 | \\svc 1 | ||
| 172 | \\ | 169 | \\ |
| 170 | \\ # call SYS_exit. exit code is already in r2 from fn return value | ||
| 171 | \\ svc 1 | ||
| 173 | ); | 172 | ); |
| 174 | } | 173 | } |
| 175 | 174 | ||
| 176 | pub fn restore() callconv(.naked) noreturn { | 175 | pub fn restore() callconv(.naked) noreturn { |
| 177 | switch (builtin.zig_backend) { | 176 | asm volatile ( |
| 178 | .stage2_c => asm volatile ( | 177 | \\ lghi %%r1, %[number] |
| 179 | \\lghi %%r1, %[number] | 178 | \\ svc 0 |
| 180 | \\svc 0 | 179 | : |
| 181 | : | 180 | : [number] "K" (@backingInt(SYS.sigreturn)), |
| 182 | : [number] "K" (@backingInt(SYS.sigreturn)), | 181 | ); |
| 183 | ), | ||
| 184 | else => asm volatile ( | ||
| 185 | \\svc 0 | ||
| 186 | : | ||
| 187 | : [number] "{r1}" (@backingInt(SYS.sigreturn)), | ||
| 188 | ), | ||
| 189 | } | ||
| 190 | } | 182 | } |
| 191 | 183 | ||
| 192 | pub fn restore_rt() callconv(.naked) noreturn { | 184 | pub fn restore_rt() callconv(.naked) noreturn { |
| 193 | switch (builtin.zig_backend) { | 185 | asm volatile ( |
| 194 | .stage2_c => asm volatile ( | 186 | \\ lghi %%r1, %[number] |
| 195 | \\lghi %%r1, %[number] | 187 | \\ svc 0 |
| 196 | \\svc 0 | 188 | : |
| 197 | : | 189 | : [number] "K" (@backingInt(SYS.rt_sigreturn)), |
| 198 | : [number] "K" (@backingInt(SYS.rt_sigreturn)), | 190 | ); |
| 199 | ), | ||
| 200 | else => asm volatile ( | ||
| 201 | \\svc 0 | ||
| 202 | : | ||
| 203 | : [number] "{r1}" (@backingInt(SYS.rt_sigreturn)), | ||
| 204 | ), | ||
| 205 | } | ||
| 206 | } | 191 | } |
| 207 | 192 | ||
| 208 | pub const time_t = i64; | 193 | pub const time_t = i64; |
lib/std/os/linux/sh.zig+2-2| ... | @@ -167,8 +167,8 @@ pub fn clone() callconv(.naked) u32 { | ... | @@ -167,8 +167,8 @@ pub fn clone() callconv(.naked) u32 { |
| 167 | \\ mov #120, r3 ! SYS_clone | 167 | \\ mov #120, r3 ! SYS_clone |
| 168 | \\ mov r6, r4 | 168 | \\ mov r6, r4 |
| 169 | \\ mov.l @r15, r6 | 169 | \\ mov.l @r15, r6 |
| 170 | \\ mov.l @(r15, 8), r7 | 170 | \\ mov.l @(8, r15), r7 |
| 171 | \\ mov.l @(r15, 4), r0 | 171 | \\ mov.l @(4, r15), r0 |
| 172 | \\ trapa #31 | 172 | \\ trapa #31 |
| 173 | \\ or r0, r0 | 173 | \\ or r0, r0 |
| 174 | \\ or r0, r0 | 174 | \\ or r0, r0 |
lib/std/os/linux/sparc.zig+2-2| ... | @@ -214,11 +214,11 @@ pub fn clone() callconv(.naked) u32 { | ... | @@ -214,11 +214,11 @@ pub fn clone() callconv(.naked) u32 { |
| 214 | \\ | 214 | \\ |
| 215 | \\ # Align, and add some extra space for the initial frame | 215 | \\ # Align, and add some extra space for the initial frame |
| 216 | \\ and %%i1, -8, %%i1 | 216 | \\ and %%i1, -8, %%i1 |
| 217 | \\ sub %%i1, 96 + 2047, %%o1 | 217 | \\ sub %%i1, 96, %%o1 |
| 218 | \\ | 218 | \\ |
| 219 | \\ mov %%i4, %%o2 | 219 | \\ mov %%i4, %%o2 |
| 220 | \\ mov %%i5, %%o3 | 220 | \\ mov %%i5, %%o3 |
| 221 | \\ ld [%%fp + 92 + 2047], %%o4 | 221 | \\ ld [%%fp + 92], %%o4 |
| 222 | \\ t 0x10 | 222 | \\ t 0x10 |
| 223 | \\ bcs 1f | 223 | \\ bcs 1f |
| 224 | \\ nop | 224 | \\ nop |
lib/std/os/linux/tls.zig+8-8| ... | @@ -261,10 +261,9 @@ pub fn setThreadPointer(addr: usize) void { | ... | @@ -261,10 +261,9 @@ pub fn setThreadPointer(addr: usize) void { |
| 261 | }, | 261 | }, |
| 262 | .alpha => { | 262 | .alpha => { |
| 263 | asm volatile ( | 263 | asm volatile ( |
| 264 | \\ lda $16, 0(%[addr]) | ||
| 265 | \\ wruniq | 264 | \\ wruniq |
| 266 | : | 265 | : |
| 267 | : [addr] "r" (addr), | 266 | : [addr] "{$16}" (addr), |
| 268 | ); | 267 | ); |
| 269 | }, | 268 | }, |
| 270 | .arc, .arceb => { | 269 | .arc, .arceb => { |
| ... | @@ -282,7 +281,7 @@ pub fn setThreadPointer(addr: usize) void { | ... | @@ -282,7 +281,7 @@ pub fn setThreadPointer(addr: usize) void { |
| 282 | assert(rc == 0); | 281 | assert(rc == 0); |
| 283 | }, | 282 | }, |
| 284 | .m68k => { | 283 | .m68k => { |
| 285 | const rc = linux.syscall1(.set_thread_area, addr); | 284 | const rc = @call(.always_inline, linux.syscall1, .{ .set_thread_area, addr }); |
| 286 | assert(rc == 0); | 285 | assert(rc == 0); |
| 287 | }, | 286 | }, |
| 288 | .hexagon => { | 287 | .hexagon => { |
| ... | @@ -295,9 +294,10 @@ pub fn setThreadPointer(addr: usize) void { | ... | @@ -295,9 +294,10 @@ pub fn setThreadPointer(addr: usize) void { |
| 295 | .hppa => { | 294 | .hppa => { |
| 296 | asm volatile ( | 295 | asm volatile ( |
| 297 | \\ ble 0xe0(%%sr2, %%r0) | 296 | \\ ble 0xe0(%%sr2, %%r0) |
| 297 | \\ nop | ||
| 298 | : | 298 | : |
| 299 | : [addr] "={r26}" (addr), | 299 | : [addr] "{r26}" (addr), |
| 300 | : .{ .r29 = true }); | 300 | : .{ .r31 = true }); |
| 301 | }, | 301 | }, |
| 302 | .loongarch32, .loongarch64 => { | 302 | .loongarch32, .loongarch64 => { |
| 303 | asm volatile ( | 303 | asm volatile ( |
| ... | @@ -357,7 +357,7 @@ pub fn setThreadPointer(addr: usize) void { | ... | @@ -357,7 +357,7 @@ pub fn setThreadPointer(addr: usize) void { |
| 357 | }, | 357 | }, |
| 358 | .sh, .sheb => { | 358 | .sh, .sheb => { |
| 359 | asm volatile ( | 359 | asm volatile ( |
| 360 | \\ ldc gbr, %[addr] | 360 | \\ ldc %[addr], gbr |
| 361 | : | 361 | : |
| 362 | : [addr] "r" (addr), | 362 | : [addr] "r" (addr), |
| 363 | ); | 363 | ); |
| ... | @@ -417,7 +417,7 @@ pub fn getThreadPointer() usize { | ... | @@ -417,7 +417,7 @@ pub fn getThreadPointer() usize { |
| 417 | \\ move %[ret], $tp | 417 | \\ move %[ret], $tp |
| 418 | : [ret] "=r" (-> usize), | 418 | : [ret] "=r" (-> usize), |
| 419 | ), | 419 | ), |
| 420 | .m68k => linux.syscall1(.get_thread_area), | 420 | .m68k => linux.syscall0(.get_thread_area), |
| 421 | .mips, .mipsel, .mips64, .mips64el => asm ( | 421 | .mips, .mipsel, .mips64, .mips64el => asm ( |
| 422 | \\ rdhwr %[ret], $29 | 422 | \\ rdhwr %[ret], $29 |
| 423 | : [ret] "=r" (-> usize), | 423 | : [ret] "=r" (-> usize), |
| ... | @@ -449,7 +449,7 @@ pub fn getThreadPointer() usize { | ... | @@ -449,7 +449,7 @@ pub fn getThreadPointer() usize { |
| 449 | : [ret] "=r" (-> usize), | 449 | : [ret] "=r" (-> usize), |
| 450 | ), | 450 | ), |
| 451 | .sh, .sheb => asm ( | 451 | .sh, .sheb => asm ( |
| 452 | \\ stc %[ret], gbr | 452 | \\ stc gbr, %[ret] |
| 453 | : [ret] "=r" (-> usize), | 453 | : [ret] "=r" (-> usize), |
| 454 | ), | 454 | ), |
| 455 | .sparc, .sparc64 => asm ( | 455 | .sparc, .sparc64 => asm ( |
lib/std/os/linux/x32.zig+27-35| ... | @@ -125,54 +125,46 @@ pub fn syscall_lseek( | ... | @@ -125,54 +125,46 @@ pub fn syscall_lseek( |
| 125 | 125 | ||
| 126 | pub fn clone() callconv(.naked) u32 { | 126 | pub fn clone() callconv(.naked) u32 { |
| 127 | asm volatile ( | 127 | asm volatile ( |
| 128 | \\ movl $0x40000038,%%eax // SYS_clone | 128 | \\ movl $0x40000038,%%eax // SYS_clone |
| 129 | \\ mov %%rdi,%%r11 | 129 | \\ mov %%rdi,%%r11 |
| 130 | \\ mov %%rdx,%%rdi | 130 | \\ mov %%rdx,%%rdi |
| 131 | \\ mov %%r8,%%rdx | 131 | \\ mov %%r8,%%rdx |
| 132 | \\ mov %%r9,%%r8 | 132 | \\ mov %%r9,%%r8 |
| 133 | \\ mov 8(%%rsp),%%r10d | 133 | \\ mov 8(%%rsp),%%r10d |
| 134 | \\ mov %%r11,%%r9 | 134 | \\ mov %%r11,%%r9 |
| 135 | \\ and $-16,%%rsi | 135 | \\ and $-16,%%rsi |
| 136 | \\ sub $8,%%rsi | 136 | \\ sub $8,%%rsi |
| 137 | \\ mov %%rcx,(%%rsi) | 137 | \\ mov %%rcx,(%%rsi) |
| 138 | \\ syscall | 138 | \\ syscall |
| 139 | \\ test %%eax,%%eax | 139 | \\ test %%eax,%%eax |
| 140 | \\ jz 1f | 140 | \\ jz 1f |
| 141 | \\ ret | 141 | \\ ret |
| 142 | \\ | 142 | \\ |
| 143 | \\1: | 143 | \\1: |
| 144 | ); | 144 | ); |
| 145 | if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile ( | 145 | if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile ( |
| 146 | \\ .cfi_undefined %%rip | 146 | \\ .cfi_undefined %%rip |
| 147 | ); | 147 | ); |
| 148 | asm volatile ( | 148 | asm volatile ( |
| 149 | \\ xor %%ebp,%%ebp | 149 | \\ xor %%ebp,%%ebp |
| 150 | \\ | ||
| 151 | \\ pop %%rdi | ||
| 152 | \\ call *%%r9 | ||
| 153 | \\ mov %%eax,%%edi | ||
| 154 | \\ movl $0x4000003c,%%eax // SYS_exit | ||
| 155 | \\ syscall | ||
| 156 | \\ | 150 | \\ |
| 151 | \\ pop %%rdi | ||
| 152 | \\ call *%%r9 | ||
| 153 | \\ mov %%eax,%%edi | ||
| 154 | \\ movl $0x4000003c,%%eax // SYS_exit | ||
| 155 | \\ syscall | ||
| 157 | ); | 156 | ); |
| 158 | } | 157 | } |
| 159 | 158 | ||
| 160 | pub const restore = restore_rt; | 159 | pub const restore = restore_rt; |
| 161 | 160 | ||
| 162 | pub fn restore_rt() callconv(.naked) noreturn { | 161 | pub fn restore_rt() callconv(.naked) noreturn { |
| 163 | switch (builtin.zig_backend) { | 162 | asm volatile ( |
| 164 | .stage2_c => asm volatile ( | 163 | \\ movl %[number], %%eax |
| 165 | \\ movl %[number], %%eax | 164 | \\ syscall |
| 166 | \\ syscall | 165 | : |
| 167 | : | 166 | : [number] "i" (@backingInt(SYS.rt_sigreturn)), |
| 168 | : [number] "i" (@backingInt(SYS.rt_sigreturn)), | 167 | ); |
| 169 | ), | ||
| 170 | else => asm volatile ( | ||
| 171 | \\ syscall | ||
| 172 | : | ||
| 173 | : [number] "{rax}" (@backingInt(SYS.rt_sigreturn)), | ||
| 174 | ), | ||
| 175 | } | ||
| 176 | } | 168 | } |
| 177 | 169 | ||
| 178 | pub const time_t = i64; | 170 | pub const time_t = i64; |
lib/std/os/linux/x86.zig+46-61| ... | @@ -142,81 +142,66 @@ pub fn clone() callconv(.naked) u32 { | ... | @@ -142,81 +142,66 @@ pub fn clone() callconv(.naked) u32 { |
| 142 | // syscall(SYS_clone, flags, stack, ptid, tls, ctid) | 142 | // syscall(SYS_clone, flags, stack, ptid, tls, ctid) |
| 143 | // eax, ebx, ecx, edx, esi, edi | 143 | // eax, ebx, ecx, edx, esi, edi |
| 144 | asm volatile ( | 144 | asm volatile ( |
| 145 | \\ pushl %%ebp | 145 | \\ pushl %%ebp |
| 146 | \\ movl %%esp,%%ebp | 146 | \\ movl %%esp,%%ebp |
| 147 | \\ pushl %%ebx | 147 | \\ pushl %%ebx |
| 148 | \\ pushl %%esi | 148 | \\ pushl %%esi |
| 149 | \\ pushl %%edi | 149 | \\ pushl %%edi |
| 150 | \\ // Setup the arguments | 150 | \\ // Setup the arguments |
| 151 | \\ movl 16(%%ebp),%%ebx | 151 | \\ movl 16(%%ebp),%%ebx |
| 152 | \\ movl 12(%%ebp),%%ecx | 152 | \\ movl 12(%%ebp),%%ecx |
| 153 | \\ andl $-16,%%ecx | 153 | \\ andl $-16,%%ecx |
| 154 | \\ subl $20,%%ecx | 154 | \\ subl $20,%%ecx |
| 155 | \\ movl 20(%%ebp),%%eax | 155 | \\ movl 20(%%ebp),%%eax |
| 156 | \\ movl %%eax,4(%%ecx) | 156 | \\ movl %%eax,4(%%ecx) |
| 157 | \\ movl 8(%%ebp),%%eax | 157 | \\ movl 8(%%ebp),%%eax |
| 158 | \\ movl %%eax,0(%%ecx) | 158 | \\ movl %%eax,0(%%ecx) |
| 159 | \\ movl 24(%%ebp),%%edx | 159 | \\ movl 24(%%ebp),%%edx |
| 160 | \\ movl 28(%%ebp),%%esi | 160 | \\ movl 28(%%ebp),%%esi |
| 161 | \\ movl 32(%%ebp),%%edi | 161 | \\ movl 32(%%ebp),%%edi |
| 162 | \\ movl $120,%%eax // SYS_clone | 162 | \\ movl $120,%%eax // SYS_clone |
| 163 | \\ int $128 | 163 | \\ int $128 |
| 164 | \\ testl %%eax,%%eax | 164 | \\ testl %%eax,%%eax |
| 165 | \\ jz 1f | 165 | \\ jz 1f |
| 166 | \\ popl %%edi | 166 | \\ popl %%edi |
| 167 | \\ popl %%esi | 167 | \\ popl %%esi |
| 168 | \\ popl %%ebx | 168 | \\ popl %%ebx |
| 169 | \\ popl %%ebp | 169 | \\ popl %%ebp |
| 170 | \\ retl | 170 | \\ retl |
| 171 | \\ | 171 | \\ |
| 172 | \\1: | 172 | \\1: |
| 173 | ); | 173 | ); |
| 174 | if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile ( | 174 | if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile ( |
| 175 | \\ .cfi_undefined %%eip | 175 | \\ .cfi_undefined %%eip |
| 176 | ); | 176 | ); |
| 177 | asm volatile ( | 177 | asm volatile ( |
| 178 | \\ xorl %%ebp,%%ebp | 178 | \\ xorl %%ebp,%%ebp |
| 179 | \\ | 179 | \\ |
| 180 | \\ popl %%eax | 180 | \\ popl %%eax |
| 181 | \\ calll *%%eax | 181 | \\ calll *%%eax |
| 182 | \\ movl %%eax,%%ebx | 182 | \\ movl %%eax,%%ebx |
| 183 | \\ movl $1,%%eax // SYS_exit | 183 | \\ movl $1,%%eax // SYS_exit |
| 184 | \\ int $128 | 184 | \\ int $128 |
| 185 | ); | 185 | ); |
| 186 | } | 186 | } |
| 187 | 187 | ||
| 188 | pub fn restore() callconv(.naked) noreturn { | 188 | pub fn restore() callconv(.naked) noreturn { |
| 189 | switch (builtin.zig_backend) { | 189 | asm volatile ( |
| 190 | .stage2_c => asm volatile ( | 190 | \\ addl $4, %%esp |
| 191 | \\ addl $4, %%esp | 191 | \\ movl %[number], %%eax |
| 192 | \\ movl %[number], %%eax | 192 | \\ int $0x80 |
| 193 | \\ int $0x80 | 193 | : |
| 194 | : | 194 | : [number] "i" (@backingInt(SYS.sigreturn)), |
| 195 | : [number] "i" (@backingInt(SYS.sigreturn)), | 195 | ); |
| 196 | ), | ||
| 197 | else => asm volatile ( | ||
| 198 | \\ addl $4, %%esp | ||
| 199 | \\ int $0x80 | ||
| 200 | : | ||
| 201 | : [number] "{eax}" (@backingInt(SYS.sigreturn)), | ||
| 202 | ), | ||
| 203 | } | ||
| 204 | } | 196 | } |
| 205 | 197 | ||
| 206 | pub fn restore_rt() callconv(.naked) noreturn { | 198 | pub fn restore_rt() callconv(.naked) noreturn { |
| 207 | switch (builtin.zig_backend) { | 199 | asm volatile ( |
| 208 | .stage2_c => asm volatile ( | 200 | \\ movl %[number], %%eax |
| 209 | \\ movl %[number], %%eax | 201 | \\ int $0x80 |
| 210 | \\ int $0x80 | 202 | : |
| 211 | : | 203 | : [number] "i" (@backingInt(SYS.rt_sigreturn)), |
| 212 | : [number] "i" (@backingInt(SYS.rt_sigreturn)), | 204 | ); |
| 213 | ), | ||
| 214 | else => asm volatile ( | ||
| 215 | \\ int $0x80 | ||
| 216 | : | ||
| 217 | : [number] "{eax}" (@backingInt(SYS.rt_sigreturn)), | ||
| 218 | ), | ||
| 219 | } | ||
| 220 | } | 205 | } |
| 221 | 206 | ||
| 222 | pub const VDSO = struct { | 207 | pub const VDSO = struct { |
lib/std/os/linux/x86_64.zig+27-35| ... | @@ -111,54 +111,46 @@ pub fn syscall6( | ... | @@ -111,54 +111,46 @@ pub fn syscall6( |
| 111 | 111 | ||
| 112 | pub fn clone() callconv(.naked) u64 { | 112 | pub fn clone() callconv(.naked) u64 { |
| 113 | asm volatile ( | 113 | asm volatile ( |
| 114 | \\ movl $56,%%eax // SYS_clone | 114 | \\ movl $56,%%eax // SYS_clone |
| 115 | \\ movq %%rdi,%%r11 | 115 | \\ movq %%rdi,%%r11 |
| 116 | \\ movq %%rdx,%%rdi | 116 | \\ movq %%rdx,%%rdi |
| 117 | \\ movq %%r8,%%rdx | 117 | \\ movq %%r8,%%rdx |
| 118 | \\ movq %%r9,%%r8 | 118 | \\ movq %%r9,%%r8 |
| 119 | \\ movq 8(%%rsp),%%r10 | 119 | \\ movq 8(%%rsp),%%r10 |
| 120 | \\ movq %%r11,%%r9 | 120 | \\ movq %%r11,%%r9 |
| 121 | \\ andq $-16,%%rsi | 121 | \\ andq $-16,%%rsi |
| 122 | \\ subq $8,%%rsi | 122 | \\ subq $8,%%rsi |
| 123 | \\ movq %%rcx,(%%rsi) | 123 | \\ movq %%rcx,(%%rsi) |
| 124 | \\ syscall | 124 | \\ syscall |
| 125 | \\ testq %%rax,%%rax | 125 | \\ testq %%rax,%%rax |
| 126 | \\ jz 1f | 126 | \\ jz 1f |
| 127 | \\ retq | 127 | \\ retq |
| 128 | \\ | 128 | \\ |
| 129 | \\1: | 129 | \\1: |
| 130 | ); | 130 | ); |
| 131 | if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile ( | 131 | if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile ( |
| 132 | \\ .cfi_undefined %%rip | 132 | \\ .cfi_undefined %%rip |
| 133 | ); | 133 | ); |
| 134 | asm volatile ( | 134 | asm volatile ( |
| 135 | \\ xorl %%ebp,%%ebp | 135 | \\ xorl %%ebp,%%ebp |
| 136 | \\ | ||
| 137 | \\ popq %%rdi | ||
| 138 | \\ callq *%%r9 | ||
| 139 | \\ movl %%eax,%%edi | ||
| 140 | \\ movl $60,%%eax // SYS_exit | ||
| 141 | \\ syscall | ||
| 142 | \\ | 136 | \\ |
| 137 | \\ popq %%rdi | ||
| 138 | \\ callq *%%r9 | ||
| 139 | \\ movl %%eax,%%edi | ||
| 140 | \\ movl $60,%%eax // SYS_exit | ||
| 141 | \\ syscall | ||
| 143 | ); | 142 | ); |
| 144 | } | 143 | } |
| 145 | 144 | ||
| 146 | pub const restore = restore_rt; | 145 | pub const restore = restore_rt; |
| 147 | 146 | ||
| 148 | pub fn restore_rt() callconv(.naked) noreturn { | 147 | pub fn restore_rt() callconv(.naked) noreturn { |
| 149 | switch (builtin.zig_backend) { | 148 | asm volatile ( |
| 150 | .stage2_c => asm volatile ( | 149 | \\ movl %[number], %%eax |
| 151 | \\ movl %[number], %%eax | 150 | \\ syscall |
| 152 | \\ syscall | 151 | : |
| 153 | : | 152 | : [number] "i" (@backingInt(SYS.rt_sigreturn)), |
| 154 | : [number] "i" (@backingInt(SYS.rt_sigreturn)), | 153 | ); |
| 155 | ), | ||
| 156 | else => asm volatile ( | ||
| 157 | \\ syscall | ||
| 158 | : | ||
| 159 | : [number] "{rax}" (@backingInt(SYS.rt_sigreturn)), | ||
| 160 | ), | ||
| 161 | } | ||
| 162 | } | 154 | } |
| 163 | 155 | ||
| 164 | pub const time_t = i64; | 156 | pub const time_t = i64; |
lib/std/os/linux/xtensa.zig+6-13| ... | @@ -173,19 +173,12 @@ pub fn clone() callconv(.naked) u32 { | ... | @@ -173,19 +173,12 @@ pub fn clone() callconv(.naked) u32 { |
| 173 | pub const restore = restore_rt; | 173 | pub const restore = restore_rt; |
| 174 | 174 | ||
| 175 | pub fn restore_rt() callconv(.naked) noreturn { | 175 | pub fn restore_rt() callconv(.naked) noreturn { |
| 176 | switch (builtin.zig_backend) { | 176 | asm volatile ( |
| 177 | .stage2_c => asm volatile ( | 177 | \\ movi a2, %[number] |
| 178 | \\ movi a2, %[number] | 178 | \\ syscall |
| 179 | \\ syscall | 179 | : |
| 180 | : | 180 | : [number] "I" (@backingInt(SYS.rt_sigreturn)), |
| 181 | : [number] "I" (@backingInt(SYS.rt_sigreturn)), | 181 | ); |
| 182 | ), | ||
| 183 | else => asm volatile ( | ||
| 184 | \\ syscall | ||
| 185 | : | ||
| 186 | : [number] "{a2}" (@backingInt(SYS.rt_sigreturn)), | ||
| 187 | ), | ||
| 188 | } | ||
| 189 | } | 182 | } |
| 190 | 183 | ||
| 191 | pub const VDSO = void; | 184 | pub const VDSO = void; |
lib/std/pie.zig+42-21| ... | @@ -83,7 +83,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn { | ... | @@ -83,7 +83,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn { |
| 83 | \\ add %[ret], pc | 83 | \\ add %[ret], pc |
| 84 | \\ b 2f | 84 | \\ b 2f |
| 85 | \\1: | 85 | \\1: |
| 86 | \\ .word _DYNAMIC-1b | 86 | \\ .word _DYNAMIC - 1b |
| 87 | \\2: | 87 | \\2: |
| 88 | : [ret] "=r" (-> [*]const elf.Dyn), | 88 | : [ret] "=r" (-> [*]const elf.Dyn), |
| 89 | ), | 89 | ), |
| ... | @@ -97,20 +97,29 @@ inline fn getDynamicSymbol() [*]const elf.Dyn { | ... | @@ -97,20 +97,29 @@ inline fn getDynamicSymbol() [*]const elf.Dyn { |
| 97 | ), | 97 | ), |
| 98 | // The compiler is not required to load the GP register, so do it ourselves. | 98 | // The compiler is not required to load the GP register, so do it ourselves. |
| 99 | .alpha => asm volatile ( | 99 | .alpha => asm volatile ( |
| 100 | \\ .weak _DYNAMIC | ||
| 101 | \\ .hidden _DYNAMIC | ||
| 100 | \\ br $29, 1f | 102 | \\ br $29, 1f |
| 101 | \\1: | 103 | \\1: |
| 102 | \\ ldgp $29, 0($29) | 104 | \\ ldgp $29, 0($29) |
| 103 | \\ ldq %[ret], -0x8000($29) | 105 | \\ ldah %[ret], _DYNAMIC($29) !gprelhigh |
| 106 | \\ lda %[ret], _DYNAMIC(%[ret]) !gprellow | ||
| 104 | : [ret] "=r" (-> [*]const elf.Dyn), | 107 | : [ret] "=r" (-> [*]const elf.Dyn), |
| 105 | : | 108 | : |
| 106 | : .{ .r26 = true, .r29 = true }), | 109 | : .{ .r29 = true }), |
| 107 | // The CSKY ABI requires the gb register to point to the GOT. Additionally, the first | ||
| 108 | // entry in the GOT is defined to hold the address of _DYNAMIC. | ||
| 109 | .csky => asm volatile ( | 110 | .csky => asm volatile ( |
| 110 | \\ mov %[ret], gb | 111 | \\ .weak _DYNAMIC |
| 111 | \\ ldw %[ret], %[ret] | 112 | \\ .hidden _DYNAMIC |
| 113 | \\ grs %[ret], 1f | ||
| 114 | \\ br 2f | ||
| 115 | \\1: | ||
| 116 | \\ .long _DYNAMIC - 1b | ||
| 117 | \\2: | ||
| 118 | \\ ldw r12, (%[ret], 0) | ||
| 119 | \\ addu %[ret], %[ret], r12 | ||
| 112 | : [ret] "=r" (-> [*]const elf.Dyn), | 120 | : [ret] "=r" (-> [*]const elf.Dyn), |
| 113 | ), | 121 | : |
| 122 | : .{ .r12 = true }), | ||
| 114 | .hexagon => asm volatile ( | 123 | .hexagon => asm volatile ( |
| 115 | \\ .weak _DYNAMIC | 124 | \\ .weak _DYNAMIC |
| 116 | \\ .hidden _DYNAMIC | 125 | \\ .hidden _DYNAMIC |
| ... | @@ -143,12 +152,20 @@ inline fn getDynamicSymbol() [*]const elf.Dyn { | ... | @@ -143,12 +152,20 @@ inline fn getDynamicSymbol() [*]const elf.Dyn { |
| 143 | \\ .hidden _DYNAMIC | 152 | \\ .hidden _DYNAMIC |
| 144 | \\ lea _DYNAMIC - . - 8, %[ret] | 153 | \\ lea _DYNAMIC - . - 8, %[ret] |
| 145 | \\ lea (%[ret], %%pc), %[ret] | 154 | \\ lea (%[ret], %%pc), %[ret] |
| 146 | : [ret] "=r" (-> [*]const elf.Dyn), | 155 | : [ret] "=a" (-> [*]const elf.Dyn), |
| 147 | ), | 156 | ), |
| 148 | .microblaze, .microblazeel => asm volatile ( | 157 | .microblaze, .microblazeel => asm volatile ( |
| 149 | \\ lwi %[ret], r20, 0 | 158 | \\ .weak _DYNAMIC |
| 159 | \\ .hidden _DYNAMIC | ||
| 160 | \\ mfs %[ret], rpc | ||
| 161 | \\ bri 1f | ||
| 162 | \\ .word _DYNAMIC - . + 8 | ||
| 163 | \\1: | ||
| 164 | \\ lwi r18, %[ret], 8 | ||
| 165 | \\ add %[ret], %[ret], r18 | ||
| 150 | : [ret] "=r" (-> [*]const elf.Dyn), | 166 | : [ret] "=r" (-> [*]const elf.Dyn), |
| 151 | ), | 167 | : |
| 168 | : .{ .r18 = true }), | ||
| 152 | .mips, .mipsel => asm volatile ( | 169 | .mips, .mipsel => asm volatile ( |
| 153 | \\ .weak _DYNAMIC | 170 | \\ .weak _DYNAMIC |
| 154 | \\ .hidden _DYNAMIC | 171 | \\ .hidden _DYNAMIC |
| ... | @@ -190,6 +207,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn { | ... | @@ -190,6 +207,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn { |
| 190 | \\ .weak _DYNAMIC | 207 | \\ .weak _DYNAMIC |
| 191 | \\ .hidden _DYNAMIC | 208 | \\ .hidden _DYNAMIC |
| 192 | \\ l.jal 1f | 209 | \\ l.jal 1f |
| 210 | \\ l.nop | ||
| 193 | \\ .word _DYNAMIC - . | 211 | \\ .word _DYNAMIC - . |
| 194 | \\1: | 212 | \\1: |
| 195 | \\ l.lwz %[ret], 0(r9) | 213 | \\ l.lwz %[ret], 0(r9) |
| ... | @@ -212,11 +230,13 @@ inline fn getDynamicSymbol() [*]const elf.Dyn { | ... | @@ -212,11 +230,13 @@ inline fn getDynamicSymbol() [*]const elf.Dyn { |
| 212 | .powerpc64, .powerpc64le => asm volatile ( | 230 | .powerpc64, .powerpc64le => asm volatile ( |
| 213 | \\ .weak _DYNAMIC | 231 | \\ .weak _DYNAMIC |
| 214 | \\ .hidden _DYNAMIC | 232 | \\ .hidden _DYNAMIC |
| 233 | \\ .balign 8 | ||
| 215 | \\ bl 1f | 234 | \\ bl 1f |
| 235 | \\ nop | ||
| 216 | \\ .quad _DYNAMIC - . | 236 | \\ .quad _DYNAMIC - . |
| 217 | \\1: | 237 | \\1: |
| 218 | \\ mflr %[ret] | 238 | \\ mflr %[ret] |
| 219 | \\ ld 4, 0(%[ret]) | 239 | \\ ld 4, 4(%[ret]) |
| 220 | \\ add %[ret], 4, %[ret] | 240 | \\ add %[ret], 4, %[ret] |
| 221 | : [ret] "=r" (-> [*]const elf.Dyn), | 241 | : [ret] "=r" (-> [*]const elf.Dyn), |
| 222 | : | 242 | : |
| ... | @@ -245,24 +265,25 @@ inline fn getDynamicSymbol() [*]const elf.Dyn { | ... | @@ -245,24 +265,25 @@ inline fn getDynamicSymbol() [*]const elf.Dyn { |
| 245 | \\ mov.l 1f, %[ret] | 265 | \\ mov.l 1f, %[ret] |
| 246 | \\ add r0, %[ret] | 266 | \\ add r0, %[ret] |
| 247 | \\ bra 2f | 267 | \\ bra 2f |
| 248 | \\1: | 268 | \\ nop |
| 249 | \\ .balign 4 | 269 | \\ .balign 4 |
| 250 | \\ .long DYNAMIC - . | 270 | \\1: |
| 271 | \\ .long _DYNAMIC - . | ||
| 251 | \\2: | 272 | \\2: |
| 252 | : [ret] "=r" (-> [*]const elf.Dyn), | 273 | : [ret] "=r" (-> [*]const elf.Dyn), |
| 253 | : | 274 | : |
| 254 | : .{ .r0 = true }), | 275 | : .{ .r0 = true }), |
| 255 | // The compiler does not necessarily have any obligation to load the `l7` register (pointing | ||
| 256 | // to the GOT), so do it ourselves just in case. | ||
| 257 | .sparc, .sparc64 => asm volatile ( | 276 | .sparc, .sparc64 => asm volatile ( |
| 258 | \\ sethi %%hi(_GLOBAL_OFFSET_TABLE_ - 4), %%l7 | 277 | \\ .weak _DYNAMIC |
| 278 | \\ .hidden _DYNAMIC | ||
| 279 | \\ sethi %%pc22(_DYNAMIC - 4), %[ret] | ||
| 259 | \\ call 1f | 280 | \\ call 1f |
| 260 | \\ add %%l7, %%lo(_GLOBAL_OFFSET_TABLE_ + 4), %%l7 | 281 | \\ add %[ret], %%pc10(_DYNAMIC + 4), %[ret] |
| 261 | \\1: | 282 | \\1: |
| 262 | \\ add %%l7, %%o7, %[ret] | 283 | \\ add %[ret], %%o7, %[ret] |
| 263 | : [ret] "=r" (-> [*]const elf.Dyn), | 284 | : [ret] "=r" (-> [*]const elf.Dyn), |
| 264 | : | 285 | : |
| 265 | : .{ .l7 = true }), | 286 | : .{ .o7 = true }), |
| 266 | .xtensa, .xtensaeb => asm volatile ( | 287 | .xtensa, .xtensaeb => asm volatile ( |
| 267 | \\ .weak _DYNAMIC | 288 | \\ .weak _DYNAMIC |
| 268 | \\ .hidden _DYNAMIC | 289 | \\ .hidden _DYNAMIC |
| ... | @@ -274,7 +295,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn { | ... | @@ -274,7 +295,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn { |
| 274 | \\ .balign 4 | 295 | \\ .balign 4 |
| 275 | \\ .word _DYNAMIC - . | 296 | \\ .word _DYNAMIC - . |
| 276 | \\1: | 297 | \\1: |
| 277 | \\ add a0, a0, 1 | 298 | \\ addi a0, a0, 1 |
| 278 | \\ l32i a8, a0, 0 | 299 | \\ l32i a8, a0, 0 |
| 279 | \\ add %[ret], a0, a8 | 300 | \\ add %[ret], a0, a8 |
| 280 | : [ret] "=a" (-> [*]const elf.Dyn), | 301 | : [ret] "=a" (-> [*]const elf.Dyn), |
lib/std/start.zig+26-20| ... | @@ -247,7 +247,7 @@ fn _start() callconv(.naked) noreturn { | ... | @@ -247,7 +247,7 @@ fn _start() callconv(.naked) noreturn { |
| 247 | \\ mov $30, $16 | 247 | \\ mov $30, $16 |
| 248 | \\ ldi $1, -16 | 248 | \\ ldi $1, -16 |
| 249 | \\ and $30, $30, $1 | 249 | \\ and $30, $30, $1 |
| 250 | \\ jsr $26, %[posixCallMainAndExit] | 250 | \\ br $31, %[posixCallMainAndExit] |
| 251 | , | 251 | , |
| 252 | .arc, .arceb => | 252 | .arc, .arceb => |
| 253 | // ARC v1 and v2 had a very low stack alignment requirement of 4; v3 increased it to 16. | 253 | // ARC v1 and v2 had a very low stack alignment requirement of 4; v3 increased it to 16. |
| ... | @@ -276,14 +276,16 @@ fn _start() callconv(.naked) noreturn { | ... | @@ -276,14 +276,16 @@ fn _start() callconv(.naked) noreturn { |
| 276 | // `_DYNAMIC` as well. | 276 | // `_DYNAMIC` as well. |
| 277 | // r8 = FP | 277 | // r8 = FP |
| 278 | \\ grs t0, 1f | 278 | \\ grs t0, 1f |
| 279 | \\ 1: | 279 | \\1: |
| 280 | \\ lrw gb, 1b@GOTPC | 280 | \\ lrw gb, 1b@GOTPC |
| 281 | \\ addu gb, t0 | 281 | \\ addu gb, t0 |
| 282 | \\ movi r8, 0 | 282 | \\ movi r8, 0 |
| 283 | \\ movi lr, 0 | 283 | \\ movi lr, 0 |
| 284 | \\ mov a0, sp | 284 | \\ mov a0, sp |
| 285 | \\ andi sp, sp, -8 | 285 | \\ andni sp, sp, 7 |
| 286 | \\ jmpi %[posixCallMainAndExit] | 286 | \\ lrw t1, %[posixCallMainAndExit]@GOTOFF |
| 287 | \\ addu t1, gb | ||
| 288 | \\ jmp t1 | ||
| 287 | , | 289 | , |
| 288 | .hexagon => | 290 | .hexagon => |
| 289 | // r29 = SP, r30 = FP, r31 = LR | 291 | // r29 = SP, r30 = FP, r31 = LR |
| ... | @@ -293,7 +295,7 @@ fn _start() callconv(.naked) noreturn { | ... | @@ -293,7 +295,7 @@ fn _start() callconv(.naked) noreturn { |
| 293 | \\ r29 = and(r29, #-8) | 295 | \\ r29 = and(r29, #-8) |
| 294 | \\ memw(r29 + #-8) = r29 | 296 | \\ memw(r29 + #-8) = r29 |
| 295 | \\ r29 = add(r29, #-8) | 297 | \\ r29 = add(r29, #-8) |
| 296 | \\ call %[posixCallMainAndExit] | 298 | \\ jump %[posixCallMainAndExit] |
| 297 | , | 299 | , |
| 298 | .kvx => | 300 | .kvx => |
| 299 | \\ make $fp = 0 | 301 | \\ make $fp = 0 |
| ... | @@ -324,15 +326,17 @@ fn _start() callconv(.naked) noreturn { | ... | @@ -324,15 +326,17 @@ fn _start() callconv(.naked) noreturn { |
| 324 | \\ l.ori r2, r0, 0 | 326 | \\ l.ori r2, r0, 0 |
| 325 | \\ l.ori r9, r0, 0 | 327 | \\ l.ori r9, r0, 0 |
| 326 | \\ l.ori r3, r1, 0 | 328 | \\ l.ori r3, r1, 0 |
| 327 | \\ l.andi r1, r1, -4 | 329 | \\ l.addi r13, r0, -4 |
| 328 | \\ l.jal %[posixCallMainAndExit] | 330 | \\ l.and r1, r1, r13 |
| 331 | \\ l.j %[posixCallMainAndExit] | ||
| 332 | \\ l.nop | ||
| 329 | , | 333 | , |
| 330 | .riscv32, .riscv32be, .riscv64, .riscv64be => | 334 | .riscv32, .riscv32be, .riscv64, .riscv64be => |
| 331 | \\ li fp, 0 | 335 | \\ li fp, 0 |
| 332 | \\ li ra, 0 | 336 | \\ li ra, 0 |
| 333 | \\ mv a0, sp | 337 | \\ mv a0, sp |
| 334 | \\ andi sp, sp, -16 | 338 | \\ andi sp, sp, -16 |
| 335 | \\ tail %[posixCallMainAndExit]@plt | 339 | \\ tail %[posixCallMainAndExit] |
| 336 | , | 340 | , |
| 337 | .m68k => | 341 | .m68k => |
| 338 | // Note that the - 8 is needed because pc in the jsr instruction points into the middle | 342 | // Note that the - 8 is needed because pc in the jsr instruction points into the middle |
| ... | @@ -354,7 +358,7 @@ fn _start() callconv(.naked) noreturn { | ... | @@ -354,7 +358,7 @@ fn _start() callconv(.naked) noreturn { |
| 354 | \\ or %%r1, %%r0, %%r0 | 358 | \\ or %%r1, %%r0, %%r0 |
| 355 | \\ or %%r2, %%r31, %%r0 | 359 | \\ or %%r2, %%r31, %%r0 |
| 356 | \\ clr %%r31, %%r31, 4<0> | 360 | \\ clr %%r31, %%r31, 4<0> |
| 357 | \\ br.n %[posixCallMainAndExit] | 361 | \\ br %[posixCallMainAndExit] |
| 358 | , | 362 | , |
| 359 | .microblaze, .microblazeel => | 363 | .microblaze, .microblazeel => |
| 360 | // r1 = SP, r15 = LR, r19 = FP, r20 = GP | 364 | // r1 = SP, r15 = LR, r19 = FP, r20 = GP |
| ... | @@ -364,7 +368,7 @@ fn _start() callconv(.naked) noreturn { | ... | @@ -364,7 +368,7 @@ fn _start() callconv(.naked) noreturn { |
| 364 | \\ addi r20, r20, _GLOBAL_OFFSET_TABLE_ + 8 | 368 | \\ addi r20, r20, _GLOBAL_OFFSET_TABLE_ + 8 |
| 365 | \\ ori r5, r1, 0 | 369 | \\ ori r5, r1, 0 |
| 366 | \\ andi r1, r1, -4 | 370 | \\ andi r1, r1, -4 |
| 367 | \\ brlid r15, %[posixCallMainAndExit] | 371 | \\ bri %[posixCallMainAndExit] |
| 368 | , | 372 | , |
| 369 | .mips, .mipsel => | 373 | .mips, .mipsel => |
| 370 | \\ move $fp, $zero | 374 | \\ move $fp, $zero |
| ... | @@ -383,7 +387,7 @@ fn _start() callconv(.naked) noreturn { | ... | @@ -383,7 +387,7 @@ fn _start() callconv(.naked) noreturn { |
| 383 | \\ move $a0, $sp | 387 | \\ move $a0, $sp |
| 384 | \\ and $sp, -8 | 388 | \\ and $sp, -8 |
| 385 | \\ subu $sp, $sp, 16 | 389 | \\ subu $sp, $sp, 16 |
| 386 | \\ jalr $t9 | 390 | \\ jr $t9 |
| 387 | , | 391 | , |
| 388 | .mips64, .mips64el => switch (builtin.abi) { | 392 | .mips64, .mips64el => switch (builtin.abi) { |
| 389 | .gnuabin32, .muslabin32, .abin32 => | 393 | .gnuabin32, .muslabin32, .abin32 => |
| ... | @@ -399,9 +403,9 @@ fn _start() callconv(.naked) noreturn { | ... | @@ -399,9 +403,9 @@ fn _start() callconv(.naked) noreturn { |
| 399 | \\ addu $t9, $t9, $gp | 403 | \\ addu $t9, $t9, $gp |
| 400 | \\ move $ra, $zero | 404 | \\ move $ra, $zero |
| 401 | \\ move $a0, $sp | 405 | \\ move $a0, $sp |
| 402 | \\ and $sp, -8 | 406 | \\ and $sp, -16 |
| 403 | \\ subu $sp, $sp, 16 | 407 | \\ subu $sp, $sp, 16 |
| 404 | \\ jalr $t9 | 408 | \\ jr $t9 |
| 405 | , | 409 | , |
| 406 | else => | 410 | else => |
| 407 | \\ move $fp, $zero | 411 | \\ move $fp, $zero |
| ... | @@ -422,7 +426,7 @@ fn _start() callconv(.naked) noreturn { | ... | @@ -422,7 +426,7 @@ fn _start() callconv(.naked) noreturn { |
| 422 | \\ move $a0, $sp | 426 | \\ move $a0, $sp |
| 423 | \\ and $sp, -16 | 427 | \\ and $sp, -16 |
| 424 | \\ dsubu $sp, $sp, 16 | 428 | \\ dsubu $sp, $sp, 16 |
| 425 | \\ jalr $t9 | 429 | \\ jr $t9 |
| 426 | , | 430 | , |
| 427 | }, | 431 | }, |
| 428 | .powerpc, .powerpcle => | 432 | .powerpc, .powerpcle => |
| ... | @@ -434,7 +438,7 @@ fn _start() callconv(.naked) noreturn { | ... | @@ -434,7 +438,7 @@ fn _start() callconv(.naked) noreturn { |
| 434 | \\ stwu 1, -16(1) | 438 | \\ stwu 1, -16(1) |
| 435 | \\ stw 0, 0(1) | 439 | \\ stw 0, 0(1) |
| 436 | \\ li 31, 0 | 440 | \\ li 31, 0 |
| 437 | \\ mtlr 0 | 441 | \\ mtlr 31 |
| 438 | \\ b %[posixCallMainAndExit] | 442 | \\ b %[posixCallMainAndExit] |
| 439 | , | 443 | , |
| 440 | .powerpc64, .powerpc64le => | 444 | .powerpc64, .powerpc64le => |
| ... | @@ -447,7 +451,7 @@ fn _start() callconv(.naked) noreturn { | ... | @@ -447,7 +451,7 @@ fn _start() callconv(.naked) noreturn { |
| 447 | \\ li 0, 0 | 451 | \\ li 0, 0 |
| 448 | \\ stdu 0, -32(1) | 452 | \\ stdu 0, -32(1) |
| 449 | \\ li 31, 0 | 453 | \\ li 31, 0 |
| 450 | \\ mtlr 0 | 454 | \\ mtlr 31 |
| 451 | \\ b %[posixCallMainAndExit] | 455 | \\ b %[posixCallMainAndExit] |
| 452 | \\ nop | 456 | \\ nop |
| 453 | , | 457 | , |
| ... | @@ -472,12 +476,14 @@ fn _start() callconv(.naked) noreturn { | ... | @@ -472,12 +476,14 @@ fn _start() callconv(.naked) noreturn { |
| 472 | \\ mov r15, r4 | 476 | \\ mov r15, r4 |
| 473 | \\ mov #-4, r0 | 477 | \\ mov #-4, r0 |
| 474 | \\ and r0, r15 | 478 | \\ and r0, r15 |
| 479 | \\ mova 2f, r0 | ||
| 475 | \\ mov.l 2f, r1 | 480 | \\ mov.l 2f, r1 |
| 476 | \\1: | 481 | \\ add r0, r1 |
| 477 | \\ bsrf r1 | 482 | \\ jmp @r1 |
| 478 | \\2: | 483 | \\ nop |
| 479 | \\ .balign 4 | 484 | \\ .balign 4 |
| 480 | \\ .long %[posixCallMainAndExit]@PCREL - (1b + 4 - .) | 485 | \\1: |
| 486 | \\ .long %[posixCallMainAndExit] - . | ||
| 481 | , | 487 | , |
| 482 | .sparc => | 488 | .sparc => |
| 483 | // argc is stored after a register window (16 registers * 4 bytes). | 489 | // argc is stored after a register window (16 registers * 4 bytes). |