xref: /openbmc/linux/arch/riscv/kvm/vm.c (revision 9f7013265112a92340cef5debec8d02ec8d1de06)
199cdc6c1SAnup Patel // SPDX-License-Identifier: GPL-2.0
299cdc6c1SAnup Patel /*
399cdc6c1SAnup Patel  * Copyright (C) 2019 Western Digital Corporation or its affiliates.
499cdc6c1SAnup Patel  *
599cdc6c1SAnup Patel  * Authors:
699cdc6c1SAnup Patel  *     Anup Patel <anup.patel@wdc.com>
799cdc6c1SAnup Patel  */
899cdc6c1SAnup Patel 
999cdc6c1SAnup Patel #include <linux/errno.h>
1099cdc6c1SAnup Patel #include <linux/err.h>
1199cdc6c1SAnup Patel #include <linux/module.h>
1299cdc6c1SAnup Patel #include <linux/uaccess.h>
1399cdc6c1SAnup Patel #include <linux/kvm_host.h>
1499cdc6c1SAnup Patel 
1599cdc6c1SAnup Patel const struct _kvm_stats_desc kvm_vm_stats_desc[] = {
1699cdc6c1SAnup Patel 	KVM_GENERIC_VM_STATS()
1799cdc6c1SAnup Patel };
1899cdc6c1SAnup Patel static_assert(ARRAY_SIZE(kvm_vm_stats_desc) ==
1999cdc6c1SAnup Patel 		sizeof(struct kvm_vm_stat) / sizeof(u64));
2099cdc6c1SAnup Patel 
2199cdc6c1SAnup Patel const struct kvm_stats_header kvm_vm_stats_header = {
2299cdc6c1SAnup Patel 	.name_size = KVM_STATS_NAME_SIZE,
2399cdc6c1SAnup Patel 	.num_desc = ARRAY_SIZE(kvm_vm_stats_desc),
2499cdc6c1SAnup Patel 	.id_offset =  sizeof(struct kvm_stats_header),
2599cdc6c1SAnup Patel 	.desc_offset = sizeof(struct kvm_stats_header) + KVM_STATS_NAME_SIZE,
2699cdc6c1SAnup Patel 	.data_offset = sizeof(struct kvm_stats_header) + KVM_STATS_NAME_SIZE +
2799cdc6c1SAnup Patel 		       sizeof(kvm_vm_stats_desc),
2899cdc6c1SAnup Patel };
2999cdc6c1SAnup Patel 
3099cdc6c1SAnup Patel int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, struct kvm_dirty_log *log)
3199cdc6c1SAnup Patel {
3299cdc6c1SAnup Patel 	/* TODO: To be added later. */
3399cdc6c1SAnup Patel 	return -EOPNOTSUPP;
3499cdc6c1SAnup Patel }
3599cdc6c1SAnup Patel 
3699cdc6c1SAnup Patel int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
3799cdc6c1SAnup Patel {
3899cdc6c1SAnup Patel 	int r;
3999cdc6c1SAnup Patel 
4099cdc6c1SAnup Patel 	r = kvm_riscv_stage2_alloc_pgd(kvm);
4199cdc6c1SAnup Patel 	if (r)
4299cdc6c1SAnup Patel 		return r;
4399cdc6c1SAnup Patel 
4499cdc6c1SAnup Patel 	return 0;
4599cdc6c1SAnup Patel }
4699cdc6c1SAnup Patel 
4799cdc6c1SAnup Patel void kvm_arch_destroy_vm(struct kvm *kvm)
4899cdc6c1SAnup Patel {
4999cdc6c1SAnup Patel 	int i;
5099cdc6c1SAnup Patel 
5199cdc6c1SAnup Patel 	for (i = 0; i < KVM_MAX_VCPUS; ++i) {
5299cdc6c1SAnup Patel 		if (kvm->vcpus[i]) {
5399cdc6c1SAnup Patel 			kvm_vcpu_destroy(kvm->vcpus[i]);
5499cdc6c1SAnup Patel 			kvm->vcpus[i] = NULL;
5599cdc6c1SAnup Patel 		}
5699cdc6c1SAnup Patel 	}
5799cdc6c1SAnup Patel 	atomic_set(&kvm->online_vcpus, 0);
5899cdc6c1SAnup Patel }
5999cdc6c1SAnup Patel 
6099cdc6c1SAnup Patel int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
6199cdc6c1SAnup Patel {
6299cdc6c1SAnup Patel 	int r;
6399cdc6c1SAnup Patel 
6499cdc6c1SAnup Patel 	switch (ext) {
65*9f701326SAnup Patel 	case KVM_CAP_IOEVENTFD:
6699cdc6c1SAnup Patel 	case KVM_CAP_DEVICE_CTRL:
6799cdc6c1SAnup Patel 	case KVM_CAP_USER_MEMORY:
6899cdc6c1SAnup Patel 	case KVM_CAP_DESTROY_MEMORY_REGION_WORKS:
6999cdc6c1SAnup Patel 	case KVM_CAP_ONE_REG:
7099cdc6c1SAnup Patel 	case KVM_CAP_READONLY_MEM:
7199cdc6c1SAnup Patel 	case KVM_CAP_MP_STATE:
7299cdc6c1SAnup Patel 	case KVM_CAP_IMMEDIATE_EXIT:
7399cdc6c1SAnup Patel 		r = 1;
7499cdc6c1SAnup Patel 		break;
7599cdc6c1SAnup Patel 	case KVM_CAP_NR_VCPUS:
7699cdc6c1SAnup Patel 		r = num_online_cpus();
7799cdc6c1SAnup Patel 		break;
7899cdc6c1SAnup Patel 	case KVM_CAP_MAX_VCPUS:
7999cdc6c1SAnup Patel 		r = KVM_MAX_VCPUS;
8099cdc6c1SAnup Patel 		break;
8199cdc6c1SAnup Patel 	case KVM_CAP_NR_MEMSLOTS:
8299cdc6c1SAnup Patel 		r = KVM_USER_MEM_SLOTS;
8399cdc6c1SAnup Patel 		break;
8499cdc6c1SAnup Patel 	default:
8599cdc6c1SAnup Patel 		r = 0;
8699cdc6c1SAnup Patel 		break;
8799cdc6c1SAnup Patel 	}
8899cdc6c1SAnup Patel 
8999cdc6c1SAnup Patel 	return r;
9099cdc6c1SAnup Patel }
9199cdc6c1SAnup Patel 
9299cdc6c1SAnup Patel long kvm_arch_vm_ioctl(struct file *filp,
9399cdc6c1SAnup Patel 		       unsigned int ioctl, unsigned long arg)
9499cdc6c1SAnup Patel {
9599cdc6c1SAnup Patel 	return -EINVAL;
9699cdc6c1SAnup Patel }
97