include: Make mstatus parameter optional for get_insn()
authorAnup Patel <anup.patel@wdc.com>
Sat, 30 Mar 2019 13:13:49 +0000 (18:43 +0530)
committerAnup Patel <anup@brainfault.org>
Mon, 1 Apr 2019 04:40:38 +0000 (10:10 +0530)
The mstatus parameter of get_insn() is used to return MSTATUS CSR
value which get_insn() saw. Most of the get_insn() callers don't
use the value returned in mstatus so this patch makes mstatus
parameter optional for get_insn().

Signed-off-by: Anup Patel <anup.patel@wdc.com>
include/sbi/riscv_unpriv.h
lib/sbi_illegal_insn.c
lib/sbi_misaligned_ldst.c

index c109417..bd134b5 100644 (file)
@@ -82,7 +82,7 @@ static inline ulong get_insn(ulong mepc, ulong *mstatus)
 #endif
                "csrw "STR(CSR_MSTATUS)", %[mstatus]"
                : [mstatus] "+&r" (__mstatus), [insn] "=&r" (val)
-               : [mprv] "r" (MSTATUS_MPRV | MSTATUS_MXR), [addr] "r" (__mepc));
+               : [mprv] "r" (MSTATUS_MPRV|MSTATUS_MXR), [addr] "r" (__mepc));
 #else
        ulong rvc_mask = 3, tmp;
        asm ("csrrs %[mstatus], "STR(CSR_MSTATUS)", %[mprv]\n"
@@ -107,10 +107,11 @@ static inline ulong get_insn(ulong mepc, ulong *mstatus)
                "add %[insn], %[insn], %[tmp]\n"
                "2: csrw "STR(CSR_MSTATUS)", %[mstatus]"
        : [mstatus] "+&r" (__mstatus), [insn] "=&r" (val), [tmp] "=&r" (tmp)
-       : [mprv] "r" (MSTATUS_MPRV | MSTATUS_MXR), [addr] "r" (__mepc),
+       : [mprv] "r" (MSTATUS_MPRV|MSTATUS_MXR), [addr] "r" (__mepc),
        [rvc_mask] "r" (rvc_mask), [xlen_minus_16] "i" (__riscv_xlen - 16));
 #endif
-       *mstatus = __mstatus;
+       if (mstatus)
+               *mstatus = __mstatus;
        return val;
 }
 
index 820f96c..7184fea 100644 (file)
@@ -122,14 +122,11 @@ int sbi_illegal_insn_handler(u32 hartid, ulong mcause,
                             struct sbi_trap_regs *regs,
                             struct sbi_scratch *scratch)
 {
-       ulong mstatus;
        ulong insn = csr_read(mbadaddr);
 
        if (unlikely((insn & 3) != 3)) {
-               if (insn == 0) {
-                       mstatus = csr_read(CSR_MSTATUS);
-                       insn = get_insn(regs->mepc, &mstatus);
-               }
+               if (insn == 0)
+                       insn = get_insn(regs->mepc, NULL);
                if ((insn & 3) != 3)
                        return truly_illegal_insn(insn, hartid, mcause,
                                                  regs, scratch);
index 3fe67ea..5b2df93 100644 (file)
@@ -26,8 +26,7 @@ int sbi_misaligned_load_handler(u32 hartid, ulong mcause,
                                struct sbi_scratch *scratch)
 {
        union reg_data val;
-       ulong mstatus = csr_read(CSR_MSTATUS);
-       ulong insn = get_insn(regs->mepc, &mstatus);
+       ulong insn = get_insn(regs->mepc, NULL);
        ulong addr = csr_read(CSR_MTVAL);
        int i, fp = 0, shift = 0, len = 0;
 
@@ -112,8 +111,7 @@ int sbi_misaligned_store_handler(u32 hartid, ulong mcause,
                                 struct sbi_scratch *scratch)
 {
        union reg_data val;
-       ulong mstatus = csr_read(CSR_MSTATUS);
-       ulong insn = get_insn(regs->mepc, &mstatus);
+       ulong insn = get_insn(regs->mepc, NULL);
        ulong addr = csr_read(CSR_MTVAL);
        int i, len = 0;