[PATCH v3 12/16] riscv/cfi: Store shadow stack information in TLS
Jesse Huang
jesse.huang@sifive.com
Mon Oct 27 04:26:30 GMT 2025
Switching between different ucontexts involves two cases, one is both
sharing a same shadow stack, which requires a unwinding, and the other
is both using a different shadow stack, which require a stack switch
using shadow stack restore token.
By storing shadow stack base in TLS and compare to the one stored in the
context, we can tell the difference and perform the right action.
---
sysdeps/riscv/nptl/Makefile | 1 +
sysdeps/riscv/nptl/tcb-offsets.sym | 5 +++++
sysdeps/riscv/nptl/tls.h | 2 ++
3 files changed, 8 insertions(+)
create mode 100644 sysdeps/riscv/nptl/Makefile
create mode 100644 sysdeps/riscv/nptl/tcb-offsets.sym
diff --git a/sysdeps/riscv/nptl/Makefile b/sysdeps/riscv/nptl/Makefile
new file mode 100644
index 0000000000..2b7bf43403
--- /dev/null
+++ b/sysdeps/riscv/nptl/Makefile
@@ -0,0 +1 @@
+gen-as-const-headers += tcb-offsets.sym
diff --git a/sysdeps/riscv/nptl/tcb-offsets.sym b/sysdeps/riscv/nptl/tcb-offsets.sym
new file mode 100644
index 0000000000..04a402acb5
--- /dev/null
+++ b/sysdeps/riscv/nptl/tcb-offsets.sym
@@ -0,0 +1,5 @@
+#include <sysdep.h>
+#include <tls.h>
+#include <kernel-features.h>
+
+TLS_SSP_BASE_OFFSET offsetof (tcbhead_t, ssp_base)
diff --git a/sysdeps/riscv/nptl/tls.h b/sysdeps/riscv/nptl/tls.h
index 11a1b08972..1e7c26790b 100644
--- a/sysdeps/riscv/nptl/tls.h
+++ b/sysdeps/riscv/nptl/tls.h
@@ -44,6 +44,8 @@ typedef struct
{
dtv_t *dtv;
void *private;
+ /* The marker for the current shadow stack. */
+ unsigned long long int ssp_base;
} tcbhead_t;
/* This is the size of the initial TCB. Because our TCB is before the thread
--
2.39.3
More information about the Libc-alpha
mailing list