From ce65533985caa9e2da567948e36d7d4ba0185005 Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Fri, 18 Dec 2020 09:15:17 +0100 Subject: [PATCH] std: Properly fix the TLS alignment problem ad05509 introduced a fix for the wrong problem, the logic to align the start of main_thread_tls_buffer was already there but was flawed. Fix it for good and avoid wasting too many bytes for alignment purposes. --- lib/std/os/linux/tls.zig | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/std/os/linux/tls.zig b/lib/std/os/linux/tls.zig index d78a14c311210736c8830ba38e65e2e7e8a68eeb..d956266114a3362935eca02e36f2534b29233c62 100644 --- a/lib/std/os/linux/tls.zig +++ b/lib/std/os/linux/tls.zig @@ -327,7 +327,7 @@ pub fn prepareTLS(area: []u8) usize { if (tls_tp_points_past_tcb) tls_image.data_offset else tls_image.tcb_offset; } -var main_thread_tls_buffer: [256]u8 align(16) = undefined; +var main_thread_tls_buffer: [256]u8 = undefined; pub fn initStaticTLS() void { initTLS(); @@ -351,7 +351,9 @@ pub fn initStaticTLS() void { }; // Make sure the slice is correctly aligned - const start = @ptrToInt(alloc_tls_area.ptr) & (tls_image.alloc_align - 1); + const begin_addr = @ptrToInt(alloc_tls_area.ptr); + const begin_aligned_addr = mem.alignForward(begin_addr, tls_image.alloc_align); + const start = begin_aligned_addr - begin_addr; const tls_area = alloc_tls_area[start .. start + tls_image.alloc_size]; const tp_value = prepareTLS(tls_area); -- 2.54.0