diff options
| author | Alex Rønne Petersen <alex@alexrp.com> | 2025-04-08 06:04:16 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-08 06:04:16 +0200 |
| commit | 2d33cc2e42d40ce0ee798d4d56c2d7da93ead44a (patch) | |
| tree | bad7965f8787aaf5a84b63996cb384d0866f0743 /lib/std/os/linux/tls.zig | |
| parent | d8153fa74ab01f8cdc117e0049e0a2d2e4187892 (diff) | |
| parent | bcb4ba9afd610a0f3ab66ad828c90fd57dc95a6f (diff) | |
| download | zig-2d33cc2e42d40ce0ee798d4d56c2d7da93ead44a.tar.gz zig-2d33cc2e42d40ce0ee798d4d56c2d7da93ead44a.zip | |
Merge pull request #23376 from sweiglbosker/m68k-archbits
Diffstat (limited to 'lib/std/os/linux/tls.zig')
| -rw-r--r-- | lib/std/os/linux/tls.zig | 32 |
1 files changed, 14 insertions, 18 deletions
diff --git a/lib/std/os/linux/tls.zig b/lib/std/os/linux/tls.zig index fdaac29e5d..3587512e65 100644 --- a/lib/std/os/linux/tls.zig +++ b/lib/std/os/linux/tls.zig @@ -508,14 +508,7 @@ pub fn initStatic(phdrs: []elf.Phdr) void { break :blk main_thread_area_buffer[0..area_desc.size]; } - const begin_addr = mmap( - null, - area_desc.size + area_desc.alignment - 1, - posix.PROT.READ | posix.PROT.WRITE, - .{ .TYPE = .PRIVATE, .ANONYMOUS = true }, - -1, - 0, - ); + const begin_addr = mmap_tls(area_desc.size + area_desc.alignment - 1); if (@call(.always_inline, linux.E.init, .{begin_addr}) != .SUCCESS) @trap(); const area_ptr: [*]align(page_size_min) u8 = @ptrFromInt(begin_addr); @@ -530,16 +523,19 @@ pub fn initStatic(phdrs: []elf.Phdr) void { setThreadPointer(tp_value); } -inline fn mmap(address: ?[*]u8, length: usize, prot: usize, flags: linux.MAP, fd: i32, offset: i64) usize { +inline fn mmap_tls(length: usize) usize { + const prot = posix.PROT.READ | posix.PROT.WRITE; + const flags: linux.MAP = .{ .TYPE = .PRIVATE, .ANONYMOUS = true }; + if (@hasField(linux.SYS, "mmap2")) { return @call(.always_inline, linux.syscall6, .{ .mmap2, - @intFromPtr(address), + 0, length, prot, @as(u32, @bitCast(flags)), - @as(usize, @bitCast(@as(isize, fd))), - @as(usize, @truncate(@as(u64, @bitCast(offset)) / linux.MMAP2_UNIT)), + @as(usize, @bitCast(@as(isize, -1))), + 0, }); } else { // The s390x mmap() syscall existed before Linux supported syscalls with 5+ parameters, so @@ -547,21 +543,21 @@ inline fn mmap(address: ?[*]u8, length: usize, prot: usize, flags: linux.MAP, fd return if (native_arch == .s390x) @call(.always_inline, linux.syscall1, .{ .mmap, @intFromPtr(&[_]usize{ - @intFromPtr(address), + 0, length, prot, @as(u32, @bitCast(flags)), - @as(usize, @bitCast(@as(isize, fd))), - @as(u64, @bitCast(offset)), + @as(usize, @bitCast(@as(isize, -1))), + 0, }), }) else @call(.always_inline, linux.syscall6, .{ .mmap, - @intFromPtr(address), + 0, length, prot, @as(u32, @bitCast(flags)), - @as(usize, @bitCast(@as(isize, fd))), - @as(u64, @bitCast(offset)), + @as(usize, @bitCast(@as(isize, -1))), + 0, }); } } |
