riscv vmm: fix remote fence.

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
This commit is contained in:
Ruslan Bukin 2025-02-03 11:45:29 +00:00
parent 7ac65902d8
commit 1fdb01ec5f

View file

@ -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