[v5,12/16] riscv/cfi: Store shadow stack information in TLS

Message ID 20260628070241.88310-13-jesse.huang@sifive.com (mailing list archive)
State New
Headers
Series Support RISC-V Control Flow Integrifty (CFI) |

Checks

Context Check Description
redhat-pt-bot/TryBot-apply_patch success Patch applied to master at the time it was sent
linaro-tcwg-bot/tcwg_glibc_build--master-aarch64 success Build passed
linaro-tcwg-bot/tcwg_glibc_build--master-arm success Build passed

Commit Message

Jesse Huang June 28, 2026, 7:02 a.m. UTC
  Switching between different ucontexts involves two cases.  One case is
when both contexts share the same shadow stack, which requires unwinding.
The other is when each context uses a different shadow stack, which
requires a stack switch using a shadow stack restore token.

By storing the shadow stack base in TLS and comparing it to the value
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
  

Patch

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..5257acccec
--- /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) - sizeof (tcbhead_t))
diff --git a/sysdeps/riscv/nptl/tls.h b/sysdeps/riscv/nptl/tls.h
index 1e46e93669..f53863ea05 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