[PATCH v7 2/6] riscv: introduce riscv_v_ucontext_save() for signal and ptrace
Andy Chiu
tchiu at tenstorrent.com
Wed Nov 11 10:43:24 PST 2026
Add a centralized user context saving function for the next patch. As we
are preparing for the optimization that skip saving on VS==INITIAL, user
context saving in ptrace and signal both need to account for such case,
and they are handled in a similar way.
This is a preparatory patch, the next patch folds in the actual handling
for exporting the user context when VS is at INITIAL state.
Signed-off-by: Andy Chiu <tchiu at tenstorrent.com>
---
Changelog v7:
- new patch since v7 (splited out from v6 to maintain git bisectability)
---
arch/riscv/include/asm/vector.h | 2 ++
arch/riscv/kernel/ptrace.c | 6 +-----
arch/riscv/kernel/signal.c | 4 +---
arch/riscv/kernel/vector.c | 12 ++++++++++++
4 files changed, 16 insertions(+), 8 deletions(-)
diff --git a/arch/riscv/include/asm/vector.h b/arch/riscv/include/asm/vector.h
index 8c88a2258e61..7cd20f661596 100644
--- a/arch/riscv/include/asm/vector.h
+++ b/arch/riscv/include/asm/vector.h
@@ -52,6 +52,7 @@ void riscv_v_thread_free(struct task_struct *tsk);
void __init riscv_v_setup_ctx_cache(void);
void riscv_v_thread_alloc(struct task_struct *tsk);
void __init update_regset_vector_info(unsigned long size);
+void riscv_v_ucontext_save(struct task_struct *tsk);
static inline u32 riscv_v_flags(void)
{
@@ -434,6 +435,7 @@ static inline bool riscv_v_vstate_ctrl_user_allowed(void) { return false; }
#define riscv_v_thread_alloc(tsk) do {} while (0)
#define get_cpu_vector_context() do {} while (0)
#define put_cpu_vector_context() do {} while (0)
+#define riscv_v_ucontext_save(tsk) do {} while (0)
#define riscv_v_vstate_set_restore(task, regs) do {} while (0)
#endif /* CONFIG_RISCV_ISA_V */
diff --git a/arch/riscv/kernel/ptrace.c b/arch/riscv/kernel/ptrace.c
index a0055743d3ba..88442ac4f6ae 100644
--- a/arch/riscv/kernel/ptrace.c
+++ b/arch/riscv/kernel/ptrace.c
@@ -109,11 +109,7 @@ static int riscv_vr_get(struct task_struct *target,
* Ensure the vector registers have been saved to the memory before
* copying them to membuf.
*/
- if (target == current) {
- get_cpu_vector_context();
- riscv_v_vstate_save(¤t->thread.vstate, task_pt_regs(current));
- put_cpu_vector_context();
- }
+ riscv_v_ucontext_save(target);
ptrace_vstate.vstart = vstate->vstart;
ptrace_vstate.vl = vstate->vl;
diff --git a/arch/riscv/kernel/signal.c b/arch/riscv/kernel/signal.c
index 6f6f3315bc09..50c77bcf2b09 100644
--- a/arch/riscv/kernel/signal.c
+++ b/arch/riscv/kernel/signal.c
@@ -89,9 +89,7 @@ static long save_v_state(struct pt_regs *regs, void __user *sc_vec)
/* datap is designed to be 16 byte aligned for better performance */
WARN_ON(!IS_ALIGNED((unsigned long)datap, 16));
- get_cpu_vector_context();
- riscv_v_vstate_save(¤t->thread.vstate, regs);
- put_cpu_vector_context();
+ riscv_v_ucontext_save(current);
/* Copy everything of vstate but datap. */
err = __copy_to_user(&state->v_state, ¤t->thread.vstate,
diff --git a/arch/riscv/kernel/vector.c b/arch/riscv/kernel/vector.c
index b112166d51e9..924baa71af7e 100644
--- a/arch/riscv/kernel/vector.c
+++ b/arch/riscv/kernel/vector.c
@@ -29,6 +29,18 @@ static struct kmem_cache *riscv_v_kernel_cachep;
unsigned long riscv_v_vsize __read_mostly;
EXPORT_SYMBOL_GPL(riscv_v_vsize);
+void riscv_v_ucontext_save(struct task_struct *tsk)
+{
+ struct __riscv_v_ext_state *vstate = &tsk->thread.vstate;
+ struct pt_regs *regs = task_pt_regs(tsk);
+
+ if (tsk == current) {
+ get_cpu_vector_context();
+ riscv_v_vstate_save(vstate, regs);
+ put_cpu_vector_context();
+ }
+}
+
int riscv_v_setup_vsize(void)
{
unsigned long this_vsize;
--
2.43.0
More information about the linux-riscv
mailing list