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 mutex_init(&vm->regions_mapping_lock); 35 vm->vmid = vm_param->vmid; 36 vm->vcpu_num = vm_param->vcpu_num; 37 38 mutex_lock(&acrn_vm_list_lock); 39 list_add(&vm->list, &acrn_vm_list); 40 mutex_unlock(&acrn_vm_list_lock); 41 42 dev_dbg(acrn_dev.this_device, "VM %u created.\n", vm->vmid); 43 return vm; 44 } 45 46 int acrn_vm_destroy(struct acrn_vm *vm) 47 { 48 int ret; 49 50 if (vm->vmid == ACRN_INVALID_VMID || 51 test_and_set_bit(ACRN_VM_FLAG_DESTROYED, &vm->flags)) 52 return 0; 53 54 /* Remove from global VM list */ 55 mutex_lock(&acrn_vm_list_lock); 56 list_del_init(&vm->list); 57 mutex_unlock(&acrn_vm_list_lock); 58 59 ret = hcall_destroy_vm(vm->vmid); 60 if (ret < 0) { 61 dev_err(acrn_dev.this_device, 62 "Failed to destroy VM %u\n", vm->vmid); 63 clear_bit(ACRN_VM_FLAG_DESTROYED, &vm->flags); 64 return ret; 65 } 66 67 acrn_vm_all_ram_unmap(vm); 68 69 dev_dbg(acrn_dev.this_device, "VM %u destroyed.\n", vm->vmid); 70 vm->vmid = ACRN_INVALID_VMID; 71 return 0; 72 } 73