forked from Mirrors/opensbi
lib: sbi: Remove the SBI_ETRAP error code
The SBI_ETRAP error code was introduced only for doing trap redirection in generic sbi_ecall_handler(). Now the trap redirection is moved into sbi_ecall_legacy.c and SBI_ETRAP error code is only used in this source file so let us remove it. Signed-off-by: Anup Patel <apatel@ventanamicro.com>
This commit is contained in:
@@ -32,9 +32,8 @@
|
|||||||
#define SBI_EILL -1004
|
#define SBI_EILL -1004
|
||||||
#define SBI_ENOSPC -1005
|
#define SBI_ENOSPC -1005
|
||||||
#define SBI_ENOMEM -1006
|
#define SBI_ENOMEM -1006
|
||||||
#define SBI_ETRAP -1007
|
#define SBI_EUNKNOWN -1007
|
||||||
#define SBI_EUNKNOWN -1008
|
#define SBI_ENOENT -1008
|
||||||
#define SBI_ENOENT -1009
|
|
||||||
|
|
||||||
/* clang-format on */
|
/* clang-format on */
|
||||||
|
|
||||||
|
@@ -24,22 +24,22 @@
|
|||||||
#include <sbi/sbi_unpriv.h>
|
#include <sbi/sbi_unpriv.h>
|
||||||
#include <sbi/sbi_hart.h>
|
#include <sbi/sbi_hart.h>
|
||||||
|
|
||||||
static int sbi_load_hart_mask_unpriv(ulong *pmask, ulong *hmask,
|
static bool sbi_load_hart_mask_unpriv(ulong *pmask, ulong *hmask,
|
||||||
struct sbi_trap_info *uptrap)
|
struct sbi_trap_info *uptrap)
|
||||||
{
|
{
|
||||||
ulong mask = 0;
|
ulong mask = 0;
|
||||||
|
|
||||||
if (pmask) {
|
if (pmask) {
|
||||||
mask = sbi_load_ulong(pmask, uptrap);
|
mask = sbi_load_ulong(pmask, uptrap);
|
||||||
if (uptrap->cause)
|
if (uptrap->cause)
|
||||||
return SBI_ETRAP;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
sbi_hsm_hart_interruptible_mask(sbi_domain_thishart_ptr(),
|
sbi_hsm_hart_interruptible_mask(sbi_domain_thishart_ptr(),
|
||||||
0, &mask);
|
0, &mask);
|
||||||
}
|
}
|
||||||
*hmask = mask;
|
*hmask = mask;
|
||||||
|
|
||||||
return 0;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid,
|
static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid,
|
||||||
@@ -70,56 +70,48 @@ static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid,
|
|||||||
sbi_ipi_clear_smode();
|
sbi_ipi_clear_smode();
|
||||||
break;
|
break;
|
||||||
case SBI_EXT_0_1_SEND_IPI:
|
case SBI_EXT_0_1_SEND_IPI:
|
||||||
ret = sbi_load_hart_mask_unpriv((ulong *)regs->a0,
|
if (sbi_load_hart_mask_unpriv((ulong *)regs->a0,
|
||||||
&hmask, &trap);
|
&hmask, &trap)) {
|
||||||
if (ret != SBI_ETRAP) {
|
|
||||||
ret = sbi_ipi_send_smode(hmask, 0);
|
ret = sbi_ipi_send_smode(hmask, 0);
|
||||||
} else {
|
} else {
|
||||||
ret = 0;
|
|
||||||
trap.epc = regs->mepc;
|
trap.epc = regs->mepc;
|
||||||
sbi_trap_redirect(regs, &trap);
|
sbi_trap_redirect(regs, &trap);
|
||||||
out->skip_regs_update = true;
|
out->skip_regs_update = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SBI_EXT_0_1_REMOTE_FENCE_I:
|
case SBI_EXT_0_1_REMOTE_FENCE_I:
|
||||||
ret = sbi_load_hart_mask_unpriv((ulong *)regs->a0,
|
if (sbi_load_hart_mask_unpriv((ulong *)regs->a0,
|
||||||
&hmask, &trap);
|
&hmask, &trap)) {
|
||||||
if (ret != SBI_ETRAP) {
|
|
||||||
SBI_TLB_INFO_INIT(&tlb_info, 0, 0, 0, 0,
|
SBI_TLB_INFO_INIT(&tlb_info, 0, 0, 0, 0,
|
||||||
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 {
|
||||||
ret = 0;
|
|
||||||
trap.epc = regs->mepc;
|
trap.epc = regs->mepc;
|
||||||
sbi_trap_redirect(regs, &trap);
|
sbi_trap_redirect(regs, &trap);
|
||||||
out->skip_regs_update = true;
|
out->skip_regs_update = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SBI_EXT_0_1_REMOTE_SFENCE_VMA:
|
case SBI_EXT_0_1_REMOTE_SFENCE_VMA:
|
||||||
ret = sbi_load_hart_mask_unpriv((ulong *)regs->a0,
|
if (sbi_load_hart_mask_unpriv((ulong *)regs->a0,
|
||||||
&hmask, &trap);
|
&hmask, &trap)) {
|
||||||
if (ret != SBI_ETRAP) {
|
|
||||||
SBI_TLB_INFO_INIT(&tlb_info, regs->a1, regs->a2, 0, 0,
|
SBI_TLB_INFO_INIT(&tlb_info, regs->a1, regs->a2, 0, 0,
|
||||||
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 {
|
||||||
ret = 0;
|
|
||||||
trap.epc = regs->mepc;
|
trap.epc = regs->mepc;
|
||||||
sbi_trap_redirect(regs, &trap);
|
sbi_trap_redirect(regs, &trap);
|
||||||
out->skip_regs_update = true;
|
out->skip_regs_update = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SBI_EXT_0_1_REMOTE_SFENCE_VMA_ASID:
|
case SBI_EXT_0_1_REMOTE_SFENCE_VMA_ASID:
|
||||||
ret = sbi_load_hart_mask_unpriv((ulong *)regs->a0,
|
if (sbi_load_hart_mask_unpriv((ulong *)regs->a0,
|
||||||
&hmask, &trap);
|
&hmask, &trap)) {
|
||||||
if (ret != SBI_ETRAP) {
|
|
||||||
SBI_TLB_INFO_INIT(&tlb_info, regs->a1,
|
SBI_TLB_INFO_INIT(&tlb_info, regs->a1,
|
||||||
regs->a2, regs->a3, 0,
|
regs->a2, regs->a3, 0,
|
||||||
SBI_TLB_SFENCE_VMA_ASID,
|
SBI_TLB_SFENCE_VMA_ASID,
|
||||||
source_hart);
|
source_hart);
|
||||||
ret = sbi_tlb_request(hmask, 0, &tlb_info);
|
ret = sbi_tlb_request(hmask, 0, &tlb_info);
|
||||||
} else {
|
} else {
|
||||||
ret = 0;
|
|
||||||
trap.epc = regs->mepc;
|
trap.epc = regs->mepc;
|
||||||
sbi_trap_redirect(regs, &trap);
|
sbi_trap_redirect(regs, &trap);
|
||||||
out->skip_regs_update = true;
|
out->skip_regs_update = true;
|
||||||
|
Reference in New Issue
Block a user