lib: sbi: Set gva when creating sbi_trap_info

In some cases the sbi_trap_info argument passed to sbi_trap_redirect is
created from scratch by filling its fields. Since we previously added a
gva field to struct sbi_trap_info, initialize gva in these cases also.

Suggested-by: Andrew Jones <ajones@ventanamicro.com>
Signed-off-by: Vivian Wang <dramforever@live.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
Vivian Wang 2022-08-04 22:32:29 +08:00 committed by Anup Patel
parent 1fbe7778c9
commit 1c4ce74f51
3 changed files with 17 additions and 0 deletions

View file

@ -30,6 +30,7 @@ static int truly_illegal_insn(ulong insn, struct sbi_trap_regs *regs)
trap.tval = insn; trap.tval = insn;
trap.tval2 = 0; trap.tval2 = 0;
trap.tinst = 0; trap.tinst = 0;
trap.gva = 0;
return sbi_trap_redirect(regs, &trap); return sbi_trap_redirect(regs, &trap);
} }

View file

@ -129,6 +129,7 @@ int sbi_misaligned_load_handler(ulong addr, ulong tval2, ulong tinst,
uptrap.tval = addr; uptrap.tval = addr;
uptrap.tval2 = tval2; uptrap.tval2 = tval2;
uptrap.tinst = tinst; uptrap.tinst = tinst;
uptrap.gva = 0;
return sbi_trap_redirect(regs, &uptrap); return sbi_trap_redirect(regs, &uptrap);
} }
@ -244,6 +245,7 @@ int sbi_misaligned_store_handler(ulong addr, ulong tval2, ulong tinst,
uptrap.tval = addr; uptrap.tval = addr;
uptrap.tval2 = tval2; uptrap.tval2 = tval2;
uptrap.tinst = tinst; uptrap.tinst = tinst;
uptrap.gva = 0;
return sbi_trap_redirect(regs, &uptrap); return sbi_trap_redirect(regs, &uptrap);
} }

View file

@ -311,6 +311,20 @@ struct sbi_trap_regs *sbi_trap_handler(struct sbi_trap_regs *regs)
trap.tval = mtval; trap.tval = mtval;
trap.tval2 = mtval2; trap.tval2 = mtval2;
trap.tinst = mtinst; trap.tinst = mtinst;
/*
* If the hypervisor extension is not implemented,
* mstatus[h].GVA is a WPRI field, which is guaranteed to read
* as zero. In addition, in this case we don't read mstatush and
* instead pretend it is zero, which handles privileged spec
* version < 1.12.
*/
#if __riscv_xlen == 32
trap.gva = (regs->mstatusH & MSTATUSH_GVA) ? 1 : 0;
#else
trap.gva = (regs->mstatus & MSTATUS_GVA) ? 1 : 0;
#endif
rc = sbi_trap_redirect(regs, &trap); rc = sbi_trap_redirect(regs, &trap);
break; break;
}; };