Re: [PATCH] riscv: vector: Fix data pointer constraints in context save/restore
From: Guo Ren
Date: Fri Sep 11 2026 - 02:57:14 EST
On Tue, Sep 8, 2026 at 9:03 PM Troy Mitchell <troy.mitchell@xxxxxxxxx> wrote:
>
> The standard vector save/restore asm advances datap but declares it as
> input-only. An inlined caller reusing the original pointer may therefore
> use the advanced address instead.
>
> Declare datap as read-write so the compiler can preserve the original
> pointer when needed.
>
> Fixes: 03c3fcd9941a ("riscv: Introduce struct/helpers to save/restore per-task Vector state")
> Signed-off-by: Troy Mitchell <troy.mitchell@xxxxxxxxx>
> ---
> arch/riscv/include/asm/vector.h | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/arch/riscv/include/asm/vector.h b/arch/riscv/include/asm/vector.h
> index fffe72a772080..c7fd6d50a7a47 100644
> --- a/arch/riscv/include/asm/vector.h
> +++ b/arch/riscv/include/asm/vector.h
> @@ -230,7 +230,7 @@ static inline void __riscv_v_vstate_save(struct __riscv_v_ext_state *save_to,
> "add %1, %1, %0\n\t"
Yes, %1 is modified. Good catch!
Reviewed-by: GUO Ren (XuanTie) <guoren@xxxxxxxxxx>
PS:
Don't forget "if (has_xtheadvector()) {" part, thx :)
> "vse8.v v24, (%1)\n\t"
> ".option pop\n\t"
> - : "=&r" (vl) : "r" (datap) : "memory");
> + : "=&r" (vl), "+r" (datap) : : "memory");
> }
> riscv_v_disable();
> }
> @@ -266,7 +266,7 @@ static inline void __riscv_v_vstate_restore(struct __riscv_v_ext_state *restore_
> "add %1, %1, %0\n\t"
> "vle8.v v24, (%1)\n\t"
> ".option pop\n\t"
> - : "=&r" (vl) : "r" (datap) : "memory");
> + : "=&r" (vl), "+r" (datap) : : "memory");
> }
> __vstate_csr_restore(restore_from);
> riscv_v_disable();
>
> ---
> base-commit: cee9395acd8043be0644b25c34bfa86623f2b935
> change-id: 20260908-riscv-vector-asm-fix-27ed36623934
>
> Best regards,
> --
> Troy Mitchell <troy.mitchell@xxxxxxxxx>
>
--
Best Regards
Guo Ren