1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * ACRN_HSM: Virtual Machine management 4 * 5 * Copyright (C) 2020 Intel Corporation. All rights reserved. 6 * 7 * Authors: 8 * Jason Chen CJ <jason.cj.chen@intel.com> 9 * Yakui Zhao <yakui.zhao@intel.com> 10 */ 11 #include <linux/io.h> 12 #include <linux/mm.h> 13 #include <linux/slab.h> 14 15 #include "acrn_drv.h" 16 17 /* List of VMs */ 18 static LIST_HEAD(acrn_vm_list); 19 /* To protect acrn_vm_list */ 20 static DEFINE_MUTEX(acrn_vm_list_lock); 21 22 struct acrn_vm *acrn_vm_create(struct acrn_vm *vm, 23 struct acrn_vm_creation *vm_param) 24 { 25 int ret; 26 27 ret = hcall_create_vm(virt_to_phys(vm_param)); 28 if (ret < 0 || vm_param->vmid == ACRN_INVALID_VMID) { 29 dev_err(acrn_dev.this_device, 30 "Failed to create VM! Error: %d\n", ret); 31 return NULL; 32 } 33 34 vm->vmid = vm_param->vmid; 35 vm->vcpu_num = vm_param->vcpu_num; 36 37 mutex_lock(&acrn_vm_list_lock); 38 list_add(&vm->list, &acrn_vm_list); 39 mutex_unlock(&acrn_vm_list_lock); 40 41 dev_dbg(acrn_dev.this_device, "VM %u created.\n", vm->vmid); 42 return vm; 43 } 44 45 int acrn_vm_destroy(struct acrn_vm *vm) 46 { 47 int ret; 48 49 if (vm->vmid == ACRN_INVALID_VMID || 50 test_and_set_bit(ACRN_VM_FLAG_DESTROYED, &vm->flags)) 51 return 0; 52 53 /* Remove from global VM list */ 54 mutex_lock(&acrn_vm_list_lock); 55 list_del_init(&vm->list); 56 mutex_unlock(&acrn_vm_list_lock); 57 58 ret = hcall_destroy_vm(vm->vmid); 59 if (ret < 0) { 60 dev_err(acrn_dev.this_device, 61 "Failed to destroy VM %u\n", vm->vmid); 62 clear_bit(ACRN_VM_FLAG_DESTROYED, &vm->flags); 63 return ret; 64 } 65 dev_dbg(acrn_dev.this_device, "VM %u destroyed.\n", vm->vmid); 66 vm->vmid = ACRN_INVALID_VMID; 67 return 0; 68 } 69