[PATCH] RISC-V: Clobber V registers on syscalls

Björn Töpel bjorn at kernel.org
Mon Jun 19 12:01:20 PDT 2023


Palmer Dabbelt <palmer at rivosinc.com> writes:

[...]

>>> +		riscv_v_vstate_off(regs);
>>> +
>>
>> Not off, right? Isn't it __riscv_v_vstate_clean() that you'd like to
>> call? Something like:
>>
>> static void vstate_discard(struct pt_regs *regs)
>> {
>>        if ((regs->status & SR_VS) == SR_VS_DIRTY)
>>                __riscv_v_vstate_clean(regs);
>> }
>>
>> Complemented by a !V config variant.
>
> I think it's just a question of what we're trying to do here: clean 
> avoids the kernel V state save, but unless the kernel decides to use V 
> during the syscall the register contents will still be usable by 
> userspace.  Maybe that's fine and we can just rely on the ISA spec, 
> though?  I sent another patch to just document it in Linux, even if it's 
> in the ISA spec it seems worth having in the kernel as well.
>
> That said, I think the right thing to do here might be to zero the V 
> register state and set it to initial: that way we can prevent userspace 
> from accidentally relying on the state save, but we can also avoid the 
> trap that would come from turning it off.  That lets us give the 
> hardware a nice clean indication when the V state isn't in use, which 
> will hopefully help us avoid the save/restore performance issues that 
> other ports have hit.

FWIW, I think that's a much better idea than turning V off. I also like
that it'll preventing userland to rely on pre-ecall state.


Björn



More information about the linux-riscv mailing list