mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2025-08-24 15:31:22 +01:00
include: Make mstatus parameter optional for get_insn()
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>
This commit is contained in:
@@ -82,7 +82,7 @@ static inline ulong get_insn(ulong mepc, ulong *mstatus)
|
|||||||
#endif
|
#endif
|
||||||
"csrw "STR(CSR_MSTATUS)", %[mstatus]"
|
"csrw "STR(CSR_MSTATUS)", %[mstatus]"
|
||||||
: [mstatus] "+&r" (__mstatus), [insn] "=&r" (val)
|
: [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
|
#else
|
||||||
ulong rvc_mask = 3, tmp;
|
ulong rvc_mask = 3, tmp;
|
||||||
asm ("csrrs %[mstatus], "STR(CSR_MSTATUS)", %[mprv]\n"
|
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"
|
"add %[insn], %[insn], %[tmp]\n"
|
||||||
"2: csrw "STR(CSR_MSTATUS)", %[mstatus]"
|
"2: csrw "STR(CSR_MSTATUS)", %[mstatus]"
|
||||||
: [mstatus] "+&r" (__mstatus), [insn] "=&r" (val), [tmp] "=&r" (tmp)
|
: [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));
|
[rvc_mask] "r" (rvc_mask), [xlen_minus_16] "i" (__riscv_xlen - 16));
|
||||||
#endif
|
#endif
|
||||||
*mstatus = __mstatus;
|
if (mstatus)
|
||||||
|
*mstatus = __mstatus;
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -122,14 +122,11 @@ int sbi_illegal_insn_handler(u32 hartid, ulong mcause,
|
|||||||
struct sbi_trap_regs *regs,
|
struct sbi_trap_regs *regs,
|
||||||
struct sbi_scratch *scratch)
|
struct sbi_scratch *scratch)
|
||||||
{
|
{
|
||||||
ulong mstatus;
|
|
||||||
ulong insn = csr_read(mbadaddr);
|
ulong insn = csr_read(mbadaddr);
|
||||||
|
|
||||||
if (unlikely((insn & 3) != 3)) {
|
if (unlikely((insn & 3) != 3)) {
|
||||||
if (insn == 0) {
|
if (insn == 0)
|
||||||
mstatus = csr_read(CSR_MSTATUS);
|
insn = get_insn(regs->mepc, NULL);
|
||||||
insn = get_insn(regs->mepc, &mstatus);
|
|
||||||
}
|
|
||||||
if ((insn & 3) != 3)
|
if ((insn & 3) != 3)
|
||||||
return truly_illegal_insn(insn, hartid, mcause,
|
return truly_illegal_insn(insn, hartid, mcause,
|
||||||
regs, scratch);
|
regs, scratch);
|
||||||
|
@@ -26,8 +26,7 @@ int sbi_misaligned_load_handler(u32 hartid, ulong mcause,
|
|||||||
struct sbi_scratch *scratch)
|
struct sbi_scratch *scratch)
|
||||||
{
|
{
|
||||||
union reg_data val;
|
union reg_data val;
|
||||||
ulong mstatus = csr_read(CSR_MSTATUS);
|
ulong insn = get_insn(regs->mepc, NULL);
|
||||||
ulong insn = get_insn(regs->mepc, &mstatus);
|
|
||||||
ulong addr = csr_read(CSR_MTVAL);
|
ulong addr = csr_read(CSR_MTVAL);
|
||||||
int i, fp = 0, shift = 0, len = 0;
|
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)
|
struct sbi_scratch *scratch)
|
||||||
{
|
{
|
||||||
union reg_data val;
|
union reg_data val;
|
||||||
ulong mstatus = csr_read(CSR_MSTATUS);
|
ulong insn = get_insn(regs->mepc, NULL);
|
||||||
ulong insn = get_insn(regs->mepc, &mstatus);
|
|
||||||
ulong addr = csr_read(CSR_MTVAL);
|
ulong addr = csr_read(CSR_MTVAL);
|
||||||
int i, len = 0;
|
int i, len = 0;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user