]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
RISC-V: KVM: Fix the size parameter check in SBI SFENCE calls
authorAnup Patel <apatel@ventanamicro.com>
Thu, 5 Jun 2025 06:14:46 +0000 (11:44 +0530)
committerAnup Patel <anup@brainfault.org>
Tue, 17 Jun 2025 04:48:40 +0000 (10:18 +0530)
As-per the SBI specification, an SBI remote fence operation applies
to the entire address space if either:
1) start_addr and size are both 0
2) size is equal to 2^XLEN-1

>From the above, only #1 is checked by SBI SFENCE calls so fix the
size parameter check in SBI SFENCE calls to cover #2 as well.

Fixes: 13acfec2dbcc ("RISC-V: KVM: Add remote HFENCE functions based on VCPU requests")
Reviewed-by: Atish Patra <atishp@rivosinc.com>
Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Link: https://lore.kernel.org/r/20250605061458.196003-2-apatel@ventanamicro.com
Signed-off-by: Anup Patel <anup@brainfault.org>
arch/riscv/kvm/vcpu_sbi_replace.c

index 5fbf3f94f1e85565de85dd04c3643f583c848126..9752d2ffff6834ffc434ad4c8d55640f66b7bc2e 100644 (file)
@@ -103,7 +103,7 @@ static int kvm_sbi_ext_rfence_handler(struct kvm_vcpu *vcpu, struct kvm_run *run
                kvm_riscv_vcpu_pmu_incr_fw(vcpu, SBI_PMU_FW_FENCE_I_SENT);
                break;
        case SBI_EXT_RFENCE_REMOTE_SFENCE_VMA:
-               if (cp->a2 == 0 && cp->a3 == 0)
+               if ((cp->a2 == 0 && cp->a3 == 0) || cp->a3 == -1UL)
                        kvm_riscv_hfence_vvma_all(vcpu->kvm, hbase, hmask);
                else
                        kvm_riscv_hfence_vvma_gva(vcpu->kvm, hbase, hmask,
@@ -111,7 +111,7 @@ static int kvm_sbi_ext_rfence_handler(struct kvm_vcpu *vcpu, struct kvm_run *run
                kvm_riscv_vcpu_pmu_incr_fw(vcpu, SBI_PMU_FW_HFENCE_VVMA_SENT);
                break;
        case SBI_EXT_RFENCE_REMOTE_SFENCE_VMA_ASID:
-               if (cp->a2 == 0 && cp->a3 == 0)
+               if ((cp->a2 == 0 && cp->a3 == 0) || cp->a3 == -1UL)
                        kvm_riscv_hfence_vvma_asid_all(vcpu->kvm,
                                                       hbase, hmask, cp->a4);
                else