Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F109900099
D24366.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
9 KB
Referenced Files
None
Subscribers
None
D24366.diff
View Options
Index: head/libexec/rtld-elf/aarch64/rtld_machdep.h
===================================================================
--- head/libexec/rtld-elf/aarch64/rtld_machdep.h
+++ head/libexec/rtld-elf/aarch64/rtld_machdep.h
@@ -72,9 +72,9 @@
#define round(size, align) \
(((size) + (align) - 1) & ~((align) - 1))
-#define calculate_first_tls_offset(size, align) \
+#define calculate_first_tls_offset(size, align, offset) \
round(16, align)
-#define calculate_tls_offset(prev_offset, prev_size, size, align) \
+#define calculate_tls_offset(prev_offset, prev_size, size, align, offset) \
round(prev_offset + prev_size, align)
#define calculate_tls_end(off, size) ((off) + (size))
#define calculate_tls_post_size(align) \
Index: head/libexec/rtld-elf/amd64/reloc.c
===================================================================
--- head/libexec/rtld-elf/amd64/reloc.c
+++ head/libexec/rtld-elf/amd64/reloc.c
@@ -552,3 +552,33 @@
return tls_get_addr_common(&segbase[1], ti->ti_module, ti->ti_offset);
}
+
+size_t
+calculate_first_tls_offset(size_t size, size_t align, size_t offset)
+{
+ size_t res;
+
+ res = roundup(size, align);
+ offset &= align - 1;
+ if (offset != 0)
+ res += align - offset;
+ return (res);
+}
+
+size_t
+calculate_tls_offset(size_t prev_offset, size_t prev_size __unused, size_t size,
+ size_t align, size_t offset)
+{
+ size_t res;
+
+ res = roundup(prev_offset + size, align);
+ offset &= align - 1;
+ if (offset != 0)
+ res += align - offset;
+ return (res);
+}
+size_t
+calculate_tls_end(size_t off, size_t size __unused)
+{
+ return (off);
+}
Index: head/libexec/rtld-elf/amd64/rtld_machdep.h
===================================================================
--- head/libexec/rtld-elf/amd64/rtld_machdep.h
+++ head/libexec/rtld-elf/amd64/rtld_machdep.h
@@ -61,14 +61,6 @@
(((Elf_Addr (*)(uint32_t, uint32_t, uint32_t, uint32_t))ptr)( \
cpu_feature, cpu_feature2, cpu_stdext_feature, cpu_stdext_feature2))
-#define round(size, align) \
- (((size) + (align) - 1) & ~((align) - 1))
-#define calculate_first_tls_offset(size, align) \
- round(size, align)
-#define calculate_tls_offset(prev_offset, prev_size, size, align) \
- round((prev_offset) + (size), align)
-#define calculate_tls_end(off, size) (off)
-
typedef struct {
unsigned long ti_module;
unsigned long ti_offset;
@@ -81,4 +73,8 @@
#define md_abi_variant_hook(x)
+size_t calculate_first_tls_offset(size_t size, size_t align, size_t offset);
+size_t calculate_tls_offset(size_t prev_offset, size_t prev_size, size_t size,
+ size_t align, size_t offset);
+size_t calculate_tls_end(size_t off, size_t size);
#endif
Index: head/libexec/rtld-elf/arm/rtld_machdep.h
===================================================================
--- head/libexec/rtld-elf/arm/rtld_machdep.h
+++ head/libexec/rtld-elf/arm/rtld_machdep.h
@@ -64,9 +64,9 @@
#define round(size, align) \
(((size) + (align) - 1) & ~((align) - 1))
-#define calculate_first_tls_offset(size, align) \
+#define calculate_first_tls_offset(size, align, offset) \
round(8, align)
-#define calculate_tls_offset(prev_offset, prev_size, size, align) \
+#define calculate_tls_offset(prev_offset, prev_size, size, align, offset) \
round(prev_offset + prev_size, align)
#define calculate_tls_end(off, size) ((off) + (size))
#define calculate_tls_post_size(align) \
Index: head/libexec/rtld-elf/i386/reloc.c
===================================================================
--- head/libexec/rtld-elf/i386/reloc.c
+++ head/libexec/rtld-elf/i386/reloc.c
@@ -543,3 +543,33 @@
return tls_get_addr_common(&segbase[1], ti->ti_module, ti->ti_offset);
}
+
+size_t
+calculate_first_tls_offset(size_t size, size_t align, size_t offset)
+{
+ size_t res;
+
+ res = roundup(size, align);
+ offset &= align - 1;
+ if (offset != 0)
+ res += align - offset;
+ return (res);
+}
+
+size_t
+calculate_tls_offset(size_t prev_offset, size_t prev_size __unused, size_t size,
+ size_t align, size_t offset)
+{
+ size_t res;
+
+ res = roundup(prev_offset + size, align);
+ offset &= align - 1;
+ if (offset != 0)
+ res += align - offset;
+ return (res);
+}
+size_t
+calculate_tls_end(size_t off, size_t size __unused)
+{
+ return (off);
+}
Index: head/libexec/rtld-elf/i386/rtld_machdep.h
===================================================================
--- head/libexec/rtld-elf/i386/rtld_machdep.h
+++ head/libexec/rtld-elf/i386/rtld_machdep.h
@@ -61,14 +61,6 @@
(((Elf_Addr (*)(uint32_t, uint32_t, uint32_t, uint32_t))(ptr))( \
cpu_feature, cpu_feature2, cpu_stdext_feature, cpu_stdext_feature2))
-#define round(size, align) \
- (((size) + (align) - 1) & ~((align) - 1))
-#define calculate_first_tls_offset(size, align) \
- round(size, align)
-#define calculate_tls_offset(prev_offset, prev_size, size, align) \
- round((prev_offset) + (size), align)
-#define calculate_tls_end(off, size) (off)
-
typedef struct {
unsigned long ti_module;
unsigned long ti_offset;
@@ -82,4 +74,8 @@
#define md_abi_variant_hook(x)
+size_t calculate_first_tls_offset(size_t size, size_t align, size_t offset);
+size_t calculate_tls_offset(size_t prev_offset, size_t prev_size, size_t size,
+ size_t align, size_t offset);
+size_t calculate_tls_end(size_t off, size_t size);
#endif
Index: head/libexec/rtld-elf/mips/rtld_machdep.h
===================================================================
--- head/libexec/rtld-elf/mips/rtld_machdep.h
+++ head/libexec/rtld-elf/mips/rtld_machdep.h
@@ -66,9 +66,9 @@
#define round(size, align) \
(((size) + (align) - 1) & ~((align) - 1))
-#define calculate_first_tls_offset(size, align) \
+#define calculate_first_tls_offset(size, align, offset) \
TLS_TCB_SIZE
-#define calculate_tls_offset(prev_offset, prev_size, size, align) \
+#define calculate_tls_offset(prev_offset, prev_size, size, align, offset) \
round(prev_offset + prev_size, align)
#define calculate_tls_end(off, size) ((off) + (size))
#define calculate_tls_post_size(align) 0
Index: head/libexec/rtld-elf/powerpc/rtld_machdep.h
===================================================================
--- head/libexec/rtld-elf/powerpc/rtld_machdep.h
+++ head/libexec/rtld-elf/powerpc/rtld_machdep.h
@@ -79,9 +79,9 @@
#define round(size, align) \
(((size) + (align) - 1) & ~((align) - 1))
-#define calculate_first_tls_offset(size, align) \
+#define calculate_first_tls_offset(size, align, offset) \
TLS_TCB_SIZE
-#define calculate_tls_offset(prev_offset, prev_size, size, align) \
+#define calculate_tls_offset(prev_offset, prev_size, size, align, offset) \
round(prev_offset + prev_size, align)
#define calculate_tls_end(off, size) ((off) + (size))
#define calculate_tls_post_size(align) 0
Index: head/libexec/rtld-elf/powerpc64/rtld_machdep.h
===================================================================
--- head/libexec/rtld-elf/powerpc64/rtld_machdep.h
+++ head/libexec/rtld-elf/powerpc64/rtld_machdep.h
@@ -71,9 +71,9 @@
#define round(size, align) \
(((size) + (align) - 1) & ~((align) - 1))
-#define calculate_first_tls_offset(size, align) \
+#define calculate_first_tls_offset(size, align, offset) \
TLS_TCB_SIZE
-#define calculate_tls_offset(prev_offset, prev_size, size, align) \
+#define calculate_tls_offset(prev_offset, prev_size, size, align, offset) \
round(prev_offset + prev_size, align)
#define calculate_tls_end(off, size) ((off) + (size))
#define calculate_tls_post_size(align) 0
Index: head/libexec/rtld-elf/riscv/rtld_machdep.h
===================================================================
--- head/libexec/rtld-elf/riscv/rtld_machdep.h
+++ head/libexec/rtld-elf/riscv/rtld_machdep.h
@@ -88,9 +88,9 @@
#define round(size, align) \
(((size) + (align) - 1) & ~((align) - 1))
-#define calculate_first_tls_offset(size, align) \
+#define calculate_first_tls_offset(size, align, offset) \
TLS_TCB_SIZE
-#define calculate_tls_offset(prev_offset, prev_size, size, align) \
+#define calculate_tls_offset(prev_offset, prev_size, size, align, offset) \
round(prev_offset + prev_size, align)
#define calculate_tls_end(off, size) ((off) + (size))
#define calculate_tls_post_size(align) 0
Index: head/libexec/rtld-elf/rtld.c
===================================================================
--- head/libexec/rtld-elf/rtld.c
+++ head/libexec/rtld-elf/rtld.c
@@ -4979,13 +4979,13 @@
ralign = tcbalign;
if (tls_static_max_align > ralign)
ralign = tls_static_max_align;
- size = round(tls_static_space, ralign) + round(tcbsize, ralign);
+ size = roundup(tls_static_space, ralign) + roundup(tcbsize, ralign);
assert(tcbsize >= 2*sizeof(Elf_Addr));
tls = malloc_aligned(size, ralign, 0 /* XXX */);
dtv = xcalloc(tls_max_index + 2, sizeof(Elf_Addr));
- segbase = (Elf_Addr)(tls + round(tls_static_space, ralign));
+ segbase = (Elf_Addr)(tls + roundup(tls_static_space, ralign));
((Elf_Addr*)segbase)[0] = segbase;
((Elf_Addr*)segbase)[1] = (Elf_Addr) dtv;
@@ -5051,7 +5051,7 @@
ralign = tcbalign;
if (tls_static_max_align > ralign)
ralign = tls_static_max_align;
- size = round(tls_static_space, ralign);
+ size = roundup(tls_static_space, ralign);
dtv = ((Elf_Addr**)tls)[1];
dtvsize = dtv[1];
@@ -5109,10 +5109,11 @@
}
if (tls_last_offset == 0)
- off = calculate_first_tls_offset(obj->tlssize, obj->tlsalign);
+ off = calculate_first_tls_offset(obj->tlssize, obj->tlsalign,
+ obj->tlspoffset);
else
off = calculate_tls_offset(tls_last_offset, tls_last_size,
- obj->tlssize, obj->tlsalign);
+ obj->tlssize, obj->tlsalign, obj->tlspoffset);
/*
* If we have already fixed the size of the static TLS block, we
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Feb 11, 10:55 PM (16 h, 21 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16584837
Default Alt Text
D24366.diff (9 KB)
Attached To
Mode
D24366: Align initial-exec TLS segments to the p_vaddr % align.
Attached
Detach File
Event Timeline
Log In to Comment