[PATCH 06/12] lib: sbi_ecall_legacy: Use SBI v0.2 encoding for "all harts"
Anup Patel
anup at brainfault.org
Wed Sep 25 23:07:16 PDT 2024
On Fri, Aug 30, 2024 at 9:19 PM Samuel Holland
<samuel.holland at sifive.com> wrote:
>
> This simplifies the logic so that sbi_hsm_hart_interruptible_mask() is
> only called from one place (sbi_ipi_send_many()). A minor functional
> change is that the legacy functions can now affect more than XLEN harts
> when targeting all harts.
>
> Signed-off-by: Samuel Holland <samuel.holland at sifive.com>
LGTM.
Reviewed-by: Anup Patel <anup at brainfault.org>
Applied this patch to the riscv/opensbi repo.
Thanks,
Anup
> ---
>
> lib/sbi/sbi_ecall_legacy.c | 25 ++++++++++++-------------
> 1 file changed, 12 insertions(+), 13 deletions(-)
>
> diff --git a/lib/sbi/sbi_ecall_legacy.c b/lib/sbi/sbi_ecall_legacy.c
> index 9a1ae1e4..25e9a1e8 100644
> --- a/lib/sbi/sbi_ecall_legacy.c
> +++ b/lib/sbi/sbi_ecall_legacy.c
> @@ -14,7 +14,6 @@
> #include <sbi/sbi_ecall.h>
> #include <sbi/sbi_ecall_interface.h>
> #include <sbi/sbi_error.h>
> -#include <sbi/sbi_hsm.h>
> #include <sbi/sbi_ipi.h>
> #include <sbi/sbi_platform.h>
> #include <sbi/sbi_system.h>
> @@ -24,7 +23,7 @@
> #include <sbi/sbi_unpriv.h>
> #include <sbi/sbi_hart.h>
>
> -static bool sbi_load_hart_mask_unpriv(ulong *pmask, ulong *hmask,
> +static bool sbi_load_hart_mask_unpriv(ulong *pmask, ulong *hmask, ulong *hbase,
> struct sbi_trap_info *uptrap)
> {
> ulong mask = 0;
> @@ -33,9 +32,9 @@ static bool sbi_load_hart_mask_unpriv(ulong *pmask, ulong *hmask,
> mask = sbi_load_ulong(pmask, uptrap);
> if (uptrap->cause)
> return false;
> + *hbase = 0;
> } else {
> - sbi_hsm_hart_interruptible_mask(sbi_domain_thishart_ptr(),
> - 0, &mask);
> + *hbase = -1UL;
> }
> *hmask = mask;
>
> @@ -50,7 +49,7 @@ static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid,
> struct sbi_tlb_info tlb_info;
> u32 source_hart = current_hartid();
> struct sbi_trap_info trap = {0};
> - ulong hmask = 0;
> + ulong hmask, hbase;
>
> switch (extid) {
> case SBI_EXT_0_1_SET_TIMER:
> @@ -71,8 +70,8 @@ static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid,
> break;
> case SBI_EXT_0_1_SEND_IPI:
> if (sbi_load_hart_mask_unpriv((ulong *)regs->a0,
> - &hmask, &trap)) {
> - ret = sbi_ipi_send_smode(hmask, 0);
> + &hmask, &hbase, &trap)) {
> + ret = sbi_ipi_send_smode(hmask, hbase);
> } else {
> sbi_trap_redirect(regs, &trap);
> out->skip_regs_update = true;
> @@ -80,10 +79,10 @@ static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid,
> break;
> case SBI_EXT_0_1_REMOTE_FENCE_I:
> if (sbi_load_hart_mask_unpriv((ulong *)regs->a0,
> - &hmask, &trap)) {
> + &hmask, &hbase, &trap)) {
> SBI_TLB_INFO_INIT(&tlb_info, 0, 0, 0, 0,
> SBI_TLB_FENCE_I, source_hart);
> - ret = sbi_tlb_request(hmask, 0, &tlb_info);
> + ret = sbi_tlb_request(hmask, hbase, &tlb_info);
> } else {
> sbi_trap_redirect(regs, &trap);
> out->skip_regs_update = true;
> @@ -91,10 +90,10 @@ static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid,
> break;
> case SBI_EXT_0_1_REMOTE_SFENCE_VMA:
> if (sbi_load_hart_mask_unpriv((ulong *)regs->a0,
> - &hmask, &trap)) {
> + &hmask, &hbase, &trap)) {
> SBI_TLB_INFO_INIT(&tlb_info, regs->a1, regs->a2, 0, 0,
> SBI_TLB_SFENCE_VMA, source_hart);
> - ret = sbi_tlb_request(hmask, 0, &tlb_info);
> + ret = sbi_tlb_request(hmask, hbase, &tlb_info);
> } else {
> sbi_trap_redirect(regs, &trap);
> out->skip_regs_update = true;
> @@ -102,12 +101,12 @@ static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid,
> break;
> case SBI_EXT_0_1_REMOTE_SFENCE_VMA_ASID:
> if (sbi_load_hart_mask_unpriv((ulong *)regs->a0,
> - &hmask, &trap)) {
> + &hmask, &hbase, &trap)) {
> SBI_TLB_INFO_INIT(&tlb_info, regs->a1,
> regs->a2, regs->a3, 0,
> SBI_TLB_SFENCE_VMA_ASID,
> source_hart);
> - ret = sbi_tlb_request(hmask, 0, &tlb_info);
> + ret = sbi_tlb_request(hmask, hbase, &tlb_info);
> } else {
> sbi_trap_redirect(regs, &trap);
> out->skip_regs_update = true;
> --
> 2.45.1
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi
More information about the opensbi
mailing list