diff --git a/hypervisor/common/hypercall.c b/hypervisor/common/hypercall.c index 74f3c8a77..74b39b7f9 100644 --- a/hypervisor/common/hypercall.c +++ b/hypervisor/common/hypercall.c @@ -834,12 +834,13 @@ int32_t hcall_assign_pcidev(struct acrn_vm *vm, uint16_t vmid, uint64_t param) struct acrn_assign_pcidev pcidev; struct acrn_vm *target_vm = get_vm_from_vmid(vmid); - if (!is_poweroff_vm(target_vm) && is_postlaunched_vm(target_vm)) { + /* We should only assign a device to a post-launched VM at creating time for safety, not runtime or other cases*/ + if (is_created_vm(target_vm) && is_postlaunched_vm(target_vm)) { if (copy_from_gpa(vm, &pcidev, param, sizeof(pcidev)) == 0) { ret = vpci_assign_pcidev(target_vm, &pcidev); } } else { - pr_err("%s, vm[%d] is invalid\n", __func__, vm->vm_id); + pr_err("%s, vm[%d] is not a postlaunched VM, or not in CREATED status to be assigned with a pcidev\n", __func__, vm->vm_id); } return ret; @@ -862,12 +863,13 @@ int32_t hcall_deassign_pcidev(struct acrn_vm *vm, uint16_t vmid, uint64_t param) struct acrn_assign_pcidev pcidev; struct acrn_vm *target_vm = get_vm_from_vmid(vmid); - if (!is_poweroff_vm(target_vm) && is_postlaunched_vm(target_vm)) { + /* We should only de-assign a device from a post-launched VM at creating/shutdown/reset time */ + if ((is_paused_vm(target_vm) || is_created_vm(target_vm)) && is_postlaunched_vm(target_vm)) { if (copy_from_gpa(vm, &pcidev, param, sizeof(pcidev)) == 0) { ret = vpci_deassign_pcidev(target_vm, &pcidev); } } else { - pr_err("%s, vm[%d] is invalid\n", __func__, vm->vm_id); + pr_err("%s, vm[%d] is not a postlaunched VM, or not in PAUSED/CREATED status to be deassigned from a pcidev\n", __func__, vm->vm_id); } return ret;