blob: af3ce2bb370d74a31b1ad0e6e9ebf88b1cbb1120 [file] [log] [blame]
Thomas Gleixnerd94d71c2019-05-29 07:12:40 -07001// SPDX-License-Identifier: GPL-2.0-only
Christoffer Dall749cf76c2013-01-20 18:28:06 -05002/*
3 * Copyright (C) 2012 - Virtual Open Systems and Columbia University
4 * Author: Christoffer Dall <c.dall@virtualopensystems.com>
Christoffer Dall749cf76c2013-01-20 18:28:06 -05005 */
6
Dave Martin85acda32018-04-20 16:20:43 +01007#include <linux/bug.h>
Lorenzo Pieralisi1fcf7ce2013-08-05 15:04:46 +01008#include <linux/cpu_pm.h>
Christoffer Dall749cf76c2013-01-20 18:28:06 -05009#include <linux/errno.h>
10#include <linux/err.h>
11#include <linux/kvm_host.h>
Andre Przywara1085fdc2016-07-15 12:43:31 +010012#include <linux/list.h>
Christoffer Dall749cf76c2013-01-20 18:28:06 -050013#include <linux/module.h>
14#include <linux/vmalloc.h>
15#include <linux/fs.h>
16#include <linux/mman.h>
17#include <linux/sched.h>
Christoffer Dall86ce8532013-01-20 18:28:08 -050018#include <linux/kvm.h>
Eric Auger24124052017-10-27 15:28:31 +010019#include <linux/kvm_irqfd.h>
20#include <linux/irqbypass.h>
Marc Zyngierde737082018-06-21 10:43:59 +010021#include <linux/sched/stat.h>
Christoffer Dall749cf76c2013-01-20 18:28:06 -050022#include <trace/events/kvm.h>
Shannon Zhaob02386e2016-02-26 19:29:19 +080023#include <kvm/arm_pmu.h>
Marc Zyngier1a2fb942018-02-06 17:56:08 +000024#include <kvm/arm_psci.h>
Christoffer Dall749cf76c2013-01-20 18:28:06 -050025
26#define CREATE_TRACE_POINTS
27#include "trace.h"
28
Linus Torvalds7c0f6ba2016-12-24 11:46:01 -080029#include <linux/uaccess.h>
Christoffer Dall749cf76c2013-01-20 18:28:06 -050030#include <asm/ptrace.h>
31#include <asm/mman.h>
Christoffer Dall342cd0a2013-01-20 18:28:06 -050032#include <asm/tlbflush.h>
Christoffer Dall5b3e5e52013-01-20 18:28:09 -050033#include <asm/cacheflush.h>
Dave Martin85acda32018-04-20 16:20:43 +010034#include <asm/cpufeature.h>
Christoffer Dall342cd0a2013-01-20 18:28:06 -050035#include <asm/virt.h>
36#include <asm/kvm_arm.h>
37#include <asm/kvm_asm.h>
38#include <asm/kvm_mmu.h>
Christoffer Dallf7ed45b2013-01-20 18:47:42 -050039#include <asm/kvm_emulate.h>
Christoffer Dall5b3e5e52013-01-20 18:28:09 -050040#include <asm/kvm_coproc.h>
Marc Zyngier910917b2015-10-27 12:18:48 +000041#include <asm/sections.h>
Christoffer Dall749cf76c2013-01-20 18:28:06 -050042
Steven Price8564d632019-10-21 16:28:18 +010043#include <kvm/arm_hypercalls.h>
44#include <kvm/arm_pmu.h>
45#include <kvm/arm_psci.h>
46
Christoffer Dall749cf76c2013-01-20 18:28:06 -050047#ifdef REQUIRES_VIRT
48__asm__(".arch_extension virt");
49#endif
50
Andrew Murray630a1682019-04-09 20:22:11 +010051DEFINE_PER_CPU(kvm_host_data_t, kvm_host_data);
Christoffer Dall342cd0a2013-01-20 18:28:06 -050052static DEFINE_PER_CPU(unsigned long, kvm_arm_hyp_stack_page);
Christoffer Dall342cd0a2013-01-20 18:28:06 -050053
Marc Zyngier1638a122013-01-21 19:36:11 -050054/* Per-CPU variable containing the currently running vcpu. */
55static DEFINE_PER_CPU(struct kvm_vcpu *, kvm_arm_running_vcpu);
56
Christoffer Dallf7ed45b2013-01-20 18:47:42 -050057/* The VMID used in the VTTBR */
58static atomic64_t kvm_vmid_gen = ATOMIC64_INIT(1);
Vladimir Murzin20475f72015-11-16 11:28:18 +000059static u32 kvm_next_vmid;
Christoffer Dallfb544d12018-12-11 13:23:57 +010060static DEFINE_SPINLOCK(kvm_vmid_lock);
Christoffer Dall342cd0a2013-01-20 18:28:06 -050061
Pavel Fedinc7da6fa2015-12-18 14:38:43 +030062static bool vgic_present;
63
AKASHI Takahiro67f69192016-04-27 17:47:05 +010064static DEFINE_PER_CPU(unsigned char, kvm_arm_hardware_enabled);
65
Marc Zyngier1638a122013-01-21 19:36:11 -050066static void kvm_arm_set_running_vcpu(struct kvm_vcpu *vcpu)
67{
Christoph Lameter1436c1a2013-10-21 13:17:08 +010068 __this_cpu_write(kvm_arm_running_vcpu, vcpu);
Marc Zyngier1638a122013-01-21 19:36:11 -050069}
70
Christoffer Dall61bbe382017-10-27 19:57:51 +020071DEFINE_STATIC_KEY_FALSE(userspace_irqchip_in_use);
72
Marc Zyngier1638a122013-01-21 19:36:11 -050073/**
74 * kvm_arm_get_running_vcpu - get the vcpu running on the current CPU.
75 * Must be called from non-preemptible context
76 */
77struct kvm_vcpu *kvm_arm_get_running_vcpu(void)
78{
Christoph Lameter1436c1a2013-10-21 13:17:08 +010079 return __this_cpu_read(kvm_arm_running_vcpu);
Marc Zyngier1638a122013-01-21 19:36:11 -050080}
81
82/**
83 * kvm_arm_get_running_vcpus - get the per-CPU array of currently running vcpus.
84 */
Will Deacon4000be42014-08-26 15:13:21 +010085struct kvm_vcpu * __percpu *kvm_get_running_vcpus(void)
Marc Zyngier1638a122013-01-21 19:36:11 -050086{
87 return &kvm_arm_running_vcpu;
88}
89
Christoffer Dall749cf76c2013-01-20 18:28:06 -050090int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu)
91{
92 return kvm_vcpu_exiting_guest_mode(vcpu) == IN_GUEST_MODE;
93}
94
Christoffer Dall749cf76c2013-01-20 18:28:06 -050095int kvm_arch_hardware_setup(void)
96{
97 return 0;
98}
99
Sean Christophersonf257d6d2019-04-19 22:18:17 -0700100int kvm_arch_check_processor_compat(void)
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500101{
Sean Christophersonf257d6d2019-04-19 22:18:17 -0700102 return 0;
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500103}
104
Christoffer Dallc7262002019-10-11 13:07:05 +0200105int kvm_vm_ioctl_enable_cap(struct kvm *kvm,
106 struct kvm_enable_cap *cap)
107{
108 int r;
109
110 if (cap->flags)
111 return -EINVAL;
112
113 switch (cap->cap) {
114 case KVM_CAP_ARM_NISV_TO_USER:
115 r = 0;
116 kvm->arch.return_nisv_io_abort_to_user = true;
117 break;
118 default:
119 r = -EINVAL;
120 break;
121 }
122
123 return r;
124}
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500125
Christoffer Dalld5d81842013-01-20 18:28:07 -0500126/**
127 * kvm_arch_init_vm - initializes a VM data structure
128 * @kvm: pointer to the KVM struct
129 */
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500130int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
131{
Marc Zyngier94d0e592016-10-18 18:37:49 +0100132 int ret, cpu;
Christoffer Dalld5d81842013-01-20 18:28:07 -0500133
Marc Zyngierbca607e2018-10-01 13:40:36 +0100134 ret = kvm_arm_setup_stage2(kvm, type);
Suzuki K Poulose5b6c6742018-09-26 17:32:42 +0100135 if (ret)
136 return ret;
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500137
Marc Zyngier94d0e592016-10-18 18:37:49 +0100138 kvm->arch.last_vcpu_ran = alloc_percpu(typeof(*kvm->arch.last_vcpu_ran));
139 if (!kvm->arch.last_vcpu_ran)
140 return -ENOMEM;
141
142 for_each_possible_cpu(cpu)
143 *per_cpu_ptr(kvm->arch.last_vcpu_ran, cpu) = -1;
144
Christoffer Dalld5d81842013-01-20 18:28:07 -0500145 ret = kvm_alloc_stage2_pgd(kvm);
146 if (ret)
147 goto out_fail_alloc;
148
Marc Zyngierc8dddec2016-06-13 15:00:45 +0100149 ret = create_hyp_mappings(kvm, kvm + 1, PAGE_HYP);
Christoffer Dalld5d81842013-01-20 18:28:07 -0500150 if (ret)
151 goto out_free_stage2_pgd;
152
Marc Zyngier6c3d63c2014-06-23 17:37:18 +0100153 kvm_vgic_early_init(kvm);
Christoffer Dalla1a64382013-11-16 10:51:25 -0800154
Christoffer Dalld5d81842013-01-20 18:28:07 -0500155 /* Mark the initial VMID generation invalid */
Christoffer Dalle329fb72018-12-11 15:26:31 +0100156 kvm->arch.vmid.vmid_gen = 0;
Christoffer Dalld5d81842013-01-20 18:28:07 -0500157
Andre Przywara3caa2d82014-06-02 16:26:01 +0200158 /* The maximum number of VCPUs is limited by the host's GIC model */
Pavel Fedinc7da6fa2015-12-18 14:38:43 +0300159 kvm->arch.max_vcpus = vgic_present ?
160 kvm_vgic_get_max_vcpus() : KVM_MAX_VCPUS;
Andre Przywara3caa2d82014-06-02 16:26:01 +0200161
Christoffer Dalld5d81842013-01-20 18:28:07 -0500162 return ret;
163out_free_stage2_pgd:
164 kvm_free_stage2_pgd(kvm);
165out_fail_alloc:
Marc Zyngier94d0e592016-10-18 18:37:49 +0100166 free_percpu(kvm->arch.last_vcpu_ran);
167 kvm->arch.last_vcpu_ran = NULL;
Christoffer Dalld5d81842013-01-20 18:28:07 -0500168 return ret;
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500169}
170
Luiz Capitulino235539b2016-09-07 14:47:23 -0400171int kvm_arch_create_vcpu_debugfs(struct kvm_vcpu *vcpu)
172{
173 return 0;
174}
175
Souptick Joarder1499fa82018-04-19 00:49:58 +0530176vm_fault_t kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf)
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500177{
178 return VM_FAULT_SIGBUS;
179}
180
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500181
Christoffer Dalld5d81842013-01-20 18:28:07 -0500182/**
183 * kvm_arch_destroy_vm - destroy the VM data structure
184 * @kvm: pointer to the KVM struct
185 */
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500186void kvm_arch_destroy_vm(struct kvm *kvm)
187{
188 int i;
189
Marc Zyngierb2c9a852017-10-27 15:28:34 +0100190 kvm_vgic_destroy(kvm);
191
Marc Zyngier94d0e592016-10-18 18:37:49 +0100192 free_percpu(kvm->arch.last_vcpu_ran);
193 kvm->arch.last_vcpu_ran = NULL;
194
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500195 for (i = 0; i < KVM_MAX_VCPUS; ++i) {
196 if (kvm->vcpus[i]) {
Sean Christopherson4b8fff72019-12-18 13:55:04 -0800197 kvm_arch_vcpu_destroy(kvm->vcpus[i]);
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500198 kvm->vcpus[i] = NULL;
199 }
200 }
Andrew Jones6b2ad812017-11-27 19:17:18 +0100201 atomic_set(&kvm->online_vcpus, 0);
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500202}
203
Alexander Graf784aa3d2014-07-14 18:27:35 +0200204int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500205{
206 int r;
207 switch (ext) {
Marc Zyngier1a89dd92013-01-21 19:36:12 -0500208 case KVM_CAP_IRQCHIP:
Pavel Fedinc7da6fa2015-12-18 14:38:43 +0300209 r = vgic_present;
210 break;
Nikolay Nikolaevd44758c2015-01-24 12:00:02 +0000211 case KVM_CAP_IOEVENTFD:
Christoffer Dall73306722013-10-25 17:29:18 +0100212 case KVM_CAP_DEVICE_CTRL:
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500213 case KVM_CAP_USER_MEMORY:
214 case KVM_CAP_SYNC_MMU:
215 case KVM_CAP_DESTROY_MEMORY_REGION_WORKS:
216 case KVM_CAP_ONE_REG:
Marc Zyngieraa024c22013-01-20 18:28:13 -0500217 case KVM_CAP_ARM_PSCI:
Anup Patel4447a202014-04-29 11:24:25 +0530218 case KVM_CAP_ARM_PSCI_0_2:
Christoffer Dall98047882014-08-19 12:18:04 +0200219 case KVM_CAP_READONLY_MEM:
Alex Bennéeecccf0c2015-03-13 17:02:52 +0000220 case KVM_CAP_MP_STATE:
Paolo Bonzini460df4c2017-02-08 11:50:15 +0100221 case KVM_CAP_IMMEDIATE_EXIT:
Dongjiu Geng58bf4372018-10-13 00:12:49 +0800222 case KVM_CAP_VCPU_EVENTS:
Marc Zyngier92f35b72019-08-18 14:09:47 +0100223 case KVM_CAP_ARM_IRQ_LINE_LAYOUT_2:
Christoffer Dallc7262002019-10-11 13:07:05 +0200224 case KVM_CAP_ARM_NISV_TO_USER:
Christoffer Dallda345172019-10-11 13:07:06 +0200225 case KVM_CAP_ARM_INJECT_EXT_DABT:
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500226 r = 1;
227 break;
Christoffer Dall3401d5462013-01-23 13:18:04 -0500228 case KVM_CAP_ARM_SET_DEVICE_ADDR:
229 r = 1;
Marc Zyngierca46e102013-04-03 10:43:13 +0100230 break;
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500231 case KVM_CAP_NR_VCPUS:
232 r = num_online_cpus();
233 break;
234 case KVM_CAP_MAX_VCPUS:
235 r = KVM_MAX_VCPUS;
236 break;
Thomas Hutha86cb412019-05-23 18:43:08 +0200237 case KVM_CAP_MAX_VCPU_ID:
238 r = KVM_MAX_VCPU_ID;
239 break;
Vladimir Murzin29885092016-11-02 11:55:34 +0000240 case KVM_CAP_MSI_DEVID:
241 if (!kvm)
242 r = -EINVAL;
243 else
244 r = kvm->arch.vgic.msis_require_devid;
245 break;
Christoffer Dallf7214e62017-02-01 12:54:11 +0100246 case KVM_CAP_ARM_USER_IRQ:
247 /*
248 * 1: EL1_VTIMER, EL1_PTIMER, and PMU.
249 * (bump this number if adding more devices)
250 */
251 r = 1;
252 break;
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500253 default:
Dongjiu Geng375bdd32018-10-13 00:12:48 +0800254 r = kvm_arch_vm_ioctl_check_extension(kvm, ext);
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500255 break;
256 }
257 return r;
258}
259
260long kvm_arch_dev_ioctl(struct file *filp,
261 unsigned int ioctl, unsigned long arg)
262{
263 return -EINVAL;
264}
265
Marc Orrd1e5b0e2018-05-15 04:37:37 -0700266struct kvm *kvm_arch_alloc_vm(void)
267{
268 if (!has_vhe())
269 return kzalloc(sizeof(struct kvm), GFP_KERNEL);
270
271 return vzalloc(sizeof(struct kvm));
272}
273
274void kvm_arch_free_vm(struct kvm *kvm)
275{
276 if (!has_vhe())
277 kfree(kvm);
278 else
279 vfree(kvm);
280}
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500281
Sean Christopherson897cc382019-12-18 13:55:09 -0800282int kvm_arch_vcpu_precreate(struct kvm *kvm, unsigned int id)
283{
284 if (irqchip_in_kernel(kvm) && vgic_initialized(kvm))
285 return -EBUSY;
286
287 if (id >= kvm->arch.max_vcpus)
288 return -EINVAL;
289
290 return 0;
291}
292
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500293struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, unsigned int id)
294{
295 int err;
296 struct kvm_vcpu *vcpu;
297
298 vcpu = kmem_cache_zalloc(kvm_vcpu_cache, GFP_KERNEL);
299 if (!vcpu) {
300 err = -ENOMEM;
301 goto out;
302 }
303
304 err = kvm_vcpu_init(vcpu, kvm, id);
305 if (err)
306 goto free_vcpu;
307
Marc Zyngierc8dddec2016-06-13 15:00:45 +0100308 err = create_hyp_mappings(vcpu, vcpu + 1, PAGE_HYP);
Christoffer Dalld5d81842013-01-20 18:28:07 -0500309 if (err)
310 goto vcpu_uninit;
311
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500312 return vcpu;
Christoffer Dalld5d81842013-01-20 18:28:07 -0500313vcpu_uninit:
314 kvm_vcpu_uninit(vcpu);
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500315free_vcpu:
316 kmem_cache_free(kvm_vcpu_cache, vcpu);
317out:
318 return ERR_PTR(err);
319}
320
Dominik Dingel31928aa2014-12-04 15:47:07 +0100321void kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu)
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500322{
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500323}
324
Sean Christopherson4b8fff72019-12-18 13:55:04 -0800325void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500326{
Christoffer Dallf1d72312018-01-25 18:32:29 +0100327 if (vcpu->arch.has_run_once && unlikely(!irqchip_in_kernel(vcpu->kvm)))
328 static_branch_dec(&userspace_irqchip_in_use);
329
Christoffer Dalld5d81842013-01-20 18:28:07 -0500330 kvm_mmu_free_memory_caches(vcpu);
Marc Zyngier967f8422013-01-23 13:21:59 -0500331 kvm_timer_vcpu_terminate(vcpu);
Shannon Zhao5f0a7142015-09-11 15:18:05 +0800332 kvm_pmu_vcpu_destroy(vcpu);
James Morse591d2152016-06-08 17:24:45 +0100333 kvm_vcpu_uninit(vcpu);
Christoffer Dalld5d81842013-01-20 18:28:07 -0500334 kmem_cache_free(kvm_vcpu_cache, vcpu);
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500335}
336
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500337int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu)
338{
Christoffer Dall1c88ab72017-01-06 16:07:48 +0100339 return kvm_timer_is_pending(vcpu);
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500340}
341
Christoffer Dalld35268d2015-08-25 19:48:21 +0200342void kvm_arch_vcpu_blocking(struct kvm_vcpu *vcpu)
343{
Marc Zyngier5eeaf102019-08-02 10:28:32 +0100344 /*
345 * If we're about to block (most likely because we've just hit a
346 * WFI), we need to sync back the state of the GIC CPU interface
Marc Zyngier8e01d9a2019-10-27 14:41:59 +0000347 * so that we have the latest PMR and group enables. This ensures
Marc Zyngier5eeaf102019-08-02 10:28:32 +0100348 * that kvm_arch_vcpu_runnable has up-to-date data to decide
349 * whether we have pending interrupts.
Marc Zyngier8e01d9a2019-10-27 14:41:59 +0000350 *
351 * For the same reason, we want to tell GICv4 that we need
352 * doorbells to be signalled, should an interrupt become pending.
Marc Zyngier5eeaf102019-08-02 10:28:32 +0100353 */
354 preempt_disable();
355 kvm_vgic_vmcr_sync(vcpu);
Marc Zyngier8e01d9a2019-10-27 14:41:59 +0000356 vgic_v4_put(vcpu, true);
Marc Zyngier5eeaf102019-08-02 10:28:32 +0100357 preempt_enable();
Christoffer Dalld35268d2015-08-25 19:48:21 +0200358}
359
360void kvm_arch_vcpu_unblocking(struct kvm_vcpu *vcpu)
361{
Marc Zyngier8e01d9a2019-10-27 14:41:59 +0000362 preempt_disable();
363 vgic_v4_load(vcpu);
364 preempt_enable();
Christoffer Dalld35268d2015-08-25 19:48:21 +0200365}
366
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500367int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu)
368{
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500369 /* Force users to call KVM_ARM_VCPU_INIT */
370 vcpu->arch.target = -1;
Christoffer Dallf7fa034d2014-10-16 16:40:53 +0200371 bitmap_zero(vcpu->arch.features, KVM_VCPU_MAX_FEATURES);
Marc Zyngier1a89dd92013-01-21 19:36:12 -0500372
Marc Zyngier967f8422013-01-23 13:21:59 -0500373 /* Set up the timer */
374 kvm_timer_vcpu_init(vcpu);
375
Zenghui Yubca031e2019-07-18 08:15:10 +0000376 kvm_pmu_vcpu_init(vcpu);
377
Alex Bennée84e690b2015-07-07 17:30:00 +0100378 kvm_arm_reset_debug_ptr(vcpu);
379
Steven Price8564d632019-10-21 16:28:18 +0100380 kvm_arm_pvtime_vcpu_init(&vcpu->arch);
381
Christoffer Dall1aab6f42017-05-08 12:30:24 +0200382 return kvm_vgic_vcpu_init(vcpu);
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500383}
384
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500385void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
386{
Marc Zyngier94d0e592016-10-18 18:37:49 +0100387 int *last_ran;
Andrew Murray630a1682019-04-09 20:22:11 +0100388 kvm_host_data_t *cpu_data;
Marc Zyngier94d0e592016-10-18 18:37:49 +0100389
390 last_ran = this_cpu_ptr(vcpu->kvm->arch.last_vcpu_ran);
Andrew Murray630a1682019-04-09 20:22:11 +0100391 cpu_data = this_cpu_ptr(&kvm_host_data);
Marc Zyngier94d0e592016-10-18 18:37:49 +0100392
393 /*
394 * We might get preempted before the vCPU actually runs, but
395 * over-invalidation doesn't affect correctness.
396 */
397 if (*last_ran != vcpu->vcpu_id) {
398 kvm_call_hyp(__kvm_tlb_flush_local_vmid, vcpu);
399 *last_ran = vcpu->vcpu_id;
400 }
401
Christoffer Dall86ce8532013-01-20 18:28:08 -0500402 vcpu->cpu = cpu;
Andrew Murray630a1682019-04-09 20:22:11 +0100403 vcpu->arch.host_cpu_context = &cpu_data->host_ctxt;
Christoffer Dall5b3e5e52013-01-20 18:28:09 -0500404
Marc Zyngier1638a122013-01-21 19:36:11 -0500405 kvm_arm_set_running_vcpu(vcpu);
Christoffer Dall328e5662016-03-24 11:21:04 +0100406 kvm_vgic_load(vcpu);
Christoffer Dallb103cc32016-10-16 20:30:38 +0200407 kvm_timer_vcpu_load(vcpu);
Christoffer Dallbc192ce2017-10-10 10:21:18 +0200408 kvm_vcpu_load_sysregs(vcpu);
Dave Martine6b673b2018-04-06 14:55:59 +0100409 kvm_arch_vcpu_load_fp(vcpu);
Andrew Murray435e53f2019-04-09 20:22:15 +0100410 kvm_vcpu_pmu_restore_guest(vcpu);
Steven Price8564d632019-10-21 16:28:18 +0100411 if (kvm_arm_is_pvtime_enabled(&vcpu->arch))
412 kvm_make_request(KVM_REQ_RECORD_STEAL, vcpu);
Marc Zyngierde737082018-06-21 10:43:59 +0100413
414 if (single_task_running())
Marc Zyngieref2e78d2019-11-07 16:04:12 +0000415 vcpu_clear_wfx_traps(vcpu);
Marc Zyngierde737082018-06-21 10:43:59 +0100416 else
Marc Zyngieref2e78d2019-11-07 16:04:12 +0000417 vcpu_set_wfx_traps(vcpu);
Mark Rutland384b40c2019-04-23 10:12:35 +0530418
419 vcpu_ptrauth_setup_lazy(vcpu);
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500420}
421
422void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
423{
Dave Martine6b673b2018-04-06 14:55:59 +0100424 kvm_arch_vcpu_put_fp(vcpu);
Christoffer Dallbc192ce2017-10-10 10:21:18 +0200425 kvm_vcpu_put_sysregs(vcpu);
Christoffer Dallb103cc32016-10-16 20:30:38 +0200426 kvm_timer_vcpu_put(vcpu);
Christoffer Dall328e5662016-03-24 11:21:04 +0100427 kvm_vgic_put(vcpu);
Andrew Murray435e53f2019-04-09 20:22:15 +0100428 kvm_vcpu_pmu_restore_host(vcpu);
Christoffer Dall328e5662016-03-24 11:21:04 +0100429
Christoffer Dalle9b152c2013-12-11 20:29:11 -0800430 vcpu->cpu = -1;
431
Marc Zyngier1638a122013-01-21 19:36:11 -0500432 kvm_arm_set_running_vcpu(NULL);
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500433}
434
Andrew Jones424c9892017-06-04 14:43:57 +0200435static void vcpu_power_off(struct kvm_vcpu *vcpu)
436{
437 vcpu->arch.power_off = true;
Andrew Jones7b244e22017-06-04 14:43:58 +0200438 kvm_make_request(KVM_REQ_SLEEP, vcpu);
Andrew Jones424c9892017-06-04 14:43:57 +0200439 kvm_vcpu_kick(vcpu);
440}
441
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500442int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu,
443 struct kvm_mp_state *mp_state)
444{
Eric Auger37815282015-09-25 23:41:14 +0200445 if (vcpu->arch.power_off)
Alex Bennéeecccf0c2015-03-13 17:02:52 +0000446 mp_state->mp_state = KVM_MP_STATE_STOPPED;
447 else
448 mp_state->mp_state = KVM_MP_STATE_RUNNABLE;
449
450 return 0;
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500451}
452
453int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,
454 struct kvm_mp_state *mp_state)
455{
Christoffer Dalle83dff52017-12-04 21:35:31 +0100456 int ret = 0;
457
Alex Bennéeecccf0c2015-03-13 17:02:52 +0000458 switch (mp_state->mp_state) {
459 case KVM_MP_STATE_RUNNABLE:
Eric Auger37815282015-09-25 23:41:14 +0200460 vcpu->arch.power_off = false;
Alex Bennéeecccf0c2015-03-13 17:02:52 +0000461 break;
462 case KVM_MP_STATE_STOPPED:
Andrew Jones424c9892017-06-04 14:43:57 +0200463 vcpu_power_off(vcpu);
Alex Bennéeecccf0c2015-03-13 17:02:52 +0000464 break;
465 default:
Christoffer Dalle83dff52017-12-04 21:35:31 +0100466 ret = -EINVAL;
Alex Bennéeecccf0c2015-03-13 17:02:52 +0000467 }
468
Christoffer Dalle83dff52017-12-04 21:35:31 +0100469 return ret;
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500470}
471
Christoffer Dall5b3e5e52013-01-20 18:28:09 -0500472/**
473 * kvm_arch_vcpu_runnable - determine if the vcpu can be scheduled
474 * @v: The VCPU pointer
475 *
476 * If the guest CPU is not waiting for interrupts or an interrupt line is
477 * asserted, the CPU is by definition runnable.
478 */
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500479int kvm_arch_vcpu_runnable(struct kvm_vcpu *v)
480{
Christoffer Dall3df59d82017-08-03 12:09:05 +0200481 bool irq_lines = *vcpu_hcr(v) & (HCR_VI | HCR_VF);
482 return ((irq_lines || kvm_vgic_vcpu_pending_irq(v))
Eric Auger3b928302015-09-25 23:41:17 +0200483 && !v->arch.power_off && !v->arch.pause);
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500484}
485
Longpeng(Mike)199b5762017-08-08 12:05:32 +0800486bool kvm_arch_vcpu_in_kernel(struct kvm_vcpu *vcpu)
487{
Longpeng(Mike)f01fbd22017-08-08 12:05:35 +0800488 return vcpu_mode_priv(vcpu);
Longpeng(Mike)199b5762017-08-08 12:05:32 +0800489}
490
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500491/* Just ensure a guest exit from a particular CPU */
492static void exit_vm_noop(void *info)
493{
494}
495
496void force_vm_exit(const cpumask_t *mask)
497{
Eric Auger898f9492016-03-07 23:50:36 +0700498 preempt_disable();
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500499 smp_call_function_many(mask, exit_vm_noop, NULL, true);
Eric Auger898f9492016-03-07 23:50:36 +0700500 preempt_enable();
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500501}
502
503/**
504 * need_new_vmid_gen - check that the VMID is still valid
Christoffer Dalle329fb72018-12-11 15:26:31 +0100505 * @vmid: The VMID to check
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500506 *
507 * return true if there is a new generation of VMIDs being used
508 *
Christoffer Dalle329fb72018-12-11 15:26:31 +0100509 * The hardware supports a limited set of values with the value zero reserved
510 * for the host, so we check if an assigned value belongs to a previous
511 * generation, which which requires us to assign a new value. If we're the
512 * first to use a VMID for the new generation, we must flush necessary caches
513 * and TLBs on all CPUs.
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500514 */
Christoffer Dalle329fb72018-12-11 15:26:31 +0100515static bool need_new_vmid_gen(struct kvm_vmid *vmid)
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500516{
Christoffer Dallfb544d12018-12-11 13:23:57 +0100517 u64 current_vmid_gen = atomic64_read(&kvm_vmid_gen);
518 smp_rmb(); /* Orders read of kvm_vmid_gen and kvm->arch.vmid */
Christoffer Dalle329fb72018-12-11 15:26:31 +0100519 return unlikely(READ_ONCE(vmid->vmid_gen) != current_vmid_gen);
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500520}
521
522/**
Christoffer Dalle329fb72018-12-11 15:26:31 +0100523 * update_vmid - Update the vmid with a valid VMID for the current generation
524 * @kvm: The guest that struct vmid belongs to
525 * @vmid: The stage-2 VMID information struct
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500526 */
Christoffer Dalle329fb72018-12-11 15:26:31 +0100527static void update_vmid(struct kvm_vmid *vmid)
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500528{
Christoffer Dalle329fb72018-12-11 15:26:31 +0100529 if (!need_new_vmid_gen(vmid))
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500530 return;
531
Christoffer Dallfb544d12018-12-11 13:23:57 +0100532 spin_lock(&kvm_vmid_lock);
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500533
534 /*
535 * We need to re-check the vmid_gen here to ensure that if another vcpu
536 * already allocated a valid vmid for this vm, then this vcpu should
537 * use the same vmid.
538 */
Christoffer Dalle329fb72018-12-11 15:26:31 +0100539 if (!need_new_vmid_gen(vmid)) {
Christoffer Dallfb544d12018-12-11 13:23:57 +0100540 spin_unlock(&kvm_vmid_lock);
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500541 return;
542 }
543
544 /* First user of a new VMID generation? */
545 if (unlikely(kvm_next_vmid == 0)) {
546 atomic64_inc(&kvm_vmid_gen);
547 kvm_next_vmid = 1;
548
549 /*
550 * On SMP we know no other CPUs can use this CPU's or each
551 * other's VMID after force_vm_exit returns since the
552 * kvm_vmid_lock blocks them from reentry to the guest.
553 */
554 force_vm_exit(cpu_all_mask);
555 /*
556 * Now broadcast TLB + ICACHE invalidation over the inner
557 * shareable domain to make sure all data structures are
558 * clean.
559 */
560 kvm_call_hyp(__kvm_flush_vm_context);
561 }
562
Christoffer Dalle329fb72018-12-11 15:26:31 +0100563 vmid->vmid = kvm_next_vmid;
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500564 kvm_next_vmid++;
Christoffer Dalle329fb72018-12-11 15:26:31 +0100565 kvm_next_vmid &= (1 << kvm_get_vmid_bits()) - 1;
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500566
Christoffer Dallfb544d12018-12-11 13:23:57 +0100567 smp_wmb();
Christoffer Dalle329fb72018-12-11 15:26:31 +0100568 WRITE_ONCE(vmid->vmid_gen, atomic64_read(&kvm_vmid_gen));
Christoffer Dallfb544d12018-12-11 13:23:57 +0100569
570 spin_unlock(&kvm_vmid_lock);
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500571}
572
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500573static int kvm_vcpu_first_run_init(struct kvm_vcpu *vcpu)
574{
Christoffer Dall05971122014-12-12 21:19:23 +0100575 struct kvm *kvm = vcpu->kvm;
Christoffer Dall41a54482016-05-18 16:26:00 +0100576 int ret = 0;
Christoffer Dalle1ba0202013-09-23 14:55:55 -0700577
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500578 if (likely(vcpu->arch.has_run_once))
579 return 0;
580
Dave Martin7dd32a02018-12-19 14:27:01 +0000581 if (!kvm_arm_vcpu_is_finalized(vcpu))
582 return -EPERM;
583
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500584 vcpu->arch.has_run_once = true;
Marc Zyngieraa024c22013-01-20 18:28:13 -0500585
Christoffer Dall61bbe382017-10-27 19:57:51 +0200586 if (likely(irqchip_in_kernel(kvm))) {
587 /*
588 * Map the VGIC hardware resources before running a vcpu the
589 * first time on this VM.
590 */
591 if (unlikely(!vgic_ready(kvm))) {
592 ret = kvm_vgic_map_resources(kvm);
593 if (ret)
594 return ret;
595 }
596 } else {
597 /*
598 * Tell the rest of the code that there are userspace irqchip
599 * VMs in the wild.
600 */
601 static_branch_inc(&userspace_irqchip_in_use);
Marc Zyngier01ac5e32013-01-21 19:36:16 -0500602 }
603
Alexander Grafd9e13972016-09-27 21:08:06 +0200604 ret = kvm_timer_enable(vcpu);
Christoffer Dalla2befac2017-05-02 13:41:02 +0200605 if (ret)
606 return ret;
607
608 ret = kvm_arm_pmu_v3_enable(vcpu);
Christoffer Dall05971122014-12-12 21:19:23 +0100609
Christoffer Dall41a54482016-05-18 16:26:00 +0100610 return ret;
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500611}
612
Eric Augerc1426e42015-03-04 11:14:34 +0100613bool kvm_arch_intc_initialized(struct kvm *kvm)
614{
615 return vgic_initialized(kvm);
616}
617
Christoffer Dallb13216c2016-04-27 10:28:00 +0100618void kvm_arm_halt_guest(struct kvm *kvm)
Eric Auger3b928302015-09-25 23:41:17 +0200619{
620 int i;
621 struct kvm_vcpu *vcpu;
622
623 kvm_for_each_vcpu(i, vcpu, kvm)
624 vcpu->arch.pause = true;
Andrew Jones7b244e22017-06-04 14:43:58 +0200625 kvm_make_all_cpus_request(kvm, KVM_REQ_SLEEP);
Eric Auger3b928302015-09-25 23:41:17 +0200626}
627
Christoffer Dallb13216c2016-04-27 10:28:00 +0100628void kvm_arm_resume_guest(struct kvm *kvm)
Eric Auger3b928302015-09-25 23:41:17 +0200629{
630 int i;
631 struct kvm_vcpu *vcpu;
632
Christoffer Dallabd72292017-05-06 20:01:24 +0200633 kvm_for_each_vcpu(i, vcpu, kvm) {
634 vcpu->arch.pause = false;
Peter Zijlstrab3dae102018-06-12 10:34:52 +0200635 swake_up_one(kvm_arch_vcpu_wq(vcpu));
Christoffer Dallabd72292017-05-06 20:01:24 +0200636 }
Eric Auger3b928302015-09-25 23:41:17 +0200637}
638
Andrew Jones7b244e22017-06-04 14:43:58 +0200639static void vcpu_req_sleep(struct kvm_vcpu *vcpu)
Marc Zyngieraa024c22013-01-20 18:28:13 -0500640{
Marcelo Tosatti85773702016-02-19 09:46:39 +0100641 struct swait_queue_head *wq = kvm_arch_vcpu_wq(vcpu);
Marc Zyngieraa024c22013-01-20 18:28:13 -0500642
Peter Zijlstrab3dae102018-06-12 10:34:52 +0200643 swait_event_interruptible_exclusive(*wq, ((!vcpu->arch.power_off) &&
Eric Auger3b928302015-09-25 23:41:17 +0200644 (!vcpu->arch.pause)));
Andrew Jones0592c002017-06-04 14:43:55 +0200645
Andrew Jones424c9892017-06-04 14:43:57 +0200646 if (vcpu->arch.power_off || vcpu->arch.pause) {
Andrew Jones0592c002017-06-04 14:43:55 +0200647 /* Awaken to handle a signal, request we sleep again later. */
Andrew Jones7b244e22017-06-04 14:43:58 +0200648 kvm_make_request(KVM_REQ_SLEEP, vcpu);
Andrew Jones0592c002017-06-04 14:43:55 +0200649 }
Marc Zyngier358b28f2018-12-20 11:36:07 +0000650
651 /*
652 * Make sure we will observe a potential reset request if we've
653 * observed a change to the power state. Pairs with the smp_wmb() in
654 * kvm_psci_vcpu_on().
655 */
656 smp_rmb();
Marc Zyngieraa024c22013-01-20 18:28:13 -0500657}
658
Andre Przywarae8180dc2013-05-09 00:28:06 +0200659static int kvm_vcpu_initialized(struct kvm_vcpu *vcpu)
660{
661 return vcpu->arch.target >= 0;
662}
663
Andrew Jones0592c002017-06-04 14:43:55 +0200664static void check_vcpu_requests(struct kvm_vcpu *vcpu)
665{
666 if (kvm_request_pending(vcpu)) {
Andrew Jones7b244e22017-06-04 14:43:58 +0200667 if (kvm_check_request(KVM_REQ_SLEEP, vcpu))
668 vcpu_req_sleep(vcpu);
Andrew Jones325f9c62017-06-04 14:43:59 +0200669
Marc Zyngier358b28f2018-12-20 11:36:07 +0000670 if (kvm_check_request(KVM_REQ_VCPU_RESET, vcpu))
671 kvm_reset_vcpu(vcpu);
672
Andrew Jones325f9c62017-06-04 14:43:59 +0200673 /*
674 * Clear IRQ_PENDING requests that were made to guarantee
675 * that a VCPU sees new virtual interrupts.
676 */
677 kvm_check_request(KVM_REQ_IRQ_PENDING, vcpu);
Steven Price8564d632019-10-21 16:28:18 +0100678
679 if (kvm_check_request(KVM_REQ_RECORD_STEAL, vcpu))
680 kvm_update_stolen_time(vcpu);
Andrew Jones0592c002017-06-04 14:43:55 +0200681 }
682}
683
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500684/**
685 * kvm_arch_vcpu_ioctl_run - the main VCPU run function to execute guest code
686 * @vcpu: The VCPU pointer
687 * @run: The kvm_run structure pointer used for userspace state exchange
688 *
689 * This function is called through the VCPU_RUN ioctl called from user space. It
690 * will execute VM code in a loop until the time slice for the process is used
691 * or some emulation is needed from user space in which case the function will
692 * return with return value 0 and with the kvm_run structure filled in with the
693 * required data for the requested emulation.
694 */
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500695int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
696{
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500697 int ret;
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500698
Andre Przywarae8180dc2013-05-09 00:28:06 +0200699 if (unlikely(!kvm_vcpu_initialized(vcpu)))
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500700 return -ENOEXEC;
701
702 ret = kvm_vcpu_first_run_init(vcpu);
703 if (ret)
Christoffer Dall829a5862017-11-29 16:37:53 +0100704 return ret;
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500705
Christoffer Dall45e96ea2013-01-20 18:43:58 -0500706 if (run->exit_reason == KVM_EXIT_MMIO) {
707 ret = kvm_handle_mmio_return(vcpu, vcpu->run);
708 if (ret)
Christoffer Dall829a5862017-11-29 16:37:53 +0100709 return ret;
Christoffer Dall45e96ea2013-01-20 18:43:58 -0500710 }
711
Christoffer Dall829a5862017-11-29 16:37:53 +0100712 if (run->immediate_exit)
713 return -EINTR;
714
715 vcpu_load(vcpu);
Paolo Bonzini460df4c2017-02-08 11:50:15 +0100716
Jan H. Schönherr20b70352017-11-24 22:39:01 +0100717 kvm_sigset_activate(vcpu);
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500718
719 ret = 1;
720 run->exit_reason = KVM_EXIT_UNKNOWN;
721 while (ret > 0) {
722 /*
723 * Check conditions before entering the guest
724 */
725 cond_resched();
726
Christoffer Dalle329fb72018-12-11 15:26:31 +0100727 update_vmid(&vcpu->kvm->arch.vmid);
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500728
Andrew Jones0592c002017-06-04 14:43:55 +0200729 check_vcpu_requests(vcpu);
730
Marc Zyngierabdf5842015-06-08 15:00:28 +0100731 /*
Marc Zyngierabdf5842015-06-08 15:00:28 +0100732 * Preparing the interrupts to be injected also
733 * involves poking the GIC, which must be done in a
734 * non-preemptible context.
735 */
736 preempt_disable();
Christoffer Dall328e5662016-03-24 11:21:04 +0100737
Shannon Zhaob02386e2016-02-26 19:29:19 +0800738 kvm_pmu_flush_hwstate(vcpu);
Christoffer Dall328e5662016-03-24 11:21:04 +0100739
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500740 local_irq_disable();
741
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500742 kvm_vgic_flush_hwstate(vcpu);
Christoffer Dall5b3e5e52013-01-20 18:28:09 -0500743
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500744 /*
Christoffer Dall61bbe382017-10-27 19:57:51 +0200745 * Exit if we have a signal pending so that we can deliver the
746 * signal to user space.
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500747 */
Christoffer Dall61bbe382017-10-27 19:57:51 +0200748 if (signal_pending(current)) {
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500749 ret = -EINTR;
750 run->exit_reason = KVM_EXIT_INTR;
751 }
752
Andrew Jones6a6d73b2017-06-04 14:43:54 +0200753 /*
Christoffer Dall61bbe382017-10-27 19:57:51 +0200754 * If we're using a userspace irqchip, then check if we need
755 * to tell a userspace irqchip about timer or PMU level
756 * changes and if so, exit to userspace (the actual level
757 * state gets updated in kvm_timer_update_run and
758 * kvm_pmu_update_run below).
759 */
760 if (static_branch_unlikely(&userspace_irqchip_in_use)) {
761 if (kvm_timer_should_notify_user(vcpu) ||
762 kvm_pmu_should_notify_user(vcpu)) {
763 ret = -EINTR;
764 run->exit_reason = KVM_EXIT_INTR;
765 }
766 }
767
768 /*
Andrew Jones6a6d73b2017-06-04 14:43:54 +0200769 * Ensure we set mode to IN_GUEST_MODE after we disable
770 * interrupts and before the final VCPU requests check.
771 * See the comment in kvm_vcpu_exiting_guest_mode() and
Christoph Hellwig2f5947d2019-07-24 09:24:49 +0200772 * Documentation/virt/kvm/vcpu-requests.rst
Andrew Jones6a6d73b2017-06-04 14:43:54 +0200773 */
774 smp_store_mb(vcpu->mode, IN_GUEST_MODE);
775
Christoffer Dalle329fb72018-12-11 15:26:31 +0100776 if (ret <= 0 || need_new_vmid_gen(&vcpu->kvm->arch.vmid) ||
Andrew Jones424c9892017-06-04 14:43:57 +0200777 kvm_request_pending(vcpu)) {
Andrew Jones6a6d73b2017-06-04 14:43:54 +0200778 vcpu->mode = OUTSIDE_GUEST_MODE;
Christoffer Dall771621b2017-10-04 23:42:32 +0200779 isb(); /* Ensure work in x_flush_hwstate is committed */
Shannon Zhaob02386e2016-02-26 19:29:19 +0800780 kvm_pmu_sync_hwstate(vcpu);
Christoffer Dall61bbe382017-10-27 19:57:51 +0200781 if (static_branch_unlikely(&userspace_irqchip_in_use))
782 kvm_timer_sync_hwstate(vcpu);
Marc Zyngier1a89dd92013-01-21 19:36:12 -0500783 kvm_vgic_sync_hwstate(vcpu);
Christoffer Dallee9bb9a2016-10-16 20:24:30 +0200784 local_irq_enable();
Marc Zyngierabdf5842015-06-08 15:00:28 +0100785 preempt_enable();
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500786 continue;
787 }
788
Alex Bennée56c7f5e2015-07-07 17:29:56 +0100789 kvm_arm_setup_debug(vcpu);
790
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500791 /**************************************************************
792 * Enter the guest
793 */
794 trace_kvm_entry(*vcpu_pc(vcpu));
Paolo Bonzini6edaa532016-06-15 15:18:26 +0200795 guest_enter_irqoff();
Christoffer Dall3f5c90b2017-10-03 14:02:12 +0200796
797 if (has_vhe()) {
James Morse4f5abad2018-01-15 19:39:00 +0000798 kvm_arm_vhe_guest_enter();
Christoffer Dall3f5c90b2017-10-03 14:02:12 +0200799 ret = kvm_vcpu_run_vhe(vcpu);
James Morse4f5abad2018-01-15 19:39:00 +0000800 kvm_arm_vhe_guest_exit();
Christoffer Dall3f5c90b2017-10-03 14:02:12 +0200801 } else {
Marc Zyngier7aa8d142019-01-05 15:49:50 +0000802 ret = kvm_call_hyp_ret(__kvm_vcpu_run_nvhe, vcpu);
Christoffer Dall3f5c90b2017-10-03 14:02:12 +0200803 }
804
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500805 vcpu->mode = OUTSIDE_GUEST_MODE;
Amit Tomarb19e6892015-11-26 10:09:43 +0000806 vcpu->stat.exits++;
Christoffer Dall1b3d5462015-05-28 19:49:10 +0100807 /*
808 * Back from guest
809 *************************************************************/
810
Alex Bennée56c7f5e2015-07-07 17:29:56 +0100811 kvm_arm_clear_debug(vcpu);
812
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500813 /*
Christoffer Dallb103cc32016-10-16 20:30:38 +0200814 * We must sync the PMU state before the vgic state so
Christoffer Dallee9bb9a2016-10-16 20:24:30 +0200815 * that the vgic can properly sample the updated state of the
816 * interrupt line.
817 */
818 kvm_pmu_sync_hwstate(vcpu);
Christoffer Dallee9bb9a2016-10-16 20:24:30 +0200819
Christoffer Dallb103cc32016-10-16 20:30:38 +0200820 /*
821 * Sync the vgic state before syncing the timer state because
822 * the timer code needs to know if the virtual timer
823 * interrupts are active.
824 */
Christoffer Dallee9bb9a2016-10-16 20:24:30 +0200825 kvm_vgic_sync_hwstate(vcpu);
826
827 /*
Christoffer Dallb103cc32016-10-16 20:30:38 +0200828 * Sync the timer hardware state before enabling interrupts as
829 * we don't want vtimer interrupts to race with syncing the
830 * timer virtual interrupt state.
831 */
Christoffer Dall61bbe382017-10-27 19:57:51 +0200832 if (static_branch_unlikely(&userspace_irqchip_in_use))
833 kvm_timer_sync_hwstate(vcpu);
Christoffer Dallb103cc32016-10-16 20:30:38 +0200834
Dave Martine6b673b2018-04-06 14:55:59 +0100835 kvm_arch_vcpu_ctxsync_fp(vcpu);
836
Christoffer Dallb103cc32016-10-16 20:30:38 +0200837 /*
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500838 * We may have taken a host interrupt in HYP mode (ie
839 * while executing the guest). This interrupt is still
840 * pending, as we haven't serviced it yet!
841 *
842 * We're now back in SVC mode, with interrupts
843 * disabled. Enabling the interrupts now will have
844 * the effect of taking the interrupt again, in SVC
845 * mode this time.
846 */
847 local_irq_enable();
848
849 /*
Paolo Bonzini6edaa532016-06-15 15:18:26 +0200850 * We do local_irq_enable() before calling guest_exit() so
Christoffer Dall1b3d5462015-05-28 19:49:10 +0100851 * that if a timer interrupt hits while running the guest we
852 * account that tick as being spent in the guest. We enable
Paolo Bonzini6edaa532016-06-15 15:18:26 +0200853 * preemption after calling guest_exit() so that if we get
Christoffer Dall1b3d5462015-05-28 19:49:10 +0100854 * preempted we make sure ticks after that is not counted as
855 * guest time.
856 */
Paolo Bonzini6edaa532016-06-15 15:18:26 +0200857 guest_exit();
Christoffer Dallb5905dc2015-08-30 15:55:22 +0200858 trace_kvm_exit(ret, kvm_vcpu_trap_get_class(vcpu), *vcpu_pc(vcpu));
Christoffer Dall1b3d5462015-05-28 19:49:10 +0100859
James Morse3368bd82018-01-15 19:39:04 +0000860 /* Exit types that need handling before we can be preempted */
861 handle_exit_early(vcpu, run, ret);
862
Marc Zyngierabdf5842015-06-08 15:00:28 +0100863 preempt_enable();
864
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500865 ret = handle_exit(vcpu, run, ret);
866 }
867
Alexander Grafd9e13972016-09-27 21:08:06 +0200868 /* Tell userspace about in-kernel device output levels */
Christoffer Dall3dbbdf72017-02-01 12:51:52 +0100869 if (unlikely(!irqchip_in_kernel(vcpu->kvm))) {
870 kvm_timer_update_run(vcpu);
871 kvm_pmu_update_run(vcpu);
872 }
Alexander Grafd9e13972016-09-27 21:08:06 +0200873
Jan H. Schönherr20b70352017-11-24 22:39:01 +0100874 kvm_sigset_deactivate(vcpu);
875
Christoffer Dallaccb7572017-12-04 21:35:25 +0100876 vcpu_put(vcpu);
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500877 return ret;
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500878}
879
Christoffer Dall86ce8532013-01-20 18:28:08 -0500880static int vcpu_interrupt_line(struct kvm_vcpu *vcpu, int number, bool level)
881{
882 int bit_index;
883 bool set;
Christoffer Dall3df59d82017-08-03 12:09:05 +0200884 unsigned long *hcr;
Christoffer Dall86ce8532013-01-20 18:28:08 -0500885
886 if (number == KVM_ARM_IRQ_CPU_IRQ)
887 bit_index = __ffs(HCR_VI);
888 else /* KVM_ARM_IRQ_CPU_FIQ */
889 bit_index = __ffs(HCR_VF);
890
Christoffer Dall3df59d82017-08-03 12:09:05 +0200891 hcr = vcpu_hcr(vcpu);
Christoffer Dall86ce8532013-01-20 18:28:08 -0500892 if (level)
Christoffer Dall3df59d82017-08-03 12:09:05 +0200893 set = test_and_set_bit(bit_index, hcr);
Christoffer Dall86ce8532013-01-20 18:28:08 -0500894 else
Christoffer Dall3df59d82017-08-03 12:09:05 +0200895 set = test_and_clear_bit(bit_index, hcr);
Christoffer Dall86ce8532013-01-20 18:28:08 -0500896
897 /*
898 * If we didn't change anything, no need to wake up or kick other CPUs
899 */
900 if (set == level)
901 return 0;
902
903 /*
904 * The vcpu irq_lines field was updated, wake up sleeping VCPUs and
905 * trigger a world-switch round on the running physical CPU to set the
906 * virtual IRQ/FIQ fields in the HCR appropriately.
907 */
Andrew Jones325f9c62017-06-04 14:43:59 +0200908 kvm_make_request(KVM_REQ_IRQ_PENDING, vcpu);
Christoffer Dall86ce8532013-01-20 18:28:08 -0500909 kvm_vcpu_kick(vcpu);
910
911 return 0;
912}
913
Alexander Graf79558f12013-04-16 19:21:41 +0200914int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_level,
915 bool line_status)
Christoffer Dall86ce8532013-01-20 18:28:08 -0500916{
917 u32 irq = irq_level->irq;
918 unsigned int irq_type, vcpu_idx, irq_num;
919 int nrcpus = atomic_read(&kvm->online_vcpus);
920 struct kvm_vcpu *vcpu = NULL;
921 bool level = irq_level->level;
922
923 irq_type = (irq >> KVM_ARM_IRQ_TYPE_SHIFT) & KVM_ARM_IRQ_TYPE_MASK;
924 vcpu_idx = (irq >> KVM_ARM_IRQ_VCPU_SHIFT) & KVM_ARM_IRQ_VCPU_MASK;
Marc Zyngier92f35b72019-08-18 14:09:47 +0100925 vcpu_idx += ((irq >> KVM_ARM_IRQ_VCPU2_SHIFT) & KVM_ARM_IRQ_VCPU2_MASK) * (KVM_ARM_IRQ_VCPU_MASK + 1);
Christoffer Dall86ce8532013-01-20 18:28:08 -0500926 irq_num = (irq >> KVM_ARM_IRQ_NUM_SHIFT) & KVM_ARM_IRQ_NUM_MASK;
927
928 trace_kvm_irq_line(irq_type, vcpu_idx, irq_num, irq_level->level);
929
Marc Zyngier5863c2c2013-01-21 19:36:15 -0500930 switch (irq_type) {
931 case KVM_ARM_IRQ_TYPE_CPU:
932 if (irqchip_in_kernel(kvm))
933 return -ENXIO;
Christoffer Dall86ce8532013-01-20 18:28:08 -0500934
Marc Zyngier5863c2c2013-01-21 19:36:15 -0500935 if (vcpu_idx >= nrcpus)
936 return -EINVAL;
Christoffer Dall86ce8532013-01-20 18:28:08 -0500937
Marc Zyngier5863c2c2013-01-21 19:36:15 -0500938 vcpu = kvm_get_vcpu(kvm, vcpu_idx);
939 if (!vcpu)
940 return -EINVAL;
Christoffer Dall86ce8532013-01-20 18:28:08 -0500941
Marc Zyngier5863c2c2013-01-21 19:36:15 -0500942 if (irq_num > KVM_ARM_IRQ_CPU_FIQ)
943 return -EINVAL;
Christoffer Dall86ce8532013-01-20 18:28:08 -0500944
Marc Zyngier5863c2c2013-01-21 19:36:15 -0500945 return vcpu_interrupt_line(vcpu, irq_num, level);
946 case KVM_ARM_IRQ_TYPE_PPI:
947 if (!irqchip_in_kernel(kvm))
948 return -ENXIO;
949
950 if (vcpu_idx >= nrcpus)
951 return -EINVAL;
952
953 vcpu = kvm_get_vcpu(kvm, vcpu_idx);
954 if (!vcpu)
955 return -EINVAL;
956
957 if (irq_num < VGIC_NR_SGIS || irq_num >= VGIC_NR_PRIVATE_IRQS)
958 return -EINVAL;
959
Christoffer Dallcb3f0ad2017-05-16 12:41:18 +0200960 return kvm_vgic_inject_irq(kvm, vcpu->vcpu_id, irq_num, level, NULL);
Marc Zyngier5863c2c2013-01-21 19:36:15 -0500961 case KVM_ARM_IRQ_TYPE_SPI:
962 if (!irqchip_in_kernel(kvm))
963 return -ENXIO;
964
Andre Przywarafd1d0dd2015-04-10 16:17:59 +0100965 if (irq_num < VGIC_NR_PRIVATE_IRQS)
Marc Zyngier5863c2c2013-01-21 19:36:15 -0500966 return -EINVAL;
967
Christoffer Dallcb3f0ad2017-05-16 12:41:18 +0200968 return kvm_vgic_inject_irq(kvm, 0, irq_num, level, NULL);
Marc Zyngier5863c2c2013-01-21 19:36:15 -0500969 }
970
971 return -EINVAL;
Christoffer Dall86ce8532013-01-20 18:28:08 -0500972}
973
Christoffer Dallf7fa034d2014-10-16 16:40:53 +0200974static int kvm_vcpu_set_target(struct kvm_vcpu *vcpu,
975 const struct kvm_vcpu_init *init)
976{
Andrew Jones811328f2019-04-04 19:42:30 +0200977 unsigned int i, ret;
Christoffer Dallf7fa034d2014-10-16 16:40:53 +0200978 int phys_target = kvm_target_cpu();
979
980 if (init->target != phys_target)
981 return -EINVAL;
982
983 /*
984 * Secondary and subsequent calls to KVM_ARM_VCPU_INIT must
985 * use the same target.
986 */
987 if (vcpu->arch.target != -1 && vcpu->arch.target != init->target)
988 return -EINVAL;
989
990 /* -ENOENT for unknown features, -EINVAL for invalid combinations. */
991 for (i = 0; i < sizeof(init->features) * 8; i++) {
992 bool set = (init->features[i / 32] & (1 << (i % 32)));
993
994 if (set && i >= KVM_VCPU_MAX_FEATURES)
995 return -ENOENT;
996
997 /*
998 * Secondary and subsequent calls to KVM_ARM_VCPU_INIT must
999 * use the same feature set.
1000 */
1001 if (vcpu->arch.target != -1 && i < KVM_VCPU_MAX_FEATURES &&
1002 test_bit(i, vcpu->arch.features) != set)
1003 return -EINVAL;
1004
1005 if (set)
1006 set_bit(i, vcpu->arch.features);
1007 }
1008
1009 vcpu->arch.target = phys_target;
1010
1011 /* Now we know what it is, we can reset it. */
Andrew Jones811328f2019-04-04 19:42:30 +02001012 ret = kvm_reset_vcpu(vcpu);
1013 if (ret) {
1014 vcpu->arch.target = -1;
1015 bitmap_zero(vcpu->arch.features, KVM_VCPU_MAX_FEATURES);
1016 }
Christoffer Dallf7fa034d2014-10-16 16:40:53 +02001017
Andrew Jones811328f2019-04-04 19:42:30 +02001018 return ret;
1019}
Christoffer Dallf7fa034d2014-10-16 16:40:53 +02001020
Christoffer Dall478a8232013-11-19 17:43:19 -08001021static int kvm_arch_vcpu_ioctl_vcpu_init(struct kvm_vcpu *vcpu,
1022 struct kvm_vcpu_init *init)
1023{
1024 int ret;
1025
1026 ret = kvm_vcpu_set_target(vcpu, init);
1027 if (ret)
1028 return ret;
1029
Christoffer Dall957db102014-11-27 10:35:03 +01001030 /*
1031 * Ensure a rebooted VM will fault in RAM pages and detect if the
1032 * guest MMU is turned off and flush the caches as needed.
1033 */
1034 if (vcpu->arch.has_run_once)
1035 stage2_unmap_vm(vcpu->kvm);
1036
Christoffer Dallb856a592014-10-16 17:21:16 +02001037 vcpu_reset_hcr(vcpu);
1038
Christoffer Dall478a8232013-11-19 17:43:19 -08001039 /*
Eric Auger37815282015-09-25 23:41:14 +02001040 * Handle the "start in power-off" case.
Christoffer Dall478a8232013-11-19 17:43:19 -08001041 */
Christoffer Dall03f1d4c2014-12-02 15:27:51 +01001042 if (test_bit(KVM_ARM_VCPU_POWER_OFF, vcpu->arch.features))
Andrew Jones424c9892017-06-04 14:43:57 +02001043 vcpu_power_off(vcpu);
Christoffer Dall3ad8b3d2014-10-16 16:14:43 +02001044 else
Eric Auger37815282015-09-25 23:41:14 +02001045 vcpu->arch.power_off = false;
Christoffer Dall478a8232013-11-19 17:43:19 -08001046
1047 return 0;
1048}
1049
Shannon Zhaof577f6c2016-01-11 20:56:17 +08001050static int kvm_arm_vcpu_set_attr(struct kvm_vcpu *vcpu,
1051 struct kvm_device_attr *attr)
1052{
1053 int ret = -ENXIO;
1054
1055 switch (attr->group) {
1056 default:
Shannon Zhaobb0c70b2016-01-11 21:35:32 +08001057 ret = kvm_arm_vcpu_arch_set_attr(vcpu, attr);
Shannon Zhaof577f6c2016-01-11 20:56:17 +08001058 break;
1059 }
1060
1061 return ret;
1062}
1063
1064static int kvm_arm_vcpu_get_attr(struct kvm_vcpu *vcpu,
1065 struct kvm_device_attr *attr)
1066{
1067 int ret = -ENXIO;
1068
1069 switch (attr->group) {
1070 default:
Shannon Zhaobb0c70b2016-01-11 21:35:32 +08001071 ret = kvm_arm_vcpu_arch_get_attr(vcpu, attr);
Shannon Zhaof577f6c2016-01-11 20:56:17 +08001072 break;
1073 }
1074
1075 return ret;
1076}
1077
1078static int kvm_arm_vcpu_has_attr(struct kvm_vcpu *vcpu,
1079 struct kvm_device_attr *attr)
1080{
1081 int ret = -ENXIO;
1082
1083 switch (attr->group) {
1084 default:
Shannon Zhaobb0c70b2016-01-11 21:35:32 +08001085 ret = kvm_arm_vcpu_arch_has_attr(vcpu, attr);
Shannon Zhaof577f6c2016-01-11 20:56:17 +08001086 break;
1087 }
1088
1089 return ret;
1090}
1091
James Morse539aee02018-07-19 16:24:24 +01001092static int kvm_arm_vcpu_get_events(struct kvm_vcpu *vcpu,
1093 struct kvm_vcpu_events *events)
1094{
1095 memset(events, 0, sizeof(*events));
1096
1097 return __kvm_arm_vcpu_get_events(vcpu, events);
1098}
1099
1100static int kvm_arm_vcpu_set_events(struct kvm_vcpu *vcpu,
1101 struct kvm_vcpu_events *events)
1102{
1103 int i;
1104
1105 /* check whether the reserved field is zero */
1106 for (i = 0; i < ARRAY_SIZE(events->reserved); i++)
1107 if (events->reserved[i])
1108 return -EINVAL;
1109
1110 /* check whether the pad field is zero */
1111 for (i = 0; i < ARRAY_SIZE(events->exception.pad); i++)
1112 if (events->exception.pad[i])
1113 return -EINVAL;
1114
1115 return __kvm_arm_vcpu_set_events(vcpu, events);
1116}
James Morse539aee02018-07-19 16:24:24 +01001117
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001118long kvm_arch_vcpu_ioctl(struct file *filp,
1119 unsigned int ioctl, unsigned long arg)
1120{
1121 struct kvm_vcpu *vcpu = filp->private_data;
1122 void __user *argp = (void __user *)arg;
Shannon Zhaof577f6c2016-01-11 20:56:17 +08001123 struct kvm_device_attr attr;
Christoffer Dall9b0624712017-12-04 21:35:36 +01001124 long r;
1125
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001126 switch (ioctl) {
1127 case KVM_ARM_VCPU_INIT: {
1128 struct kvm_vcpu_init init;
1129
Christoffer Dall9b0624712017-12-04 21:35:36 +01001130 r = -EFAULT;
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001131 if (copy_from_user(&init, argp, sizeof(init)))
Christoffer Dall9b0624712017-12-04 21:35:36 +01001132 break;
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001133
Christoffer Dall9b0624712017-12-04 21:35:36 +01001134 r = kvm_arch_vcpu_ioctl_vcpu_init(vcpu, &init);
1135 break;
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001136 }
1137 case KVM_SET_ONE_REG:
1138 case KVM_GET_ONE_REG: {
1139 struct kvm_one_reg reg;
Andre Przywarae8180dc2013-05-09 00:28:06 +02001140
Christoffer Dall9b0624712017-12-04 21:35:36 +01001141 r = -ENOEXEC;
Andre Przywarae8180dc2013-05-09 00:28:06 +02001142 if (unlikely(!kvm_vcpu_initialized(vcpu)))
Christoffer Dall9b0624712017-12-04 21:35:36 +01001143 break;
Andre Przywarae8180dc2013-05-09 00:28:06 +02001144
Christoffer Dall9b0624712017-12-04 21:35:36 +01001145 r = -EFAULT;
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001146 if (copy_from_user(&reg, argp, sizeof(reg)))
Christoffer Dall9b0624712017-12-04 21:35:36 +01001147 break;
1148
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001149 if (ioctl == KVM_SET_ONE_REG)
Christoffer Dall9b0624712017-12-04 21:35:36 +01001150 r = kvm_arm_set_reg(vcpu, &reg);
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001151 else
Christoffer Dall9b0624712017-12-04 21:35:36 +01001152 r = kvm_arm_get_reg(vcpu, &reg);
1153 break;
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001154 }
1155 case KVM_GET_REG_LIST: {
1156 struct kvm_reg_list __user *user_list = argp;
1157 struct kvm_reg_list reg_list;
1158 unsigned n;
1159
Christoffer Dall9b0624712017-12-04 21:35:36 +01001160 r = -ENOEXEC;
Andre Przywarae8180dc2013-05-09 00:28:06 +02001161 if (unlikely(!kvm_vcpu_initialized(vcpu)))
Christoffer Dall9b0624712017-12-04 21:35:36 +01001162 break;
Andre Przywarae8180dc2013-05-09 00:28:06 +02001163
Dave Martin7dd32a02018-12-19 14:27:01 +00001164 r = -EPERM;
1165 if (!kvm_arm_vcpu_is_finalized(vcpu))
1166 break;
1167
Christoffer Dall9b0624712017-12-04 21:35:36 +01001168 r = -EFAULT;
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001169 if (copy_from_user(&reg_list, user_list, sizeof(reg_list)))
Christoffer Dall9b0624712017-12-04 21:35:36 +01001170 break;
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001171 n = reg_list.n;
1172 reg_list.n = kvm_arm_num_regs(vcpu);
1173 if (copy_to_user(user_list, &reg_list, sizeof(reg_list)))
Christoffer Dall9b0624712017-12-04 21:35:36 +01001174 break;
1175 r = -E2BIG;
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001176 if (n < reg_list.n)
Christoffer Dall9b0624712017-12-04 21:35:36 +01001177 break;
1178 r = kvm_arm_copy_reg_indices(vcpu, user_list->reg);
1179 break;
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001180 }
Shannon Zhaof577f6c2016-01-11 20:56:17 +08001181 case KVM_SET_DEVICE_ATTR: {
Christoffer Dall9b0624712017-12-04 21:35:36 +01001182 r = -EFAULT;
Shannon Zhaof577f6c2016-01-11 20:56:17 +08001183 if (copy_from_user(&attr, argp, sizeof(attr)))
Christoffer Dall9b0624712017-12-04 21:35:36 +01001184 break;
1185 r = kvm_arm_vcpu_set_attr(vcpu, &attr);
1186 break;
Shannon Zhaof577f6c2016-01-11 20:56:17 +08001187 }
1188 case KVM_GET_DEVICE_ATTR: {
Christoffer Dall9b0624712017-12-04 21:35:36 +01001189 r = -EFAULT;
Shannon Zhaof577f6c2016-01-11 20:56:17 +08001190 if (copy_from_user(&attr, argp, sizeof(attr)))
Christoffer Dall9b0624712017-12-04 21:35:36 +01001191 break;
1192 r = kvm_arm_vcpu_get_attr(vcpu, &attr);
1193 break;
Shannon Zhaof577f6c2016-01-11 20:56:17 +08001194 }
1195 case KVM_HAS_DEVICE_ATTR: {
Christoffer Dall9b0624712017-12-04 21:35:36 +01001196 r = -EFAULT;
Shannon Zhaof577f6c2016-01-11 20:56:17 +08001197 if (copy_from_user(&attr, argp, sizeof(attr)))
Christoffer Dall9b0624712017-12-04 21:35:36 +01001198 break;
1199 r = kvm_arm_vcpu_has_attr(vcpu, &attr);
1200 break;
Shannon Zhaof577f6c2016-01-11 20:56:17 +08001201 }
Dongjiu Gengb7b27fa2018-07-19 16:24:22 +01001202 case KVM_GET_VCPU_EVENTS: {
1203 struct kvm_vcpu_events events;
1204
1205 if (kvm_arm_vcpu_get_events(vcpu, &events))
1206 return -EINVAL;
1207
1208 if (copy_to_user(argp, &events, sizeof(events)))
1209 return -EFAULT;
1210
1211 return 0;
1212 }
1213 case KVM_SET_VCPU_EVENTS: {
1214 struct kvm_vcpu_events events;
1215
1216 if (copy_from_user(&events, argp, sizeof(events)))
1217 return -EFAULT;
1218
1219 return kvm_arm_vcpu_set_events(vcpu, &events);
1220 }
Dave Martin7dd32a02018-12-19 14:27:01 +00001221 case KVM_ARM_VCPU_FINALIZE: {
1222 int what;
1223
1224 if (!kvm_vcpu_initialized(vcpu))
1225 return -ENOEXEC;
1226
1227 if (get_user(what, (const int __user *)argp))
1228 return -EFAULT;
1229
1230 return kvm_arm_vcpu_finalize(vcpu, what);
1231 }
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001232 default:
Christoffer Dall9b0624712017-12-04 21:35:36 +01001233 r = -EINVAL;
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001234 }
Christoffer Dall9b0624712017-12-04 21:35:36 +01001235
Christoffer Dall9b0624712017-12-04 21:35:36 +01001236 return r;
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001237}
1238
Mario Smarduch53c810c2015-01-15 15:58:57 -08001239/**
1240 * kvm_vm_ioctl_get_dirty_log - get and clear the log of dirty pages in a slot
1241 * @kvm: kvm instance
1242 * @log: slot id and address to which we copy the log
1243 *
1244 * Steps 1-4 below provide general overview of dirty page logging. See
1245 * kvm_get_dirty_log_protect() function description for additional details.
1246 *
1247 * We call kvm_get_dirty_log_protect() to handle steps 1-3, upon return we
1248 * always flush the TLB (step 4) even if previous step failed and the dirty
1249 * bitmap may be corrupt. Regardless of previous outcome the KVM logging API
1250 * does not preclude user space subsequent dirty log read. Flushing TLB ensures
1251 * writes will be marked dirty for next log read.
1252 *
1253 * 1. Take a snapshot of the bit and clear it if needed.
1254 * 2. Write protect the corresponding page.
1255 * 3. Copy the snapshot to the userspace.
1256 * 4. Flush TLB's if needed.
1257 */
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001258int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, struct kvm_dirty_log *log)
1259{
Paolo Bonzini8fe65a82018-10-23 02:18:42 +02001260 bool flush = false;
Mario Smarduch53c810c2015-01-15 15:58:57 -08001261 int r;
1262
1263 mutex_lock(&kvm->slots_lock);
1264
Paolo Bonzini8fe65a82018-10-23 02:18:42 +02001265 r = kvm_get_dirty_log_protect(kvm, log, &flush);
Mario Smarduch53c810c2015-01-15 15:58:57 -08001266
Paolo Bonzini8fe65a82018-10-23 02:18:42 +02001267 if (flush)
Mario Smarduch53c810c2015-01-15 15:58:57 -08001268 kvm_flush_remote_tlbs(kvm);
1269
1270 mutex_unlock(&kvm->slots_lock);
1271 return r;
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001272}
1273
Paolo Bonzini2a31b9d2018-10-23 02:36:47 +02001274int kvm_vm_ioctl_clear_dirty_log(struct kvm *kvm, struct kvm_clear_dirty_log *log)
1275{
1276 bool flush = false;
1277 int r;
1278
1279 mutex_lock(&kvm->slots_lock);
1280
1281 r = kvm_clear_dirty_log_protect(kvm, log, &flush);
1282
1283 if (flush)
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001284 kvm_flush_remote_tlbs(kvm);
1285
1286 mutex_unlock(&kvm->slots_lock);
1287 return r;
1288}
1289
Christoffer Dall3401d5462013-01-23 13:18:04 -05001290static int kvm_vm_ioctl_set_device_addr(struct kvm *kvm,
1291 struct kvm_arm_device_addr *dev_addr)
1292{
Christoffer Dall330690c2013-01-21 19:36:13 -05001293 unsigned long dev_id, type;
1294
1295 dev_id = (dev_addr->id & KVM_ARM_DEVICE_ID_MASK) >>
1296 KVM_ARM_DEVICE_ID_SHIFT;
1297 type = (dev_addr->id & KVM_ARM_DEVICE_TYPE_MASK) >>
1298 KVM_ARM_DEVICE_TYPE_SHIFT;
1299
1300 switch (dev_id) {
1301 case KVM_ARM_DEVICE_VGIC_V2:
Pavel Fedinc7da6fa2015-12-18 14:38:43 +03001302 if (!vgic_present)
1303 return -ENXIO;
Christoffer Dallce01e4e2013-09-23 14:55:56 -07001304 return kvm_vgic_addr(kvm, type, &dev_addr->addr, true);
Christoffer Dall330690c2013-01-21 19:36:13 -05001305 default:
1306 return -ENODEV;
1307 }
Christoffer Dall3401d5462013-01-23 13:18:04 -05001308}
1309
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001310long kvm_arch_vm_ioctl(struct file *filp,
1311 unsigned int ioctl, unsigned long arg)
1312{
Christoffer Dall3401d5462013-01-23 13:18:04 -05001313 struct kvm *kvm = filp->private_data;
1314 void __user *argp = (void __user *)arg;
1315
1316 switch (ioctl) {
Marc Zyngier5863c2c2013-01-21 19:36:15 -05001317 case KVM_CREATE_IRQCHIP: {
Christoffer Dalla28ebea2016-08-09 19:13:01 +02001318 int ret;
Pavel Fedinc7da6fa2015-12-18 14:38:43 +03001319 if (!vgic_present)
1320 return -ENXIO;
Christoffer Dalla28ebea2016-08-09 19:13:01 +02001321 mutex_lock(&kvm->lock);
1322 ret = kvm_vgic_create(kvm, KVM_DEV_TYPE_ARM_VGIC_V2);
1323 mutex_unlock(&kvm->lock);
1324 return ret;
Marc Zyngier5863c2c2013-01-21 19:36:15 -05001325 }
Christoffer Dall3401d5462013-01-23 13:18:04 -05001326 case KVM_ARM_SET_DEVICE_ADDR: {
1327 struct kvm_arm_device_addr dev_addr;
1328
1329 if (copy_from_user(&dev_addr, argp, sizeof(dev_addr)))
1330 return -EFAULT;
1331 return kvm_vm_ioctl_set_device_addr(kvm, &dev_addr);
1332 }
Anup Patel42c4e0c2013-09-30 14:20:07 +05301333 case KVM_ARM_PREFERRED_TARGET: {
1334 int err;
1335 struct kvm_vcpu_init init;
1336
1337 err = kvm_vcpu_preferred_target(&init);
1338 if (err)
1339 return err;
1340
1341 if (copy_to_user(argp, &init, sizeof(init)))
1342 return -EFAULT;
1343
1344 return 0;
1345 }
Christoffer Dall3401d5462013-01-23 13:18:04 -05001346 default:
1347 return -EINVAL;
1348 }
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001349}
1350
Miaohe Lin7e0befd2019-11-21 15:15:59 +08001351static void cpu_init_hyp_mode(void)
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001352{
Marc Zyngierdac288f2013-05-14 12:11:37 +01001353 phys_addr_t pgd_ptr;
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001354 unsigned long hyp_stack_ptr;
1355 unsigned long stack_page;
1356 unsigned long vector_ptr;
1357
1358 /* Switch from the HYP stub to our own HYP init vector */
Marc Zyngier5a677ce2013-04-12 19:12:06 +01001359 __hyp_set_vectors(kvm_get_idmap_vector());
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001360
Marc Zyngierdac288f2013-05-14 12:11:37 +01001361 pgd_ptr = kvm_mmu_get_httbr();
Christoph Lameter1436c1a2013-10-21 13:17:08 +01001362 stack_page = __this_cpu_read(kvm_arm_hyp_stack_page);
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001363 hyp_stack_ptr = stack_page + PAGE_SIZE;
Marc Zyngier6840bdd2018-01-03 16:38:35 +00001364 vector_ptr = (unsigned long)kvm_get_hyp_vector();
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001365
Marc Zyngier12fda812016-06-30 18:40:45 +01001366 __cpu_init_hyp_mode(pgd_ptr, hyp_stack_ptr, vector_ptr);
Marc Zyngier35a24912016-02-01 17:54:35 +00001367 __cpu_init_stage2();
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001368}
1369
Marc Zyngier47eb3cb2017-04-03 19:38:01 +01001370static void cpu_hyp_reset(void)
1371{
1372 if (!is_kernel_in_hyp_mode())
1373 __hyp_reset_vectors();
1374}
1375
James Morse5f5560b2016-03-30 18:33:04 +01001376static void cpu_hyp_reinit(void)
1377{
Marc Zyngier1e0cf162019-07-05 23:35:56 +01001378 kvm_init_host_cpu_context(&this_cpu_ptr(&kvm_host_data)->host_ctxt);
1379
Marc Zyngier47eb3cb2017-04-03 19:38:01 +01001380 cpu_hyp_reset();
1381
Marc Zyngier9d47bb02018-10-01 13:41:32 +01001382 if (is_kernel_in_hyp_mode())
Hu Huajun02d50cd2017-06-12 22:37:48 +08001383 kvm_timer_init_vhe();
Marc Zyngier9d47bb02018-10-01 13:41:32 +01001384 else
Miaohe Lin7e0befd2019-11-21 15:15:59 +08001385 cpu_init_hyp_mode();
Christoffer Dall5b0d2cc2017-03-18 13:56:56 +01001386
Mark Rutlandda5a3ce2018-10-17 17:42:10 +01001387 kvm_arm_init_debug();
Christoffer Dall5b0d2cc2017-03-18 13:56:56 +01001388
1389 if (vgic_present)
1390 kvm_vgic_init_cpu_hardware();
James Morse5f5560b2016-03-30 18:33:04 +01001391}
1392
AKASHI Takahiro67f69192016-04-27 17:47:05 +01001393static void _kvm_arch_hardware_enable(void *discard)
1394{
1395 if (!__this_cpu_read(kvm_arm_hardware_enabled)) {
1396 cpu_hyp_reinit();
1397 __this_cpu_write(kvm_arm_hardware_enabled, 1);
1398 }
1399}
1400
1401int kvm_arch_hardware_enable(void)
1402{
1403 _kvm_arch_hardware_enable(NULL);
1404 return 0;
1405}
1406
1407static void _kvm_arch_hardware_disable(void *discard)
1408{
1409 if (__this_cpu_read(kvm_arm_hardware_enabled)) {
1410 cpu_hyp_reset();
1411 __this_cpu_write(kvm_arm_hardware_enabled, 0);
1412 }
1413}
1414
1415void kvm_arch_hardware_disable(void)
1416{
1417 _kvm_arch_hardware_disable(NULL);
1418}
Marc Zyngierd157f4a2013-04-12 19:12:07 +01001419
Lorenzo Pieralisi1fcf7ce2013-08-05 15:04:46 +01001420#ifdef CONFIG_CPU_PM
1421static int hyp_init_cpu_pm_notifier(struct notifier_block *self,
1422 unsigned long cmd,
1423 void *v)
1424{
AKASHI Takahiro67f69192016-04-27 17:47:05 +01001425 /*
1426 * kvm_arm_hardware_enabled is left with its old value over
1427 * PM_ENTER->PM_EXIT. It is used to indicate PM_EXIT should
1428 * re-enable hyp.
1429 */
1430 switch (cmd) {
1431 case CPU_PM_ENTER:
1432 if (__this_cpu_read(kvm_arm_hardware_enabled))
1433 /*
1434 * don't update kvm_arm_hardware_enabled here
1435 * so that the hardware will be re-enabled
1436 * when we resume. See below.
1437 */
1438 cpu_hyp_reset();
Lorenzo Pieralisi1fcf7ce2013-08-05 15:04:46 +01001439
AKASHI Takahiro67f69192016-04-27 17:47:05 +01001440 return NOTIFY_OK;
James Morse58d6b152018-01-22 18:19:06 +00001441 case CPU_PM_ENTER_FAILED:
AKASHI Takahiro67f69192016-04-27 17:47:05 +01001442 case CPU_PM_EXIT:
1443 if (__this_cpu_read(kvm_arm_hardware_enabled))
1444 /* The hardware was enabled before suspend. */
1445 cpu_hyp_reinit();
1446
1447 return NOTIFY_OK;
1448
1449 default:
1450 return NOTIFY_DONE;
1451 }
Lorenzo Pieralisi1fcf7ce2013-08-05 15:04:46 +01001452}
1453
1454static struct notifier_block hyp_init_cpu_pm_nb = {
1455 .notifier_call = hyp_init_cpu_pm_notifier,
1456};
1457
1458static void __init hyp_cpu_pm_init(void)
1459{
1460 cpu_pm_register_notifier(&hyp_init_cpu_pm_nb);
1461}
Sudeep Holla06a71a22016-04-04 14:46:51 +01001462static void __init hyp_cpu_pm_exit(void)
1463{
1464 cpu_pm_unregister_notifier(&hyp_init_cpu_pm_nb);
1465}
Lorenzo Pieralisi1fcf7ce2013-08-05 15:04:46 +01001466#else
1467static inline void hyp_cpu_pm_init(void)
1468{
1469}
Sudeep Holla06a71a22016-04-04 14:46:51 +01001470static inline void hyp_cpu_pm_exit(void)
1471{
1472}
Lorenzo Pieralisi1fcf7ce2013-08-05 15:04:46 +01001473#endif
1474
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001475static int init_common_resources(void)
1476{
Suzuki K Poulose0f62f0e2018-09-26 17:32:52 +01001477 kvm_set_ipa_limit();
1478
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001479 return 0;
1480}
1481
1482static int init_subsystems(void)
1483{
AKASHI Takahiro67f69192016-04-27 17:47:05 +01001484 int err = 0;
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001485
1486 /*
AKASHI Takahiro67f69192016-04-27 17:47:05 +01001487 * Enable hardware so that subsystem initialisation can access EL2.
James Morse5f5560b2016-03-30 18:33:04 +01001488 */
AKASHI Takahiro67f69192016-04-27 17:47:05 +01001489 on_each_cpu(_kvm_arch_hardware_enable, NULL, 1);
James Morse5f5560b2016-03-30 18:33:04 +01001490
1491 /*
1492 * Register CPU lower-power notifier
1493 */
1494 hyp_cpu_pm_init();
1495
1496 /*
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001497 * Init HYP view of VGIC
1498 */
1499 err = kvm_vgic_hyp_init();
1500 switch (err) {
1501 case 0:
1502 vgic_present = true;
1503 break;
1504 case -ENODEV:
1505 case -ENXIO:
1506 vgic_present = false;
AKASHI Takahiro67f69192016-04-27 17:47:05 +01001507 err = 0;
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001508 break;
1509 default:
AKASHI Takahiro67f69192016-04-27 17:47:05 +01001510 goto out;
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001511 }
1512
1513 /*
1514 * Init HYP architected timer support
1515 */
Marc Zyngierf384dcf2017-12-07 11:46:15 +00001516 err = kvm_timer_hyp_init(vgic_present);
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001517 if (err)
AKASHI Takahiro67f69192016-04-27 17:47:05 +01001518 goto out;
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001519
1520 kvm_perf_init();
1521 kvm_coproc_table_init();
1522
AKASHI Takahiro67f69192016-04-27 17:47:05 +01001523out:
1524 on_each_cpu(_kvm_arch_hardware_disable, NULL, 1);
1525
1526 return err;
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001527}
1528
1529static void teardown_hyp_mode(void)
1530{
1531 int cpu;
1532
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001533 free_hyp_pgds();
1534 for_each_possible_cpu(cpu)
1535 free_page(per_cpu(kvm_arm_hyp_stack_page, cpu));
Sudeep Holla06a71a22016-04-04 14:46:51 +01001536 hyp_cpu_pm_exit();
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001537}
1538
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001539/**
1540 * Inits Hyp-mode on all online CPUs
1541 */
1542static int init_hyp_mode(void)
1543{
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001544 int cpu;
1545 int err = 0;
1546
1547 /*
1548 * Allocate Hyp PGD and setup Hyp identity mapping
1549 */
1550 err = kvm_mmu_init();
1551 if (err)
1552 goto out_err;
1553
1554 /*
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001555 * Allocate stack pages for Hypervisor-mode
1556 */
1557 for_each_possible_cpu(cpu) {
1558 unsigned long stack_page;
1559
1560 stack_page = __get_free_page(GFP_KERNEL);
1561 if (!stack_page) {
1562 err = -ENOMEM;
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001563 goto out_err;
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001564 }
1565
1566 per_cpu(kvm_arm_hyp_stack_page, cpu) = stack_page;
1567 }
1568
1569 /*
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001570 * Map the Hyp-code called directly from the host
1571 */
Linus Torvalds588ab3f2016-03-17 20:03:47 -07001572 err = create_hyp_mappings(kvm_ksym_ref(__hyp_text_start),
Marc Zyngier59002702016-06-13 15:00:48 +01001573 kvm_ksym_ref(__hyp_text_end), PAGE_HYP_EXEC);
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001574 if (err) {
1575 kvm_err("Cannot map world-switch code\n");
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001576 goto out_err;
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001577 }
1578
Ard Biesheuvela0bf9772016-02-16 13:52:39 +01001579 err = create_hyp_mappings(kvm_ksym_ref(__start_rodata),
Marc Zyngier74a6b882016-06-13 15:00:47 +01001580 kvm_ksym_ref(__end_rodata), PAGE_HYP_RO);
Marc Zyngier910917b2015-10-27 12:18:48 +00001581 if (err) {
1582 kvm_err("Cannot map rodata section\n");
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001583 goto out_err;
Marc Zyngier910917b2015-10-27 12:18:48 +00001584 }
1585
Marc Zyngierc8ea0392016-10-20 10:17:21 +01001586 err = create_hyp_mappings(kvm_ksym_ref(__bss_start),
1587 kvm_ksym_ref(__bss_stop), PAGE_HYP_RO);
1588 if (err) {
1589 kvm_err("Cannot map bss section\n");
1590 goto out_err;
1591 }
1592
Marc Zyngier6840bdd2018-01-03 16:38:35 +00001593 err = kvm_map_vectors();
1594 if (err) {
1595 kvm_err("Cannot map vectors\n");
1596 goto out_err;
1597 }
1598
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001599 /*
1600 * Map the Hyp stack pages
1601 */
1602 for_each_possible_cpu(cpu) {
1603 char *stack_page = (char *)per_cpu(kvm_arm_hyp_stack_page, cpu);
Marc Zyngierc8dddec2016-06-13 15:00:45 +01001604 err = create_hyp_mappings(stack_page, stack_page + PAGE_SIZE,
1605 PAGE_HYP);
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001606
1607 if (err) {
1608 kvm_err("Cannot map hyp stack\n");
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001609 goto out_err;
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001610 }
1611 }
1612
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001613 for_each_possible_cpu(cpu) {
Andrew Murray630a1682019-04-09 20:22:11 +01001614 kvm_host_data_t *cpu_data;
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001615
Andrew Murray630a1682019-04-09 20:22:11 +01001616 cpu_data = per_cpu_ptr(&kvm_host_data, cpu);
Andrew Murray630a1682019-04-09 20:22:11 +01001617 err = create_hyp_mappings(cpu_data, cpu_data + 1, PAGE_HYP);
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001618
1619 if (err) {
Marc Zyngier3de50da2013-04-08 16:47:19 +01001620 kvm_err("Cannot map host CPU state: %d\n", err);
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001621 goto out_err;
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001622 }
1623 }
1624
Marc Zyngier55e37482018-05-29 13:11:16 +01001625 err = hyp_map_aux_data();
1626 if (err)
Colin Ian Kinga37f0c32019-02-17 22:36:26 +00001627 kvm_err("Cannot map host auxiliary data: %d\n", err);
Marc Zyngier55e37482018-05-29 13:11:16 +01001628
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001629 return 0;
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001630
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001631out_err:
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001632 teardown_hyp_mode();
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001633 kvm_err("error initializing Hyp mode: %d\n", err);
1634 return err;
1635}
1636
Andre Przywarad4e071c2013-04-17 12:52:01 +02001637static void check_kvm_target_cpu(void *ret)
1638{
1639 *(int *)ret = kvm_target_cpu();
1640}
1641
Andre Przywara4429fc62014-06-02 15:37:13 +02001642struct kvm_vcpu *kvm_mpidr_to_vcpu(struct kvm *kvm, unsigned long mpidr)
1643{
1644 struct kvm_vcpu *vcpu;
1645 int i;
1646
1647 mpidr &= MPIDR_HWID_BITMASK;
1648 kvm_for_each_vcpu(i, vcpu, kvm) {
1649 if (mpidr == kvm_vcpu_get_mpidr_aff(vcpu))
1650 return vcpu;
1651 }
1652 return NULL;
1653}
1654
Eric Auger24124052017-10-27 15:28:31 +01001655bool kvm_arch_has_irq_bypass(void)
1656{
1657 return true;
1658}
1659
1660int kvm_arch_irq_bypass_add_producer(struct irq_bypass_consumer *cons,
1661 struct irq_bypass_producer *prod)
1662{
1663 struct kvm_kernel_irqfd *irqfd =
1664 container_of(cons, struct kvm_kernel_irqfd, consumer);
1665
Marc Zyngier196b1362017-10-27 15:28:39 +01001666 return kvm_vgic_v4_set_forwarding(irqfd->kvm, prod->irq,
1667 &irqfd->irq_entry);
Eric Auger24124052017-10-27 15:28:31 +01001668}
1669void kvm_arch_irq_bypass_del_producer(struct irq_bypass_consumer *cons,
1670 struct irq_bypass_producer *prod)
1671{
1672 struct kvm_kernel_irqfd *irqfd =
1673 container_of(cons, struct kvm_kernel_irqfd, consumer);
1674
Marc Zyngier196b1362017-10-27 15:28:39 +01001675 kvm_vgic_v4_unset_forwarding(irqfd->kvm, prod->irq,
1676 &irqfd->irq_entry);
Eric Auger24124052017-10-27 15:28:31 +01001677}
1678
1679void kvm_arch_irq_bypass_stop(struct irq_bypass_consumer *cons)
1680{
1681 struct kvm_kernel_irqfd *irqfd =
1682 container_of(cons, struct kvm_kernel_irqfd, consumer);
1683
1684 kvm_arm_halt_guest(irqfd->kvm);
1685}
1686
1687void kvm_arch_irq_bypass_start(struct irq_bypass_consumer *cons)
1688{
1689 struct kvm_kernel_irqfd *irqfd =
1690 container_of(cons, struct kvm_kernel_irqfd, consumer);
1691
1692 kvm_arm_resume_guest(irqfd->kvm);
1693}
1694
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001695/**
1696 * Initialize Hyp-mode and memory mappings on all CPUs.
1697 */
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001698int kvm_arch_init(void *opaque)
1699{
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001700 int err;
Andre Przywarad4e071c2013-04-17 12:52:01 +02001701 int ret, cpu;
Julien Thierryfe7d7b02017-10-20 12:34:16 +01001702 bool in_hyp_mode;
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001703
1704 if (!is_hyp_mode_available()) {
Ard Biesheuvel58d0d192017-11-28 15:18:19 +00001705 kvm_info("HYP mode not available\n");
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001706 return -ENODEV;
1707 }
1708
Marc Zyngier33e5f4e2018-12-06 17:31:20 +00001709 in_hyp_mode = is_kernel_in_hyp_mode();
1710
1711 if (!in_hyp_mode && kvm_arch_requires_vhe()) {
1712 kvm_pr_unimpl("CPU unsupported in non-VHE mode, not initializing\n");
Dave Martin85acda32018-04-20 16:20:43 +01001713 return -ENODEV;
1714 }
1715
Andre Przywarad4e071c2013-04-17 12:52:01 +02001716 for_each_online_cpu(cpu) {
1717 smp_call_function_single(cpu, check_kvm_target_cpu, &ret, 1);
1718 if (ret < 0) {
1719 kvm_err("Error, CPU %d not supported!\n", cpu);
1720 return -ENODEV;
1721 }
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001722 }
1723
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001724 err = init_common_resources();
1725 if (err)
1726 return err;
Srivatsa S. Bhat81468752014-03-18 15:53:05 +05301727
Dave Martina3be8362019-04-12 15:30:58 +01001728 err = kvm_arm_init_sve();
Dave Martin0f062bf2019-02-28 18:33:00 +00001729 if (err)
1730 return err;
1731
Julien Thierryfe7d7b02017-10-20 12:34:16 +01001732 if (!in_hyp_mode) {
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001733 err = init_hyp_mode();
Julien Thierryfe7d7b02017-10-20 12:34:16 +01001734 if (err)
1735 goto out_err;
1736 }
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001737
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001738 err = init_subsystems();
1739 if (err)
1740 goto out_hyp;
Marc Zyngierd157f4a2013-04-12 19:12:07 +01001741
Julien Thierryfe7d7b02017-10-20 12:34:16 +01001742 if (in_hyp_mode)
1743 kvm_info("VHE mode initialized successfully\n");
1744 else
1745 kvm_info("Hyp mode initialized successfully\n");
1746
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001747 return 0;
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001748
1749out_hyp:
Julien Thierryfe7d7b02017-10-20 12:34:16 +01001750 if (!in_hyp_mode)
1751 teardown_hyp_mode();
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001752out_err:
1753 return err;
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001754}
1755
1756/* NOP: Compiling as a module not supported */
1757void kvm_arch_exit(void)
1758{
Marc Zyngier210552c2013-03-05 03:18:00 +00001759 kvm_perf_teardown();
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001760}
1761
1762static int arm_init(void)
1763{
1764 int rc = kvm_init(NULL, sizeof(struct kvm_vcpu), 0, THIS_MODULE);
1765 return rc;
1766}
1767
1768module_init(arm_init);