| ... | ... | @@ -1227,16 +1227,14 @@ const LinuxThreadImpl = struct { |
| 1227 | 1227 | switch (target.cpu.arch) { |
| 1228 | 1228 | .x86 => asm volatile ( |
| 1229 | 1229 | \\ movl $91, %%eax # SYS_munmap |
| 1230 | | \\ movl %[ptr], %%ebx |
| 1231 | | \\ movl %[len], %%ecx |
| 1232 | 1230 | \\ int $128 |
| 1233 | 1231 | \\ movl $1, %%eax # SYS_exit |
| 1234 | 1232 | \\ movl $0, %%ebx |
| 1235 | 1233 | \\ int $128 |
| 1236 | 1234 | : |
| 1237 | | : [ptr] "r" (@intFromPtr(self.mapped.ptr)), |
| 1238 | | [len] "r" (self.mapped.len), |
| 1239 | | : .{ .memory = true }), |
| 1235 | : [ptr] "{ebx}" (@intFromPtr(self.mapped.ptr)), |
| 1236 | [len] "{ecx}" (self.mapped.len), |
| 1237 | ), |
| 1240 | 1238 | .x86_64 => asm volatile (switch (target.abi) { |
| 1241 | 1239 | .gnux32, .muslx32 => |
| 1242 | 1240 | \\ movl $0x4000000b, %%eax # SYS_munmap |
| ... | ... | @@ -1259,88 +1257,74 @@ const LinuxThreadImpl = struct { |
| 1259 | 1257 | ), |
| 1260 | 1258 | .arm, .armeb, .thumb, .thumbeb => asm volatile ( |
| 1261 | 1259 | \\ mov r7, #91 // SYS_munmap |
| 1262 | | \\ mov r0, %[ptr] |
| 1263 | | \\ mov r1, %[len] |
| 1264 | 1260 | \\ svc 0 |
| 1265 | 1261 | \\ mov r7, #1 // SYS_exit |
| 1266 | 1262 | \\ mov r0, #0 |
| 1267 | 1263 | \\ svc 0 |
| 1268 | 1264 | : |
| 1269 | | : [ptr] "r" (@intFromPtr(self.mapped.ptr)), |
| 1270 | | [len] "r" (self.mapped.len), |
| 1271 | | : .{ .memory = true }), |
| 1265 | : [ptr] "{r0}" (@intFromPtr(self.mapped.ptr)), |
| 1266 | [len] "{r1}" (self.mapped.len), |
| 1267 | ), |
| 1272 | 1268 | .aarch64, .aarch64_be => asm volatile ( |
| 1273 | 1269 | \\ mov x8, #215 // SYS_munmap |
| 1274 | | \\ mov x0, %[ptr] |
| 1275 | | \\ mov x1, %[len] |
| 1276 | 1270 | \\ svc 0 |
| 1277 | 1271 | \\ mov x8, #93 // SYS_exit |
| 1278 | 1272 | \\ mov x0, #0 |
| 1279 | 1273 | \\ svc 0 |
| 1280 | 1274 | : |
| 1281 | | : [ptr] "r" (@intFromPtr(self.mapped.ptr)), |
| 1282 | | [len] "r" (self.mapped.len), |
| 1283 | | : .{ .memory = true }), |
| 1275 | : [ptr] "{x0}" (@intFromPtr(self.mapped.ptr)), |
| 1276 | [len] "{x1}" (self.mapped.len), |
| 1277 | ), |
| 1284 | 1278 | .alpha => asm volatile ( |
| 1285 | 1279 | \\ ldi $0, 73 # SYS_munmap |
| 1286 | | \\ mov %[ptr], $16 |
| 1287 | | \\ mov %[len], $17 |
| 1288 | 1280 | \\ callsys |
| 1289 | 1281 | \\ ldi $0, 1 # SYS_exit |
| 1290 | 1282 | \\ ldi $16, 0 |
| 1291 | 1283 | \\ callsys |
| 1292 | 1284 | : |
| 1293 | | : [ptr] "r" (@intFromPtr(self.mapped.ptr)), |
| 1294 | | [len] "r" (self.mapped.len), |
| 1295 | | : .{ .memory = true }), |
| 1285 | : [ptr] "{r16}" (@intFromPtr(self.mapped.ptr)), |
| 1286 | [len] "{r17}" (self.mapped.len), |
| 1287 | ), |
| 1296 | 1288 | .hexagon => asm volatile ( |
| 1297 | 1289 | \\ r6 = #215 // SYS_munmap |
| 1298 | | \\ r0 = %[ptr] |
| 1299 | | \\ r1 = %[len] |
| 1300 | 1290 | \\ trap0(#1) |
| 1301 | 1291 | \\ r6 = #93 // SYS_exit |
| 1302 | 1292 | \\ r0 = #0 |
| 1303 | 1293 | \\ trap0(#1) |
| 1304 | 1294 | : |
| 1305 | | : [ptr] "r" (@intFromPtr(self.mapped.ptr)), |
| 1306 | | [len] "r" (self.mapped.len), |
| 1307 | | : .{ .memory = true }), |
| 1295 | : [ptr] "{r0}" (@intFromPtr(self.mapped.ptr)), |
| 1296 | [len] "{r1}" (self.mapped.len), |
| 1297 | ), |
| 1308 | 1298 | .hppa => asm volatile ( |
| 1309 | 1299 | \\ ldi 91, %%r20 /* SYS_munmap */ |
| 1310 | | \\ copy %[ptr], %%r26 |
| 1311 | | \\ copy %[len], %%r25 |
| 1312 | 1300 | \\ ble 0x100(%%sr2, %%r0) |
| 1313 | 1301 | \\ ldi 1, %%r20 /* SYS_exit */ |
| 1314 | 1302 | \\ ldi 0, %%r26 |
| 1315 | 1303 | \\ ble 0x100(%%sr2, %%r0) |
| 1316 | 1304 | : |
| 1317 | | : [ptr] "r" (@intFromPtr(self.mapped.ptr)), |
| 1318 | | [len] "r" (self.mapped.len), |
| 1319 | | : .{ .memory = true }), |
| 1305 | : [ptr] "{r26}" (@intFromPtr(self.mapped.ptr)), |
| 1306 | [len] "{r25}" (self.mapped.len), |
| 1307 | ), |
| 1320 | 1308 | .m68k => asm volatile ( |
| 1321 | 1309 | \\ move.l #91, %%d0 // SYS_munmap |
| 1322 | | \\ move.l %[ptr], %%d1 |
| 1323 | | \\ move.l %[len], %%d2 |
| 1324 | 1310 | \\ trap #0 |
| 1325 | 1311 | \\ move.l #1, %%d0 // SYS_exit |
| 1326 | 1312 | \\ move.l #0, %%d1 |
| 1327 | 1313 | \\ trap #0 |
| 1328 | 1314 | : |
| 1329 | | : [ptr] "r" (@intFromPtr(self.mapped.ptr)), |
| 1330 | | [len] "r" (self.mapped.len), |
| 1331 | | : .{ .memory = true }), |
| 1315 | : [ptr] "{d1}" (@intFromPtr(self.mapped.ptr)), |
| 1316 | [len] "{d2}" (self.mapped.len), |
| 1317 | ), |
| 1332 | 1318 | .microblaze, .microblazeel => asm volatile ( |
| 1333 | 1319 | \\ ori r12, r0, 91 # SYS_munmap |
| 1334 | | \\ ori r5, %[ptr], 0 |
| 1335 | | \\ ori r6, %[len], 0 |
| 1336 | 1320 | \\ brki r14, 0x8 |
| 1337 | 1321 | \\ ori r12, r0, 1 # SYS_exit |
| 1338 | 1322 | \\ or r5, r0, r0 |
| 1339 | 1323 | \\ brki r14, 0x8 |
| 1340 | 1324 | : |
| 1341 | | : [ptr] "r" (@intFromPtr(self.mapped.ptr)), |
| 1342 | | [len] "r" (self.mapped.len), |
| 1343 | | : .{ .memory = true }), |
| 1325 | : [ptr] "{r5}" (@intFromPtr(self.mapped.ptr)), |
| 1326 | [len] "{r6}" (self.mapped.len), |
| 1327 | ), |
| 1344 | 1328 | // We set `sp` to the address of the current function as a workaround for a Linux |
| 1345 | 1329 | // kernel bug that caused syscalls to return EFAULT if the stack pointer is invalid. |
| 1346 | 1330 | // The bug was introduced in 46e12c07b3b9603c60fc1d421ff18618241cb081 and fixed in |
| ... | ... | @@ -1348,21 +1332,17 @@ const LinuxThreadImpl = struct { |
| 1348 | 1332 | .mips, .mipsel => asm volatile ( |
| 1349 | 1333 | \\ move $sp, $t9 |
| 1350 | 1334 | \\ li $v0, 4091 # SYS_munmap |
| 1351 | | \\ move $a0, %[ptr] |
| 1352 | | \\ move $a1, %[len] |
| 1353 | 1335 | \\ syscall |
| 1354 | 1336 | \\ li $v0, 4001 # SYS_exit |
| 1355 | 1337 | \\ li $a0, 0 |
| 1356 | 1338 | \\ syscall |
| 1357 | 1339 | : |
| 1358 | | : [ptr] "r" (@intFromPtr(self.mapped.ptr)), |
| 1359 | | [len] "r" (self.mapped.len), |
| 1360 | | : .{ .memory = true }), |
| 1340 | : [ptr] "{$4}" (@intFromPtr(self.mapped.ptr)), |
| 1341 | [len] "{$5}" (self.mapped.len), |
| 1342 | ), |
| 1361 | 1343 | .mips64, .mips64el => asm volatile (switch (target.abi) { |
| 1362 | 1344 | .gnuabin32, .muslabin32 => |
| 1363 | 1345 | \\ li $v0, 6011 # SYS_munmap |
| 1364 | | \\ move $a0, %[ptr] |
| 1365 | | \\ move $a1, %[len] |
| 1366 | 1346 | \\ syscall |
| 1367 | 1347 | \\ li $v0, 6058 # SYS_exit |
| 1368 | 1348 | \\ li $a0, 0 |
| ... | ... | @@ -1370,8 +1350,6 @@ const LinuxThreadImpl = struct { |
| 1370 | 1350 | , |
| 1371 | 1351 | else => |
| 1372 | 1352 | \\ li $v0, 5011 # SYS_munmap |
| 1373 | | \\ move $a0, %[ptr] |
| 1374 | | \\ move $a1, %[len] |
| 1375 | 1353 | \\ syscall |
| 1376 | 1354 | \\ li $v0, 5058 # SYS_exit |
| 1377 | 1355 | \\ li $a0, 0 |
| ... | ... | @@ -1379,60 +1357,50 @@ const LinuxThreadImpl = struct { |
| 1379 | 1357 | , |
| 1380 | 1358 | } |
| 1381 | 1359 | : |
| 1382 | | : [ptr] "r" (@intFromPtr(self.mapped.ptr)), |
| 1383 | | [len] "r" (self.mapped.len), |
| 1384 | | : .{ .memory = true }), |
| 1360 | : [ptr] "{$4}" (@intFromPtr(self.mapped.ptr)), |
| 1361 | [len] "{$5}" (self.mapped.len), |
| 1362 | ), |
| 1385 | 1363 | .or1k => asm volatile ( |
| 1386 | 1364 | \\ l.ori r11, r0, 215 # SYS_munmap |
| 1387 | | \\ l.ori r3, %[ptr] |
| 1388 | | \\ l.ori r4, %[len] |
| 1389 | 1365 | \\ l.sys 1 |
| 1390 | 1366 | \\ l.ori r11, r0, 93 # SYS_exit |
| 1391 | 1367 | \\ l.ori r3, r0, r0 |
| 1392 | 1368 | \\ l.sys 1 |
| 1393 | 1369 | : |
| 1394 | | : [ptr] "r" (@intFromPtr(self.mapped.ptr)), |
| 1395 | | [len] "r" (self.mapped.len), |
| 1396 | | : .{ .memory = true }), |
| 1370 | : [ptr] "{r3}" (@intFromPtr(self.mapped.ptr)), |
| 1371 | [len] "{r4}" (self.mapped.len), |
| 1372 | ), |
| 1397 | 1373 | .powerpc, .powerpcle, .powerpc64, .powerpc64le => asm volatile ( |
| 1398 | 1374 | \\ li 0, 91 # SYS_munmap |
| 1399 | | \\ mr 3, %[ptr] |
| 1400 | | \\ mr 4, %[len] |
| 1401 | 1375 | \\ sc |
| 1402 | 1376 | \\ li 0, 1 # SYS_exit |
| 1403 | 1377 | \\ li 3, 0 |
| 1404 | 1378 | \\ sc |
| 1405 | 1379 | \\ blr |
| 1406 | 1380 | : |
| 1407 | | : [ptr] "r" (@intFromPtr(self.mapped.ptr)), |
| 1408 | | [len] "r" (self.mapped.len), |
| 1409 | | : .{ .memory = true }), |
| 1381 | : [ptr] "{r3}" (@intFromPtr(self.mapped.ptr)), |
| 1382 | [len] "{r4}" (self.mapped.len), |
| 1383 | ), |
| 1410 | 1384 | .riscv32, .riscv64 => asm volatile ( |
| 1411 | 1385 | \\ li a7, 215 # SYS_munmap |
| 1412 | | \\ mv a0, %[ptr] |
| 1413 | | \\ mv a1, %[len] |
| 1414 | 1386 | \\ ecall |
| 1415 | 1387 | \\ li a7, 93 # SYS_exit |
| 1416 | 1388 | \\ mv a0, zero |
| 1417 | 1389 | \\ ecall |
| 1418 | 1390 | : |
| 1419 | | : [ptr] "r" (@intFromPtr(self.mapped.ptr)), |
| 1420 | | [len] "r" (self.mapped.len), |
| 1421 | | : .{ .memory = true }), |
| 1391 | : [ptr] "{a0}" (@intFromPtr(self.mapped.ptr)), |
| 1392 | [len] "{a1}" (self.mapped.len), |
| 1393 | ), |
| 1422 | 1394 | .s390x => asm volatile ( |
| 1423 | | \\ lgr %%r2, %[ptr] |
| 1424 | | \\ lgr %%r3, %[len] |
| 1425 | 1395 | \\ svc 91 # SYS_munmap |
| 1426 | 1396 | \\ lghi %%r2, 0 |
| 1427 | 1397 | \\ svc 1 # SYS_exit |
| 1428 | 1398 | : |
| 1429 | | : [ptr] "r" (@intFromPtr(self.mapped.ptr)), |
| 1430 | | [len] "r" (self.mapped.len), |
| 1431 | | : .{ .memory = true }), |
| 1399 | : [ptr] "{r2}" (@intFromPtr(self.mapped.ptr)), |
| 1400 | [len] "{r3}" (self.mapped.len), |
| 1401 | ), |
| 1432 | 1402 | .sh, .sheb => asm volatile ( |
| 1433 | 1403 | \\ mov #91, r3 ! SYS_munmap |
| 1434 | | \\ mov %[ptr], r4 |
| 1435 | | \\ mov %[len], r5 |
| 1436 | 1404 | \\ trapa #31 |
| 1437 | 1405 | \\ or r0, r0 |
| 1438 | 1406 | \\ or r0, r0 |
| ... | ... | @@ -1448,9 +1416,9 @@ const LinuxThreadImpl = struct { |
| 1448 | 1416 | \\ or r0, r0 |
| 1449 | 1417 | \\ or r0, r0 |
| 1450 | 1418 | : |
| 1451 | | : [ptr] "r" (@intFromPtr(self.mapped.ptr)), |
| 1452 | | [len] "r" (self.mapped.len), |
| 1453 | | : .{ .memory = true }), |
| 1419 | : [ptr] "{r4}" (@intFromPtr(self.mapped.ptr)), |
| 1420 | [len] "{r5}" (self.mapped.len), |
| 1421 | ), |
| 1454 | 1422 | .sparc => asm volatile ( |
| 1455 | 1423 | \\ # See sparc64 comments below. |
| 1456 | 1424 | \\ 1: |
| ... | ... | @@ -1460,17 +1428,17 @@ const LinuxThreadImpl = struct { |
| 1460 | 1428 | \\ ba 1b |
| 1461 | 1429 | \\ restore |
| 1462 | 1430 | \\ 2: |
| 1431 | \\ mov %%g1, %%o0 // ptr |
| 1432 | \\ mov %%g2, %%o1 // len |
| 1463 | 1433 | \\ mov 73, %%g1 // SYS_munmap |
| 1464 | | \\ mov %[ptr], %%o0 |
| 1465 | | \\ mov %[len], %%o1 |
| 1466 | 1434 | \\ t 0x3 # ST_FLUSH_WINDOWS |
| 1467 | 1435 | \\ t 0x10 |
| 1468 | 1436 | \\ mov 1, %%g1 // SYS_exit |
| 1469 | 1437 | \\ mov 0, %%o0 |
| 1470 | 1438 | \\ t 0x10 |
| 1471 | 1439 | : |
| 1472 | | : [ptr] "r" (@intFromPtr(self.mapped.ptr)), |
| 1473 | | [len] "r" (self.mapped.len), |
| 1440 | : [ptr] "{g1}" (@intFromPtr(self.mapped.ptr)), |
| 1441 | [len] "{g2}" (self.mapped.len), |
| 1474 | 1442 | : .{ .memory = true }), |
| 1475 | 1443 | .sparc64 => asm volatile ( |
| 1476 | 1444 | \\ # SPARCs really don't like it when active stack frames |
| ... | ... | @@ -1484,9 +1452,9 @@ const LinuxThreadImpl = struct { |
| 1484 | 1452 | \\ ba 1b |
| 1485 | 1453 | \\ restore |
| 1486 | 1454 | \\ 2: |
| 1455 | \\ mov %%g1, %%o0 // ptr |
| 1456 | \\ mov %%g2, %%o1 // len |
| 1487 | 1457 | \\ mov 73, %%g1 // SYS_munmap |
| 1488 | | \\ mov %[ptr], %%o0 |
| 1489 | | \\ mov %[len], %%o1 |
| 1490 | 1458 | \\ # Flush register window contents to prevent background |
| 1491 | 1459 | \\ # memory access before unmapping the stack. |
| 1492 | 1460 | \\ flushw |
| ... | ... | @@ -1495,20 +1463,18 @@ const LinuxThreadImpl = struct { |
| 1495 | 1463 | \\ mov 0, %%o0 |
| 1496 | 1464 | \\ t 0x6d |
| 1497 | 1465 | : |
| 1498 | | : [ptr] "r" (@intFromPtr(self.mapped.ptr)), |
| 1499 | | [len] "r" (self.mapped.len), |
| 1466 | : [ptr] "{g1}" (@intFromPtr(self.mapped.ptr)), |
| 1467 | [len] "{g2}" (self.mapped.len), |
| 1500 | 1468 | : .{ .memory = true }), |
| 1501 | 1469 | .loongarch32, .loongarch64 => asm volatile ( |
| 1502 | | \\ or $a0, $zero, %[ptr] |
| 1503 | | \\ or $a1, $zero, %[len] |
| 1504 | 1470 | \\ ori $a7, $zero, 215 # SYS_munmap |
| 1505 | 1471 | \\ syscall 0 # call munmap |
| 1506 | 1472 | \\ ori $a0, $zero, 0 |
| 1507 | 1473 | \\ ori $a7, $zero, 93 # SYS_exit |
| 1508 | 1474 | \\ syscall 0 # call exit |
| 1509 | 1475 | : |
| 1510 | | : [ptr] "r" (@intFromPtr(self.mapped.ptr)), |
| 1511 | | [len] "r" (self.mapped.len), |
| 1476 | : [ptr] "{r4}" (@intFromPtr(self.mapped.ptr)), |
| 1477 | [len] "{r5}" (self.mapped.len), |
| 1512 | 1478 | : .{ .memory = true }), |
| 1513 | 1479 | else => |cpu_arch| @compileError("Unsupported linux arch: " ++ @tagName(cpu_arch)), |
| 1514 | 1480 | } |