>From cba617464c71f4d4e4a34728f117ca92145f746f Mon Sep 17 00:00:00 2001
From: Jordan Hargrave <[email protected]>
Date: Tue, 18 Aug 2020 15:46:36 -0500
Subject: [PATCH 1/4] Add helper vm_find_vcpu function for VMM
---
sys/arch/amd64/amd64/vmm.c | 63 ++++++++++++++++++++------------------
1 file changed, 33 insertions(+), 30 deletions(-)
diff --git a/sys/arch/amd64/amd64/vmm.c b/sys/arch/amd64/amd64/vmm.c
index 84fcb23a5..f6d51737e 100644
--- a/sys/arch/amd64/amd64/vmm.c
+++ b/sys/arch/amd64/amd64/vmm.c
@@ -558,6 +558,34 @@ vmmclose(dev_t dev, int flag, int mode, struct proc *p)
return 0;
}
+/*
+ * vm_find_vcpu
+ *
+ * Lookup VMM VCPU by ID number
+ *
+ * Parameters:
+ * vm: vm structure
+ * id: index id of vcpu
+ *
+ * Returns pointer to vcpu structure if successful, NULL otherwise
+ */
+static struct vcpu *
+vm_find_vcpu(struct vm *vm, uint32_t id)
+{
+ struct vcpu *vcpu;
+
+ if (vm == NULL)
+ return NULL;
+ rw_enter_read(&vm->vm_vcpu_lock);
+ SLIST_FOREACH(vcpu, &vm->vm_vcpu_list, vc_vcpu_link) {
+ if (vcpu->vc_id == id)
+ break;
+ }
+ rw_exit_read(&vm->vm_vcpu_lock);
+ return vcpu;
+}
+
+
/*
* vm_resetcpu
*
@@ -591,12 +619,7 @@ vm_resetcpu(struct vm_resetcpu_params *vrp)
return (error);
}
- rw_enter_read(&vm->vm_vcpu_lock);
- SLIST_FOREACH(vcpu, &vm->vm_vcpu_list, vc_vcpu_link) {
- if (vcpu->vc_id == vrp->vrp_vcpu_id)
- break;
- }
- rw_exit_read(&vm->vm_vcpu_lock);
+ vcpu = vm_find_vcpu(vm, vrp->vrp_vcpu_id);
if (vcpu == NULL) {
DPRINTF("%s: vcpu id %u of vm %u not found\n", __func__,
@@ -657,12 +680,7 @@ vm_intr_pending(struct vm_intr_params *vip)
return (error);
}
- rw_enter_read(&vm->vm_vcpu_lock);
- SLIST_FOREACH(vcpu, &vm->vm_vcpu_list, vc_vcpu_link) {
- if (vcpu->vc_id == vip->vip_vcpu_id)
- break;
- }
- rw_exit_read(&vm->vm_vcpu_lock);
+ vcpu = vm_find_vcpu(vm, vip->vip_vcpu_id);
rw_exit_read(&vmm_softc->vm_lock);
if (vcpu == NULL)
@@ -722,12 +740,7 @@ vm_rwvmparams(struct vm_rwvmparams_params *vpp, int dir) {
return (error);
}
- rw_enter_read(&vm->vm_vcpu_lock);
- SLIST_FOREACH(vcpu, &vm->vm_vcpu_list, vc_vcpu_link) {
- if (vcpu->vc_id == vpp->vpp_vcpu_id)
- break;
- }
- rw_exit_read(&vm->vm_vcpu_lock);
+ vcpu = vm_find_vcpu(vm, vpp->vpp_vcpu_id);
rw_exit_read(&vmm_softc->vm_lock);
if (vcpu == NULL)
@@ -786,12 +799,7 @@ vm_rwregs(struct vm_rwregs_params *vrwp, int dir)
return (error);
}
- rw_enter_read(&vm->vm_vcpu_lock);
- SLIST_FOREACH(vcpu, &vm->vm_vcpu_list, vc_vcpu_link) {
- if (vcpu->vc_id == vrwp->vrwp_vcpu_id)
- break;
- }
- rw_exit_read(&vm->vm_vcpu_lock);
+ vcpu = vm_find_vcpu(vm, vrwp->vrwp_vcpu_id);
rw_exit_read(&vmm_softc->vm_lock);
if (vcpu == NULL)
@@ -858,12 +866,7 @@ vm_mprotect_ept(struct vm_mprotect_ept_params *vmep)
return (ret);
}
- rw_enter_read(&vm->vm_vcpu_lock);
- SLIST_FOREACH(vcpu, &vm->vm_vcpu_list, vc_vcpu_link) {
- if (vcpu->vc_id == vmep->vmep_vcpu_id)
- break;
- }
- rw_exit_read(&vm->vm_vcpu_lock);
+ vcpu = vm_find_vcpu(vm, vmep->vmep_vcpu_id);
if (vcpu == NULL) {
DPRINTF("%s: vcpu id %u of vm %u not found\n", __func__,
--
2.26.2