[PATCH] riscv: Fix RV32 libthread_db THREAD_SELF register layout
Shengwen Cheng
shengwen1997.tw@gmail.com
Tue Jun 23 18:02:52 GMT 2026
The RISC-V libthread_db THREAD_SELF descriptor currently assumes 64-bit
general-register slots:
REGISTER (64, 64, 4 * 8, ...)
That is correct for RV64, where tp/x4 is at byte offset 4 * 8 in the
general register set. On RV32, general-register slots are 32-bit wide,
so tp/x4 is at byte offset 4 * 4.
Using the RV64 layout on RV32 makes libthread_db read the wrong thread
pointer value and prevents GDB from enabling pthread-aware thread
debugging.
Check __riscv_xlen and define DB_THREAD_SELF with the matching register
slot size.
---
sysdeps/riscv/nptl/tls.h | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/sysdeps/riscv/nptl/tls.h b/sysdeps/riscv/nptl/tls.h
index b2e0f3c249..708b18007e 100644
--- a/sysdeps/riscv/nptl/tls.h
+++ b/sysdeps/riscv/nptl/tls.h
@@ -96,8 +96,15 @@ typedef struct
/* Informs libthread_db that the thread pointer is register 4, which is used
* to know how to do THREAD_SELF. */
-# define DB_THREAD_SELF \
+# if __riscv_xlen == 64
+# define DB_THREAD_SELF \
REGISTER (64, 64, 4 * 8, - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE)
+# elif __riscv_xlen == 32
+# define DB_THREAD_SELF \
+ REGISTER (32, 32, 4 * 4, - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE)
+# else
+# error unsupported xlen
+# endif
/* Access to data in the thread descriptor is easy. */
# include <tcb-access.h>
--
2.43.0
More information about the Libc-alpha
mailing list