the only part of TP_ADJ that was not uniquely determined by TLS_ABOVE_TP was the 0x7000 adjustment used mainly on mips and powerpc variants.
@@ -7,6 +7,5 @@ static inline struct pthread *__pthread_self()
#define TLS_ABOVE_TP
#define GAP_ABOVE_TP 16
-#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread))
#define MC_PC pc
@@ -28,6 +28,5 @@ static inline pthread_t __pthread_self()
#define GAP_ABOVE_TP 8
#define MC_PC arm_pc
@@ -5,6 +5,4 @@ static inline struct pthread *__pthread_self()
return self;
}
-#define TP_ADJ(p) (p)
-
#define MC_PC gregs[REG_EIP]
@@ -6,8 +6,8 @@ static inline struct pthread *__pthread_self()
#define GAP_ABOVE_TP 0
-#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + 0x7000)
+#define TP_OFFSET 0x7000
#define DTP_OFFSET 0x8000
#define MC_PC gregs[R_PC]
#define MC_PC regs.pc
@@ -12,8 +12,8 @@ static inline struct pthread *__pthread_self()
@@ -13,6 +13,5 @@ static inline struct pthread *__pthread_self()
@@ -7,8 +7,8 @@ static inline struct pthread *__pthread_self()
// the kernel calls the ip "nip", it's the first saved value after the 32
@@ -7,7 +7,6 @@ static inline struct pthread *__pthread_self()
-#define TP_ADJ(p) ((char *)p + sizeof(struct pthread))
#define DTP_OFFSET 0x800
@@ -9,6 +9,4 @@ static inline struct pthread *__pthread_self()
#define MC_PC psw.addr
#define MC_PC sc_pc
@@ -5,8 +5,6 @@ static inline struct pthread *__pthread_self()
#define MC_PC gregs[REG_RIP]
#define CANARY canary2
@@ -105,10 +105,20 @@ struct __timer {
#define CANARY canary
#endif
+#ifndef TP_OFFSET
+#define TP_OFFSET 0
+#endif
+
#ifndef DTP_OFFSET
#define DTP_OFFSET 0
+#ifdef TLS_ABOVE_TP
+#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + TP_OFFSET)
+#else
+#define TP_ADJ(p) (p)
#ifndef tls_mod_off_t
#define tls_mod_off_t size_t