Merge tag 'kvmarm-6.5' of git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm...
[platform/kernel/linux-starfive.git] / arch / arm64 / include / asm / kvm_host.h
index 9787503..1143ce0 100644 (file)
@@ -39,6 +39,7 @@
 #define KVM_MAX_VCPUS VGIC_V3_MAX_CPUS
 
 #define KVM_VCPU_MAX_FEATURES 7
+#define KVM_VCPU_VALID_FEATURES        (BIT(KVM_VCPU_MAX_FEATURES) - 1)
 
 #define KVM_REQ_SLEEP \
        KVM_ARCH_REQ_FLAGS(0, KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP)
@@ -159,6 +160,21 @@ struct kvm_s2_mmu {
        /* The last vcpu id that ran on each physical CPU */
        int __percpu *last_vcpu_ran;
 
+#define KVM_ARM_EAGER_SPLIT_CHUNK_SIZE_DEFAULT 0
+       /*
+        * Memory cache used to split
+        * KVM_CAP_ARM_EAGER_SPLIT_CHUNK_SIZE worth of huge pages. It
+        * is used to allocate stage2 page tables while splitting huge
+        * pages. The choice of KVM_CAP_ARM_EAGER_SPLIT_CHUNK_SIZE
+        * influences both the capacity of the split page cache, and
+        * how often KVM reschedules. Be wary of raising CHUNK_SIZE
+        * too high.
+        *
+        * Protected by kvm->slots_lock.
+        */
+       struct kvm_mmu_memory_cache split_page_cache;
+       uint64_t split_page_chunk_size;
+
        struct kvm_arch *arch;
 };
 
@@ -214,25 +230,23 @@ struct kvm_arch {
 #define KVM_ARCH_FLAG_MTE_ENABLED                      1
        /* At least one vCPU has ran in the VM */
 #define KVM_ARCH_FLAG_HAS_RAN_ONCE                     2
-       /*
-        * The following two bits are used to indicate the guest's EL1
-        * register width configuration. A value of KVM_ARCH_FLAG_EL1_32BIT
-        * bit is valid only when KVM_ARCH_FLAG_REG_WIDTH_CONFIGURED is set.
-        * Otherwise, the guest's EL1 register width has not yet been
-        * determined yet.
-        */
-#define KVM_ARCH_FLAG_REG_WIDTH_CONFIGURED             3
-#define KVM_ARCH_FLAG_EL1_32BIT                                4
+       /* The vCPU feature set for the VM is configured */
+#define KVM_ARCH_FLAG_VCPU_FEATURES_CONFIGURED         3
        /* PSCI SYSTEM_SUSPEND enabled for the guest */
-#define KVM_ARCH_FLAG_SYSTEM_SUSPEND_ENABLED           5
+#define KVM_ARCH_FLAG_SYSTEM_SUSPEND_ENABLED           4
        /* VM counter offset */
-#define KVM_ARCH_FLAG_VM_COUNTER_OFFSET                        6
+#define KVM_ARCH_FLAG_VM_COUNTER_OFFSET                        5
        /* Timer PPIs made immutable */
-#define KVM_ARCH_FLAG_TIMER_PPIS_IMMUTABLE             7
+#define KVM_ARCH_FLAG_TIMER_PPIS_IMMUTABLE             6
        /* SMCCC filter initialized for the VM */
-#define KVM_ARCH_FLAG_SMCCC_FILTER_CONFIGURED          8
+#define KVM_ARCH_FLAG_SMCCC_FILTER_CONFIGURED          7
+       /* Initial ID reg values loaded */
+#define KVM_ARCH_FLAG_ID_REGS_INITIALIZED              8
        unsigned long flags;
 
+       /* VM-wide vCPU feature set */
+       DECLARE_BITMAP(vcpu_features, KVM_VCPU_MAX_FEATURES);
+
        /*
         * VM-wide PMU filter, implemented as a bitmap and big enough for
         * up to 2^10 events (ARMv8.0) or 2^16 events (ARMv8.1+).
@@ -242,18 +256,24 @@ struct kvm_arch {
 
        cpumask_var_t supported_cpus;
 
-       u8 pfr0_csv2;
-       u8 pfr0_csv3;
-       struct {
-               u8 imp:4;
-               u8 unimp:4;
-       } dfr0_pmuver;
-
        /* Hypercall features firmware registers' descriptor */
        struct kvm_smccc_features smccc_feat;
        struct maple_tree smccc_filter;
 
        /*
+        * Emulated CPU ID registers per VM
+        * (Op0, Op1, CRn, CRm, Op2) of the ID registers to be saved in it
+        * is (3, 0, 0, crm, op2), where 1<=crm<8, 0<=op2<8.
+        *
+        * These emulated idregs are VM-wide, but accessed from the context of a vCPU.
+        * Atomic access to multiple idregs are guarded by kvm_arch.config_lock.
+        */
+#define IDREG_IDX(id)          (((sys_reg_CRm(id) - 1) << 3) | sys_reg_Op2(id))
+#define IDREG(kvm, id)         ((kvm)->arch.id_regs[IDREG_IDX(id)])
+#define KVM_ARM_ID_REG_NUM     (IDREG_IDX(sys_reg(3, 0, 0, 7, 7)) + 1)
+       u64 id_regs[KVM_ARM_ID_REG_NUM];
+
+       /*
         * For an untrusted host VM, 'pkvm.handle' is used to lookup
         * the associated pKVM instance in the hypervisor.
         */
@@ -405,6 +425,7 @@ struct kvm_host_data {
 struct kvm_host_psci_config {
        /* PSCI version used by host. */
        u32 version;
+       u32 smccc_version;
 
        /* Function IDs used by host if version is v0.1. */
        struct psci_0_1_function_ids function_ids_0_1;