[RFC PATCH 3/3] lib: sbi_trap: Set hstatus.GVA when redirecting
dramforever
dramforever at live.com
Wed Aug 3 07:31:34 PDT 2022
On 8/3/22 21:16, Andrew Jones wrote:
> On Wed, Aug 03, 2022 at 01:16:52PM +0800, dramforever wrote:
>> ---
>> lib/sbi/sbi_trap.c | 13 ++++++++-----
>> 1 file changed, 8 insertions(+), 5 deletions(-)
>>
>> diff --git a/lib/sbi/sbi_trap.c b/lib/sbi/sbi_trap.c
>> index ee3e4e9..1669577 100644
>> --- a/lib/sbi/sbi_trap.c
>> +++ b/lib/sbi/sbi_trap.c
>> @@ -118,12 +118,15 @@ int sbi_trap_redirect(struct sbi_trap_regs *regs,
>> regs->mstatus |= (next_virt) ? MSTATUS_MPV : 0UL;
>> #endif
>>
>> - /* Update HSTATUS for VS/VU-mode to HS-mode transition */
>> - if (misa_extension('H') && prev_virt && !next_virt) {
>> - /* Update HSTATUS SPVP and SPV bits */
>> + /* Update HSTATUS if going to HS-mode */
>> + if (misa_extension('H') && !next_virt) {
>> hstatus = csr_read(CSR_HSTATUS);
>> - hstatus &= ~HSTATUS_SPVP;
>> - hstatus |= (prev_mode == PRV_S) ? HSTATUS_SPVP : 0;
>> + if (prev_virt) {
>> + hstatus &= ~HSTATUS_SPVP;
>> + hstatus |= (prev_mode == PRV_S) ? HSTATUS_SPVP : 0;
>> + }
>> + hstatus &= ~HSTATUS_GVA;
>> + hstatus |= (trap->gva) ? HSTATUS_GVA : 0;
> trap->gva may be garbage at the point of this check since
> sbi_trap_redirect() is called from:
>
> lib/sbi/sbi_illegal_insn.c:34
> lib/sbi/sbi_misaligned_ldst.c:132
> lib/sbi/sbi_misaligned_ldst.c:247
> lib/sbi/sbi_trap.c:314
>
> with an uninitialized, stack-allocated sbi_trap_info structure,
> where all the members are explicitly initialized before the call.
> We need to also initialize gva at those points.
Thanks for the catch. I did not realize that sbi_trap_redirect() was
also used this way. I'll take a look and fix in next version.
>> hstatus &= ~HSTATUS_SPV;
>> hstatus |= (prev_virt) ? HSTATUS_SPV : 0;
>> csr_write(CSR_HSTATUS, hstatus);
> The patch is doing more than the summary says. We're now setting
> hstatus, htval, and htinst anytime we transition to HS-mode, whereas
> before we only set those registers when transitioning to HS-mode
> from VS/VU-mode. If I understand the spec properly, then that's a
> bug fix, but it should be in a separate patch.
When rearranging the code to fit the HS-to-HS case here, I actually
didn't realize this was a logical change for the rest of the CSRs and
other bits in hstatus, but you're right. I'll split up the changes
affecting existing logic into a separate patch in the next version.
> Please write commit messages. Even simply adding adding new bit
> masks and shifts should have a sentence expressing the motivation
> for adding them.
Thanks. I'll add detailed commit descriptions in the next version.
Regards,
dram
> Thanks,
> drew
More information about the opensbi
mailing list