lib: sbi: Simplify parameters of misaligned and access fault handlers
authorAnup Patel <apatel@ventanamicro.com>
Mon, 11 Mar 2024 09:51:53 +0000 (15:21 +0530)
committerAnup Patel <anup@brainfault.org>
Tue, 19 Mar 2024 06:01:28 +0000 (11:31 +0530)
The struct sbi_trap_context already has the information needed by
misaligned load/store and access fault load/store handlers so directly
pass struct sbi_trap_context pointer to these functions.

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Reviewed-by: Samuel Holland <samuel.holland@sifive.com>
Tested-by: Samuel Holland <samuel.holland@sifive.com>
Reviewed-by: Clément Léger <cleger@rivosinc.com>
include/sbi/sbi_trap_ldst.h
lib/sbi/sbi_trap.c
lib/sbi/sbi_trap_ldst.c

index 9cab4e424e69049ecb58faed7d5a77b19137dd51..8aee31643f75c8117f3e5c100906bc62b2c22777 100644 (file)
@@ -20,16 +20,12 @@ union sbi_ldst_data {
        ulong data_ulong;
 };
 
-int sbi_misaligned_load_handler(struct sbi_trap_regs *regs,
-                               const struct sbi_trap_info *orig_trap);
+int sbi_misaligned_load_handler(struct sbi_trap_context *tcntx);
 
-int sbi_misaligned_store_handler(struct sbi_trap_regs *regs,
-                                const struct sbi_trap_info *orig_trap);
+int sbi_misaligned_store_handler(struct sbi_trap_context *tcntx);
 
-int sbi_load_access_handler(struct sbi_trap_regs *regs,
-                           const struct sbi_trap_info *orig_trap);
+int sbi_load_access_handler(struct sbi_trap_context *tcntx);
 
-int sbi_store_access_handler(struct sbi_trap_regs *regs,
-                            const struct sbi_trap_info *orig_trap);
+int sbi_store_access_handler(struct sbi_trap_context *tcntx);
 
 #endif
index 4dbda063a9a3327d1d1ef5a938f421118a008ca9..a2afb0ac6112a10942c93a77981142eb1009623d 100644 (file)
@@ -290,12 +290,12 @@ struct sbi_trap_context *sbi_trap_handler(struct sbi_trap_context *tcntx)
                break;
        case CAUSE_MISALIGNED_LOAD:
                sbi_pmu_ctr_incr_fw(SBI_PMU_FW_MISALIGNED_LOAD);
-               rc  = sbi_misaligned_load_handler(regs, trap);
+               rc  = sbi_misaligned_load_handler(tcntx);
                msg = "misaligned load handler failed";
                break;
        case CAUSE_MISALIGNED_STORE:
                sbi_pmu_ctr_incr_fw(SBI_PMU_FW_MISALIGNED_STORE);
-               rc  = sbi_misaligned_store_handler(regs, trap);
+               rc  = sbi_misaligned_store_handler(tcntx);
                msg = "misaligned store handler failed";
                break;
        case CAUSE_SUPERVISOR_ECALL:
@@ -305,12 +305,12 @@ struct sbi_trap_context *sbi_trap_handler(struct sbi_trap_context *tcntx)
                break;
        case CAUSE_LOAD_ACCESS:
                sbi_pmu_ctr_incr_fw(SBI_PMU_FW_ACCESS_LOAD);
-               rc  = sbi_load_access_handler(regs, trap);
+               rc  = sbi_load_access_handler(tcntx);
                msg = "load fault handler failed";
                break;
        case CAUSE_STORE_ACCESS:
                sbi_pmu_ctr_incr_fw(SBI_PMU_FW_ACCESS_STORE);
-               rc  = sbi_store_access_handler(regs, trap);
+               rc  = sbi_store_access_handler(tcntx);
                msg = "store fault handler failed";
                break;
        default:
index 5a0537b1be1124e98c5b36e00cc07eaeb9522b88..f9c0241c900cd4be7707020308ebe4ebed24650f 100644 (file)
@@ -12,7 +12,6 @@
 #include <sbi/riscv_fp.h>
 #include <sbi/sbi_error.h>
 #include <sbi/sbi_trap_ldst.h>
