diff options
Diffstat (limited to 'arch/riscv/kernel/signal.c')
| -rw-r--r-- | arch/riscv/kernel/signal.c | 9 | 
1 files changed, 6 insertions, 3 deletions
diff --git a/arch/riscv/kernel/signal.c b/arch/riscv/kernel/signal.c index 88b6220b2608..501e66debf69 100644 --- a/arch/riscv/kernel/signal.c +++ b/arch/riscv/kernel/signal.c @@ -86,12 +86,15 @@ 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(unlikely(!IS_ALIGNED((unsigned long)datap, 16))); -	riscv_v_vstate_save(current, regs); +	get_cpu_vector_context(); +	riscv_v_vstate_save(¤t->thread.vstate, regs); +	put_cpu_vector_context(); +  	/* Copy everything of vstate but datap. */  	err = __copy_to_user(&state->v_state, ¤t->thread.vstate,  			     offsetof(struct __riscv_v_ext_state, datap));  	/* Copy the pointer datap itself. */ -	err |= __put_user(datap, &state->v_state.datap); +	err |= __put_user((__force void *)datap, &state->v_state.datap);  	/* Copy the whole vector content to user space datap. */  	err |= __copy_to_user(datap, current->thread.vstate.datap, riscv_v_vsize);  	/* Copy magic to the user space after saving  all vector conetext */ @@ -134,7 +137,7 @@ static long __restore_v_state(struct pt_regs *regs, void __user *sc_vec)  	if (unlikely(err))  		return err; -	riscv_v_vstate_restore(current, regs); +	riscv_v_vstate_set_restore(current, regs);  	return err;  }  |