mirror of
https://github.com/Fishwaldo/opensbi.git
synced 2025-07-07 21:49:02 +00:00
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:
parent
1fbe7778c9
commit
1c4ce74f51
3 changed files with 17 additions and 0 deletions
|
@ -30,6 +30,7 @@ static int truly_illegal_insn(ulong insn, struct sbi_trap_regs *regs)
|
|||
trap.tval = insn;
|
||||
trap.tval2 = 0;
|
||||
trap.tinst = 0;
|
||||
trap.gva = 0;
|
||||
|
||||
return sbi_trap_redirect(regs, &trap);
|
||||
}
|
||||
|
|
|
@ -129,6 +129,7 @@ int sbi_misaligned_load_handler(ulong addr, ulong tval2, ulong tinst,
|
|||
uptrap.tval = addr;
|
||||
uptrap.tval2 = tval2;
|
||||
uptrap.tinst = tinst;
|
||||
uptrap.gva = 0;
|
||||
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.tval2 = tval2;
|
||||
uptrap.tinst = tinst;
|
||||
uptrap.gva = 0;
|
||||
return sbi_trap_redirect(regs, &uptrap);
|
||||
}
|
||||
|
||||
|
|
|
@ -311,6 +311,20 @@ struct sbi_trap_regs *sbi_trap_handler(struct sbi_trap_regs *regs)
|
|||
trap.tval = mtval;
|
||||
trap.tval2 = mtval2;
|
||||
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);
|
||||
break;
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue