xref: /openbmc/linux/drivers/virt/acrn/vm.c (revision 88f537d5)
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