Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
[linux-2.6-block.git] / arch / arm64 / include / asm / kvm_host.h
index 689d4c95e12fbd0dd7c1cf7ca9521918f37aaab0..71fa6fe9d54addc45099c3f8fbbf35c1c9e38b71 100644 (file)
@@ -25,7 +25,9 @@
 #include <linux/types.h>
 #include <linux/kvm_types.h>
 #include <asm/kvm.h>
+#include <asm/kvm_asm.h>
 #include <asm/kvm_mmio.h>
+#include <asm/kvm_perf_event.h>
 
 #define __KVM_HAVE_ARCH_INTC_INITIALIZED
 
 
 #include <kvm/arm_vgic.h>
 #include <kvm/arm_arch_timer.h>
+#include <kvm/arm_pmu.h>
 
 #define KVM_MAX_VCPUS VGIC_V3_MAX_CPUS
 
-#define KVM_VCPU_MAX_FEATURES 3
+#define KVM_VCPU_MAX_FEATURES 4
 
 int __attribute_const__ kvm_target_cpu(void);
 int kvm_reset_vcpu(struct kvm_vcpu *vcpu);
@@ -114,6 +117,21 @@ enum vcpu_sysreg {
        MDSCR_EL1,      /* Monitor Debug System Control Register */
        MDCCINT_EL1,    /* Monitor Debug Comms Channel Interrupt Enable Reg */
 
+       /* Performance Monitors Registers */
+       PMCR_EL0,       /* Control Register */
+       PMSELR_EL0,     /* Event Counter Selection Register */
+       PMEVCNTR0_EL0,  /* Event Counter Register (0-30) */
+       PMEVCNTR30_EL0 = PMEVCNTR0_EL0 + 30,
+       PMCCNTR_EL0,    /* Cycle Counter Register */
+       PMEVTYPER0_EL0, /* Event Type Register (0-30) */
+       PMEVTYPER30_EL0 = PMEVTYPER0_EL0 + 30,
+       PMCCFILTR_EL0,  /* Cycle Count Filter Register */
+       PMCNTENSET_EL0, /* Count Enable Set Register */
+       PMINTENSET_EL1, /* Interrupt Enable Set Register */
+       PMOVSSET_EL0,   /* Overflow Flag Status Set Register */
+       PMSWINC_EL0,    /* Software Increment Register */
+       PMUSERENR_EL0,  /* User Enable Register */
+
        /* 32bit specific registers. Keep them at the end of the range */
        DACR32_EL2,     /* Domain Access Control Register */
        IFSR32_EL2,     /* Instruction Fault Status Register */
@@ -211,6 +229,7 @@ struct kvm_vcpu_arch {
        /* VGIC state */
        struct vgic_cpu vgic_cpu;
        struct arch_timer_cpu timer_cpu;
+       struct kvm_pmu pmu;
 
        /*
         * Anything that is not used directly from assembly code goes
@@ -342,5 +361,18 @@ void kvm_arm_init_debug(void);
 void kvm_arm_setup_debug(struct kvm_vcpu *vcpu);
 void kvm_arm_clear_debug(struct kvm_vcpu *vcpu);
 void kvm_arm_reset_debug_ptr(struct kvm_vcpu *vcpu);
+int kvm_arm_vcpu_arch_set_attr(struct kvm_vcpu *vcpu,
+                              struct kvm_device_attr *attr);
+int kvm_arm_vcpu_arch_get_attr(struct kvm_vcpu *vcpu,
+                              struct kvm_device_attr *attr);
+int kvm_arm_vcpu_arch_has_attr(struct kvm_vcpu *vcpu,
+                              struct kvm_device_attr *attr);
+
+/* #define kvm_call_hyp(f, ...) __kvm_call_hyp(kvm_ksym_ref(f), ##__VA_ARGS__) */
+
+static inline void __cpu_init_stage2(void)
+{
+       kvm_call_hyp(__init_stage2_translation);
+}
 
 #endif /* __ARM64_KVM_HOST_H__ */