Skip to content

Commit

Permalink
musl: update struct_pthread to musl 1.2 layout
Browse files Browse the repository at this point in the history
our tid caching implementation in chromium was depending on internal
musl ABI from musl 1.2.4, but we stil have musl 1.1.x by default.

Adding patches to get the same struct_pthread layout from mus 1.2 to get
our chromium builds compatible with both musl 1.1 and 1.2

closes #29654
  • Loading branch information
Johnnynator committed Oct 23, 2024
1 parent 7a461ad commit a445492
Show file tree
Hide file tree
Showing 4 changed files with 789 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,255 @@
From ea71a9004e08030a15d45186e263fd2b0c51cc25 Mon Sep 17 00:00:00 2001
From: Rich Felker <dalias@aerifal.cx>
Date: Mon, 24 Aug 2020 22:04:52 -0400
Subject: [PATCH 3/5] deduplicate TP_ADJ logic out of each arch, replace with
TP_OFFSET

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.
---
arch/aarch64/pthread_arch.h | 1 -
arch/arm/pthread_arch.h | 1 -
arch/i386/pthread_arch.h | 2 --
arch/m68k/pthread_arch.h | 2 +-
arch/microblaze/pthread_arch.h | 2 --
arch/mips/pthread_arch.h | 2 +-
arch/mips64/pthread_arch.h | 2 +-
arch/mipsn32/pthread_arch.h | 2 +-
arch/or1k/pthread_arch.h | 1 -
arch/powerpc/pthread_arch.h | 2 +-
arch/powerpc64/pthread_arch.h | 2 +-
arch/riscv64/pthread_arch.h | 1 -
arch/s390x/pthread_arch.h | 2 --
arch/sh/pthread_arch.h | 1 -
arch/x32/pthread_arch.h | 2 --
arch/x86_64/pthread_arch.h | 2 --
src/internal/pthread_impl.h | 10 ++++++++++
17 files changed, 16 insertions(+), 21 deletions(-)

diff --git a/arch/aarch64/pthread_arch.h b/arch/aarch64/pthread_arch.h
index e64b126d..f3c005c7 100644
--- a/arch/aarch64/pthread_arch.h
+++ b/arch/aarch64/pthread_arch.h
@@ -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
diff --git a/arch/arm/pthread_arch.h b/arch/arm/pthread_arch.h
index e689ea21..48640985 100644
--- a/arch/arm/pthread_arch.h
+++ b/arch/arm/pthread_arch.h
@@ -28,6 +28,5 @@ static inline pthread_t __pthread_self()

#define TLS_ABOVE_TP
#define GAP_ABOVE_TP 8
-#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread))

#define MC_PC arm_pc
diff --git a/arch/i386/pthread_arch.h b/arch/i386/pthread_arch.h
index 6f600b9e..32570a17 100644
--- a/arch/i386/pthread_arch.h
+++ b/arch/i386/pthread_arch.h
@@ -5,6 +5,4 @@ static inline struct pthread *__pthread_self()
return self;
}

-#define TP_ADJ(p) (p)
-
#define MC_PC gregs[REG_EIP]
diff --git a/arch/m68k/pthread_arch.h b/arch/m68k/pthread_arch.h
index 02d5b8a0..7c9990c2 100644
--- a/arch/m68k/pthread_arch.h
+++ b/arch/m68k/pthread_arch.h
@@ -6,8 +6,8 @@ static inline struct pthread *__pthread_self()

#define TLS_ABOVE_TP
#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]
diff --git a/arch/microblaze/pthread_arch.h b/arch/microblaze/pthread_arch.h
index f6ba8de9..c327f4eb 100644
--- a/arch/microblaze/pthread_arch.h
+++ b/arch/microblaze/pthread_arch.h
@@ -5,6 +5,4 @@ static inline struct pthread *__pthread_self()
return self;
}

-#define TP_ADJ(p) (p)
-
#define MC_PC regs.pc
diff --git a/arch/mips/pthread_arch.h b/arch/mips/pthread_arch.h
index 1e7839ea..c22eb34d 100644
--- a/arch/mips/pthread_arch.h
+++ b/arch/mips/pthread_arch.h
@@ -12,8 +12,8 @@ static inline struct pthread *__pthread_self()

#define TLS_ABOVE_TP
#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 pc
diff --git a/arch/mips64/pthread_arch.h b/arch/mips64/pthread_arch.h
index 1e7839ea..c22eb34d 100644
--- a/arch/mips64/pthread_arch.h
+++ b/arch/mips64/pthread_arch.h
@@ -12,8 +12,8 @@ static inline struct pthread *__pthread_self()

