| ... | ... | @@ -372,4 +372,54 @@ pub fn addCases(ctx: *TestContext) !void { |
| 372 | 372 | \\pub export fn main() void { _ = entry; } |
| 373 | 373 | ); |
| 374 | 374 | } |
| 375 | |
| 376 | { |
| 377 | var case = ctx.exeUsingLlvmBackend("f segment address space reading and writing", linux_x64); |
| 378 | case.addCompareOutput( |
| 379 | \\fn assert(ok: bool) void { |
| 380 | \\ if (!ok) unreachable; |
| 381 | \\} |
| 382 | \\ |
| 383 | \\fn setFs(value: c_ulong) void { |
| 384 | \\ asm volatile ( |
| 385 | \\ \\syscall |
| 386 | \\ : |
| 387 | \\ : [number] "{rax}" (158), |
| 388 | \\ [code] "{rdi}" (0x1002), |
| 389 | \\ [val] "{rsi}" (value), |
| 390 | \\ : "rcx", "r11", "memory" |
| 391 | \\ ); |
| 392 | \\} |
| 393 | \\ |
| 394 | \\fn getFs() c_ulong { |
| 395 | \\ var result: c_ulong = undefined; |
| 396 | \\ asm volatile ( |
| 397 | \\ \\syscall |
| 398 | \\ : |
| 399 | \\ : [number] "{rax}" (158), |
| 400 | \\ [code] "{rdi}" (0x1003), |
| 401 | \\ [ptr] "{rsi}" (@ptrToInt(&result)), |
| 402 | \\ : "rcx", "r11", "memory" |
| 403 | \\ ); |
| 404 | \\ return result; |
| 405 | \\} |
| 406 | \\ |
| 407 | \\var test_value: u64 = 12345; |
| 408 | \\ |
| 409 | \\pub export fn main() c_int { |
| 410 | \\ const orig_fs = getFs(); |
| 411 | \\ |
| 412 | \\ setFs(@ptrToInt(&test_value)); |
| 413 | \\ assert(getFs() == @ptrToInt(&test_value)); |
| 414 | \\ |
| 415 | \\ var test_ptr = @intToPtr(*allowzero addrspace(.fs) u64, 0); |
| 416 | \\ assert(test_ptr.* == 12345); |
| 417 | \\ test_ptr.* = 98765; |
| 418 | \\ assert(test_value == 98765); |
| 419 | \\ |
| 420 | \\ setFs(orig_fs); |
| 421 | \\ return 0; |
| 422 | \\} |
| 423 | , ""); |
| 424 | } |
| 375 | 425 | } |