From 1fdb01ec5fdd23d3f6d7d743d1f438915ded40d4 Mon Sep 17 00:00:00 2001 From: Ruslan Bukin Date: Mon, 3 Feb 2025 11:45:29 +0000 Subject: [PATCH] riscv vmm: fix remote fence. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From the spec: The remote fence function acts as a full TLB flush if • start_addr and size are both 0 • size is equal to 2^XLEN-1 Differential Revision: https://reviews.freebsd.org/D48716 --- sys/riscv/vmm/vmm_fence.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sys/riscv/vmm/vmm_fence.c b/sys/riscv/vmm/vmm_fence.c index 6bba3f4b5df..f8b69aac77a 100644 --- a/sys/riscv/vmm/vmm_fence.c +++ b/sys/riscv/vmm/vmm_fence.c @@ -103,7 +103,8 @@ vmm_fence_process_one(struct vmm_fence *fence) sfence_vma_page(va); break; case VMM_RISCV_FENCE_VMA_ASID: - if (fence->start == 0 && fence->size == 0) + if ((fence->start == 0 && fence->size == 0) || + fence->size == -1) sfence_vma_asid(fence->asid); else for (va = fence->start; va < fence->start + fence->size; @@ -165,7 +166,8 @@ vmm_fence_add(struct vm *vm, cpuset_t *cpus, struct vmm_fence *fence) atomic_set_32(&hypctx->fence_req, FENCE_REQ_I); break; case VMM_RISCV_FENCE_VMA: - if (fence->start == 0 && fence->size == 0) + if ((fence->start == 0 && fence->size == 0) || + fence->size == -1) atomic_set_32(&hypctx->fence_req, FENCE_REQ_VMA); else