lib: sbi: Set gva when creating sbi_trap_info
authorVivian Wang <dramforever@live.com>
Thu, 4 Aug 2022 14:32:29 +0000 (22:32 +0800)
committerAnup Patel <anup@brainfault.org>
Mon, 22 Aug 2022 03:19:49 +0000 (08:49 +0530)
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>
lib/sbi/sbi_illegal_insn.c
lib/sbi/sbi_misaligned_ldst.c
lib/sbi/sbi_trap.c

index 84c04f8..ecd3508 100644 (file)
@@ -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);
 }
index fd11798..92a2393 100644 (file)
@@ -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);
        }
 
index ee3e4e9..db70c26 100644 (file)
@@ -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;
        };