|
@@ -54,11 +54,38 @@ static DEFINE_PER_CPU(unsigned long, kvm_arm_hyp_stack_page);
|
|
|
static struct vfp_hard_struct __percpu *kvm_host_vfp_state;
|
|
|
static unsigned long hyp_default_vectors;
|
|
|
|
|
|
+/* Per-CPU variable containing the currently running vcpu. */
|
|
|
+static DEFINE_PER_CPU(struct kvm_vcpu *, kvm_arm_running_vcpu);
|
|
|
+
|
|
|
/* The VMID used in the VTTBR */
|
|
|
static atomic64_t kvm_vmid_gen = ATOMIC64_INIT(1);
|
|
|
static u8 kvm_next_vmid;
|
|
|
static DEFINE_SPINLOCK(kvm_vmid_lock);
|
|
|
|
|
|
+static void kvm_arm_set_running_vcpu(struct kvm_vcpu *vcpu)
|
|
|
+{
|
|
|
+ BUG_ON(preemptible());
|
|
|
+ __get_cpu_var(kvm_arm_running_vcpu) = vcpu;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * kvm_arm_get_running_vcpu - get the vcpu running on the current CPU.
|
|
|
+ * Must be called from non-preemptible context
|
|
|
+ */
|
|
|
+struct kvm_vcpu *kvm_arm_get_running_vcpu(void)
|
|
|
+{
|
|
|
+ BUG_ON(preemptible());
|
|
|
+ return __get_cpu_var(kvm_arm_running_vcpu);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * kvm_arm_get_running_vcpus - get the per-CPU array of currently running vcpus.
|
|
|
+ */
|
|
|
+struct kvm_vcpu __percpu **kvm_get_running_vcpus(void)
|
|
|
+{
|
|
|
+ return &kvm_arm_running_vcpu;
|
|
|
+}
|
|
|
+
|
|
|
int kvm_arch_hardware_enable(void *garbage)
|
|
|
{
|
|
|
return 0;
|
|
@@ -310,10 +337,13 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
|
|
|
*/
|
|
|
if (cpumask_test_and_clear_cpu(cpu, &vcpu->arch.require_dcache_flush))
|
|
|
flush_cache_all(); /* We'd really want v7_flush_dcache_all() */
|
|
|
+
|
|
|
+ kvm_arm_set_running_vcpu(vcpu);
|
|
|
}
|
|
|
|
|
|
void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
|
|
|
{
|
|
|
+ kvm_arm_set_running_vcpu(NULL);
|
|
|
}
|
|
|
|
|
|
int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
|