forked from Mirrors/opensbi
lib: sbi: Remove epc from struct sbi_trap_info
In the only places this value is used, it duplicates mepc from struct sbi_trap_regs. Signed-off-by: Samuel Holland <samuel.holland@sifive.com> Reviewed-by: Anup Patel <anup@brainfault.org>
This commit is contained in:

committed by
Anup Patel

parent
86224ec36a
commit
2e8517865a
@@ -87,20 +87,18 @@
|
|||||||
/** Last member index in sbi_trap_regs */
|
/** Last member index in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_last 35
|
#define SBI_TRAP_REGS_last 35
|
||||||
|
|
||||||
/** Index of epc member in sbi_trap_info */
|
|
||||||
#define SBI_TRAP_INFO_epc 0
|
|
||||||
/** Index of cause member in sbi_trap_info */
|
/** Index of cause member in sbi_trap_info */
|
||||||
#define SBI_TRAP_INFO_cause 1
|
#define SBI_TRAP_INFO_cause 0
|
||||||
/** Index of tval member in sbi_trap_info */
|
/** Index of tval member in sbi_trap_info */
|
||||||
#define SBI_TRAP_INFO_tval 2
|
#define SBI_TRAP_INFO_tval 1
|
||||||
/** Index of tval2 member in sbi_trap_info */
|
/** Index of tval2 member in sbi_trap_info */
|
||||||
#define SBI_TRAP_INFO_tval2 3
|
#define SBI_TRAP_INFO_tval2 2
|
||||||
/** Index of tinst member in sbi_trap_info */
|
/** Index of tinst member in sbi_trap_info */
|
||||||
#define SBI_TRAP_INFO_tinst 4
|
#define SBI_TRAP_INFO_tinst 3
|
||||||
/** Index of gva member in sbi_trap_info */
|
/** Index of gva member in sbi_trap_info */
|
||||||
#define SBI_TRAP_INFO_gva 5
|
#define SBI_TRAP_INFO_gva 4
|
||||||
/** Last member index in sbi_trap_info */
|
/** Last member index in sbi_trap_info */
|
||||||
#define SBI_TRAP_INFO_last 6
|
#define SBI_TRAP_INFO_last 5
|
||||||
|
|
||||||
/* clang-format on */
|
/* clang-format on */
|
||||||
|
|
||||||
@@ -194,8 +192,6 @@ struct sbi_trap_regs {
|
|||||||
|
|
||||||
/** Representation of trap details */
|
/** Representation of trap details */
|
||||||
struct sbi_trap_info {
|
struct sbi_trap_info {
|
||||||
/** epc Trap program counter */
|
|
||||||
unsigned long epc;
|
|
||||||
/** cause Trap exception cause */
|
/** cause Trap exception cause */
|
||||||
unsigned long cause;
|
unsigned long cause;
|
||||||
/** tval Trap value */
|
/** tval Trap value */
|
||||||
|
@@ -74,7 +74,6 @@ static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid,
|
|||||||
&hmask, &trap)) {
|
&hmask, &trap)) {
|
||||||
ret = sbi_ipi_send_smode(hmask, 0);
|
ret = sbi_ipi_send_smode(hmask, 0);
|
||||||
} else {
|
} else {
|
||||||
trap.epc = regs->mepc;
|
|
||||||
sbi_trap_redirect(regs, &trap);
|
sbi_trap_redirect(regs, &trap);
|
||||||
out->skip_regs_update = true;
|
out->skip_regs_update = true;
|
||||||
}
|
}
|
||||||
@@ -86,7 +85,6 @@ static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid,
|
|||||||
SBI_TLB_FENCE_I, source_hart);
|
SBI_TLB_FENCE_I, source_hart);
|
||||||
ret = sbi_tlb_request(hmask, 0, &tlb_info);
|
ret = sbi_tlb_request(hmask, 0, &tlb_info);
|
||||||
} else {
|
} else {
|
||||||
trap.epc = regs->mepc;
|
|
||||||
sbi_trap_redirect(regs, &trap);
|
sbi_trap_redirect(regs, &trap);
|
||||||
out->skip_regs_update = true;
|
out->skip_regs_update = true;
|
||||||
}
|
}
|
||||||
@@ -98,7 +96,6 @@ static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid,
|
|||||||
SBI_TLB_SFENCE_VMA, source_hart);
|
SBI_TLB_SFENCE_VMA, source_hart);
|
||||||
ret = sbi_tlb_request(hmask, 0, &tlb_info);
|
ret = sbi_tlb_request(hmask, 0, &tlb_info);
|
||||||
} else {
|
} else {
|
||||||
trap.epc = regs->mepc;
|
|
||||||
sbi_trap_redirect(regs, &trap);
|
sbi_trap_redirect(regs, &trap);
|
||||||
out->skip_regs_update = true;
|
out->skip_regs_update = true;
|
||||||
}
|
}
|
||||||
@@ -112,7 +109,6 @@ static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid,
|
|||||||
source_hart);
|
source_hart);
|
||||||
ret = sbi_tlb_request(hmask, 0, &tlb_info);
|
ret = sbi_tlb_request(hmask, 0, &tlb_info);
|
||||||
} else {
|
} else {
|
||||||
trap.epc = regs->mepc;
|
|
||||||
sbi_trap_redirect(regs, &trap);
|
sbi_trap_redirect(regs, &trap);
|
||||||
out->skip_regs_update = true;
|
out->skip_regs_update = true;
|
||||||
}
|
}
|
||||||
|
@@ -23,8 +23,6 @@
|
|||||||
.global __sbi_expected_trap
|
.global __sbi_expected_trap
|
||||||
__sbi_expected_trap:
|
__sbi_expected_trap:
|
||||||
/* Without H-extension so, MTVAL2 and MTINST CSRs and GVA not available */
|
/* Without H-extension so, MTVAL2 and MTINST CSRs and GVA not available */
|
||||||
csrr a4, CSR_MEPC
|
|
||||||
REG_S a4, SBI_TRAP_INFO_OFFSET(epc)(a3)
|
|
||||||
csrr a4, CSR_MCAUSE
|
csrr a4, CSR_MCAUSE
|
||||||
REG_S a4, SBI_TRAP_INFO_OFFSET(cause)(a3)
|
REG_S a4, SBI_TRAP_INFO_OFFSET(cause)(a3)
|
||||||
csrr a4, CSR_MTVAL
|
csrr a4, CSR_MTVAL
|
||||||
@@ -41,8 +39,6 @@ __sbi_expected_trap:
|
|||||||
.global __sbi_expected_trap_hext
|
.global __sbi_expected_trap_hext
|
||||||
__sbi_expected_trap_hext:
|
__sbi_expected_trap_hext:
|
||||||
/* With H-extension so, MTVAL2 and MTINST CSRs and GVA available */
|
/* With H-extension so, MTVAL2 and MTINST CSRs and GVA available */
|
||||||
csrr a4, CSR_MEPC
|
|
||||||
REG_S a4, SBI_TRAP_INFO_OFFSET(epc)(a3)
|
|
||||||
csrr a4, CSR_MCAUSE
|
csrr a4, CSR_MCAUSE
|
||||||
REG_S a4, SBI_TRAP_INFO_OFFSET(cause)(a3)
|
REG_S a4, SBI_TRAP_INFO_OFFSET(cause)(a3)
|
||||||
csrr a4, CSR_MTVAL
|
csrr a4, CSR_MTVAL
|
||||||
|
@@ -25,7 +25,6 @@ static int truly_illegal_insn(ulong insn, struct sbi_trap_regs *regs)
|
|||||||
{
|
{
|
||||||
struct sbi_trap_info trap;
|
struct sbi_trap_info trap;
|
||||||
|
|
||||||
trap.epc = regs->mepc;
|
|
||||||
trap.cause = CAUSE_ILLEGAL_INSTRUCTION;
|
trap.cause = CAUSE_ILLEGAL_INSTRUCTION;
|
||||||
trap.tval = insn;
|
trap.tval = insn;
|
||||||
trap.tval2 = 0;
|
trap.tval2 = 0;
|
||||||
@@ -156,7 +155,6 @@ int sbi_illegal_insn_handler(ulong insn, struct sbi_trap_regs *regs)
|
|||||||
if (unlikely((insn & 3) != 3)) {
|
if (unlikely((insn & 3) != 3)) {
|
||||||
insn = sbi_get_insn(regs->mepc, &uptrap);
|
insn = sbi_get_insn(regs->mepc, &uptrap);
|
||||||
if (uptrap.cause) {
|
if (uptrap.cause) {
|
||||||
uptrap.epc = regs->mepc;
|
|
||||||
return sbi_trap_redirect(regs, &uptrap);
|
return sbi_trap_redirect(regs, &uptrap);
|
||||||
}
|
}
|
||||||
if ((insn & 3) != 3)
|
if ((insn & 3) != 3)
|
||||||
|
@@ -140,7 +140,7 @@ int sbi_trap_redirect(struct sbi_trap_regs *regs,
|
|||||||
if (next_virt) {
|
if (next_virt) {
|
||||||
/* Update VS-mode exception info */
|
/* Update VS-mode exception info */
|
||||||
csr_write(CSR_VSTVAL, trap->tval);
|
csr_write(CSR_VSTVAL, trap->tval);
|
||||||
csr_write(CSR_VSEPC, trap->epc);
|
csr_write(CSR_VSEPC, regs->mepc);
|
||||||
csr_write(CSR_VSCAUSE, trap->cause);
|
csr_write(CSR_VSCAUSE, trap->cause);
|
||||||
|
|
||||||
/* Set MEPC to VS-mode exception vector base */
|
/* Set MEPC to VS-mode exception vector base */
|
||||||
@@ -171,7 +171,7 @@ int sbi_trap_redirect(struct sbi_trap_regs *regs,
|
|||||||
} else {
|
} else {
|
||||||
/* Update S-mode exception info */
|
/* Update S-mode exception info */
|
||||||
csr_write(CSR_STVAL, trap->tval);
|
csr_write(CSR_STVAL, trap->tval);
|
||||||
csr_write(CSR_SEPC, trap->epc);
|
csr_write(CSR_SEPC, regs->mepc);
|
||||||
csr_write(CSR_SCAUSE, trap->cause);
|
csr_write(CSR_SCAUSE, trap->cause);
|
||||||
|
|
||||||
/* Set MEPC to S-mode exception vector base */
|
/* Set MEPC to S-mode exception vector base */
|
||||||
@@ -286,7 +286,6 @@ struct sbi_trap_regs *sbi_trap_handler(struct sbi_trap_regs *regs)
|
|||||||
return regs;
|
return regs;
|
||||||
}
|
}
|
||||||
/* Original trap_info */
|
/* Original trap_info */
|
||||||
trap.epc = regs->mepc;
|
|
||||||
trap.cause = mcause;
|
trap.cause = mcause;
|
||||||
trap.tval = mtval;
|
trap.tval = mtval;
|
||||||
trap.tval2 = mtval2;
|
trap.tval2 = mtval2;
|
||||||
|
@@ -70,7 +70,6 @@ static int sbi_trap_emulate_load(struct sbi_trap_regs *regs,
|
|||||||
*/
|
*/
|
||||||
insn = sbi_get_insn(regs->mepc, &uptrap);
|
insn = sbi_get_insn(regs->mepc, &uptrap);
|
||||||
if (uptrap.cause) {
|
if (uptrap.cause) {
|
||||||
uptrap.epc = regs->mepc;
|
|
||||||
return sbi_trap_redirect(regs, &uptrap);
|
return sbi_trap_redirect(regs, &uptrap);
|
||||||
}
|
}
|
||||||
insn_len = INSN_LEN(insn);
|
insn_len = INSN_LEN(insn);
|
||||||
@@ -193,7 +192,6 @@ static int sbi_trap_emulate_store(struct sbi_trap_regs *regs,
|
|||||||
*/
|
*/
|
||||||
insn = sbi_get_insn(regs->mepc, &uptrap);
|
insn = sbi_get_insn(regs->mepc, &uptrap);
|
||||||
if (uptrap.cause) {
|
if (uptrap.cause) {
|
||||||
uptrap.epc = regs->mepc;
|
|
||||||
return sbi_trap_redirect(regs, &uptrap);
|
return sbi_trap_redirect(regs, &uptrap);
|
||||||
}
|
}
|
||||||
insn_len = INSN_LEN(insn);
|
insn_len = INSN_LEN(insn);
|
||||||
@@ -277,7 +275,6 @@ static int sbi_misaligned_ld_emulator(int rlen, union sbi_ldst_data *out_val,
|
|||||||
out_val->data_bytes[i] =
|
out_val->data_bytes[i] =
|
||||||
sbi_load_u8((void *)(orig_trap->tval + i), &uptrap);
|
sbi_load_u8((void *)(orig_trap->tval + i), &uptrap);
|
||||||
if (uptrap.cause) {
|
if (uptrap.cause) {
|
||||||
uptrap.epc = regs->mepc;
|
|
||||||
uptrap.tinst = sbi_misaligned_tinst_fixup(
|
uptrap.tinst = sbi_misaligned_tinst_fixup(
|
||||||
orig_trap->tinst, uptrap.tinst, i);
|
orig_trap->tinst, uptrap.tinst, i);
|
||||||
return sbi_trap_redirect(regs, &uptrap);
|
return sbi_trap_redirect(regs, &uptrap);
|
||||||
@@ -304,7 +301,6 @@ static int sbi_misaligned_st_emulator(int wlen, union sbi_ldst_data in_val,
|
|||||||
sbi_store_u8((void *)(orig_trap->tval + i),
|
sbi_store_u8((void *)(orig_trap->tval + i),
|
||||||
in_val.data_bytes[i], &uptrap);
|
in_val.data_bytes[i], &uptrap);
|
||||||
if (uptrap.cause) {
|
if (uptrap.cause) {
|
||||||
uptrap.epc = regs->mepc;
|
|
||||||
uptrap.tinst = sbi_misaligned_tinst_fixup(
|
uptrap.tinst = sbi_misaligned_tinst_fixup(
|
||||||
orig_trap->tinst, uptrap.tinst, i);
|
orig_trap->tinst, uptrap.tinst, i);
|
||||||
return sbi_trap_redirect(regs, &uptrap);
|
return sbi_trap_redirect(regs, &uptrap);
|
||||||
|
Reference in New Issue
Block a user