1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright (C) 2020-2023 Loongson Technology Corporation Limited 4 */ 5 6#include <linux/kvm_host.h> 7#include <asm/kvm_mmu.h> 8 9const struct _kvm_stats_desc kvm_vm_stats_desc[] = { 10 KVM_GENERIC_VM_STATS(), 11 STATS_DESC_ICOUNTER(VM, pages), 12 STATS_DESC_ICOUNTER(VM, hugepages), 13}; 14 15const struct kvm_stats_header kvm_vm_stats_header = { 16 .name_size = KVM_STATS_NAME_SIZE, 17 .num_desc = ARRAY_SIZE(kvm_vm_stats_desc), 18 .id_offset = sizeof(struct kvm_stats_header), 19 .desc_offset = sizeof(struct kvm_stats_header) + KVM_STATS_NAME_SIZE, 20 .data_offset = sizeof(struct kvm_stats_header) + KVM_STATS_NAME_SIZE + 21 sizeof(kvm_vm_stats_desc), 22}; 23 24int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) 25{ 26 int i; 27 28 /* Allocate page table to map GPA -> RPA */ 29 kvm->arch.pgd = kvm_pgd_alloc(); 30 if (!kvm->arch.pgd) 31 return -ENOMEM; 32 33 kvm_init_vmcs(kvm); 34 kvm->arch.gpa_size = BIT(cpu_vabits - 1); 35 kvm->arch.root_level = CONFIG_PGTABLE_LEVELS - 1; 36 kvm->arch.invalid_ptes[0] = 0; 37 kvm->arch.invalid_ptes[1] = (unsigned long)invalid_pte_table; 38#if CONFIG_PGTABLE_LEVELS > 2 39 kvm->arch.invalid_ptes[2] = (unsigned long)invalid_pmd_table; 40#endif 41#if CONFIG_PGTABLE_LEVELS > 3 42 kvm->arch.invalid_ptes[3] = (unsigned long)invalid_pud_table; 43#endif 44 for (i = 0; i <= kvm->arch.root_level; i++) 45 kvm->arch.pte_shifts[i] = PAGE_SHIFT + i * (PAGE_SHIFT - 3); 46 47 return 0; 48} 49 50void kvm_arch_destroy_vm(struct kvm *kvm) 51{ 52 kvm_destroy_vcpus(kvm); 53 free_page((unsigned long)kvm->arch.pgd); 54 kvm->arch.pgd = NULL; 55} 56 57int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) 58{ 59 int r; 60 61 switch (ext) { 62 case KVM_CAP_ONE_REG: 63 case KVM_CAP_ENABLE_CAP: 64 case KVM_CAP_READONLY_MEM: 65 case KVM_CAP_SYNC_MMU: 66 case KVM_CAP_IMMEDIATE_EXIT: 67 case KVM_CAP_IOEVENTFD: 68 case KVM_CAP_MP_STATE: 69 r = 1; 70 break; 71 case KVM_CAP_NR_VCPUS: 72 r = num_online_cpus(); 73 break; 74 case KVM_CAP_MAX_VCPUS: 75 r = KVM_MAX_VCPUS; 76 break; 77 case KVM_CAP_MAX_VCPU_ID: 78 r = KVM_MAX_VCPU_IDS; 79 break; 80 case KVM_CAP_NR_MEMSLOTS: 81 r = KVM_USER_MEM_SLOTS; 82 break; 83 default: 84 r = 0; 85 break; 86 } 87 88 return r; 89} 90 91int kvm_arch_vm_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg) 92{ 93 return -ENOIOCTLCMD; 94} 95