Message ID | 20241008-v5_user_cfi_series-v6-6-60d9fe073f37@rivosinc.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | riscv control-flow integrity for usermode | expand |
On Tue, Oct 08, 2024 at 03:36:48PM -0700, Deepak Gupta wrote: > riscv will need an implementation for exit_thread to clean up shadow stack > when thread exits. If current thread had shadow stack enabled, shadow > stack is allocated by default for any new thread. FWIW both arm64 and x86 do this via deactivate_mm(). ISTR there's some case where exit_thread() doesn't quite do the right thing but I can't remember the specifics right now, possibly the vfork() case but ICBW? In any case like Rick said factoring out the common patterns would be good, keeping things aligned would support that.
On Wed, Oct 09, 2024 at 12:28:03PM +0100, Mark Brown wrote: >On Tue, Oct 08, 2024 at 03:36:48PM -0700, Deepak Gupta wrote: > >> riscv will need an implementation for exit_thread to clean up shadow stack >> when thread exits. If current thread had shadow stack enabled, shadow >> stack is allocated by default for any new thread. > >FWIW both arm64 and x86 do this via deactivate_mm(). ISTR there's some >case where exit_thread() doesn't quite do the right thing but I can't >remember the specifics right now, possibly the vfork() case but ICBW? >In any case like Rick said factoring out the common patterns would be >good, keeping things aligned would support that. Now getting back to collecting feedback and sending another version. Yeah I found what you meant. https://lore.kernel.org/all/20230908203655.543765-1-rick.p.edgecombe@intel.com/#t Seems like an issue for riscv as well. Will fix it. This particular issue screaming out loud for converging flows as well.
diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig index 22dc5ea4196c..808ea66b9537 100644 --- a/arch/riscv/Kconfig +++ b/arch/riscv/Kconfig @@ -182,6 +182,7 @@ config RISCV select HAVE_SAMPLE_FTRACE_DIRECT_MULTI select HAVE_STACKPROTECTOR select HAVE_SYSCALL_TRACEPOINTS + select HAVE_EXIT_THREAD select HOTPLUG_CORE_SYNC_DEAD if HOTPLUG_CPU select IRQ_DOMAIN select IRQ_FORCED_THREADING diff --git a/arch/riscv/kernel/process.c b/arch/riscv/kernel/process.c index e3142d8a6e28..1f2574fb2edb 100644 --- a/arch/riscv/kernel/process.c +++ b/arch/riscv/kernel/process.c @@ -201,6 +201,11 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src) return 0; } +void exit_thread(struct task_struct *tsk) +{ + +} + int copy_thread(struct task_struct *p, const struct kernel_clone_args *args) { unsigned long clone_flags = args->flags;