Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 1 Sep 2015 15:57:04 +0000 (UTC)
From:      Andrew Turner <andrew@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r287370 - head/libexec/rtld-elf/aarch64
Message-ID:  <201509011557.t81Fv4Yh072558@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: andrew
Date: Tue Sep  1 15:57:03 2015
New Revision: 287370
URL: https://svnweb.freebsd.org/changeset/base/287370

Log:
  Fix how we place each objects thread local data. The code used was based
  on the Variant II code, however arm64 uses Variant I. The former placed the
  thread pointer after the data, pointing at the thread control block, while
  the latter places these before said data.
  
  Because of this we need to use the size of the previous entry to calculate
  where to place the current entry. We also need to reserve 16 bytes at the
  start for the thread control block.
  
  This also fixes the value of TLS_TCB_SIZE to be correct. This is the size
  of two unsigned longs, i.e. 2 * 8 bytes.
  
  While here remove the bogus adjustment of the pointer in the
  R_AARCH64_TLS_TPREL64 case. It should be the offset of the data relative
  to the thread pointer, including the thread control block.
  
  Sponsored by:	ABT Systems Ltd

Modified:
  head/libexec/rtld-elf/aarch64/reloc.c
  head/libexec/rtld-elf/aarch64/rtld_machdep.h

Modified: head/libexec/rtld-elf/aarch64/reloc.c
==============================================================================
--- head/libexec/rtld-elf/aarch64/reloc.c	Tue Sep  1 15:43:56 2015	(r287369)
+++ head/libexec/rtld-elf/aarch64/reloc.c	Tue Sep  1 15:57:03 2015	(r287370)
@@ -381,7 +381,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry 
 			}
 
 			*where = def->st_value + rela->r_addend +
-			    defobj->tlsoffset - TLS_TCB_SIZE;
+			    defobj->tlsoffset;
 			break;
 		case R_AARCH64_RELATIVE:
 			*where = (Elf_Addr)(obj->relocbase + rela->r_addend);

Modified: head/libexec/rtld-elf/aarch64/rtld_machdep.h
==============================================================================
--- head/libexec/rtld-elf/aarch64/rtld_machdep.h	Tue Sep  1 15:43:56 2015	(r287369)
+++ head/libexec/rtld-elf/aarch64/rtld_machdep.h	Tue Sep  1 15:57:03 2015	(r287370)
@@ -64,12 +64,12 @@ Elf_Addr reloc_jmpslot(Elf_Addr *where, 
 #define	round(size, align) \
 	(((size) + (align) - 1) & ~((align) - 1))
 #define	calculate_first_tls_offset(size, align) \
-	round(size, align)
+	round(16, align)
 #define	calculate_tls_offset(prev_offset, prev_size, size, align) \
-	round((prev_offset) + (size), align)
+	round(prev_offset + prev_size, align)
 #define	calculate_tls_end(off, size) 	((off) + (size))
 
-#define	TLS_TCB_SIZE	8
+#define	TLS_TCB_SIZE	16
 typedef struct {
     unsigned long ti_module;
     unsigned long ti_offset;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201509011557.t81Fv4Yh072558>