-#include <sbi/sbi_pmu.h>
 #include <sbi/sbi_trap.h>
 #include <sbi/sbi_unpriv.h>
 #include <sbi/sbi_platform.h>
@@ -23,8 +22,7 @@
  * @return rlen=success, 0=success w/o regs modification, or negative error
  */
 typedef int (*sbi_trap_ld_emulator)(int rlen, union sbi_ldst_data *out_val,
-                                   struct sbi_trap_regs *regs,
-                                   const struct sbi_trap_info *orig_trap);
+                                   struct sbi_trap_context *tcntx);
 
 /**
  * Store emulator callback:
@@ -32,8 +30,7 @@ typedef int (*sbi_trap_ld_emulator)(int rlen, union sbi_ldst_data *out_val,
  * @return wlen=success, 0=success w/o regs modification, or negative error
  */
 typedef int (*sbi_trap_st_emulator)(int wlen, union sbi_ldst_data in_val,
-                                   struct sbi_trap_regs *regs,
-                                   const struct sbi_trap_info *orig_trap);
+                                   struct sbi_trap_context *tcntx);
 
 static ulong sbi_misaligned_tinst_fixup(ulong orig_tinst, ulong new_tinst,
                                        ulong addr_offset)
@@ -47,10 +44,11 @@ static ulong sbi_misaligned_tinst_fixup(ulong orig_tinst, ulong new_tinst,
                return orig_tinst | (addr_offset << SH_RS1);
 }
 
