2021-09-27 17:10:01 +05:30
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright ( C ) 2019 Western Digital Corporation or its affiliates .
*
* Authors :
* Anup Patel < anup . patel @ wdc . com >
*/
# include <linux/errno.h>
# include <linux/err.h>
# include <linux/module.h>
# include <linux/uaccess.h>
# include <linux/kvm_host.h>
const struct _kvm_stats_desc kvm_vm_stats_desc [ ] = {
KVM_GENERIC_VM_STATS ( )
} ;
static_assert ( ARRAY_SIZE ( kvm_vm_stats_desc ) = =
sizeof ( struct kvm_vm_stat ) / sizeof ( u64 ) ) ;
const struct kvm_stats_header kvm_vm_stats_header = {
. name_size = KVM_STATS_NAME_SIZE ,
. num_desc = ARRAY_SIZE ( kvm_vm_stats_desc ) ,
. id_offset = sizeof ( struct kvm_stats_header ) ,
. desc_offset = sizeof ( struct kvm_stats_header ) + KVM_STATS_NAME_SIZE ,
. data_offset = sizeof ( struct kvm_stats_header ) + KVM_STATS_NAME_SIZE +
sizeof ( kvm_vm_stats_desc ) ,
} ;
int kvm_arch_init_vm ( struct kvm * kvm , unsigned long type )
{
int r ;
2022-05-09 10:43:30 +05:30
r = kvm_riscv_gstage_alloc_pgd ( kvm ) ;
2021-09-27 17:10:01 +05:30
if ( r )
return r ;
2022-05-09 10:43:30 +05:30
r = kvm_riscv_gstage_vmid_init ( kvm ) ;
2021-09-27 17:10:08 +05:30
if ( r ) {
2022-05-09 10:43:30 +05:30
kvm_riscv_gstage_free_pgd ( kvm ) ;
2021-09-27 17:10:08 +05:30
return r ;
}
2022-07-29 17:14:26 +05:30
kvm_riscv_guest_timer_init ( kvm ) ;
return 0 ;
2021-09-27 17:10:01 +05:30
}
void kvm_arch_destroy_vm ( struct kvm * kvm )
{
2021-11-16 16:03:57 +00:00
kvm_destroy_vcpus ( kvm ) ;
2021-09-27 17:10:01 +05:30
}
int kvm_vm_ioctl_check_extension ( struct kvm * kvm , long ext )
{
int r ;
switch ( ext ) {
2021-09-27 17:10:06 +05:30
case KVM_CAP_IOEVENTFD :
2021-09-27 17:10:01 +05:30
case KVM_CAP_DEVICE_CTRL :
case KVM_CAP_USER_MEMORY :
2021-09-27 17:10:10 +05:30
case KVM_CAP_SYNC_MMU :
2021-09-27 17:10:01 +05:30
case KVM_CAP_DESTROY_MEMORY_REGION_WORKS :
case KVM_CAP_ONE_REG :
case KVM_CAP_READONLY_MEM :
case KVM_CAP_MP_STATE :
case KVM_CAP_IMMEDIATE_EXIT :
r = 1 ;
break ;
case KVM_CAP_NR_VCPUS :
2021-11-16 17:34:41 +01:00
r = min_t ( unsigned int , num_online_cpus ( ) , KVM_MAX_VCPUS ) ;
2021-09-27 17:10:01 +05:30
break ;
case KVM_CAP_MAX_VCPUS :
r = KVM_MAX_VCPUS ;
break ;
case KVM_CAP_NR_MEMSLOTS :
r = KVM_USER_MEM_SLOTS ;
break ;
2021-11-26 17:05:51 +05:30
case KVM_CAP_VM_GPA_BITS :
2022-05-09 10:43:30 +05:30
r = kvm_riscv_gstage_gpa_bits ( ) ;
2021-11-26 17:05:51 +05:30
break ;
2021-09-27 17:10:01 +05:30
default :
r = 0 ;
break ;
}
return r ;
}
long kvm_arch_vm_ioctl ( struct file * filp ,
unsigned int ioctl , unsigned long arg )
{
return - EINVAL ;
}