riscv vmm: consider hart_mask_base argument in the SBI IPI handler.

From the spec:

Any SBI function, requiring a hart mask, must take the following
two arguments:

- unsigned long hart_mask is a scalar bit-vector containing hartids
- unsigned long hart_mask_base is the starting hartid from which the
  bit-vector must be computed.

hart_mask_base can be set to -1 to indicate that hart_mask shall be
ignored and all available harts must be considered.

Differential Revision:	https://reviews.freebsd.org/D48717
This commit is contained in:
Ruslan Bukin 2025-02-03 11:48:18 +00:00
parent 1fdb01ec5f
commit c7e0b94b7d

View file

@ -154,6 +154,7 @@ vmm_sbi_handle_ipi(struct vcpu *vcpu, struct hypctx *hypctx)
cpuset_t active_cpus;
struct hyp *hyp;
uint64_t hart_mask;
uint64_t hart_mask_base;
uint64_t func_id;
int hart_id;
int bit;
@ -161,6 +162,7 @@ vmm_sbi_handle_ipi(struct vcpu *vcpu, struct hypctx *hypctx)
func_id = hypctx->guest_regs.hyp_a[6];
hart_mask = hypctx->guest_regs.hyp_a[0];
hart_mask_base = hypctx->guest_regs.hyp_a[1];
dprintf("%s: hart_mask %lx\n", __func__, hart_mask);
@ -173,6 +175,8 @@ vmm_sbi_handle_ipi(struct vcpu *vcpu, struct hypctx *hypctx)
while ((bit = ffs(hart_mask))) {
hart_id = (bit - 1);
hart_mask &= ~(1u << hart_id);
if (hart_mask_base != -1)
hart_id += hart_mask_base;
if (CPU_ISSET(hart_id, &active_cpus)) {
/* TODO. */
target_vcpu = vm_vcpu(hyp->vm, hart_id);