| 1 | fn assert(ok: bool) void { |
| 2 | if (!ok) unreachable; |
| 3 | } |
| 4 | |
| 5 | fn setFs(value: c_ulong) void { |
| 6 | asm volatile ( |
| 7 | \\syscall |
| 8 | : |
| 9 | : [number] "{rax}" (158), |
| 10 | [code] "{rdi}" (0x1002), |
| 11 | [val] "{rsi}" (value), |
| 12 | : .{ .rcx = true, .r11 = true, .memory = true } |
| 13 | ); |
| 14 | } |
| 15 | |
| 16 | fn getFs() c_ulong { |
| 17 | var result: c_ulong = undefined; |
| 18 | asm volatile ( |
| 19 | \\syscall |
| 20 | : |
| 21 | : [number] "{rax}" (158), |
| 22 | [code] "{rdi}" (0x1003), |
| 23 | [ptr] "{rsi}" (@intFromPtr(&result)), |
| 24 | : .{ .rcx = true, .r11 = true, .memory = true } |
| 25 | ); |
| 26 | return result; |
| 27 | } |
| 28 | |
| 29 | var test_value: u64 = 12345; |
| 30 | |
| 31 | pub fn main() void { |
| 32 | const orig_fs = getFs(); |
| 33 | |
| 34 | setFs(@intFromPtr(&test_value)); |
| 35 | assert(getFs() == @intFromPtr(&test_value)); |
| 36 | |
| 37 | var test_ptr: *allowzero addrspace(.fs) u64 = @ptrFromInt(0); |
| 38 | _ = &test_ptr; |
| 39 | assert(test_ptr.* == 12345); |
| 40 | test_ptr.* = 98765; |
| 41 | assert(test_value == 98765); |
| 42 | |
| 43 | setFs(orig_fs); |
| 44 | } |
| 45 | |
| 46 | // run |
| 47 | // backend=llvm |
| 48 | // target=x86_64-linux |
| 49 | // |