diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/sbi/sbi_ecall.c | 10 | ||||
-rw-r--r-- | lib/sbi/sbi_ecall_base.c | 6 | ||||
-rw-r--r-- | lib/sbi/sbi_ecall_hsm.c | 8 | ||||
-rw-r--r-- | lib/sbi/sbi_ecall_legacy.c | 25 | ||||
-rw-r--r-- | lib/sbi/sbi_ecall_replace.c | 59 | ||||
-rw-r--r-- | lib/sbi/sbi_ecall_vendor.c | 6 |
6 files changed, 59 insertions, 55 deletions
diff --git a/lib/sbi/sbi_ecall.c b/lib/sbi/sbi_ecall.c index 6d41cff..e92a539 100644 --- a/lib/sbi/sbi_ecall.c +++ b/lib/sbi/sbi_ecall.c @@ -101,19 +101,11 @@ int sbi_ecall_handler(struct sbi_trap_regs *regs) struct sbi_trap_info trap = {0}; unsigned long out_val = 0; bool is_0_1_spec = 0; - unsigned long args[6]; - - args[0] = regs->a0; - args[1] = regs->a1; - args[2] = regs->a2; - args[3] = regs->a3; - args[4] = regs->a4; - args[5] = regs->a5; ext = sbi_ecall_find_extension(extension_id); if (ext && ext->handle) { ret = ext->handle(extension_id, func_id, - args, &out_val, &trap); + regs, &out_val, &trap); if (extension_id >= SBI_EXT_0_1_SET_TIMER && extension_id <= SBI_EXT_0_1_SHUTDOWN) is_0_1_spec = 1; diff --git a/lib/sbi/sbi_ecall_base.c b/lib/sbi/sbi_ecall_base.c index 53c93c8..786d2ac 100644 --- a/lib/sbi/sbi_ecall_base.c +++ b/lib/sbi/sbi_ecall_base.c @@ -11,6 +11,7 @@ #include <sbi/sbi_ecall.h> #include <sbi/sbi_ecall_interface.h> #include <sbi/sbi_error.h> +#include <sbi/sbi_trap.h> #include <sbi/sbi_version.h> #include <sbi/riscv_asm.h> @@ -32,7 +33,8 @@ static int sbi_ecall_base_probe(unsigned long extid, unsigned long *out_val) } static int sbi_ecall_base_handler(unsigned long extid, unsigned long funcid, - unsigned long *args, unsigned long *out_val, + const struct sbi_trap_regs *regs, + unsigned long *out_val, struct sbi_trap_info *out_trap) { int ret = 0; @@ -61,7 +63,7 @@ static int sbi_ecall_base_handler(unsigned long extid, unsigned long funcid, *out_val = csr_read(CSR_MIMPID); break; case SBI_EXT_BASE_PROBE_EXT: - ret = sbi_ecall_base_probe(args[0], out_val); + ret = sbi_ecall_base_probe(regs->a0, out_val); break; default: ret = SBI_ENOTSUPP; diff --git a/lib/sbi/sbi_ecall_hsm.c b/lib/sbi/sbi_ecall_hsm.c index 376740c..df29d51 100644 --- a/lib/sbi/sbi_ecall_hsm.c +++ b/lib/sbi/sbi_ecall_hsm.c @@ -11,13 +11,15 @@ #include <sbi/sbi_ecall.h> #include <sbi/sbi_ecall_interface.h> #include <sbi/sbi_error.h> +#include <sbi/sbi_trap.h> #include <sbi/sbi_version.h> #include <sbi/sbi_hsm.h> #include <sbi/sbi_scratch.h> #include <sbi/riscv_asm.h> static int sbi_ecall_hsm_handler(unsigned long extid, unsigned long funcid, - unsigned long *args, unsigned long *out_val, + const struct sbi_trap_regs *regs, + unsigned long *out_val, struct sbi_trap_info *out_trap) { ulong smode; @@ -29,14 +31,14 @@ static int sbi_ecall_hsm_handler(unsigned long extid, unsigned long funcid, smode = csr_read(CSR_MSTATUS); smode = (smode & MSTATUS_MPP) >> MSTATUS_MPP_SHIFT; ret = sbi_hsm_hart_start(scratch, sbi_domain_thishart_ptr(), - args[0], args[1], smode, args[2]); + regs->a0, regs->a1, smode, regs->a2); break; case SBI_EXT_HSM_HART_STOP: ret = sbi_hsm_hart_stop(scratch, TRUE); break; case SBI_EXT_HSM_HART_GET_STATUS: hstate = sbi_hsm_hart_get_state(sbi_domain_thishart_ptr(), - args[0]); + regs->a0); ret = sbi_hsm_hart_state_to_status(hstate); break; default: diff --git a/lib/sbi/sbi_ecall_legacy.c b/lib/sbi/sbi_ecall_legacy.c index 7844fbb..8afeb00 100644 --- a/lib/sbi/sbi_ecall_legacy.c +++ b/lib/sbi/sbi_ecall_legacy.c @@ -43,7 +43,8 @@ static int sbi_load_hart_mask_unpriv(ulong *pmask, ulong *hmask, } static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid, - unsigned long *args, unsigned long *out_val, + const struct sbi_trap_regs *regs, + unsigned long *out_val, struct sbi_trap_info *out_trap) { int ret = 0; @@ -54,13 +55,13 @@ static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid, switch (extid) { case SBI_EXT_0_1_SET_TIMER: #if __riscv_xlen == 32 - sbi_timer_event_start((((u64)args[1] << 32) | (u64)args[0])); + sbi_timer_event_start((((u64)regs->a1 << 32) | (u64)regs->a0)); #else - sbi_timer_event_start((u64)args[0]); + sbi_timer_event_start((u64)regs->a0); #endif break; case SBI_EXT_0_1_CONSOLE_PUTCHAR: - sbi_putc(args[0]); + sbi_putc(regs->a0); break; case SBI_EXT_0_1_CONSOLE_GETCHAR: ret = sbi_getc(); @@ -69,13 +70,13 @@ static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid, sbi_ipi_clear_smode(); break; case SBI_EXT_0_1_SEND_IPI: - ret = sbi_load_hart_mask_unpriv((ulong *)args[0], + ret = sbi_load_hart_mask_unpriv((ulong *)regs->a0, &hmask, out_trap); if (ret != SBI_ETRAP) ret = sbi_ipi_send_smode(hmask, 0); break; case SBI_EXT_0_1_REMOTE_FENCE_I: - ret = sbi_load_hart_mask_unpriv((ulong *)args[0], + ret = sbi_load_hart_mask_unpriv((ulong *)regs->a0, &hmask, out_trap); if (ret != SBI_ETRAP) { SBI_TLB_INFO_INIT(&tlb_info, 0, 0, 0, 0, @@ -84,21 +85,21 @@ static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid, } break; case SBI_EXT_0_1_REMOTE_SFENCE_VMA: - ret = sbi_load_hart_mask_unpriv((ulong *)args[0], + ret = sbi_load_hart_mask_unpriv((ulong *)regs->a0, &hmask, out_trap); if (ret != SBI_ETRAP) { - SBI_TLB_INFO_INIT(&tlb_info, args[1], args[2], 0, 0, + SBI_TLB_INFO_INIT(&tlb_info, regs->a1, regs->a2, 0, 0, SBI_TLB_FLUSH_VMA, source_hart); ret = sbi_tlb_request(hmask, 0, &tlb_info); } break; case SBI_EXT_0_1_REMOTE_SFENCE_VMA_ASID: - ret = sbi_load_hart_mask_unpriv((ulong *)args[0], + ret = sbi_load_hart_mask_unpriv((ulong *)regs->a0, &hmask, out_trap); if (ret != SBI_ETRAP) { - SBI_TLB_INFO_INIT(&tlb_info, args[1], args[2], args[3], - 0, SBI_TLB_FLUSH_VMA_ASID, - source_hart); + SBI_TLB_INFO_INIT(&tlb_info, regs->a1, + regs->a2, regs->a3, 0, + SBI_TLB_FLUSH_VMA_ASID, source_hart); ret = sbi_tlb_request(hmask, 0, &tlb_info); } break; diff --git a/lib/sbi/sbi_ecall_replace.c b/lib/sbi/sbi_ecall_replace.c index d06dfa2..a95821b 100644 --- a/lib/sbi/sbi_ecall_replace.c +++ b/lib/sbi/sbi_ecall_replace.c @@ -17,18 +17,20 @@ #include <sbi/sbi_system.h> #include <sbi/sbi_timer.h> #include <sbi/sbi_tlb.h> +#include <sbi/sbi_trap.h> static int sbi_ecall_time_handler(unsigned long extid, unsigned long funcid, - unsigned long *args, unsigned long *out_val, + const struct sbi_trap_regs *regs, + unsigned long *out_val, struct sbi_trap_info *out_trap) { int ret = 0; if (funcid == SBI_EXT_TIME_SET_TIMER) { #if __riscv_xlen == 32 - sbi_timer_event_start((((u64)args[1] << 32) | (u64)args[0])); + sbi_timer_event_start((((u64)regs->a1 << 32) | (u64)regs->a0)); #else - sbi_timer_event_start((u64)args[0]); + sbi_timer_event_start((u64)regs->a0); #endif } else ret = SBI_ENOTSUPP; @@ -43,7 +45,8 @@ struct sbi_ecall_extension ecall_time = { }; static int sbi_ecall_rfence_handler(unsigned long extid, unsigned long funcid, - unsigned long *args, unsigned long *out_val, + const struct sbi_trap_regs *regs, + unsigned long *out_val, struct sbi_trap_info *out_trap) { int ret = 0; @@ -60,41 +63,41 @@ static int sbi_ecall_rfence_handler(unsigned long extid, unsigned long funcid, case SBI_EXT_RFENCE_REMOTE_FENCE_I: SBI_TLB_INFO_INIT(&tlb_info, 0, 0, 0, 0, SBI_ITLB_FLUSH, source_hart); - ret = sbi_tlb_request(args[0], args[1], &tlb_info); + ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); break; case SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA: - SBI_TLB_INFO_INIT(&tlb_info, args[2], args[3], 0, 0, + SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, 0, SBI_TLB_FLUSH_GVMA, source_hart); - ret = sbi_tlb_request(args[0], args[1], &tlb_info); + ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); break; case SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA_VMID: - SBI_TLB_INFO_INIT(&tlb_info, args[2], args[3], 0, args[4], + SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, regs->a4, SBI_TLB_FLUSH_GVMA_VMID, source_hart); - ret = sbi_tlb_request(args[0], args[1], &tlb_info); + ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); break; case SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA: vmid = (csr_read(CSR_HGATP) & HGATP_VMID_MASK); vmid = vmid >> HGATP_VMID_SHIFT; - SBI_TLB_INFO_INIT(&tlb_info, args[2], args[3], 0, vmid, + SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, vmid, SBI_TLB_FLUSH_VVMA, source_hart); - ret = sbi_tlb_request(args[0], args[1], &tlb_info); + ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); break; case SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA_ASID: vmid = (csr_read(CSR_HGATP) & HGATP_VMID_MASK); vmid = vmid >> HGATP_VMID_SHIFT; - SBI_TLB_INFO_INIT(&tlb_info, args[2], args[3], args[4], vmid, - SBI_TLB_FLUSH_VVMA_ASID, source_hart); - ret = sbi_tlb_request(args[0], args[1], &tlb_info); + SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, regs->a4, + vmid, SBI_TLB_FLUSH_VVMA_ASID, source_hart); + ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); break; case SBI_EXT_RFENCE_REMOTE_SFENCE_VMA: - SBI_TLB_INFO_INIT(&tlb_info, args[2], args[3], 0, 0, + SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, 0, SBI_TLB_FLUSH_VMA, source_hart); - ret = sbi_tlb_request(args[0], args[1], &tlb_info); + ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); break; case SBI_EXT_RFENCE_REMOTE_SFENCE_VMA_ASID: - SBI_TLB_INFO_INIT(&tlb_info, args[2], args[3], args[4], 0, + SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, regs->a4, 0, SBI_TLB_FLUSH_VMA_ASID, source_hart); - ret = sbi_tlb_request(args[0], args[1], &tlb_info); + ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); break; default: ret = SBI_ENOTSUPP; @@ -110,13 +113,14 @@ struct sbi_ecall_extension ecall_rfence = { }; static int sbi_ecall_ipi_handler(unsigned long extid, unsigned long funcid, - unsigned long *args, unsigned long *out_val, + const struct sbi_trap_regs *regs, + unsigned long *out_val, struct sbi_trap_info *out_trap) { int ret = 0; if (funcid == SBI_EXT_IPI_SEND_IPI) - ret = sbi_ipi_send_smode(args[0], args[1]); + ret = sbi_ipi_send_smode(regs->a0, regs->a1); else ret = SBI_ENOTSUPP; @@ -130,15 +134,16 @@ struct sbi_ecall_extension ecall_ipi = { }; static int sbi_ecall_srst_handler(unsigned long extid, unsigned long funcid, - unsigned long *args, unsigned long *out_val, + const struct sbi_trap_regs *regs, + unsigned long *out_val, struct sbi_trap_info *out_trap) { if (funcid == SBI_EXT_SRST_RESET) { - if ((((u32)-1U) <= ((u64)args[0])) || - (((u32)-1U) <= ((u64)args[1]))) + if ((((u32)-1U) <= ((u64)regs->a0)) || + (((u32)-1U) <= ((u64)regs->a1))) return SBI_EINVAL; - switch (args[0]) { + switch (regs->a0) { case SBI_SRST_RESET_TYPE_SHUTDOWN: case SBI_SRST_RESET_TYPE_COLD_REBOOT: case SBI_SRST_RESET_TYPE_WARM_REBOOT: @@ -147,7 +152,7 @@ static int sbi_ecall_srst_handler(unsigned long extid, unsigned long funcid, return SBI_ENOTSUPP; } - switch (args[1]) { + switch (regs->a1) { case SBI_SRST_RESET_REASON_NONE: case SBI_SRST_RESET_REASON_SYSFAIL: break; @@ -155,8 +160,8 @@ static int sbi_ecall_srst_handler(unsigned long extid, unsigned long funcid, return SBI_ENOTSUPP; } - if (sbi_system_reset_supported(args[0], args[1])) - sbi_system_reset(args[0], args[1]); + if (sbi_system_reset_supported(regs->a0, regs->a1)) + sbi_system_reset(regs->a0, regs->a1); } return SBI_ENOTSUPP; diff --git a/lib/sbi/sbi_ecall_vendor.c b/lib/sbi/sbi_ecall_vendor.c index 34c0be6..9252829 100644 --- a/lib/sbi/sbi_ecall_vendor.c +++ b/lib/sbi/sbi_ecall_vendor.c @@ -12,6 +12,7 @@ #include <sbi/sbi_ecall_interface.h> #include <sbi/sbi_error.h> #include <sbi/sbi_platform.h> +#include <sbi/sbi_trap.h> static int sbi_ecall_vendor_probe(unsigned long extid, unsigned long *out_val) @@ -22,11 +23,12 @@ static int sbi_ecall_vendor_probe(unsigned long extid, } static int sbi_ecall_vendor_handler(unsigned long extid, unsigned long funcid, - unsigned long *args, unsigned long *out_val, + const struct sbi_trap_regs *regs, + unsigned long *out_val, struct sbi_trap_info *out_trap) { return sbi_platform_vendor_ext_provider(sbi_platform_thishart_ptr(), - extid, funcid, args, + extid, funcid, regs, out_val, out_trap); } |