#define TLS_ABOVE_TP
#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 pc
diff --git a/arch/mipsn32/pthread_arch.h b/arch/mipsn32/pthread_arch.h
index 1e7839ea..c22eb34d 100644
--- a/arch/mipsn32/pthread_arch.h
+++ b/arch/mipsn32/pthread_arch.h
@@ -12,8 +12,8 @@ static inline struct pthread *__pthread_self()

#define TLS_ABOVE_TP
#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 pc
diff --git a/arch/or1k/pthread_arch.h b/arch/or1k/pthread_arch.h
index 1b806f89..76d0a8bc 100644
--- a/arch/or1k/pthread_arch.h
+++ b/arch/or1k/pthread_arch.h
@@ -13,6 +13,5 @@ static inline struct pthread *__pthread_self()

#define TLS_ABOVE_TP
#define GAP_ABOVE_TP 0
-#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread))

#define MC_PC regs.pc
diff --git a/arch/powerpc/pthread_arch.h b/arch/powerpc/pthread_arch.h
index ae0f28d6..9697046b 100644
--- a/arch/powerpc/pthread_arch.h
+++ b/arch/powerpc/pthread_arch.h
@@ -7,8 +7,8 @@ static inline struct pthread *__pthread_self()

#define TLS_ABOVE_TP
#define GAP_ABOVE_TP 0
-#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + 0x7000)

+#define TP_OFFSET 0x7000
#define DTP_OFFSET 0x8000

// the kernel calls the ip "nip", it's the first saved value after the 32
diff --git a/arch/powerpc64/pthread_arch.h b/arch/powerpc64/pthread_arch.h
index 79c3ecd8..e9dba43f 100644
--- a/arch/powerpc64/pthread_arch.h
+++ b/arch/powerpc64/pthread_arch.h
@@ -7,8 +7,8 @@ static inline struct pthread *__pthread_self()

#define TLS_ABOVE_TP
#define GAP_ABOVE_TP 0
-#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + 0x7000)

+#define TP_OFFSET 0x7000
#define DTP_OFFSET 0x8000

// the kernel calls the ip "nip", it's the first saved value after the 32
diff --git a/arch/riscv64/pthread_arch.h b/arch/riscv64/pthread_arch.h
index db414b17..50f0868d 100644
--- a/arch/riscv64/pthread_arch.h
+++ b/arch/riscv64/pthread_arch.h
@@ -7,7 +7,6 @@ static inline struct pthread *__pthread_self()

#define TLS_ABOVE_TP
#define GAP_ABOVE_TP 0
-#define TP_ADJ(p) ((char *)p + sizeof(struct pthread))

#define DTP_OFFSET 0x800

diff --git a/arch/s390x/pthread_arch.h b/arch/s390x/pthread_arch.h
index e2251f1f..5d22546b 100644
--- a/arch/s390x/pthread_arch.h
+++ b/arch/s390x/pthread_arch.h
@@ -9,6 +9,4 @@ static inline struct pthread *__pthread_self()
return self;
}

-#define TP_ADJ(p) (p)
-
#define MC_PC psw.addr
diff --git a/arch/sh/pthread_arch.h b/arch/sh/pthread_arch.h
index 3ee9c1a9..c2252908 100644
--- a/arch/sh/pthread_arch.h
+++ b/arch/sh/pthread_arch.h
@@ -7,7 +7,6 @@ static inline struct pthread *__pthread_self()

#define TLS_ABOVE_TP
#define GAP_ABOVE_TP 8
-#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread))

#define MC_PC sc_pc

diff --git a/arch/x32/pthread_arch.h b/arch/x32/pthread_arch.h
index f640a1a1..fa452839 100644
--- a/arch/x32/pthread_arch.h
+++ b/arch/x32/pthread_arch.h
@@ -5,8 +5,6 @@ static inline struct pthread *__pthread_self()
return self;
}

-#define TP_ADJ(p) (p)
-
#define MC_PC gregs[REG_RIP]

#define CANARY canary2
diff --git a/arch/x86_64/pthread_arch.h b/arch/x86_64/pthread_arch.h
index 65e880c6..1c64a840 100644
--- a/arch/x86_64/pthread_arch.h
+++ b/arch/x86_64/pthread_arch.h
@@ -5,6 +5,4 @@ static inline struct pthread *__pthread_self()
return self;
}

-#define TP_ADJ(p) (p)
-
#define MC_PC gregs[REG_RIP]
diff --git a/src/internal/pthread_impl.h b/src/internal/pthread_impl.h
index 5749a336..3c2bd767 100644
--- a/src/internal/pthread_impl.h
+++ b/src/internal/pthread_impl.h
@@ -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
#endif

+#ifdef TLS_ABOVE_TP
+#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + TP_OFFSET)
+#else
+#define TP_ADJ(p) (p)
+#endif
+
#ifndef tls_mod_off_t
#define tls_mod_off_t size_t
#endif
--
2.47.0

Loading

0 comments on commit a445492

Please sign in to comment.