diff options
author | Atish Patra <atish.patra@wdc.com> | 2019-10-02 23:59:37 +0300 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2019-10-03 06:23:52 +0300 |
commit | 26aec6afed528518dbd633a6e0d951b7646d95c5 (patch) | |
tree | bdd1dda67cb6a61f4ebcaf1b3130987990f61e32 /lib/sbi/sbi_ecall.c | |
parent | 3d335bc54b453dd69b269c8841657876fb48f15f (diff) | |
download | opensbi-26aec6afed528518dbd633a6e0d951b7646d95c5.tar.xz |
lib: Rename existing SBI implementation as 0.1.
Current SBI implementation is now considered as version 0.1 and will be
removed/replaced with newer extension/functions in future.
Rename the existing implementations accordingly to be in sync with the
specification.
Signed-off-by: Atish Patra <atish.patra@wdc.com>
Reviewed-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Zong Li <zong.li@sifive.com>
Diffstat (limited to 'lib/sbi/sbi_ecall.c')
-rw-r--r-- | lib/sbi/sbi_ecall.c | 54 |
1 files changed, 36 insertions, 18 deletions
diff --git a/lib/sbi/sbi_ecall.c b/lib/sbi/sbi_ecall.c index c6ec76e..311c4cf 100644 --- a/lib/sbi/sbi_ecall.c +++ b/lib/sbi/sbi_ecall.c @@ -31,16 +31,16 @@ u16 sbi_ecall_version_minor(void) return SBI_ECALL_VERSION_MINOR; } -int sbi_ecall_handler(u32 hartid, ulong mcause, struct sbi_trap_regs *regs, - struct sbi_scratch *scratch) +int sbi_ecall_0_1_handler(u32 hartid, struct sbi_trap_regs *regs, + struct sbi_scratch *scratch, + struct unpriv_trap *uptrap) { int ret = SBI_ENOTSUPP; - struct unpriv_trap uptrap; struct sbi_tlb_info tlb_info; u32 source_hart = sbi_current_hartid(); switch (regs->a7) { - case SBI_ECALL_SET_TIMER: + case SBI_EXT_0_1_SET_TIMER: #if __riscv_xlen == 32 sbi_timer_event_start(scratch, (((u64)regs->a1 << 32) | (u64)regs->a0)); @@ -49,60 +49,78 @@ int sbi_ecall_handler(u32 hartid, ulong mcause, struct sbi_trap_regs *regs, #endif ret = 0; break; - case SBI_ECALL_CONSOLE_PUTCHAR: + case SBI_EXT_0_1_CONSOLE_PUTCHAR: sbi_putc(regs->a0); ret = 0; break; - case SBI_ECALL_CONSOLE_GETCHAR: + case SBI_EXT_0_1_CONSOLE_GETCHAR: regs->a0 = sbi_getc(); ret = 0; break; - case SBI_ECALL_CLEAR_IPI: + case SBI_EXT_0_1_CLEAR_IPI: sbi_ipi_clear_smode(scratch); ret = 0; break; - case SBI_ECALL_SEND_IPI: - ret = sbi_ipi_send_many(scratch, &uptrap, (ulong *)regs->a0, + case SBI_EXT_0_1_SEND_IPI: + ret = sbi_ipi_send_many(scratch, uptrap, (ulong *)regs->a0, SBI_IPI_EVENT_SOFT, NULL); break; - case SBI_ECALL_REMOTE_FENCE_I: + case SBI_EXT_0_1_REMOTE_FENCE_I: tlb_info.start = 0; tlb_info.size = 0; tlb_info.type = SBI_ITLB_FLUSH; tlb_info.shart_mask = 1UL << source_hart; - ret = sbi_ipi_send_many(scratch, &uptrap, (ulong *)regs->a0, + ret = sbi_ipi_send_many(scratch, uptrap, (ulong *)regs->a0, SBI_IPI_EVENT_FENCE_I, &tlb_info); break; - case SBI_ECALL_REMOTE_SFENCE_VMA: + case SBI_EXT_0_1_REMOTE_SFENCE_VMA: tlb_info.start = (unsigned long)regs->a1; tlb_info.size = (unsigned long)regs->a2; tlb_info.type = SBI_TLB_FLUSH_VMA; tlb_info.shart_mask = 1UL << source_hart; - ret = sbi_ipi_send_many(scratch, &uptrap, (ulong *)regs->a0, + ret = sbi_ipi_send_many(scratch, uptrap, (ulong *)regs->a0, SBI_IPI_EVENT_SFENCE_VMA, &tlb_info); break; - case SBI_ECALL_REMOTE_SFENCE_VMA_ASID: + case SBI_EXT_0_1_REMOTE_SFENCE_VMA_ASID: tlb_info.start = (unsigned long)regs->a1; tlb_info.size = (unsigned long)regs->a2; tlb_info.asid = (unsigned long)regs->a3; tlb_info.type = SBI_TLB_FLUSH_VMA_ASID; tlb_info.shart_mask = 1UL << source_hart; - ret = sbi_ipi_send_many(scratch, &uptrap, (ulong *)regs->a0, + ret = sbi_ipi_send_many(scratch, uptrap, (ulong *)regs->a0, SBI_IPI_EVENT_SFENCE_VMA_ASID, &tlb_info); break; - case SBI_ECALL_SHUTDOWN: + case SBI_EXT_0_1_SHUTDOWN: sbi_system_shutdown(scratch, 0); ret = 0; break; default: regs->a0 = SBI_ENOTSUPP; - ret = 0; - break; + ret = 0; }; + return ret; + +} + +int sbi_ecall_handler(u32 hartid, ulong mcause, struct sbi_trap_regs *regs, + struct sbi_scratch *scratch) +{ + int ret = SBI_ENOTSUPP; + struct unpriv_trap uptrap; + u32 extension_id = regs->a7; + + if (extension_id >= SBI_EXT_0_1_SET_TIMER && + extension_id <= SBI_EXT_0_1_SHUTDOWN) { + ret = sbi_ecall_0_1_handler(hartid, regs, scratch, &uptrap); + } else { + regs->a0 = SBI_ENOTSUPP; + ret = 0; + } + if (!ret) { regs->mepc += 4; } else if (ret == SBI_ETRAP) { |