-static int sbi_trap_emulate_load(struct sbi_trap_regs *regs,
-                                const struct sbi_trap_info *orig_trap,
+static int sbi_trap_emulate_load(struct sbi_trap_context *tcntx,
                                 sbi_trap_ld_emulator emu)
 {
+       const struct sbi_trap_info *orig_trap = &tcntx->trap;
+       struct sbi_trap_regs *regs = &tcntx->regs;
        ulong insn, insn_len;
        union sbi_ldst_data val = { 0 };
        struct sbi_trap_info uptrap;
@@ -150,8 +148,7 @@ static int sbi_trap_emulate_load(struct sbi_trap_regs *regs,
                return sbi_trap_redirect(regs, orig_trap);
        }
 
-       rc = emu(len, &val, regs, orig_trap);
-
+       rc = emu(len, &val, tcntx);
        if (rc <= 0)
                return rc;
 
@@ -169,10 +166,11 @@ static int sbi_trap_emulate_load(struct sbi_trap_regs *regs,
        return 0;
 }
 
-static int sbi_trap_emulate_store(struct sbi_trap_regs *regs,
-                                 const struct sbi_trap_info *orig_trap,
+static int sbi_trap_emulate_store(struct sbi_trap_context *tcntx,
                                  sbi_trap_st_emulator emu)
 {
+       const struct sbi_trap_info *orig_trap = &tcntx->trap;
+       struct sbi_trap_regs *regs = &tcntx->regs;
        ulong insn, insn_len;
        union sbi_ldst_data val;
        struct sbi_trap_info uptrap;
@@ -254,8 +252,7 @@ static int sbi_trap_emulate_store(struct sbi_trap_regs *regs,
                return sbi_trap_redirect(regs, orig_trap);
        }
 
-       rc = emu(len, val, regs, orig_trap);
-
+       rc = emu(len, val, tcntx);
        if (rc <= 0)
                return rc;
 
@@ -265,9 +262,10 @@ static int sbi_trap_emulate_store(struct sbi_trap_regs *regs,
 }
 
 static int sbi_misaligned_ld_emulator(int rlen, union sbi_ldst_data *out_val,
-                                     struct sbi_trap_regs *regs,
-                                     const struct sbi_trap_info *orig_trap)
+                                     struct sbi_trap_context *tcntx)
 {
+       const struct sbi_trap_info *orig_trap = &tcntx->trap;
+       struct sbi_trap_regs *regs = &tcntx->regs;
        struct sbi_trap_info uptrap;
        int i;
 
@@ -283,17 +281,16 @@ static int sbi_misaligned_ld_emulator(int rlen, union sbi_ldst_data *out_val,
        return rlen;
 }
 
-int sbi_misaligned_load_handler(struct sbi_trap_regs *regs,
-                               const struct sbi_trap_info *orig_trap)
+int sbi_misaligned_load_handler(struct sbi_trap_context *tcntx)
 {
-       return sbi_trap_emulate_load(regs, orig_trap,
-                                    sbi_misaligned_ld_emulator);
+       return sbi_trap_emulate_load(tcntx, sbi_misaligned_ld_emulator);
 }
 
 static int sbi_misaligned_st_emulator(int wlen, union sbi_ldst_data in_val,
-                                     struct sbi_trap_regs *regs,
-                                     const struct sbi_trap_info *orig_trap)
+                                     struct sbi_trap_context *tcntx)
 {
+       const struct sbi_trap_info *orig_trap = &tcntx->trap;
+       struct sbi_trap_regs *regs = &tcntx->regs;
        struct sbi_trap_info uptrap;
        int i;
 
@@ -309,17 +306,17 @@ static int sbi_misaligned_st_emulator(int wlen, union sbi_ldst_data in_val,
        return wlen;
 }
 
-int sbi_misaligned_store_handler(struct sbi_trap_regs *regs,
-                                const struct sbi_trap_info *orig_trap)
+int sbi_misaligned_store_handler(struct sbi_trap_context *tcntx)
 {
-       return sbi_trap_emulate_store(regs, orig_trap,
-                                     sbi_misaligned_st_emulator);
+       return sbi_trap_emulate_store(tcntx, sbi_misaligned_st_emulator);
 }
 
 static int sbi_ld_access_emulator(int rlen, union sbi_ldst_data *out_val,
-                                 struct sbi_trap_regs *regs,
-                                 const struct sbi_trap_info *orig_trap)
+                                 struct sbi_trap_context *tcntx)
 {
+       const struct sbi_trap_info *orig_trap = &tcntx->trap;
+       struct sbi_trap_regs *regs = &tcntx->regs;
+
        /* If fault came from M mode, just fail */
        if (((regs->mstatus & MSTATUS_MPP) >> MSTATUS_MPP_SHIFT) == PRV_M)
                return SBI_EINVAL;
@@ -332,16 +329,17 @@ static int sbi_ld_access_emulator(int rlen, union sbi_ldst_data *out_val,
        return rlen;
 }
 
-int sbi_load_access_handler(struct sbi_trap_regs *regs,
-                           const struct sbi_trap_info *orig_trap)
+int sbi_load_access_handler(struct sbi_trap_context *tcntx)
 {
-       return sbi_trap_emulate_load(regs, orig_trap, sbi_ld_access_emulator);
+       return sbi_trap_emulate_load(tcntx, sbi_ld_access_emulator);
 }
 
 static int sbi_st_access_emulator(int wlen, union sbi_ldst_data in_val,
-                                 struct sbi_trap_regs *regs,
-                                 const struct sbi_trap_info *orig_trap)
+                                 struct sbi_trap_context *tcntx)
 {
+       const struct sbi_trap_info *orig_trap = &tcntx->trap;
+       struct sbi_trap_regs *regs = &tcntx->regs;
+
        /* If fault came from M mode, just fail */
        if (((regs->mstatus & MSTATUS_MPP) >> MSTATUS_MPP_SHIFT) == PRV_M)
                return SBI_EINVAL;
@@ -354,8 +352,7 @@ static int sbi_st_access_emulator(int wlen, union sbi_ldst_data in_val,
        return wlen;
 }
 
-int sbi_store_access_handler(struct sbi_trap_regs *regs,
-                            const struct sbi_trap_info *orig_trap)
+int sbi_store_access_handler(struct sbi_trap_context *tcntx)
 {
-       return sbi_trap_emulate_store(regs, orig_trap, sbi_st_access_emulator);
+       return sbi_trap_emulate_store(tcntx, sbi_st_access_emulator);
 }