authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-08-10 22:18:25+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-08-10 22:18:25+02:00
log6217b02f2540e32acedee8d0f2f3830ea8ae0d28
treec96b867a46dc16a336d77c62cf9aad1fa7030c9a
parentf6e32d1b3a5de1626c3fdf5527b565dae1c501a0
parent8217f26ef8ddab9eb02a9d380d6509c39ac2d0f3

Merge pull request 'std: inline assembly cleanup and fixes' (#36459) from alexrp/zig:asm-cleanup into master

Reviewed-on: https://codeberg.org/ziglang/zig/pulls/36459

28 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:
1616
17# store non-volatile regs r30, r31 on stack in order to put our17# store non-volatile regs r30, r31 on stack in order to put our
18# start func and its arg there18# start func and its arg there
19stwu 30, -16(1)19stwu 1, -16(1)
20stw 31, 4(1)20stw 30, 8(1)
21stw 31, 12(1)
2122
22# save r3 (func) into r30, and r6(arg) into r3123# save r3 (func) into r30, and r6(arg) into r31
23mr 30, 324mr 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 return52# if not 0, restore stack and return
52beq cr7, 2f53beq cr7, 2f
5354
54lwz 30, 0(1)55lwz 30, 8(1)
55lwz 31, 4(1)56lwz 31, 12(1)
56addi 1, 1, 1657addi 1, 1, 16
5758
58blr59blr
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_munmap1169 \\ movl $91, %%eax # SYS_munmap
1170 \\ int $1281170 \\ int $128
1171 \\ movl $1, %%eax # SYS_exit1171 \\ movl $1, %%eax # SYS_exit
1172 \\ movl $0, %%ebx1172 \\ movl $0, %%ebx
1173 \\ int $1281173 \\ 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_munmap1180 \\ movl $0x4000000b, %%eax # SYS_munmap
1181 \\ syscall1181 \\ syscall
1182 \\ movl $0x4000003c, %%eax # SYS_exit1182 \\ movl $0x4000003c, %%eax # SYS_exit
1183 \\ xor %%rdi, %%rdi1183 \\ xor %%rdi, %%rdi
1184 \\ syscall1184 \\ syscall
1185 ,1185 ,
1186 else =>1186 else =>
1187 \\ movl $11, %%eax # SYS_munmap1187 \\ movl $11, %%eax # SYS_munmap
1188 \\ syscall1188 \\ syscall
1189 \\ movl $60, %%eax # SYS_exit1189 \\ movl $60, %%eax # SYS_exit
1190 \\ xor %%rdi, %%rdi1190 \\ xor %%rdi, %%rdi
1191 \\ syscall1191 \\ 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_munmap1199 \\ mov r7, #91 // SYS_munmap
1200 \\ svc 01200 \\ svc 0
1201 \\ mov r7, #1 // SYS_exit1201 \\ mov r7, #1 // SYS_exit
1202 \\ mov r0, #01202 \\ mov r0, #0
1203 \\ svc 01203 \\ 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_munmap1209 \\ mov x8, #215 // SYS_munmap
1210 \\ svc 01210 \\ svc 0
1211 \\ mov x8, #93 // SYS_exit1211 \\ mov x8, #93 // SYS_exit
1212 \\ mov x0, #01212 \\ mov x0, #0
1213 \\ svc 01213 \\ 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_munmap1239 \\ r6 = #215 // SYS_munmap
1240 \\ trap0(#1)1240 \\ trap0(#1)
1241 \\ r6 = #93 // SYS_exit1241 \\ r6 = #93 // SYS_exit
1242 \\ r0 = #01242 \\ 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, %%r261251 \\ 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_munmap1279 \\ li $v0, 4091 # SYS_munmap
1285 \\ syscall1280 \\ syscall
1286 \\ li $v0, 4001 # SYS_exit1281 \\ 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_munmap1309 \\ l.ori r11, r0, 215 # SYS_munmap
1315 \\ l.sys 11310 \\ l.sys 1
1316 \\ l.ori r11, r0, 93 # SYS_exit1311 \\ l.ori r11, r0, 93 # SYS_exit
1317 \\ l.ori r3, r0, r01312 \\ l.ori r3, r0, 0
1318 \\ l.sys 11313 \\ 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_munmap1319 \\ li 0, 91 # SYS_munmap
1325 \\ sc1320 \\ sc
1326 \\ li 0, 1 # SYS_exit1321 \\ li 0, 1 # SYS_exit
1327 \\ li 3, 01322 \\ li 3, 0
1328 \\ sc1323 \\ 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_munmap1329 \\ li a7, 215 # SYS_munmap
1336 \\ ecall1330 \\ ecall
1337 \\ li a7, 93 # SYS_exit1331 \\ li a7, 93 # SYS_exit
1338 \\ mv a0, zero1332 \\ mv a0, zero
1339 \\ ecall1333 \\ 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_munmap1339 \\ svc 91 # SYS_munmap
1346 \\ lghi %%r2, 01340 \\ lghi %%r2, 0
1347 \\ svc 1 # SYS_exit1341 \\ 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 \\ flushw1384 \\ 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_munmap1402 \\ ori $a7, $zero, 215 # SYS_munmap
1409 \\ syscall 0 # call munmap1403 \\ 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_munmap1412 \\ movi r7, 215 # SYS_munmap
1419 \\ trap 01413 \\ 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_munmap1422 \\ movi a2, 81 // SYS_munmap
1429 \\ syscall1423 \\ 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"),
379379
380 // `yield` was introduced in v6k but is also available on v6m.
381 // https://www.keil.com/support/man/docs/armasm/armasm_dom1361289926796.htm380 // 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 },
389392
...@@ -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)"),
394397
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 },
402413
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, 1f354 \\ 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 }
472474
...@@ -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.
637const Kvx = extern struct {639const Kvx = extern struct {
638 r: [64]Gpr,640 r: [64]Gpr,
639 ra: Gpr,
640 pc: Gpr,641 pc: Gpr,
642 ra: Gpr,
641643
642 pub const Gpr = u64;644 pub const Gpr = u64;
643645
...@@ -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 {
763765
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]),
767769
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 1f1043 \\ bal 1f
1044 \\ nop
1042 \\1:1045 \\1:
1043 \\ sd $ra, 256($t0)1046 \\ sd $ra, 256($t0)
1044 \\ .set pop1047 \\ .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 1f1085 \\ bal 1f
1086 \\ nop
1083 \\1:1087 \\1:
1084 \\ sw $ra, 128($t4)1088 \\ sw $ra, 128($t4)
1085 \\ .set pop1089 \\ .set pop
...@@ -1164,6 +1168,7 @@ const Or1k = extern struct {...@@ -1164,6 +1168,7 @@ const Or1k = extern struct {
1164 \\ l.sw 120(r15), r301168 \\ l.sw 120(r15), r30
1165 \\ l.sw 124(r15), r311169 \\ l.sw 124(r15), r31
1166 \\ l.jal 1f1170 \\ l.jal 1f
1171 \\ l.nop
1167 \\1:1172 \\1:
1168 \\ l.sw 128(r15), r91173 \\ l.sw 128(r15), r9
1169 :1174 :
...@@ -1512,7 +1517,7 @@ const S390x = extern struct {...@@ -1512,7 +1517,7 @@ const S390x = extern struct {
15121517
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.
1514const Sparc = extern struct {1519const 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 {
15251530
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 1f1565 \\ call 1f
1566 \\ nop
1561 \\1:1567 \\1:
1562 \\ stx %o7, [%l0 + 256]1568 \\ stx %%o7, [%%l0 + 256]
1563 else1569 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 1f1586 \\ 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
16121623
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 1f1703 \\ 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, x4117 // x8, x0, x1, x2, x3, x4
118 asm volatile (118 asm volatile (
119 \\ // align stack and save func,arg119 \\ // align stack and save func,arg
120 \\ and x1,x1,#-16120 \\ and x1,x1,#-16
121 \\ stp x0,x3,[x1,#-16]!121 \\ stp x0,x3,[x1,#-16]!
122 \\122 \\
123 \\ // syscall123 \\ // syscall
124 \\ uxtw x0,w2124 \\ uxtw x0,w2
125 \\ mov x2,x4125 \\ mov x2,x4
126 \\ mov x3,x5126 \\ mov x3,x5
127 \\ mov x4,x6127 \\ mov x4,x6
128 \\ mov x8,#220 // SYS_clone128 \\ mov x8,#220 // SYS_clone
129 \\ svc #0129 \\ svc #0
130 \\130 \\
131 \\ cbz x0,1f131 \\ cbz x0,1f
132 \\ // parent132 \\ // parent
133 \\ ret133 \\ ret
134 \\134 \\
135 \\ // child135 \\ // 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 lr139 \\ .cfi_undefined lr
140 );140 );
141 asm volatile (141 asm volatile (
142 \\ mov fp, 0142 \\ mov fp, 0
143 \\ mov lr, 0143 \\ mov lr, 0
144 \\144 \\
145 \\ ldp x1,x0,[sp],#16145 \\ ldp x1,x0,[sp],#16
146 \\ blr x1146 \\ blr x1
147 \\ mov x8,#93 // SYS_exit147 \\ mov x8,#93 // SYS_exit
148 \\ svc #0148 \\ svc #0
149 );149 );
150}150}
151151
152pub const restore = restore_rt;152pub const restore = restore_rt;
153153
154pub fn restore_rt() callconv(.naked) noreturn {154pub 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 #0158 :
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}
169162
170pub const VDSO = struct {163pub 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 = $0296 // a4 = $20, a5 = $21, sp = $30, v0 = $0
297 \\ # Save function pointer and argument pointer on new thread stack297 \\ # Save function pointer and argument pointer on new thread stack
298 \\ ldi $1, -8298 \\ ldi $1, -16
299 \\ and $17, $17, $1299 \\ 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 $26323 \\ .cfi_undefined $26
324 );324 );
325 asm volatile (325 asm volatile (
326 // v0 = $0, t9 = $23, a0 = $16, ra = $26, sp = $30, fp = $15326 // v0 = $0, a0 = $16, ra = $26, sp = $30, fp = $15, pv = $27
327 \\ mov 0, $15327 \\ 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, $16334 \\ mov $0, $16
335 \\ ldi $0, 1 # SYS_EXIT335 \\ ldi $0, 1 # SYS_exit
336 \\ callsys336 \\ 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 = $30342 // v0 = $0, a0 = $16, sp = $30
343 \\ mov $30, $16343 \\ mov $30, $16
344 \\ ldi $0, 103 # SIGRETURN344 \\ ldi $0, 103 # SYS_sigreturn
345 \\ callsys345 \\ 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 = $30351 // v0 = $0, a0 = $16, sp = $30
352 \\ mov $30, $16352 \\ mov $30, $16
353 \\ ldi $0, 351 # RT_SIGRETURN353 \\ ldi $0, 351 # SYS_rt_sigreturn
354 \\ callsys354 \\ 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, r4117 // r8 r0, r1, r2, r3, r4
118 asm volatile (118 asm volatile (
119 \\ // Align stack pointer119 \\ // Align stack pointer
120 \\ and r1, r1, -16120 \\ and r1, r1, -16
121 \\ mov r10, r0121 \\ mov r10, r0
122 \\ mov r11, r3122 \\ mov r11, r3
123 \\ // Setup the arguments123 \\ // Setup the arguments
124 \\ mov r0, r2124 \\ mov r0, r2
125 \\ mov r2, r4125 \\ mov r2, r4
126 \\ mov r3, r5126 \\ mov r3, r5
127 \\ mov r4, r6127 \\ mov r4, r6
128 \\ mov r8, 220 // SYS_clone128 \\ mov r8, 220 // SYS_clone
129 \\ trap_s 0129 \\ trap_s 0
130 \\ cmp r0, 0130 \\ cmp r0, 0
131 \\ beq 1f131 \\ beq 1f
132 \\ j [blink]132 \\ j [blink]
133 \\ // Child133 \\ // 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 blink137 \\ .cfi_undefined blink
138 );138 );
139139
140 asm volatile (140 asm volatile (
141 \\ mov fp, 0141 \\ mov fp, 0
142 \\ mov blink, 0142 \\ mov blink, 0
143 \\143 \\
144 \\ mov r0, r11144 \\ mov r0, r11
145 \\ jl [r10]145 \\ jl [r10]
146 \\146 \\
147 \\ // Exit147 \\ // Exit
148 \\ mov r8, 93 // SYS_exit148 \\ mov r8, 93 // SYS_exit
149 \\ trap_s 0149 \\ trap_s 0
150 );150 );
151}151}
152152
153pub const restore = restore_rt;153pub const restore = restore_rt;
154154
155pub fn restore_rt() callconv(.naked) noreturn {155pub 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 0159 :
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}
170163
171pub const time_t = i64;164pub 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, r4117 // 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_clone120 \\ mov r7,#120 // SYS_clone
121 \\ mov r6,r3121 \\ mov r6,r3
122 \\ mov r5,r0122 \\ mov r5,r0
123 \\ mov r0,r2123 \\ mov r0,r2
124 \\ and r1,r1,#-16124 \\ 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 0128 \\ svc 0
129 \\ tst r0,r0129 \\ tst r0,r0
130 \\ beq 1f130 \\ beq 1f
131 \\ ldmfd sp!,{r4,r5,r6,r7}131 \\ ldmfd sp!,{r4,r5,r6,r7}
132 \\ bx lr132 \\ bx lr
133 \\133 \\
134 \\ // https://github.com/llvm/llvm-project/issues/115891134 \\ // https://github.com/llvm/llvm-project/issues/115891
135 \\1: mov r7, #0135 \\1:
136 \\ mov r11, #0136 \\ mov r7, #0
137 \\ mov lr, #0137 \\ mov r11, #0
138 \\ mov lr, #0
138 \\139 \\
139 \\ mov r0,r6140 \\ mov r0,r6
140 \\ bl 3f141 \\ bl 3f
141 \\ mov r7,#1 // SYS_exit142 \\ mov r7,#1 // SYS_exit
142 \\ svc 0143 \\ svc 0
143 \\144 \\
144 \\3: bx r5145 \\3:
146 \\ bx r5
145 );147 );
146}148}
147149
148pub fn restore() callconv(.naked) noreturn {150pub 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 #0154 :
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}
163158
164pub fn restore_rt() callconv(.naked) noreturn {159pub 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 #0163 :
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}
179167
180pub const VDSO = struct {168pub 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, +8114 // 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, r4117 // 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, r4120 \\ mov t0, r4
121 \\ mov t1, r7121 \\ mov t1, r7
122 \\122 \\
123 \\ andi r1, r1, -8123 \\ andni r1, r1, 7
124 \\124 \\
125 \\ subi r1, 8125 \\ 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 \\ syscall11 \\ syscall
12 \\ beq $a3, $zero, 1f12 \\ beq $a3, $zero, 1f
13 \\ blez $v0, 1f
14 \\ subu $v0, $zero, $v013 \\ 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 \\ syscall25 \\ syscall
27 \\ beq $a3, $zero, 1f26 \\ beq $a3, $zero, 1f
28 \\ blez $v0, 1f
29 \\ subu $v0, $zero, $v027 \\ 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 \\ syscall41 \\ syscall
44 \\ beq $a3, $zero, 1f42 \\ beq $a3, $zero, 1f
45 \\ blez $v0, 1f
46 \\ subu $v0, $zero, $v043 \\ 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 \\ syscall59 \\ syscall
63 \\ beq $a3, $zero, 1f60 \\ beq $a3, $zero, 1f
64 \\ blez $v0, 1f
65 \\ subu $v0, $zero, $v061 \\ 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 \\ syscall79 \\ syscall
84 \\ beq $a3, $zero, 1f80 \\ beq $a3, $zero, 1f
85 \\ blez $v0, 1f
86 \\ subu $v0, $zero, $v081 \\ 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 \\ syscall106 \\ syscall
112 \\ addu $sp, $sp, 24107 \\ addu $sp, $sp, 24
113 \\ beq $a3, $zero, 1f108 \\ beq $a3, $zero, 1f
114 \\ blez $v0, 1f
115 \\ subu $v0, $zero, $v0109 \\ 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 \\ syscall134 \\ syscall
141 \\ addu $sp, $sp, 24135 \\ addu $sp, $sp, 24
142 \\ beq $a3, $zero, 1f136 \\ beq $a3, $zero, 1f
143 \\ blez $v0, 1f
144 \\ subu $v0, $zero, $v0137 \\ 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 \\ syscall165 \\ syscall
173 \\ addu $sp, $sp, 32166 \\ addu $sp, $sp, 32
174 \\ beq $a3, $zero, 1f167 \\ beq $a3, $zero, 1f
175 \\ blez $v0, 1f
176 \\ subu $v0, $zero, $v0168 \\ 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 \\ syscall186 \\ syscall
195 \\ beq $a3, $zero, 1f187 \\ beq $a3, $zero, 1f
196 \\ blez $v0, 2f
197 \\ subu $v0, $zero, $v0188 \\ subu $v0, $zero, $v0
198 \\ b 2f189 \\ 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_clone220 \\ li $v0, 4120 # SYS_clone
230 \\ syscall221 \\ syscall
231 \\ beq $a3, $zero, 1f222 \\ beq $a3, $zero, 1f
232 \\ blez $v0, 2f
233 \\ subu $v0, $zero, $v0223 \\ subu $v0, $zero, $v0
234 \\ b 2f224 \\ 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 \\ syscall11 \\ syscall
12 \\ beq $a3, $zero, 1f12 \\ beq $a3, $zero, 1f
13 \\ blez $v0, 1f
14 \\ dsubu $v0, $zero, $v013 \\ 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 \\ syscall25 \\ syscall
27 \\ beq $a3, $zero, 1f26 \\ beq $a3, $zero, 1f
28 \\ blez $v0, 1f
29 \\ dsubu $v0, $zero, $v027 \\ 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 \\ syscall41 \\ syscall
44 \\ beq $a3, $zero, 1f42 \\ beq $a3, $zero, 1f
45 \\ blez $v0, 1f
46 \\ dsubu $v0, $zero, $v043 \\ 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 \\ syscall59 \\ syscall
63 \\ beq $a3, $zero, 1f60 \\ beq $a3, $zero, 1f
64 \\ blez $v0, 1f
65 \\ dsubu $v0, $zero, $v061 \\ 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 \\ syscall79 \\ syscall
84 \\ beq $a3, $zero, 1f80 \\ beq $a3, $zero, 1f
85 \\ blez $v0, 1f
86 \\ dsubu $v0, $zero, $v081 \\ 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 \\ syscall101 \\ syscall
107 \\ beq $a3, $zero, 1f102 \\ beq $a3, $zero, 1f
108 \\ blez $v0, 1f
109 \\ dsubu $v0, $zero, $v0103 \\ 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 \\ syscall125 \\ syscall
132 \\ beq $a3, $zero, 1f126 \\ beq $a3, $zero, 1f
133 \\ blez $v0, 1f
134 \\ dsubu $v0, $zero, $v0127 \\ 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 \\ syscall144 \\ syscall
152 \\ beq $a3, $zero, 1f145 \\ beq $a3, $zero, 1f
153 \\ blez $v0, 2f
154 \\ dsubu $v0, $zero, $v0146 \\ dsubu $v0, $zero, $v0
155 \\ b 2f147 \\ 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_clone176 \\ li $v0, 5055 # SYS_clone
185 \\ syscall177 \\ syscall
186 \\ beq $a3, $zero, 1f178 \\ beq $a3, $zero, 1f
187 \\ blez $v0, 2f
188 \\ dsubu $v0, $zero, $v0179 \\ dsubu $v0, $zero, $v0
189 \\ b 2f180 \\ 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 \\ syscall11 \\ syscall
12 \\ beq $a3, $zero, 1f12 \\ beq $a3, $zero, 1f
13 \\ blez $v0, 1f
14 \\ subu $v0, $zero, $v013 \\ 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 \\ syscall25 \\ syscall
27 \\ beq $a3, $zero, 1f26 \\ beq $a3, $zero, 1f
28 \\ blez $v0, 1f
29 \\ subu $v0, $zero, $v027 \\ 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 \\ syscall41 \\ syscall
44 \\ beq $a3, $zero, 1f42 \\ beq $a3, $zero, 1f
45 \\ blez $v0, 1f
46 \\ subu $v0, $zero, $v043 \\ 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 \\ syscall59 \\ syscall
63 \\ beq $a3, $zero, 1f60 \\ beq $a3, $zero, 1f
64 \\ blez $v0, 1f
65 \\ subu $v0, $zero, $v061 \\ 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 \\ syscall79 \\ syscall
84 \\ beq $a3, $zero, 1f80 \\ beq $a3, $zero, 1f
85 \\ blez $v0, 1f
86 \\ subu $v0, $zero, $v081 \\ 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 \\ syscall101 \\ syscall
107 \\ beq $a3, $zero, 1f102 \\ beq $a3, $zero, 1f
108 \\ blez $v0, 1f
109 \\ subu $v0, $zero, $v0103 \\ 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 \\ syscall125 \\ syscall
132 \\ beq $a3, $zero, 1f126 \\ beq $a3, $zero, 1f
133 \\ blez $v0, 1f
134 \\ subu $v0, $zero, $v0127 \\ 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 \\ syscall144 \\ syscall
152 \\ beq $a3, $zero, 1f145 \\ beq $a3, $zero, 1f
153 \\ blez $v0, 2f
154 \\ subu $v0, $zero, $v0146 \\ subu $v0, $zero, $v0
155 \\ b 2f147 \\ 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 \\ syscall164 \\ syscall
173 \\ beq $a3, $zero, 1f165 \\ beq $a3, $zero, 1f
174 \\ blez $v0, 1f
175 \\ dsubu $v0, $zero, $v0166 \\ 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_clone194 \\ li $v0, 6055 # SYS_clone
204 \\ syscall195 \\ syscall
205 \\ beq $a3, $zero, 1f196 \\ beq $a3, $zero, 1f
206 \\ blez $v0, 2f
207 \\ subu $v0, $zero, $v0197 \\ subu $v0, $zero, $v0
208 \\ b 2f198 \\ 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, r7124 // r11 r3, r4, r5, r6, r7
125 asm volatile (125 asm volatile (
126 \\ # Save function pointer and argument pointer on new thread stack126 \\ # Save function pointer and argument pointer on new thread stack
127 \\ l.andi r4, r4, -4127 \\ l.addi r13, r0, -4
128 \\ l.and r4, r4, r13
128 \\ l.addi r4, r4, -8129 \\ l.addi r4, r4, -8
129 \\ l.sw 0(r4), r3130 \\ l.sw 0(r4), r3
130 \\ l.sw 4(r4), r6131 \\ 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 1139 \\ l.sys 1
139 \\ l.sfeqi r11, 0140 \\ l.sfeqi r11, 0
140 \\ l.bf 1f141 \\ l.bf 1f
142 \\ l.nop
141 \\ l.jr r9143 \\ 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 r11156 \\ l.jalr r11
157 \\ l.nop
154 \\158 \\
155 \\ l.ori r3, r11, 0159 \\ l.ori r3, r11, 0
156 \\ l.ori r11, r0, 93 # SYS_exit160 \\ 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 \\ sc16 \\ sc
17 \\ bns+ 1f17 \\ bns+ 1f
18 \\ neg 3, 318 \\ 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 \\ sc33 \\ sc
34 \\ bns+ 1f34 \\ bns+ 1f
35 \\ neg 3, 335 \\ 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 \\ sc53 \\ sc
54 \\ bns+ 1f54 \\ bns+ 1f
55 \\ neg 3, 355 \\ 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 \\ sc77 \\ sc
78 \\ bns+ 1f78 \\ bns+ 1f
79 \\ neg 3, 379 \\ 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 \\ sc105 \\ sc
106 \\ bns+ 1f106 \\ bns+ 1f
107 \\ neg 3, 3107 \\ 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 \\ sc137 \\ sc
138 \\ bns+ 1f138 \\ bns+ 1f
139 \\ neg 3, 3139 \\ 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 \\ sc173 \\ sc
174 \\ bns+ 1f174 \\ bns+ 1f
175 \\ neg 3, 3175 \\ 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 our201 \\ # store non-volatile regs r29, r30 on stack in order to put our
202 \\ # start func and its arg there202 \\ # 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 r30207 \\ # save r3 (func) into r29, and r6(arg) into r30
207 \\ mr 29, 3208 \\ 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 return236 \\ # if not 0, restore stack and return
236 \\ beq cr7, 2f237 \\ 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, 16240 \\ addi 1, 1, 16
240 \\ blr241 \\ 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, 0250 \\ li 31, 0
250 \\ mtlr 0251 \\ mtlr 31
251 \\252 \\
252 \\ #call funcptr: move arg (d) into r3253 \\ #call funcptr: move arg (d) into r3
253 \\ mr 3, 30254 \\ 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}
263264
264pub fn restore() callconv(.naked) noreturn {265pub 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 \\ sc269 :
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}
279273
280pub fn restore_rt() callconv(.naked) noreturn {274pub 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 \\ sc278 :
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}
295282
296pub const VDSO = struct {283pub 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 \\ sc16 \\ sc
17 \\ bns+ 1f17 \\ bns+ 1f
18 \\ neg 3, 318 \\ 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 \\ sc33 \\ sc
34 \\ bns+ 1f34 \\ bns+ 1f
35 \\ neg 3, 335 \\ 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 \\ sc53 \\ sc
54 \\ bns+ 1f54 \\ bns+ 1f
55 \\ neg 3, 355 \\ 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 \\ sc77 \\ sc
78 \\ bns+ 1f78 \\ bns+ 1f
79 \\ neg 3, 379 \\ 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 \\ sc105 \\ sc
106 \\ bns+ 1f106 \\ bns+ 1f
107 \\ neg 3, 3107 \\ 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 \\ sc137 \\ sc
138 \\ bns+ 1f138 \\ bns+ 1f
139 \\ neg 3, 3139 \\ 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 \\ sc173 \\ sc
174 \\ bns+ 1f174 \\ bns+ 1f
175 \\ neg 3, 3175 \\ 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, 7199 // 0 3, 4, 5, 6, 7
200 asm volatile (200 asm volatile (
201 \\ # create initial stack frame for new thread201 \\ # create initial stack frame for new thread
202 \\ clrrdi 4, 4, 4202 \\ clrrdi 4, 4, 4
203 \\ li 0, 0203 \\ li 0, 0
204 \\ stdu 0,-32(4)204 \\ stdu 0,-32(4)
205 \\205 \\
206 \\ # save fn and arg to child stack206 \\ # 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_clone210 \\ # shuffle args into correct registers and call SYS_clone
211 \\ mr 3, 5211 \\ mr 3, 5
212 \\ #mr 4, 4212 \\ #mr 4, 4
213 \\ mr 5, 7213 \\ mr 5, 7
214 \\ mr 6, 8214 \\ mr 6, 8
215 \\ mr 7, 9215 \\ mr 7, 9
216 \\ li 0, 120 # SYS_clone = 120216 \\ li 0, 120 # SYS_clone = 120
217 \\ sc217 \\ sc
218 \\218 \\
219 \\ # if error, negate return (errno)219 \\ # if error, negate return (errno)
220 \\ bns+ 1f220 \\ bns+ 1f
221 \\ neg 3, 3221 \\ neg 3, 3
222 \\222 \\
223 \\1:223 \\1:
224 \\ # if we're the parent, return224 \\ # if we're the parent, return
225 \\ cmpwi cr7, 3, 0225 \\ cmpwi cr7, 3, 0
226 \\ bnelr cr7226 \\ bnelr cr7
227 \\227 \\
228 \\ # we're the child228 \\ # 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 lr231 \\ .cfi_undefined lr
232 );232 );
233 asm volatile (233 asm volatile (
234 \\ li 31, 0234 \\ li 31, 0
235 \\ mtlr 0235 \\ 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 12240 \\ mtctr 12
241 \\ bctrl241 \\ bctrl
242 \\242 \\
243 \\ # call SYS_exit. exit code is already in r3 from fn return value243 \\ # call SYS_exit. exit code is already in r3 from fn return value
244 \\ li 0, 1 # SYS_exit = 1244 \\ li 0, 1 # SYS_exit = 1
245 \\ sc245 \\ sc
246 );246 );
247}247}
248248
249pub fn restore() callconv(.naked) noreturn {249pub 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 \\ sc253 :
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}
264257
265pub fn restore_rt() callconv(.naked) noreturn {258pub 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 \\ sc262 :
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}
280266
281pub const VDSO = struct {267pub 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, a4117 // a7 a0, a1, a2, a3, a4
118 asm volatile (118 asm volatile (
119 \\ # Save func and arg to stack119 \\ andi a1, a1, -16
120 \\ addi a1, a1, -8120 \\ # 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_clone125 \\ # Call SYS_clone
125 \\ mv a0, a2126 \\ mv a0, a2
126 \\ mv a2, a4127 \\ mv a2, a4
127 \\ mv a3, a5128 \\ mv a3, a5
128 \\ mv a4, a6129 \\ mv a4, a6
129 \\ li a7, 220 # SYS_clone130 \\ li a7, 220 # SYS_clone
130 \\ ecall131 \\ ecall
131 \\132 \\
132 \\ beqz a0, 1f133 \\ beqz a0, 1f
133 \\ # Parent134 \\ # Parent
134 \\ ret135 \\ ret
135 \\136 \\
136 \\ # Child137 \\ # 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 ra141 \\ .cfi_undefined ra
141 );142 );
142 asm volatile (143 asm volatile (
143 \\ mv fp, zero144 \\ mv fp, zero
144 \\ mv ra, zero145 \\ 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 a1149 \\ jalr a1
149 \\150 \\
150 \\ # Exit151 \\ # Exit
151 \\ li a7, 93 # SYS_exit152 \\ li a7, 93 # SYS_exit
152 \\ ecall153 \\ ecall
153 );154 );
154}155}
155156
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, a4117 // a7 a0, a1, a2, a3, a4
118 asm volatile (118 asm volatile (
119 \\ # Save func and arg to stack119 \\ andi a1, a1, -16
120 \\ addi a1, a1, -16120 \\ # 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_clone125 \\ # Call SYS_clone
125 \\ mv a0, a2126 \\ mv a0, a2
126 \\ mv a2, a4127 \\ mv a2, a4
127 \\ mv a3, a5128 \\ mv a3, a5
128 \\ mv a4, a6129 \\ mv a4, a6
129 \\ li a7, 220 # SYS_clone130 \\ li a7, 220 # SYS_clone
130 \\ ecall131 \\ ecall
131 \\132 \\
132 \\ beqz a0, 1f133 \\ beqz a0, 1f
133 \\ # Parent134 \\ # Parent
134 \\ ret135 \\ ret
135 \\136 \\
136 \\ # Child137 \\ # 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 ra141 \\ .cfi_undefined ra
141 );142 );
142 asm volatile (143 asm volatile (
143 \\ mv fp, zero144 \\ mv fp, zero
144 \\ mv ra, zero145 \\ 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 a1149 \\ jalr a1
149 \\150 \\
150 \\ # Exit151 \\ # Exit
151 \\ li a7, 93 # SYS_exit152 \\ li a7, 93 # SYS_exit
152 \\ ecall153 \\ ecall
153 );154 );
154}155}
155156
lib/std/os/linux/s390x.zig+57-72
...@@ -111,98 +111,83 @@ pub fn syscall6(...@@ -111,98 +111,83 @@ pub fn syscall6(
111111
112pub fn clone() callconv(.naked) u64 {112pub fn clone() callconv(.naked) u64 {
113 asm volatile (113 asm volatile (
114 \\# int clone(114 \\ # int clone(
115 \\# fn, a = r2115 \\ # fn, a = r2
116 \\# stack, b = r3116 \\ # stack, b = r3
117 \\# flags, c = r4117 \\ # flags, c = r4
118 \\# arg, d = r5118 \\ # arg, d = r5
119 \\# ptid, e = r6119 \\ # 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 arg128 \\ # 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 thread131 \\ # create initial stack frame for new thread
132 \\nill %%r3, 0xfff8132 \\ nill %%r3, 0xfff8
133 \\aghi %%r3, -160133 \\ aghi %%r3, -160
134 \\lghi %%r0, 0134 \\ lghi %%r0, 0
135 \\stg %%r0, 0(%%r3)135 \\ stg %%r0, 0(%%r3)
136 \\136 \\
137 \\# save fn and arg to child stack137 \\ # 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_clone141 \\ # shuffle args into correct registers and call SYS_clone
142 \\lgr %%r2, %%r3142 \\ lgr %%r2, %%r3
143 \\lgr %%r3, %%r4143 \\ lgr %%r3, %%r4
144 \\lgr %%r4, %%r6144 \\ 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 120147 \\ svc 120
148 \\148 \\
149 \\# restore call-saved register149 \\ # 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, return152 \\ # if error or if we're the parent, return
153 \\ltgr %%r2, %%r2153 \\ ltgr %%r2, %%r2
154 \\bnzr %%r14154 \\ bnzr %%r14
155 \\155 \\
156 \\# we're the child156 \\ # 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 %%r14159 \\ .cfi_undefined %%r14
160 );160 );
161 asm volatile (161 asm volatile (
162 \\lghi %%r11, 0162 \\ lghi %%r11, 0
163 \\lghi %%r14, 0163 \\ 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, %%r1168 \\ 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}
175174
176pub fn restore() callconv(.naked) noreturn {175pub 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 0179 :
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}
191183
192pub fn restore_rt() callconv(.naked) noreturn {184pub 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 0188 :
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}
207192
208pub const time_t = i64;193pub 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_clone167 \\ mov #120, r3 ! SYS_clone
168 \\ mov r6, r4168 \\ mov r6, r4
169 \\ mov.l @r15, r6169 \\ mov.l @r15, r6
170 \\ mov.l @(r15, 8), r7170 \\ mov.l @(8, r15), r7
171 \\ mov.l @(r15, 4), r0171 \\ mov.l @(4, r15), r0
172 \\ trapa #31172 \\ trapa #31
173 \\ or r0, r0173 \\ or r0, r0
174 \\ or r0, r0174 \\ 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 frame215 \\ # Align, and add some extra space for the initial frame
216 \\ and %%i1, -8, %%i1216 \\ and %%i1, -8, %%i1
217 \\ sub %%i1, 96 + 2047, %%o1217 \\ sub %%i1, 96, %%o1
218 \\218 \\
219 \\ mov %%i4, %%o2219 \\ mov %%i4, %%o2
220 \\ mov %%i5, %%o3220 \\ mov %%i5, %%o3
221 \\ ld [%%fp + 92 + 2047], %%o4221 \\ ld [%%fp + 92], %%o4
222 \\ t 0x10222 \\ t 0x10
223 \\ bcs 1f223 \\ bcs 1f
224 \\ nop224 \\ 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 \\ wruniq264 \\ 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], $tp417 \\ 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], $29422 \\ 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], gbr452 \\ 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(
125125
126pub fn clone() callconv(.naked) u32 {126pub fn clone() callconv(.naked) u32 {
127 asm volatile (127 asm volatile (
128 \\ movl $0x40000038,%%eax // SYS_clone128 \\ movl $0x40000038,%%eax // SYS_clone
129 \\ mov %%rdi,%%r11129 \\ mov %%rdi,%%r11
130 \\ mov %%rdx,%%rdi130 \\ mov %%rdx,%%rdi
131 \\ mov %%r8,%%rdx131 \\ mov %%r8,%%rdx
132 \\ mov %%r9,%%r8132 \\ mov %%r9,%%r8
133 \\ mov 8(%%rsp),%%r10d133 \\ mov 8(%%rsp),%%r10d
134 \\ mov %%r11,%%r9134 \\ mov %%r11,%%r9
135 \\ and $-16,%%rsi135 \\ and $-16,%%rsi
136 \\ sub $8,%%rsi136 \\ sub $8,%%rsi
137 \\ mov %%rcx,(%%rsi)137 \\ mov %%rcx,(%%rsi)
138 \\ syscall138 \\ syscall
139 \\ test %%eax,%%eax139 \\ test %%eax,%%eax
140 \\ jz 1f140 \\ jz 1f
141 \\ ret141 \\ 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 %%rip146 \\ .cfi_undefined %%rip
147 );147 );
148 asm volatile (148 asm volatile (
149 \\ xor %%ebp,%%ebp149 \\ 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}
159158
160pub const restore = restore_rt;159pub const restore = restore_rt;
161160
162pub fn restore_rt() callconv(.naked) noreturn {161pub 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], %%eax164 \\ syscall
166 \\ syscall165 :
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}
177169
178pub const time_t = i64;170pub 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, edi143 // eax, ebx, ecx, edx, esi, edi
144 asm volatile (144 asm volatile (
145 \\ pushl %%ebp145 \\ pushl %%ebp
146 \\ movl %%esp,%%ebp146 \\ movl %%esp,%%ebp
147 \\ pushl %%ebx147 \\ pushl %%ebx
148 \\ pushl %%esi148 \\ pushl %%esi
149 \\ pushl %%edi149 \\ pushl %%edi
150 \\ // Setup the arguments150 \\ // Setup the arguments
151 \\ movl 16(%%ebp),%%ebx151 \\ movl 16(%%ebp),%%ebx
152 \\ movl 12(%%ebp),%%ecx152 \\ movl 12(%%ebp),%%ecx
153 \\ andl $-16,%%ecx153 \\ andl $-16,%%ecx
154 \\ subl $20,%%ecx154 \\ subl $20,%%ecx
155 \\ movl 20(%%ebp),%%eax155 \\ movl 20(%%ebp),%%eax
156 \\ movl %%eax,4(%%ecx)156 \\ movl %%eax,4(%%ecx)
157 \\ movl 8(%%ebp),%%eax157 \\ movl 8(%%ebp),%%eax
158 \\ movl %%eax,0(%%ecx)158 \\ movl %%eax,0(%%ecx)
159 \\ movl 24(%%ebp),%%edx159 \\ movl 24(%%ebp),%%edx
160 \\ movl 28(%%ebp),%%esi160 \\ movl 28(%%ebp),%%esi
161 \\ movl 32(%%ebp),%%edi161 \\ movl 32(%%ebp),%%edi
162 \\ movl $120,%%eax // SYS_clone162 \\ movl $120,%%eax // SYS_clone
163 \\ int $128163 \\ int $128
164 \\ testl %%eax,%%eax164 \\ testl %%eax,%%eax
165 \\ jz 1f165 \\ jz 1f
166 \\ popl %%edi166 \\ popl %%edi
167 \\ popl %%esi167 \\ popl %%esi
168 \\ popl %%ebx168 \\ popl %%ebx
169 \\ popl %%ebp169 \\ popl %%ebp
170 \\ retl170 \\ 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 %%eip175 \\ .cfi_undefined %%eip
176 );176 );
177 asm volatile (177 asm volatile (
178 \\ xorl %%ebp,%%ebp178 \\ xorl %%ebp,%%ebp
179 \\179 \\
180 \\ popl %%eax180 \\ popl %%eax
181 \\ calll *%%eax181 \\ calll *%%eax
182 \\ movl %%eax,%%ebx182 \\ movl %%eax,%%ebx
183 \\ movl $1,%%eax // SYS_exit183 \\ movl $1,%%eax // SYS_exit
184 \\ int $128184 \\ int $128
185 );185 );
186}186}
187187
188pub fn restore() callconv(.naked) noreturn {188pub 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, %%esp191 \\ movl %[number], %%eax
192 \\ movl %[number], %%eax192 \\ int $0x80
193 \\ int $0x80193 :
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}
205197
206pub fn restore_rt() callconv(.naked) noreturn {198pub 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], %%eax201 \\ int $0x80
210 \\ int $0x80202 :
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}
221206
222pub const VDSO = struct {207pub 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(
111111
112pub fn clone() callconv(.naked) u64 {112pub fn clone() callconv(.naked) u64 {
113 asm volatile (113 asm volatile (
114 \\ movl $56,%%eax // SYS_clone114 \\ movl $56,%%eax // SYS_clone
115 \\ movq %%rdi,%%r11115 \\ movq %%rdi,%%r11
116 \\ movq %%rdx,%%rdi116 \\ movq %%rdx,%%rdi
117 \\ movq %%r8,%%rdx117 \\ movq %%r8,%%rdx
118 \\ movq %%r9,%%r8118 \\ movq %%r9,%%r8
119 \\ movq 8(%%rsp),%%r10119 \\ movq 8(%%rsp),%%r10
120 \\ movq %%r11,%%r9120 \\ movq %%r11,%%r9
121 \\ andq $-16,%%rsi121 \\ andq $-16,%%rsi
122 \\ subq $8,%%rsi122 \\ subq $8,%%rsi
123 \\ movq %%rcx,(%%rsi)123 \\ movq %%rcx,(%%rsi)
124 \\ syscall124 \\ syscall
125 \\ testq %%rax,%%rax125 \\ testq %%rax,%%rax
126 \\ jz 1f126 \\ jz 1f
127 \\ retq127 \\ 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 %%rip132 \\ .cfi_undefined %%rip
133 );133 );
134 asm volatile (134 asm volatile (
135 \\ xorl %%ebp,%%ebp135 \\ 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}
145144
146pub const restore = restore_rt;145pub const restore = restore_rt;
147146
148pub fn restore_rt() callconv(.naked) noreturn {147pub 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], %%eax150 \\ syscall
152 \\ syscall151 :
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}
163155
164pub const time_t = i64;156pub 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 {
173pub const restore = restore_rt;173pub const restore = restore_rt;
174174
175pub fn restore_rt() callconv(.naked) noreturn {175pub 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 \\ syscall179 :
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}
190183
191pub const VDSO = void;184pub 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], pc83 \\ add %[ret], pc
84 \\ b 2f84 \\ b 2f
85 \\1:85 \\1:
86 \\ .word _DYNAMIC-1b86 \\ .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, 1f102 \\ 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], gb111 \\ .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 _DYNAMIC124 \\ .weak _DYNAMIC
116 \\ .hidden _DYNAMIC125 \\ .hidden _DYNAMIC
...@@ -143,12 +152,20 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {...@@ -143,12 +152,20 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
143 \\ .hidden _DYNAMIC152 \\ .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, 0158 \\ .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 _DYNAMIC170 \\ .weak _DYNAMIC
154 \\ .hidden _DYNAMIC171 \\ .hidden _DYNAMIC
...@@ -190,6 +207,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {...@@ -190,6 +207,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
190 \\ .weak _DYNAMIC207 \\ .weak _DYNAMIC
191 \\ .hidden _DYNAMIC208 \\ .hidden _DYNAMIC
192 \\ l.jal 1f209 \\ 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 _DYNAMIC231 \\ .weak _DYNAMIC
214 \\ .hidden _DYNAMIC232 \\ .hidden _DYNAMIC
233 \\ .balign 8
215 \\ bl 1f234 \\ 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 2f267 \\ bra 2f
248 \\1:268 \\ nop
249 \\ .balign 4269 \\ .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), %%l7277 \\ .weak _DYNAMIC
278 \\ .hidden _DYNAMIC
279 \\ sethi %%pc22(_DYNAMIC - 4), %[ret]
259 \\ call 1f280 \\ call 1f
260 \\ add %%l7, %%lo(_GLOBAL_OFFSET_TABLE_ + 4), %%l7281 \\ 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 _DYNAMIC288 \\ .weak _DYNAMIC
268 \\ .hidden _DYNAMIC289 \\ .hidden _DYNAMIC
...@@ -274,7 +295,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {...@@ -274,7 +295,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
274 \\ .balign 4295 \\ .balign 4
275 \\ .word _DYNAMIC - .296 \\ .word _DYNAMIC - .
276 \\1:297 \\1:
277 \\ add a0, a0, 1298 \\ addi a0, a0, 1
278 \\ l32i a8, a0, 0299 \\ l32i a8, a0, 0
279 \\ add %[ret], a0, a8300 \\ 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, $16247 \\ mov $30, $16
248 \\ ldi $1, -16248 \\ ldi $1, -16
249 \\ and $30, $30, $1249 \\ 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 = FP277 // r8 = FP
278 \\ grs t0, 1f278 \\ grs t0, 1f
279 \\ 1:279 \\1:
280 \\ lrw gb, 1b@GOTPC280 \\ lrw gb, 1b@GOTPC
281 \\ addu gb, t0281 \\ addu gb, t0
282 \\ movi r8, 0282 \\ movi r8, 0
283 \\ movi lr, 0283 \\ movi lr, 0
284 \\ mov a0, sp284 \\ mov a0, sp
285 \\ andi sp, sp, -8285 \\ 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 = LR291 // 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) = r29296 \\ 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 = 0301 \\ 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, 0326 \\ l.ori r2, r0, 0
325 \\ l.ori r9, r0, 0327 \\ l.ori r9, r0, 0
326 \\ l.ori r3, r1, 0328 \\ l.ori r3, r1, 0
327 \\ l.andi r1, r1, -4329 \\ 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, 0335 \\ li fp, 0
332 \\ li ra, 0336 \\ li ra, 0
333 \\ mv a0, sp337 \\ mv a0, sp
334 \\ andi sp, sp, -16338 \\ andi sp, sp, -16
335 \\ tail %[posixCallMainAndExit]@plt339 \\ tail %[posixCallMainAndExit]
336 ,340 ,
337 .m68k =>341 .m68k =>
338 // Note that the - 8 is needed because pc in the jsr instruction points into the middle342 // 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, %%r0358 \\ or %%r1, %%r0, %%r0
355 \\ or %%r2, %%r31, %%r0359 \\ 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 = GP364 // 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_ + 8368 \\ addi r20, r20, _GLOBAL_OFFSET_TABLE_ + 8
365 \\ ori r5, r1, 0369 \\ ori r5, r1, 0
366 \\ andi r1, r1, -4370 \\ andi r1, r1, -4
367 \\ brlid r15, %[posixCallMainAndExit]371 \\ bri %[posixCallMainAndExit]
368 ,372 ,
369 .mips, .mipsel =>373 .mips, .mipsel =>
370 \\ move $fp, $zero374 \\ move $fp, $zero
...@@ -383,7 +387,7 @@ fn _start() callconv(.naked) noreturn {...@@ -383,7 +387,7 @@ fn _start() callconv(.naked) noreturn {
383 \\ move $a0, $sp387 \\ move $a0, $sp
384 \\ and $sp, -8388 \\ and $sp, -8
385 \\ subu $sp, $sp, 16389 \\ subu $sp, $sp, 16
386 \\ jalr $t9390 \\ 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, $gp403 \\ addu $t9, $t9, $gp
400 \\ move $ra, $zero404 \\ move $ra, $zero
401 \\ move $a0, $sp405 \\ move $a0, $sp
402 \\ and $sp, -8406 \\ and $sp, -16
403 \\ subu $sp, $sp, 16407 \\ subu $sp, $sp, 16
404 \\ jalr $t9408 \\ jr $t9
405 ,409 ,
406 else =>410 else =>
407 \\ move $fp, $zero411 \\ move $fp, $zero
...@@ -422,7 +426,7 @@ fn _start() callconv(.naked) noreturn {...@@ -422,7 +426,7 @@ fn _start() callconv(.naked) noreturn {
422 \\ move $a0, $sp426 \\ move $a0, $sp
423 \\ and $sp, -16427 \\ and $sp, -16
424 \\ dsubu $sp, $sp, 16428 \\ dsubu $sp, $sp, 16
425 \\ jalr $t9429 \\ 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, 0440 \\ li 31, 0
437 \\ mtlr 0441 \\ 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, 0451 \\ li 0, 0
448 \\ stdu 0, -32(1)452 \\ stdu 0, -32(1)
449 \\ li 31, 0453 \\ li 31, 0
450 \\ mtlr 0454 \\ mtlr 31
451 \\ b %[posixCallMainAndExit]455 \\ b %[posixCallMainAndExit]
452 \\ nop456 \\ nop
453 ,457 ,
...@@ -472,12 +476,14 @@ fn _start() callconv(.naked) noreturn {...@@ -472,12 +476,14 @@ fn _start() callconv(.naked) noreturn {
472 \\ mov r15, r4476 \\ mov r15, r4
473 \\ mov #-4, r0477 \\ mov #-4, r0
474 \\ and r0, r15478 \\ and r0, r15
479 \\ mova 2f, r0
475 \\ mov.l 2f, r1480 \\ mov.l 2f, r1
476 \\1:481 \\ add r0, r1
477 \\ bsrf r1482 \\ jmp @r1
478 \\2:483 \\ nop
479 \\ .balign 4484 \\ .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).