blob: 12e0280291cee9c0670f0d5c222ff6f24e4c0060 [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]) {
197 kvm_arch_vcpu_free(kvm->vcpus[i]);
198 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
282struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, unsigned int id)
283{
284 int err;
285 struct kvm_vcpu *vcpu;
286
Christoffer Dall716139d2014-12-09 14:33:45 +0100287 if (irqchip_in_kernel(kvm) && vgic_initialized(kvm)) {
288 err = -EBUSY;
289 goto out;
290 }
291
Andre Przywara3caa2d82014-06-02 16:26:01 +0200292 if (id >= kvm->arch.max_vcpus) {
293 err = -EINVAL;
294 goto out;
295 }
296
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500297 vcpu = kmem_cache_zalloc(kvm_vcpu_cache, GFP_KERNEL);
298 if (!vcpu) {
299 err = -ENOMEM;
300 goto out;
301 }
302
303 err = kvm_vcpu_init(vcpu, kvm, id);
304 if (err)
305 goto free_vcpu;
306
Marc Zyngierc8dddec2016-06-13 15:00:45 +0100307 err = create_hyp_mappings(vcpu, vcpu + 1, PAGE_HYP);
Christoffer Dalld5d81842013-01-20 18:28:07 -0500308 if (err)
309 goto vcpu_uninit;
310
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500311 return vcpu;
Christoffer Dalld5d81842013-01-20 18:28:07 -0500312vcpu_uninit:
313 kvm_vcpu_uninit(vcpu);
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500314free_vcpu:
315 kmem_cache_free(kvm_vcpu_cache, vcpu);
316out:
317 return ERR_PTR(err);
318}
319
Dominik Dingel31928aa2014-12-04 15:47:07 +0100320void kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu)
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500321{
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500322}
323
324void kvm_arch_vcpu_free(struct kvm_vcpu *vcpu)
325{
Christoffer Dallf1d72312018-01-25 18:32:29 +0100326 if (vcpu->arch.has_run_once && unlikely(!irqchip_in_kernel(vcpu->kvm)))
327 static_branch_dec(&userspace_irqchip_in_use);
328
Christoffer Dalld5d81842013-01-20 18:28:07 -0500329 kvm_mmu_free_memory_caches(vcpu);
Marc Zyngier967f8422013-01-23 13:21:59 -0500330 kvm_timer_vcpu_terminate(vcpu);
Shannon Zhao5f0a7142015-09-11 15:18:05 +0800331 kvm_pmu_vcpu_destroy(vcpu);
James Morse591d2152016-06-08 17:24:45 +0100332 kvm_vcpu_uninit(vcpu);
Christoffer Dalld5d81842013-01-20 18:28:07 -0500333 kmem_cache_free(kvm_vcpu_cache, vcpu);
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500334}
335
336void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
337{
338 kvm_arch_vcpu_free(vcpu);
339}
340
341int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu)
342{
Christoffer Dall1c88ab72017-01-06 16:07:48 +0100343 return kvm_timer_is_pending(vcpu);
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500344}
345
Christoffer Dalld35268d2015-08-25 19:48:21 +0200346void kvm_arch_vcpu_blocking(struct kvm_vcpu *vcpu)
347{
Marc Zyngier5eeaf102019-08-02 10:28:32 +0100348 /*
349 * If we're about to block (most likely because we've just hit a
350 * WFI), we need to sync back the state of the GIC CPU interface
Marc Zyngier8e01d9a2019-10-27 14:41:59 +0000351 * so that we have the latest PMR and group enables. This ensures
Marc Zyngier5eeaf102019-08-02 10:28:32 +0100352 * that kvm_arch_vcpu_runnable has up-to-date data to decide
353 * whether we have pending interrupts.
Marc Zyngier8e01d9a2019-10-27 14:41:59 +0000354 *
355 * For the same reason, we want to tell GICv4 that we need
356 * doorbells to be signalled, should an interrupt become pending.
Marc Zyngier5eeaf102019-08-02 10:28:32 +0100357 */
358 preempt_disable();
359 kvm_vgic_vmcr_sync(vcpu);
Marc Zyngier8e01d9a2019-10-27 14:41:59 +0000360 vgic_v4_put(vcpu, true);
Marc Zyngier5eeaf102019-08-02 10:28:32 +0100361 preempt_enable();
Christoffer Dalld35268d2015-08-25 19:48:21 +0200362}
363
364void kvm_arch_vcpu_unblocking(struct kvm_vcpu *vcpu)
365{
Marc Zyngier8e01d9a2019-10-27 14:41:59 +0000366 preempt_disable();
367 vgic_v4_load(vcpu);
368 preempt_enable();
Christoffer Dalld35268d2015-08-25 19:48:21 +0200369}
370
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500371int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu)
372{
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500373 /* Force users to call KVM_ARM_VCPU_INIT */
374 vcpu->arch.target = -1;
Christoffer Dallf7fa034d2014-10-16 16:40:53 +0200375 bitmap_zero(vcpu->arch.features, KVM_VCPU_MAX_FEATURES);
Marc Zyngier1a89dd92013-01-21 19:36:12 -0500376
Marc Zyngier967f8422013-01-23 13:21:59 -0500377 /* Set up the timer */
378 kvm_timer_vcpu_init(vcpu);
379
Zenghui Yubca031e2019-07-18 08:15:10 +0000380 kvm_pmu_vcpu_init(vcpu);
381
Alex Bennée84e690b2015-07-07 17:30:00 +0100382 kvm_arm_reset_debug_ptr(vcpu);
383
Steven Price8564d632019-10-21 16:28:18 +0100384 kvm_arm_pvtime_vcpu_init(&vcpu->arch);
385
Christoffer Dall1aab6f42017-05-08 12:30:24 +0200386 return kvm_vgic_vcpu_init(vcpu);
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500387}
388
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500389void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
390{
Marc Zyngier94d0e592016-10-18 18:37:49 +0100391 int *last_ran;
Andrew Murray630a1682019-04-09 20:22:11 +0100392 kvm_host_data_t *cpu_data;
Marc Zyngier94d0e592016-10-18 18:37:49 +0100393
394 last_ran = this_cpu_ptr(vcpu->kvm->arch.last_vcpu_ran);
Andrew Murray630a1682019-04-09 20:22:11 +0100395 cpu_data = this_cpu_ptr(&kvm_host_data);
Marc Zyngier94d0e592016-10-18 18:37:49 +0100396
397 /*
398 * We might get preempted before the vCPU actually runs, but
399 * over-invalidation doesn't affect correctness.
400 */
401 if (*last_ran != vcpu->vcpu_id) {
402 kvm_call_hyp(__kvm_tlb_flush_local_vmid, vcpu);
403 *last_ran = vcpu->vcpu_id;
404 }
405
Christoffer Dall86ce8532013-01-20 18:28:08 -0500406 vcpu->cpu = cpu;
Andrew Murray630a1682019-04-09 20:22:11 +0100407 vcpu->arch.host_cpu_context = &cpu_data->host_ctxt;
Christoffer Dall5b3e5e52013-01-20 18:28:09 -0500408
Marc Zyngier1638a122013-01-21 19:36:11 -0500409 kvm_arm_set_running_vcpu(vcpu);
Christoffer Dall328e5662016-03-24 11:21:04 +0100410 kvm_vgic_load(vcpu);
Christoffer Dallb103cc32016-10-16 20:30:38 +0200411 kvm_timer_vcpu_load(vcpu);
Christoffer Dallbc192ce2017-10-10 10:21:18 +0200412 kvm_vcpu_load_sysregs(vcpu);
Dave Martine6b673b2018-04-06 14:55:59 +0100413 kvm_arch_vcpu_load_fp(vcpu);
Andrew Murray435e53f2019-04-09 20:22:15 +0100414 kvm_vcpu_pmu_restore_guest(vcpu);
Steven Price8564d632019-10-21 16:28:18 +0100415 if (kvm_arm_is_pvtime_enabled(&vcpu->arch))
416 kvm_make_request(KVM_REQ_RECORD_STEAL, vcpu);
Marc Zyngierde737082018-06-21 10:43:59 +0100417
418 if (single_task_running())
Marc Zyngieref2e78d2019-11-07 16:04:12 +0000419 vcpu_clear_wfx_traps(vcpu);
Marc Zyngierde737082018-06-21 10:43:59 +0100420 else
Marc Zyngieref2e78d2019-11-07 16:04:12 +0000421 vcpu_set_wfx_traps(vcpu);
Mark Rutland384b40c2019-04-23 10:12:35 +0530422
423 vcpu_ptrauth_setup_lazy(vcpu);
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500424}
425
426void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
427{
Dave Martine6b673b2018-04-06 14:55:59 +0100428 kvm_arch_vcpu_put_fp(vcpu);
Christoffer Dallbc192ce2017-10-10 10:21:18 +0200429 kvm_vcpu_put_sysregs(vcpu);
Christoffer Dallb103cc32016-10-16 20:30:38 +0200430 kvm_timer_vcpu_put(vcpu);
Christoffer Dall328e5662016-03-24 11:21:04 +0100431 kvm_vgic_put(vcpu);
Andrew Murray435e53f2019-04-09 20:22:15 +0100432 kvm_vcpu_pmu_restore_host(vcpu);
Christoffer Dall328e5662016-03-24 11:21:04 +0100433
Christoffer Dalle9b152c2013-12-11 20:29:11 -0800434 vcpu->cpu = -1;
435
Marc Zyngier1638a122013-01-21 19:36:11 -0500436 kvm_arm_set_running_vcpu(NULL);
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500437}
438
Andrew Jones424c9892017-06-04 14:43:57 +0200439static void vcpu_power_off(struct kvm_vcpu *vcpu)
440{
441 vcpu->arch.power_off = true;
Andrew Jones7b244e22017-06-04 14:43:58 +0200442 kvm_make_request(KVM_REQ_SLEEP, vcpu);
Andrew Jones424c9892017-06-04 14:43:57 +0200443 kvm_vcpu_kick(vcpu);
444}
445
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500446int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu,
447 struct kvm_mp_state *mp_state)
448{
Eric Auger37815282015-09-25 23:41:14 +0200449 if (vcpu->arch.power_off)
Alex Bennéeecccf0c2015-03-13 17:02:52 +0000450 mp_state->mp_state = KVM_MP_STATE_STOPPED;
451 else
452 mp_state->mp_state = KVM_MP_STATE_RUNNABLE;
453
454 return 0;
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500455}
456
457int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,
458 struct kvm_mp_state *mp_state)
459{
Christoffer Dalle83dff52017-12-04 21:35:31 +0100460 int ret = 0;
461
Alex Bennéeecccf0c2015-03-13 17:02:52 +0000462 switch (mp_state->mp_state) {
463 case KVM_MP_STATE_RUNNABLE:
Eric Auger37815282015-09-25 23:41:14 +0200464 vcpu->arch.power_off = false;
Alex Bennéeecccf0c2015-03-13 17:02:52 +0000465 break;
466 case KVM_MP_STATE_STOPPED:
Andrew Jones424c9892017-06-04 14:43:57 +0200467 vcpu_power_off(vcpu);
Alex Bennéeecccf0c2015-03-13 17:02:52 +0000468 break;
469 default:
Christoffer Dalle83dff52017-12-04 21:35:31 +0100470 ret = -EINVAL;
Alex Bennéeecccf0c2015-03-13 17:02:52 +0000471 }
472
Christoffer Dalle83dff52017-12-04 21:35:31 +0100473 return ret;
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500474}
475
Christoffer Dall5b3e5e52013-01-20 18:28:09 -0500476/**
477 * kvm_arch_vcpu_runnable - determine if the vcpu can be scheduled
478 * @v: The VCPU pointer
479 *
480 * If the guest CPU is not waiting for interrupts or an interrupt line is
481 * asserted, the CPU is by definition runnable.
482 */
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500483int kvm_arch_vcpu_runnable(struct kvm_vcpu *v)
484{
Christoffer Dall3df59d82017-08-03 12:09:05 +0200485 bool irq_lines = *vcpu_hcr(v) & (HCR_VI | HCR_VF);
486 return ((irq_lines || kvm_vgic_vcpu_pending_irq(v))
Eric Auger3b928302015-09-25 23:41:17 +0200487 && !v->arch.power_off && !v->arch.pause);
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500488}
489
Longpeng(Mike)199b5762017-08-08 12:05:32 +0800490bool kvm_arch_vcpu_in_kernel(struct kvm_vcpu *vcpu)
491{
Longpeng(Mike)f01fbd22017-08-08 12:05:35 +0800492 return vcpu_mode_priv(vcpu);
Longpeng(Mike)199b5762017-08-08 12:05:32 +0800493}
494
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500495/* Just ensure a guest exit from a particular CPU */
496static void exit_vm_noop(void *info)
497{
498}
499
500void force_vm_exit(const cpumask_t *mask)
501{
Eric Auger898f9492016-03-07 23:50:36 +0700502 preempt_disable();
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500503 smp_call_function_many(mask, exit_vm_noop, NULL, true);
Eric Auger898f9492016-03-07 23:50:36 +0700504 preempt_enable();
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500505}
506
507/**
508 * need_new_vmid_gen - check that the VMID is still valid
Christoffer Dalle329fb72018-12-11 15:26:31 +0100509 * @vmid: The VMID to check
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500510 *
511 * return true if there is a new generation of VMIDs being used
512 *
Christoffer Dalle329fb72018-12-11 15:26:31 +0100513 * The hardware supports a limited set of values with the value zero reserved
514 * for the host, so we check if an assigned value belongs to a previous
515 * generation, which which requires us to assign a new value. If we're the
516 * first to use a VMID for the new generation, we must flush necessary caches
517 * and TLBs on all CPUs.
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500518 */
Christoffer Dalle329fb72018-12-11 15:26:31 +0100519static bool need_new_vmid_gen(struct kvm_vmid *vmid)
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500520{
Christoffer Dallfb544d12018-12-11 13:23:57 +0100521 u64 current_vmid_gen = atomic64_read(&kvm_vmid_gen);
522 smp_rmb(); /* Orders read of kvm_vmid_gen and kvm->arch.vmid */
Christoffer Dalle329fb72018-12-11 15:26:31 +0100523 return unlikely(READ_ONCE(vmid->vmid_gen) != current_vmid_gen);
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500524}
525
526/**
Christoffer Dalle329fb72018-12-11 15:26:31 +0100527 * update_vmid - Update the vmid with a valid VMID for the current generation
528 * @kvm: The guest that struct vmid belongs to
529 * @vmid: The stage-2 VMID information struct
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500530 */
Christoffer Dalle329fb72018-12-11 15:26:31 +0100531static void update_vmid(struct kvm_vmid *vmid)
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500532{
Christoffer Dalle329fb72018-12-11 15:26:31 +0100533 if (!need_new_vmid_gen(vmid))
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500534 return;
535
Christoffer Dallfb544d12018-12-11 13:23:57 +0100536 spin_lock(&kvm_vmid_lock);
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500537
538 /*
539 * We need to re-check the vmid_gen here to ensure that if another vcpu
540 * already allocated a valid vmid for this vm, then this vcpu should
541 * use the same vmid.
542 */
Christoffer Dalle329fb72018-12-11 15:26:31 +0100543 if (!need_new_vmid_gen(vmid)) {
Christoffer Dallfb544d12018-12-11 13:23:57 +0100544 spin_unlock(&kvm_vmid_lock);
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500545 return;
546 }
547
548 /* First user of a new VMID generation? */
549 if (unlikely(kvm_next_vmid == 0)) {
550 atomic64_inc(&kvm_vmid_gen);
551 kvm_next_vmid = 1;
552
553 /*
554 * On SMP we know no other CPUs can use this CPU's or each
555 * other's VMID after force_vm_exit returns since the
556 * kvm_vmid_lock blocks them from reentry to the guest.
557 */
558 force_vm_exit(cpu_all_mask);
559 /*
560 * Now broadcast TLB + ICACHE invalidation over the inner
561 * shareable domain to make sure all data structures are
562 * clean.
563 */
564 kvm_call_hyp(__kvm_flush_vm_context);
565 }
566
Christoffer Dalle329fb72018-12-11 15:26:31 +0100567 vmid->vmid = kvm_next_vmid;
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500568 kvm_next_vmid++;
Christoffer Dalle329fb72018-12-11 15:26:31 +0100569 kvm_next_vmid &= (1 << kvm_get_vmid_bits()) - 1;
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500570
Christoffer Dallfb544d12018-12-11 13:23:57 +0100571 smp_wmb();
Christoffer Dalle329fb72018-12-11 15:26:31 +0100572 WRITE_ONCE(vmid->vmid_gen, atomic64_read(&kvm_vmid_gen));
Christoffer Dallfb544d12018-12-11 13:23:57 +0100573
574 spin_unlock(&kvm_vmid_lock);
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500575}
576
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500577static int kvm_vcpu_first_run_init(struct kvm_vcpu *vcpu)
578{
Christoffer Dall05971122014-12-12 21:19:23 +0100579 struct kvm *kvm = vcpu->kvm;
Christoffer Dall41a54482016-05-18 16:26:00 +0100580 int ret = 0;
Christoffer Dalle1ba0202013-09-23 14:55:55 -0700581
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500582 if (likely(vcpu->arch.has_run_once))
583 return 0;
584
Dave Martin7dd32a02018-12-19 14:27:01 +0000585 if (!kvm_arm_vcpu_is_finalized(vcpu))
586 return -EPERM;
587
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500588 vcpu->arch.has_run_once = true;
Marc Zyngieraa024c22013-01-20 18:28:13 -0500589
Christoffer Dall61bbe382017-10-27 19:57:51 +0200590 if (likely(irqchip_in_kernel(kvm))) {
591 /*
592 * Map the VGIC hardware resources before running a vcpu the
593 * first time on this VM.
594 */
595 if (unlikely(!vgic_ready(kvm))) {
596 ret = kvm_vgic_map_resources(kvm);
597 if (ret)
598 return ret;
599 }
600 } else {
601 /*
602 * Tell the rest of the code that there are userspace irqchip
603 * VMs in the wild.
604 */
605 static_branch_inc(&userspace_irqchip_in_use);
Marc Zyngier01ac5e32013-01-21 19:36:16 -0500606 }
607
Alexander Grafd9e13972016-09-27 21:08:06 +0200608 ret = kvm_timer_enable(vcpu);
Christoffer Dalla2befac2017-05-02 13:41:02 +0200609 if (ret)
610 return ret;
611
612 ret = kvm_arm_pmu_v3_enable(vcpu);
Christoffer Dall05971122014-12-12 21:19:23 +0100613
Christoffer Dall41a54482016-05-18 16:26:00 +0100614 return ret;
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500615}
616
Eric Augerc1426e42015-03-04 11:14:34 +0100617bool kvm_arch_intc_initialized(struct kvm *kvm)
618{
619 return vgic_initialized(kvm);
620}
621
Christoffer Dallb13216c2016-04-27 10:28:00 +0100622void kvm_arm_halt_guest(struct kvm *kvm)
Eric Auger3b928302015-09-25 23:41:17 +0200623{
624 int i;
625 struct kvm_vcpu *vcpu;
626
627 kvm_for_each_vcpu(i, vcpu, kvm)
628 vcpu->arch.pause = true;
Andrew Jones7b244e22017-06-04 14:43:58 +0200629 kvm_make_all_cpus_request(kvm, KVM_REQ_SLEEP);
Eric Auger3b928302015-09-25 23:41:17 +0200630}
631
Christoffer Dallb13216c2016-04-27 10:28:00 +0100632void kvm_arm_resume_guest(struct kvm *kvm)
Eric Auger3b928302015-09-25 23:41:17 +0200633{
634 int i;
635 struct kvm_vcpu *vcpu;
636
Christoffer Dallabd72292017-05-06 20:01:24 +0200637 kvm_for_each_vcpu(i, vcpu, kvm) {
638 vcpu->arch.pause = false;
Peter Zijlstrab3dae102018-06-12 10:34:52 +0200639 swake_up_one(kvm_arch_vcpu_wq(vcpu));
Christoffer Dallabd72292017-05-06 20:01:24 +0200640 }
Eric Auger3b928302015-09-25 23:41:17 +0200641}
642
Andrew Jones7b244e22017-06-04 14:43:58 +0200643static void vcpu_req_sleep(struct kvm_vcpu *vcpu)
Marc Zyngieraa024c22013-01-20 18:28:13 -0500644{
Marcelo Tosatti85773702016-02-19 09:46:39 +0100645 struct swait_queue_head *wq = kvm_arch_vcpu_wq(vcpu);
Marc Zyngieraa024c22013-01-20 18:28:13 -0500646
Peter Zijlstrab3dae102018-06-12 10:34:52 +0200647 swait_event_interruptible_exclusive(*wq, ((!vcpu->arch.power_off) &&
Eric Auger3b928302015-09-25 23:41:17 +0200648 (!vcpu->arch.pause)));
Andrew Jones0592c002017-06-04 14:43:55 +0200649
Andrew Jones424c9892017-06-04 14:43:57 +0200650 if (vcpu->arch.power_off || vcpu->arch.pause) {
Andrew Jones0592c002017-06-04 14:43:55 +0200651 /* Awaken to handle a signal, request we sleep again later. */
Andrew Jones7b244e22017-06-04 14:43:58 +0200652 kvm_make_request(KVM_REQ_SLEEP, vcpu);
Andrew Jones0592c002017-06-04 14:43:55 +0200653 }
Marc Zyngier358b28f2018-12-20 11:36:07 +0000654
655 /*
656 * Make sure we will observe a potential reset request if we've
657 * observed a change to the power state. Pairs with the smp_wmb() in
658 * kvm_psci_vcpu_on().
659 */
660 smp_rmb();
Marc Zyngieraa024c22013-01-20 18:28:13 -0500661}
662
Andre Przywarae8180dc2013-05-09 00:28:06 +0200663static int kvm_vcpu_initialized(struct kvm_vcpu *vcpu)
664{
665 return vcpu->arch.target >= 0;
666}
667
Andrew Jones0592c002017-06-04 14:43:55 +0200668static void check_vcpu_requests(struct kvm_vcpu *vcpu)
669{
670 if (kvm_request_pending(vcpu)) {
Andrew Jones7b244e22017-06-04 14:43:58 +0200671 if (kvm_check_request(KVM_REQ_SLEEP, vcpu))
672 vcpu_req_sleep(vcpu);
Andrew Jones325f9c62017-06-04 14:43:59 +0200673
Marc Zyngier358b28f2018-12-20 11:36:07 +0000674 if (kvm_check_request(KVM_REQ_VCPU_RESET, vcpu))
675 kvm_reset_vcpu(vcpu);
676
Andrew Jones325f9c62017-06-04 14:43:59 +0200677 /*
678 * Clear IRQ_PENDING requests that were made to guarantee
679 * that a VCPU sees new virtual interrupts.
680 */
681 kvm_check_request(KVM_REQ_IRQ_PENDING, vcpu);
Steven Price8564d632019-10-21 16:28:18 +0100682
683 if (kvm_check_request(KVM_REQ_RECORD_STEAL, vcpu))
684 kvm_update_stolen_time(vcpu);
Andrew Jones0592c002017-06-04 14:43:55 +0200685 }
686}
687
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500688/**
689 * kvm_arch_vcpu_ioctl_run - the main VCPU run function to execute guest code
690 * @vcpu: The VCPU pointer
691 * @run: The kvm_run structure pointer used for userspace state exchange
692 *
693 * This function is called through the VCPU_RUN ioctl called from user space. It
694 * will execute VM code in a loop until the time slice for the process is used
695 * or some emulation is needed from user space in which case the function will
696 * return with return value 0 and with the kvm_run structure filled in with the
697 * required data for the requested emulation.
698 */
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500699int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
700{
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500701 int ret;
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500702
Andre Przywarae8180dc2013-05-09 00:28:06 +0200703 if (unlikely(!kvm_vcpu_initialized(vcpu)))
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500704 return -ENOEXEC;
705
706 ret = kvm_vcpu_first_run_init(vcpu);
707 if (ret)
Christoffer Dall829a5862017-11-29 16:37:53 +0100708 return ret;
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500709
Christoffer Dall45e96ea2013-01-20 18:43:58 -0500710 if (run->exit_reason == KVM_EXIT_MMIO) {
711 ret = kvm_handle_mmio_return(vcpu, vcpu->run);
712 if (ret)
Christoffer Dall829a5862017-11-29 16:37:53 +0100713 return ret;
Christoffer Dall45e96ea2013-01-20 18:43:58 -0500714 }
715
Christoffer Dall829a5862017-11-29 16:37:53 +0100716 if (run->immediate_exit)
717 return -EINTR;
718
719 vcpu_load(vcpu);
Paolo Bonzini460df4c2017-02-08 11:50:15 +0100720
Jan H. Schönherr20b70352017-11-24 22:39:01 +0100721 kvm_sigset_activate(vcpu);
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500722
723 ret = 1;
724 run->exit_reason = KVM_EXIT_UNKNOWN;
725 while (ret > 0) {
726 /*
727 * Check conditions before entering the guest
728 */
729 cond_resched();
730
Christoffer Dalle329fb72018-12-11 15:26:31 +0100731 update_vmid(&vcpu->kvm->arch.vmid);
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500732
Andrew Jones0592c002017-06-04 14:43:55 +0200733 check_vcpu_requests(vcpu);
734
Marc Zyngierabdf5842015-06-08 15:00:28 +0100735 /*
Marc Zyngierabdf5842015-06-08 15:00:28 +0100736 * Preparing the interrupts to be injected also
737 * involves poking the GIC, which must be done in a
738 * non-preemptible context.
739 */
740 preempt_disable();
Christoffer Dall328e5662016-03-24 11:21:04 +0100741
Shannon Zhaob02386e2016-02-26 19:29:19 +0800742 kvm_pmu_flush_hwstate(vcpu);
Christoffer Dall328e5662016-03-24 11:21:04 +0100743
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500744 local_irq_disable();
745
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500746 kvm_vgic_flush_hwstate(vcpu);
Christoffer Dall5b3e5e52013-01-20 18:28:09 -0500747
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500748 /*
Christoffer Dall61bbe382017-10-27 19:57:51 +0200749 * Exit if we have a signal pending so that we can deliver the
750 * signal to user space.
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500751 */
Christoffer Dall61bbe382017-10-27 19:57:51 +0200752 if (signal_pending(current)) {
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500753 ret = -EINTR;
754 run->exit_reason = KVM_EXIT_INTR;
755 }
756
Andrew Jones6a6d73b2017-06-04 14:43:54 +0200757 /*
Christoffer Dall61bbe382017-10-27 19:57:51 +0200758 * If we're using a userspace irqchip, then check if we need
759 * to tell a userspace irqchip about timer or PMU level
760 * changes and if so, exit to userspace (the actual level
761 * state gets updated in kvm_timer_update_run and
762 * kvm_pmu_update_run below).
763 */
764 if (static_branch_unlikely(&userspace_irqchip_in_use)) {
765 if (kvm_timer_should_notify_user(vcpu) ||
766 kvm_pmu_should_notify_user(vcpu)) {
767 ret = -EINTR;
768 run->exit_reason = KVM_EXIT_INTR;
769 }
770 }
771
772 /*
Andrew Jones6a6d73b2017-06-04 14:43:54 +0200773 * Ensure we set mode to IN_GUEST_MODE after we disable
774 * interrupts and before the final VCPU requests check.
775 * See the comment in kvm_vcpu_exiting_guest_mode() and
Christoph Hellwig2f5947d2019-07-24 09:24:49 +0200776 * Documentation/virt/kvm/vcpu-requests.rst
Andrew Jones6a6d73b2017-06-04 14:43:54 +0200777 */
778 smp_store_mb(vcpu->mode, IN_GUEST_MODE);
779
Christoffer Dalle329fb72018-12-11 15:26:31 +0100780 if (ret <= 0 || need_new_vmid_gen(&vcpu->kvm->arch.vmid) ||
Andrew Jones424c9892017-06-04 14:43:57 +0200781 kvm_request_pending(vcpu)) {
Andrew Jones6a6d73b2017-06-04 14:43:54 +0200782 vcpu->mode = OUTSIDE_GUEST_MODE;
Christoffer Dall771621b2017-10-04 23:42:32 +0200783 isb(); /* Ensure work in x_flush_hwstate is committed */
Shannon Zhaob02386e2016-02-26 19:29:19 +0800784 kvm_pmu_sync_hwstate(vcpu);
Christoffer Dall61bbe382017-10-27 19:57:51 +0200785 if (static_branch_unlikely(&userspace_irqchip_in_use))
786 kvm_timer_sync_hwstate(vcpu);
Marc Zyngier1a89dd92013-01-21 19:36:12 -0500787 kvm_vgic_sync_hwstate(vcpu);
Christoffer Dallee9bb9a2016-10-16 20:24:30 +0200788 local_irq_enable();
Marc Zyngierabdf5842015-06-08 15:00:28 +0100789 preempt_enable();
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500790 continue;
791 }
792
Alex Bennée56c7f5e2015-07-07 17:29:56 +0100793 kvm_arm_setup_debug(vcpu);
794
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500795 /**************************************************************
796 * Enter the guest
797 */
798 trace_kvm_entry(*vcpu_pc(vcpu));
Paolo Bonzini6edaa532016-06-15 15:18:26 +0200799 guest_enter_irqoff();
Christoffer Dall3f5c90b2017-10-03 14:02:12 +0200800
801 if (has_vhe()) {
James Morse4f5abad2018-01-15 19:39:00 +0000802 kvm_arm_vhe_guest_enter();
Christoffer Dall3f5c90b2017-10-03 14:02:12 +0200803 ret = kvm_vcpu_run_vhe(vcpu);
James Morse4f5abad2018-01-15 19:39:00 +0000804 kvm_arm_vhe_guest_exit();
Christoffer Dall3f5c90b2017-10-03 14:02:12 +0200805 } else {
Marc Zyngier7aa8d142019-01-05 15:49:50 +0000806 ret = kvm_call_hyp_ret(__kvm_vcpu_run_nvhe, vcpu);
Christoffer Dall3f5c90b2017-10-03 14:02:12 +0200807 }
808
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500809 vcpu->mode = OUTSIDE_GUEST_MODE;
Amit Tomarb19e6892015-11-26 10:09:43 +0000810 vcpu->stat.exits++;
Christoffer Dall1b3d5462015-05-28 19:49:10 +0100811 /*
812 * Back from guest
813 *************************************************************/
814
Alex Bennée56c7f5e2015-07-07 17:29:56 +0100815 kvm_arm_clear_debug(vcpu);
816
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500817 /*
Christoffer Dallb103cc32016-10-16 20:30:38 +0200818 * We must sync the PMU state before the vgic state so
Christoffer Dallee9bb9a2016-10-16 20:24:30 +0200819 * that the vgic can properly sample the updated state of the
820 * interrupt line.
821 */
822 kvm_pmu_sync_hwstate(vcpu);
Christoffer Dallee9bb9a2016-10-16 20:24:30 +0200823
Christoffer Dallb103cc32016-10-16 20:30:38 +0200824 /*
825 * Sync the vgic state before syncing the timer state because
826 * the timer code needs to know if the virtual timer
827 * interrupts are active.
828 */
Christoffer Dallee9bb9a2016-10-16 20:24:30 +0200829 kvm_vgic_sync_hwstate(vcpu);
830
831 /*
Christoffer Dallb103cc32016-10-16 20:30:38 +0200832 * Sync the timer hardware state before enabling interrupts as
833 * we don't want vtimer interrupts to race with syncing the
834 * timer virtual interrupt state.
835 */
Christoffer Dall61bbe382017-10-27 19:57:51 +0200836 if (static_branch_unlikely(&userspace_irqchip_in_use))
837 kvm_timer_sync_hwstate(vcpu);
Christoffer Dallb103cc32016-10-16 20:30:38 +0200838
Dave Martine6b673b2018-04-06 14:55:59 +0100839 kvm_arch_vcpu_ctxsync_fp(vcpu);
840
Christoffer Dallb103cc32016-10-16 20:30:38 +0200841 /*
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500842 * We may have taken a host interrupt in HYP mode (ie
843 * while executing the guest). This interrupt is still
844 * pending, as we haven't serviced it yet!
845 *
846 * We're now back in SVC mode, with interrupts
847 * disabled. Enabling the interrupts now will have
848 * the effect of taking the interrupt again, in SVC
849 * mode this time.
850 */
851 local_irq_enable();
852
853 /*
Paolo Bonzini6edaa532016-06-15 15:18:26 +0200854 * We do local_irq_enable() before calling guest_exit() so
Christoffer Dall1b3d5462015-05-28 19:49:10 +0100855 * that if a timer interrupt hits while running the guest we
856 * account that tick as being spent in the guest. We enable
Paolo Bonzini6edaa532016-06-15 15:18:26 +0200857 * preemption after calling guest_exit() so that if we get
Christoffer Dall1b3d5462015-05-28 19:49:10 +0100858 * preempted we make sure ticks after that is not counted as
859 * guest time.
860 */
Paolo Bonzini6edaa532016-06-15 15:18:26 +0200861 guest_exit();
Christoffer Dallb5905dc2015-08-30 15:55:22 +0200862 trace_kvm_exit(ret, kvm_vcpu_trap_get_class(vcpu), *vcpu_pc(vcpu));
Christoffer Dall1b3d5462015-05-28 19:49:10 +0100863
James Morse3368bd82018-01-15 19:39:04 +0000864 /* Exit types that need handling before we can be preempted */
865 handle_exit_early(vcpu, run, ret);
866
Marc Zyngierabdf5842015-06-08 15:00:28 +0100867 preempt_enable();
868
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500869 ret = handle_exit(vcpu, run, ret);
870 }
871
Alexander Grafd9e13972016-09-27 21:08:06 +0200872 /* Tell userspace about in-kernel device output levels */
Christoffer Dall3dbbdf72017-02-01 12:51:52 +0100873 if (unlikely(!irqchip_in_kernel(vcpu->kvm))) {
874 kvm_timer_update_run(vcpu);
875 kvm_pmu_update_run(vcpu);
876 }
Alexander Grafd9e13972016-09-27 21:08:06 +0200877
Jan H. Schönherr20b70352017-11-24 22:39:01 +0100878 kvm_sigset_deactivate(vcpu);
879
Christoffer Dallaccb7572017-12-04 21:35:25 +0100880 vcpu_put(vcpu);
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500881 return ret;
Christoffer Dall749cf76c2013-01-20 18:28:06 -0500882}
883
Christoffer Dall86ce8532013-01-20 18:28:08 -0500884static int vcpu_interrupt_line(struct kvm_vcpu *vcpu, int number, bool level)
885{
886 int bit_index;
887 bool set;
Christoffer Dall3df59d82017-08-03 12:09:05 +0200888 unsigned long *hcr;
Christoffer Dall86ce8532013-01-20 18:28:08 -0500889
890 if (number == KVM_ARM_IRQ_CPU_IRQ)
891 bit_index = __ffs(HCR_VI);
892 else /* KVM_ARM_IRQ_CPU_FIQ */
893 bit_index = __ffs(HCR_VF);
894
Christoffer Dall3df59d82017-08-03 12:09:05 +0200895 hcr = vcpu_hcr(vcpu);
Christoffer Dall86ce8532013-01-20 18:28:08 -0500896 if (level)
Christoffer Dall3df59d82017-08-03 12:09:05 +0200897 set = test_and_set_bit(bit_index, hcr);
Christoffer Dall86ce8532013-01-20 18:28:08 -0500898 else
Christoffer Dall3df59d82017-08-03 12:09:05 +0200899 set = test_and_clear_bit(bit_index, hcr);
Christoffer Dall86ce8532013-01-20 18:28:08 -0500900
901 /*
902 * If we didn't change anything, no need to wake up or kick other CPUs
903 */
904 if (set == level)
905 return 0;
906
907 /*
908 * The vcpu irq_lines field was updated, wake up sleeping VCPUs and
909 * trigger a world-switch round on the running physical CPU to set the
910 * virtual IRQ/FIQ fields in the HCR appropriately.
911 */
Andrew Jones325f9c62017-06-04 14:43:59 +0200912 kvm_make_request(KVM_REQ_IRQ_PENDING, vcpu);
Christoffer Dall86ce8532013-01-20 18:28:08 -0500913 kvm_vcpu_kick(vcpu);
914
915 return 0;
916}
917
Alexander Graf79558f12013-04-16 19:21:41 +0200918int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_level,
919 bool line_status)
Christoffer Dall86ce8532013-01-20 18:28:08 -0500920{
921 u32 irq = irq_level->irq;
922 unsigned int irq_type, vcpu_idx, irq_num;
923 int nrcpus = atomic_read(&kvm->online_vcpus);
924 struct kvm_vcpu *vcpu = NULL;
925 bool level = irq_level->level;
926
927 irq_type = (irq >> KVM_ARM_IRQ_TYPE_SHIFT) & KVM_ARM_IRQ_TYPE_MASK;
928 vcpu_idx = (irq >> KVM_ARM_IRQ_VCPU_SHIFT) & KVM_ARM_IRQ_VCPU_MASK;
Marc Zyngier92f35b72019-08-18 14:09:47 +0100929 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 -0500930 irq_num = (irq >> KVM_ARM_IRQ_NUM_SHIFT) & KVM_ARM_IRQ_NUM_MASK;
931
932 trace_kvm_irq_line(irq_type, vcpu_idx, irq_num, irq_level->level);
933
Marc Zyngier5863c2c2013-01-21 19:36:15 -0500934 switch (irq_type) {
935 case KVM_ARM_IRQ_TYPE_CPU:
936 if (irqchip_in_kernel(kvm))
937 return -ENXIO;
Christoffer Dall86ce8532013-01-20 18:28:08 -0500938
Marc Zyngier5863c2c2013-01-21 19:36:15 -0500939 if (vcpu_idx >= nrcpus)
940 return -EINVAL;
Christoffer Dall86ce8532013-01-20 18:28:08 -0500941
Marc Zyngier5863c2c2013-01-21 19:36:15 -0500942 vcpu = kvm_get_vcpu(kvm, vcpu_idx);
943 if (!vcpu)
944 return -EINVAL;
Christoffer Dall86ce8532013-01-20 18:28:08 -0500945
Marc Zyngier5863c2c2013-01-21 19:36:15 -0500946 if (irq_num > KVM_ARM_IRQ_CPU_FIQ)
947 return -EINVAL;
Christoffer Dall86ce8532013-01-20 18:28:08 -0500948
Marc Zyngier5863c2c2013-01-21 19:36:15 -0500949 return vcpu_interrupt_line(vcpu, irq_num, level);
950 case KVM_ARM_IRQ_TYPE_PPI:
951 if (!irqchip_in_kernel(kvm))
952 return -ENXIO;
953
954 if (vcpu_idx >= nrcpus)
955 return -EINVAL;
956
957 vcpu = kvm_get_vcpu(kvm, vcpu_idx);
958 if (!vcpu)
959 return -EINVAL;
960
961 if (irq_num < VGIC_NR_SGIS || irq_num >= VGIC_NR_PRIVATE_IRQS)
962 return -EINVAL;
963
Christoffer Dallcb3f0ad2017-05-16 12:41:18 +0200964 return kvm_vgic_inject_irq(kvm, vcpu->vcpu_id, irq_num, level, NULL);
Marc Zyngier5863c2c2013-01-21 19:36:15 -0500965 case KVM_ARM_IRQ_TYPE_SPI:
966 if (!irqchip_in_kernel(kvm))
967 return -ENXIO;
968
Andre Przywarafd1d0dd2015-04-10 16:17:59 +0100969 if (irq_num < VGIC_NR_PRIVATE_IRQS)
Marc Zyngier5863c2c2013-01-21 19:36:15 -0500970 return -EINVAL;
971
Christoffer Dallcb3f0ad2017-05-16 12:41:18 +0200972 return kvm_vgic_inject_irq(kvm, 0, irq_num, level, NULL);
Marc Zyngier5863c2c2013-01-21 19:36:15 -0500973 }
974
975 return -EINVAL;
Christoffer Dall86ce8532013-01-20 18:28:08 -0500976}
977
Christoffer Dallf7fa034d2014-10-16 16:40:53 +0200978static int kvm_vcpu_set_target(struct kvm_vcpu *vcpu,
979 const struct kvm_vcpu_init *init)
980{
Andrew Jones811328f2019-04-04 19:42:30 +0200981 unsigned int i, ret;
Christoffer Dallf7fa034d2014-10-16 16:40:53 +0200982 int phys_target = kvm_target_cpu();
983
984 if (init->target != phys_target)
985 return -EINVAL;
986
987 /*
988 * Secondary and subsequent calls to KVM_ARM_VCPU_INIT must
989 * use the same target.
990 */
991 if (vcpu->arch.target != -1 && vcpu->arch.target != init->target)
992 return -EINVAL;
993
994 /* -ENOENT for unknown features, -EINVAL for invalid combinations. */
995 for (i = 0; i < sizeof(init->features) * 8; i++) {
996 bool set = (init->features[i / 32] & (1 << (i % 32)));
997
998 if (set && i >= KVM_VCPU_MAX_FEATURES)
999 return -ENOENT;
1000
1001 /*
1002 * Secondary and subsequent calls to KVM_ARM_VCPU_INIT must
1003 * use the same feature set.
1004 */
1005 if (vcpu->arch.target != -1 && i < KVM_VCPU_MAX_FEATURES &&
1006 test_bit(i, vcpu->arch.features) != set)
1007 return -EINVAL;
1008
1009 if (set)
1010 set_bit(i, vcpu->arch.features);
1011 }
1012
1013 vcpu->arch.target = phys_target;
1014
1015 /* Now we know what it is, we can reset it. */
Andrew Jones811328f2019-04-04 19:42:30 +02001016 ret = kvm_reset_vcpu(vcpu);
1017 if (ret) {
1018 vcpu->arch.target = -1;
1019 bitmap_zero(vcpu->arch.features, KVM_VCPU_MAX_FEATURES);
1020 }
Christoffer Dallf7fa034d2014-10-16 16:40:53 +02001021
Andrew Jones811328f2019-04-04 19:42:30 +02001022 return ret;
1023}
Christoffer Dallf7fa034d2014-10-16 16:40:53 +02001024
Christoffer Dall478a8232013-11-19 17:43:19 -08001025static int kvm_arch_vcpu_ioctl_vcpu_init(struct kvm_vcpu *vcpu,
1026 struct kvm_vcpu_init *init)
1027{
1028 int ret;
1029
1030 ret = kvm_vcpu_set_target(vcpu, init);
1031 if (ret)
1032 return ret;
1033
Christoffer Dall957db102014-11-27 10:35:03 +01001034 /*
1035 * Ensure a rebooted VM will fault in RAM pages and detect if the
1036 * guest MMU is turned off and flush the caches as needed.
1037 */
1038 if (vcpu->arch.has_run_once)
1039 stage2_unmap_vm(vcpu->kvm);
1040
Christoffer Dallb856a592014-10-16 17:21:16 +02001041 vcpu_reset_hcr(vcpu);
1042
Christoffer Dall478a8232013-11-19 17:43:19 -08001043 /*
Eric Auger37815282015-09-25 23:41:14 +02001044 * Handle the "start in power-off" case.
Christoffer Dall478a8232013-11-19 17:43:19 -08001045 */
Christoffer Dall03f1d4c2014-12-02 15:27:51 +01001046 if (test_bit(KVM_ARM_VCPU_POWER_OFF, vcpu->arch.features))
Andrew Jones424c9892017-06-04 14:43:57 +02001047 vcpu_power_off(vcpu);
Christoffer Dall3ad8b3d2014-10-16 16:14:43 +02001048 else
Eric Auger37815282015-09-25 23:41:14 +02001049 vcpu->arch.power_off = false;
Christoffer Dall478a8232013-11-19 17:43:19 -08001050
1051 return 0;
1052}
1053
Shannon Zhaof577f6c2016-01-11 20:56:17 +08001054static int kvm_arm_vcpu_set_attr(struct kvm_vcpu *vcpu,
1055 struct kvm_device_attr *attr)
1056{
1057 int ret = -ENXIO;
1058
1059 switch (attr->group) {
1060 default:
Shannon Zhaobb0c70b2016-01-11 21:35:32 +08001061 ret = kvm_arm_vcpu_arch_set_attr(vcpu, attr);
Shannon Zhaof577f6c2016-01-11 20:56:17 +08001062 break;
1063 }
1064
1065 return ret;
1066}
1067
1068static int kvm_arm_vcpu_get_attr(struct kvm_vcpu *vcpu,
1069 struct kvm_device_attr *attr)
1070{
1071 int ret = -ENXIO;
1072
1073 switch (attr->group) {
1074 default:
Shannon Zhaobb0c70b2016-01-11 21:35:32 +08001075 ret = kvm_arm_vcpu_arch_get_attr(vcpu, attr);
Shannon Zhaof577f6c2016-01-11 20:56:17 +08001076 break;
1077 }
1078
1079 return ret;
1080}
1081
1082static int kvm_arm_vcpu_has_attr(struct kvm_vcpu *vcpu,
1083 struct kvm_device_attr *attr)
1084{
1085 int ret = -ENXIO;
1086
1087 switch (attr->group) {
1088 default:
Shannon Zhaobb0c70b2016-01-11 21:35:32 +08001089 ret = kvm_arm_vcpu_arch_has_attr(vcpu, attr);
Shannon Zhaof577f6c2016-01-11 20:56:17 +08001090 break;
1091 }
1092
1093 return ret;
1094}
1095
James Morse539aee02018-07-19 16:24:24 +01001096static int kvm_arm_vcpu_get_events(struct kvm_vcpu *vcpu,
1097 struct kvm_vcpu_events *events)
1098{
1099 memset(events, 0, sizeof(*events));
1100
1101 return __kvm_arm_vcpu_get_events(vcpu, events);
1102}
1103
1104static int kvm_arm_vcpu_set_events(struct kvm_vcpu *vcpu,
1105 struct kvm_vcpu_events *events)
1106{
1107 int i;
1108
1109 /* check whether the reserved field is zero */
1110 for (i = 0; i < ARRAY_SIZE(events->reserved); i++)
1111 if (events->reserved[i])
1112 return -EINVAL;
1113
1114 /* check whether the pad field is zero */
1115 for (i = 0; i < ARRAY_SIZE(events->exception.pad); i++)
1116 if (events->exception.pad[i])
1117 return -EINVAL;
1118
1119 return __kvm_arm_vcpu_set_events(vcpu, events);
1120}
James Morse539aee02018-07-19 16:24:24 +01001121
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001122long kvm_arch_vcpu_ioctl(struct file *filp,
1123 unsigned int ioctl, unsigned long arg)
1124{
1125 struct kvm_vcpu *vcpu = filp->private_data;
1126 void __user *argp = (void __user *)arg;
Shannon Zhaof577f6c2016-01-11 20:56:17 +08001127 struct kvm_device_attr attr;
Christoffer Dall9b0624712017-12-04 21:35:36 +01001128 long r;
1129
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001130 switch (ioctl) {
1131 case KVM_ARM_VCPU_INIT: {
1132 struct kvm_vcpu_init init;
1133
Christoffer Dall9b0624712017-12-04 21:35:36 +01001134 r = -EFAULT;
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001135 if (copy_from_user(&init, argp, sizeof(init)))
Christoffer Dall9b0624712017-12-04 21:35:36 +01001136 break;
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001137
Christoffer Dall9b0624712017-12-04 21:35:36 +01001138 r = kvm_arch_vcpu_ioctl_vcpu_init(vcpu, &init);
1139 break;
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001140 }
1141 case KVM_SET_ONE_REG:
1142 case KVM_GET_ONE_REG: {
1143 struct kvm_one_reg reg;
Andre Przywarae8180dc2013-05-09 00:28:06 +02001144
Christoffer Dall9b0624712017-12-04 21:35:36 +01001145 r = -ENOEXEC;
Andre Przywarae8180dc2013-05-09 00:28:06 +02001146 if (unlikely(!kvm_vcpu_initialized(vcpu)))
Christoffer Dall9b0624712017-12-04 21:35:36 +01001147 break;
Andre Przywarae8180dc2013-05-09 00:28:06 +02001148
Christoffer Dall9b0624712017-12-04 21:35:36 +01001149 r = -EFAULT;
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001150 if (copy_from_user(&reg, argp, sizeof(reg)))
Christoffer Dall9b0624712017-12-04 21:35:36 +01001151 break;
1152
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001153 if (ioctl == KVM_SET_ONE_REG)
Christoffer Dall9b0624712017-12-04 21:35:36 +01001154 r = kvm_arm_set_reg(vcpu, &reg);
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001155 else
Christoffer Dall9b0624712017-12-04 21:35:36 +01001156 r = kvm_arm_get_reg(vcpu, &reg);
1157 break;
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001158 }
1159 case KVM_GET_REG_LIST: {
1160 struct kvm_reg_list __user *user_list = argp;
1161 struct kvm_reg_list reg_list;
1162 unsigned n;
1163
Christoffer Dall9b0624712017-12-04 21:35:36 +01001164 r = -ENOEXEC;
Andre Przywarae8180dc2013-05-09 00:28:06 +02001165 if (unlikely(!kvm_vcpu_initialized(vcpu)))
Christoffer Dall9b0624712017-12-04 21:35:36 +01001166 break;
Andre Przywarae8180dc2013-05-09 00:28:06 +02001167
Dave Martin7dd32a02018-12-19 14:27:01 +00001168 r = -EPERM;
1169 if (!kvm_arm_vcpu_is_finalized(vcpu))
1170 break;
1171
Christoffer Dall9b0624712017-12-04 21:35:36 +01001172 r = -EFAULT;
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001173 if (copy_from_user(&reg_list, user_list, sizeof(reg_list)))
Christoffer Dall9b0624712017-12-04 21:35:36 +01001174 break;
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001175 n = reg_list.n;
1176 reg_list.n = kvm_arm_num_regs(vcpu);
1177 if (copy_to_user(user_list, &reg_list, sizeof(reg_list)))
Christoffer Dall9b0624712017-12-04 21:35:36 +01001178 break;
1179 r = -E2BIG;
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001180 if (n < reg_list.n)
Christoffer Dall9b0624712017-12-04 21:35:36 +01001181 break;
1182 r = kvm_arm_copy_reg_indices(vcpu, user_list->reg);
1183 break;
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001184 }
Shannon Zhaof577f6c2016-01-11 20:56:17 +08001185 case KVM_SET_DEVICE_ATTR: {
Christoffer Dall9b0624712017-12-04 21:35:36 +01001186 r = -EFAULT;
Shannon Zhaof577f6c2016-01-11 20:56:17 +08001187 if (copy_from_user(&attr, argp, sizeof(attr)))
Christoffer Dall9b0624712017-12-04 21:35:36 +01001188 break;
1189 r = kvm_arm_vcpu_set_attr(vcpu, &attr);
1190 break;
Shannon Zhaof577f6c2016-01-11 20:56:17 +08001191 }
1192 case KVM_GET_DEVICE_ATTR: {
Christoffer Dall9b0624712017-12-04 21:35:36 +01001193 r = -EFAULT;
Shannon Zhaof577f6c2016-01-11 20:56:17 +08001194 if (copy_from_user(&attr, argp, sizeof(attr)))
Christoffer Dall9b0624712017-12-04 21:35:36 +01001195 break;
1196 r = kvm_arm_vcpu_get_attr(vcpu, &attr);
1197 break;
Shannon Zhaof577f6c2016-01-11 20:56:17 +08001198 }
1199 case KVM_HAS_DEVICE_ATTR: {
Christoffer Dall9b0624712017-12-04 21:35:36 +01001200 r = -EFAULT;
Shannon Zhaof577f6c2016-01-11 20:56:17 +08001201 if (copy_from_user(&attr, argp, sizeof(attr)))
Christoffer Dall9b0624712017-12-04 21:35:36 +01001202 break;
1203 r = kvm_arm_vcpu_has_attr(vcpu, &attr);
1204 break;
Shannon Zhaof577f6c2016-01-11 20:56:17 +08001205 }
Dongjiu Gengb7b27fa2018-07-19 16:24:22 +01001206 case KVM_GET_VCPU_EVENTS: {
1207 struct kvm_vcpu_events events;
1208
1209 if (kvm_arm_vcpu_get_events(vcpu, &events))
1210 return -EINVAL;
1211
1212 if (copy_to_user(argp, &events, sizeof(events)))
1213 return -EFAULT;
1214
1215 return 0;
1216 }
1217 case KVM_SET_VCPU_EVENTS: {
1218 struct kvm_vcpu_events events;
1219
1220 if (copy_from_user(&events, argp, sizeof(events)))
1221 return -EFAULT;
1222
1223 return kvm_arm_vcpu_set_events(vcpu, &events);
1224 }
Dave Martin7dd32a02018-12-19 14:27:01 +00001225 case KVM_ARM_VCPU_FINALIZE: {
1226 int what;
1227
1228 if (!kvm_vcpu_initialized(vcpu))
1229 return -ENOEXEC;
1230
1231 if (get_user(what, (const int __user *)argp))
1232 return -EFAULT;
1233
1234 return kvm_arm_vcpu_finalize(vcpu, what);
1235 }
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001236 default:
Christoffer Dall9b0624712017-12-04 21:35:36 +01001237 r = -EINVAL;
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001238 }
Christoffer Dall9b0624712017-12-04 21:35:36 +01001239
Christoffer Dall9b0624712017-12-04 21:35:36 +01001240 return r;
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001241}
1242
Mario Smarduch53c810c2015-01-15 15:58:57 -08001243/**
1244 * kvm_vm_ioctl_get_dirty_log - get and clear the log of dirty pages in a slot
1245 * @kvm: kvm instance
1246 * @log: slot id and address to which we copy the log
1247 *
1248 * Steps 1-4 below provide general overview of dirty page logging. See
1249 * kvm_get_dirty_log_protect() function description for additional details.
1250 *
1251 * We call kvm_get_dirty_log_protect() to handle steps 1-3, upon return we
1252 * always flush the TLB (step 4) even if previous step failed and the dirty
1253 * bitmap may be corrupt. Regardless of previous outcome the KVM logging API
1254 * does not preclude user space subsequent dirty log read. Flushing TLB ensures
1255 * writes will be marked dirty for next log read.
1256 *
1257 * 1. Take a snapshot of the bit and clear it if needed.
1258 * 2. Write protect the corresponding page.
1259 * 3. Copy the snapshot to the userspace.
1260 * 4. Flush TLB's if needed.
1261 */
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001262int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, struct kvm_dirty_log *log)
1263{
Paolo Bonzini8fe65a82018-10-23 02:18:42 +02001264 bool flush = false;
Mario Smarduch53c810c2015-01-15 15:58:57 -08001265 int r;
1266
1267 mutex_lock(&kvm->slots_lock);
1268
Paolo Bonzini8fe65a82018-10-23 02:18:42 +02001269 r = kvm_get_dirty_log_protect(kvm, log, &flush);
Mario Smarduch53c810c2015-01-15 15:58:57 -08001270
Paolo Bonzini8fe65a82018-10-23 02:18:42 +02001271 if (flush)
Mario Smarduch53c810c2015-01-15 15:58:57 -08001272 kvm_flush_remote_tlbs(kvm);
1273
1274 mutex_unlock(&kvm->slots_lock);
1275 return r;
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001276}
1277
Paolo Bonzini2a31b9d2018-10-23 02:36:47 +02001278int kvm_vm_ioctl_clear_dirty_log(struct kvm *kvm, struct kvm_clear_dirty_log *log)
1279{
1280 bool flush = false;
1281 int r;
1282
1283 mutex_lock(&kvm->slots_lock);
1284
1285 r = kvm_clear_dirty_log_protect(kvm, log, &flush);
1286
1287 if (flush)
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001288 kvm_flush_remote_tlbs(kvm);
1289
1290 mutex_unlock(&kvm->slots_lock);
1291 return r;
1292}
1293
Christoffer Dall3401d5462013-01-23 13:18:04 -05001294static int kvm_vm_ioctl_set_device_addr(struct kvm *kvm,
1295 struct kvm_arm_device_addr *dev_addr)
1296{
Christoffer Dall330690c2013-01-21 19:36:13 -05001297 unsigned long dev_id, type;
1298
1299 dev_id = (dev_addr->id & KVM_ARM_DEVICE_ID_MASK) >>
1300 KVM_ARM_DEVICE_ID_SHIFT;
1301 type = (dev_addr->id & KVM_ARM_DEVICE_TYPE_MASK) >>
1302 KVM_ARM_DEVICE_TYPE_SHIFT;
1303
1304 switch (dev_id) {
1305 case KVM_ARM_DEVICE_VGIC_V2:
Pavel Fedinc7da6fa2015-12-18 14:38:43 +03001306 if (!vgic_present)
1307 return -ENXIO;
Christoffer Dallce01e4e2013-09-23 14:55:56 -07001308 return kvm_vgic_addr(kvm, type, &dev_addr->addr, true);
Christoffer Dall330690c2013-01-21 19:36:13 -05001309 default:
1310 return -ENODEV;
1311 }
Christoffer Dall3401d5462013-01-23 13:18:04 -05001312}
1313
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001314long kvm_arch_vm_ioctl(struct file *filp,
1315 unsigned int ioctl, unsigned long arg)
1316{
Christoffer Dall3401d5462013-01-23 13:18:04 -05001317 struct kvm *kvm = filp->private_data;
1318 void __user *argp = (void __user *)arg;
1319
1320 switch (ioctl) {
Marc Zyngier5863c2c2013-01-21 19:36:15 -05001321 case KVM_CREATE_IRQCHIP: {
Christoffer Dalla28ebea2016-08-09 19:13:01 +02001322 int ret;
Pavel Fedinc7da6fa2015-12-18 14:38:43 +03001323 if (!vgic_present)
1324 return -ENXIO;
Christoffer Dalla28ebea2016-08-09 19:13:01 +02001325 mutex_lock(&kvm->lock);
1326 ret = kvm_vgic_create(kvm, KVM_DEV_TYPE_ARM_VGIC_V2);
1327 mutex_unlock(&kvm->lock);
1328 return ret;
Marc Zyngier5863c2c2013-01-21 19:36:15 -05001329 }
Christoffer Dall3401d5462013-01-23 13:18:04 -05001330 case KVM_ARM_SET_DEVICE_ADDR: {
1331 struct kvm_arm_device_addr dev_addr;
1332
1333 if (copy_from_user(&dev_addr, argp, sizeof(dev_addr)))
1334 return -EFAULT;
1335 return kvm_vm_ioctl_set_device_addr(kvm, &dev_addr);
1336 }
Anup Patel42c4e0c2013-09-30 14:20:07 +05301337 case KVM_ARM_PREFERRED_TARGET: {
1338 int err;
1339 struct kvm_vcpu_init init;
1340
1341 err = kvm_vcpu_preferred_target(&init);
1342 if (err)
1343 return err;
1344
1345 if (copy_to_user(argp, &init, sizeof(init)))
1346 return -EFAULT;
1347
1348 return 0;
1349 }
Christoffer Dall3401d5462013-01-23 13:18:04 -05001350 default:
1351 return -EINVAL;
1352 }
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001353}
1354
Marc Zyngierd157f4a2013-04-12 19:12:07 +01001355static void cpu_init_hyp_mode(void *dummy)
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001356{
Marc Zyngierdac288f2013-05-14 12:11:37 +01001357 phys_addr_t pgd_ptr;
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001358 unsigned long hyp_stack_ptr;
1359 unsigned long stack_page;
1360 unsigned long vector_ptr;
1361
1362 /* Switch from the HYP stub to our own HYP init vector */
Marc Zyngier5a677ce2013-04-12 19:12:06 +01001363 __hyp_set_vectors(kvm_get_idmap_vector());
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001364
Marc Zyngierdac288f2013-05-14 12:11:37 +01001365 pgd_ptr = kvm_mmu_get_httbr();
Christoph Lameter1436c1a2013-10-21 13:17:08 +01001366 stack_page = __this_cpu_read(kvm_arm_hyp_stack_page);
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001367 hyp_stack_ptr = stack_page + PAGE_SIZE;
Marc Zyngier6840bdd2018-01-03 16:38:35 +00001368 vector_ptr = (unsigned long)kvm_get_hyp_vector();
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001369
Marc Zyngier12fda812016-06-30 18:40:45 +01001370 __cpu_init_hyp_mode(pgd_ptr, hyp_stack_ptr, vector_ptr);
Marc Zyngier35a24912016-02-01 17:54:35 +00001371 __cpu_init_stage2();
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001372}
1373
Marc Zyngier47eb3cb2017-04-03 19:38:01 +01001374static void cpu_hyp_reset(void)
1375{
1376 if (!is_kernel_in_hyp_mode())
1377 __hyp_reset_vectors();
1378}
1379
James Morse5f5560b2016-03-30 18:33:04 +01001380static void cpu_hyp_reinit(void)
1381{
Marc Zyngier1e0cf162019-07-05 23:35:56 +01001382 kvm_init_host_cpu_context(&this_cpu_ptr(&kvm_host_data)->host_ctxt);
1383
Marc Zyngier47eb3cb2017-04-03 19:38:01 +01001384 cpu_hyp_reset();
1385
Marc Zyngier9d47bb02018-10-01 13:41:32 +01001386 if (is_kernel_in_hyp_mode())
Hu Huajun02d50cd2017-06-12 22:37:48 +08001387 kvm_timer_init_vhe();
Marc Zyngier9d47bb02018-10-01 13:41:32 +01001388 else
Marc Zyngier47eb3cb2017-04-03 19:38:01 +01001389 cpu_init_hyp_mode(NULL);
Christoffer Dall5b0d2cc2017-03-18 13:56:56 +01001390
Mark Rutlandda5a3ce2018-10-17 17:42:10 +01001391 kvm_arm_init_debug();
Christoffer Dall5b0d2cc2017-03-18 13:56:56 +01001392
1393 if (vgic_present)
1394 kvm_vgic_init_cpu_hardware();
James Morse5f5560b2016-03-30 18:33:04 +01001395}
1396
AKASHI Takahiro67f69192016-04-27 17:47:05 +01001397static void _kvm_arch_hardware_enable(void *discard)
1398{
1399 if (!__this_cpu_read(kvm_arm_hardware_enabled)) {
1400 cpu_hyp_reinit();
1401 __this_cpu_write(kvm_arm_hardware_enabled, 1);
1402 }
1403}
1404
1405int kvm_arch_hardware_enable(void)
1406{
1407 _kvm_arch_hardware_enable(NULL);
1408 return 0;
1409}
1410
1411static void _kvm_arch_hardware_disable(void *discard)
1412{
1413 if (__this_cpu_read(kvm_arm_hardware_enabled)) {
1414 cpu_hyp_reset();
1415 __this_cpu_write(kvm_arm_hardware_enabled, 0);
1416 }
1417}
1418
1419void kvm_arch_hardware_disable(void)
1420{
1421 _kvm_arch_hardware_disable(NULL);
1422}
Marc Zyngierd157f4a2013-04-12 19:12:07 +01001423
Lorenzo Pieralisi1fcf7ce2013-08-05 15:04:46 +01001424#ifdef CONFIG_CPU_PM
1425static int hyp_init_cpu_pm_notifier(struct notifier_block *self,
1426 unsigned long cmd,
1427 void *v)
1428{
AKASHI Takahiro67f69192016-04-27 17:47:05 +01001429 /*
1430 * kvm_arm_hardware_enabled is left with its old value over
1431 * PM_ENTER->PM_EXIT. It is used to indicate PM_EXIT should
1432 * re-enable hyp.
1433 */
1434 switch (cmd) {
1435 case CPU_PM_ENTER:
1436 if (__this_cpu_read(kvm_arm_hardware_enabled))
1437 /*
1438 * don't update kvm_arm_hardware_enabled here
1439 * so that the hardware will be re-enabled
1440 * when we resume. See below.
1441 */
1442 cpu_hyp_reset();
Lorenzo Pieralisi1fcf7ce2013-08-05 15:04:46 +01001443
AKASHI Takahiro67f69192016-04-27 17:47:05 +01001444 return NOTIFY_OK;
James Morse58d6b152018-01-22 18:19:06 +00001445 case CPU_PM_ENTER_FAILED:
AKASHI Takahiro67f69192016-04-27 17:47:05 +01001446 case CPU_PM_EXIT:
1447 if (__this_cpu_read(kvm_arm_hardware_enabled))
1448 /* The hardware was enabled before suspend. */
1449 cpu_hyp_reinit();
1450
1451 return NOTIFY_OK;
1452
1453 default:
1454 return NOTIFY_DONE;
1455 }
Lorenzo Pieralisi1fcf7ce2013-08-05 15:04:46 +01001456}
1457
1458static struct notifier_block hyp_init_cpu_pm_nb = {
1459 .notifier_call = hyp_init_cpu_pm_notifier,
1460};
1461
1462static void __init hyp_cpu_pm_init(void)
1463{
1464 cpu_pm_register_notifier(&hyp_init_cpu_pm_nb);
1465}
Sudeep Holla06a71a22016-04-04 14:46:51 +01001466static void __init hyp_cpu_pm_exit(void)
1467{
1468 cpu_pm_unregister_notifier(&hyp_init_cpu_pm_nb);
1469}
Lorenzo Pieralisi1fcf7ce2013-08-05 15:04:46 +01001470#else
1471static inline void hyp_cpu_pm_init(void)
1472{
1473}
Sudeep Holla06a71a22016-04-04 14:46:51 +01001474static inline void hyp_cpu_pm_exit(void)
1475{
1476}
Lorenzo Pieralisi1fcf7ce2013-08-05 15:04:46 +01001477#endif
1478
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001479static int init_common_resources(void)
1480{
Suzuki K Poulose0f62f0e2018-09-26 17:32:52 +01001481 kvm_set_ipa_limit();
1482
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001483 return 0;
1484}
1485
1486static int init_subsystems(void)
1487{
AKASHI Takahiro67f69192016-04-27 17:47:05 +01001488 int err = 0;
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001489
1490 /*
AKASHI Takahiro67f69192016-04-27 17:47:05 +01001491 * Enable hardware so that subsystem initialisation can access EL2.
James Morse5f5560b2016-03-30 18:33:04 +01001492 */
AKASHI Takahiro67f69192016-04-27 17:47:05 +01001493 on_each_cpu(_kvm_arch_hardware_enable, NULL, 1);
James Morse5f5560b2016-03-30 18:33:04 +01001494
1495 /*
1496 * Register CPU lower-power notifier
1497 */
1498 hyp_cpu_pm_init();
1499
1500 /*
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001501 * Init HYP view of VGIC
1502 */
1503 err = kvm_vgic_hyp_init();
1504 switch (err) {
1505 case 0:
1506 vgic_present = true;
1507 break;
1508 case -ENODEV:
1509 case -ENXIO:
1510 vgic_present = false;
AKASHI Takahiro67f69192016-04-27 17:47:05 +01001511 err = 0;
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001512 break;
1513 default:
AKASHI Takahiro67f69192016-04-27 17:47:05 +01001514 goto out;
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001515 }
1516
1517 /*
1518 * Init HYP architected timer support
1519 */
Marc Zyngierf384dcf2017-12-07 11:46:15 +00001520 err = kvm_timer_hyp_init(vgic_present);
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001521 if (err)
AKASHI Takahiro67f69192016-04-27 17:47:05 +01001522 goto out;
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001523
1524 kvm_perf_init();
1525 kvm_coproc_table_init();
1526
AKASHI Takahiro67f69192016-04-27 17:47:05 +01001527out:
1528 on_each_cpu(_kvm_arch_hardware_disable, NULL, 1);
1529
1530 return err;
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001531}
1532
1533static void teardown_hyp_mode(void)
1534{
1535 int cpu;
1536
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001537 free_hyp_pgds();
1538 for_each_possible_cpu(cpu)
1539 free_page(per_cpu(kvm_arm_hyp_stack_page, cpu));
Sudeep Holla06a71a22016-04-04 14:46:51 +01001540 hyp_cpu_pm_exit();
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001541}
1542
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001543/**
1544 * Inits Hyp-mode on all online CPUs
1545 */
1546static int init_hyp_mode(void)
1547{
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001548 int cpu;
1549 int err = 0;
1550
1551 /*
1552 * Allocate Hyp PGD and setup Hyp identity mapping
1553 */
1554 err = kvm_mmu_init();
1555 if (err)
1556 goto out_err;
1557
1558 /*
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001559 * Allocate stack pages for Hypervisor-mode
1560 */
1561 for_each_possible_cpu(cpu) {
1562 unsigned long stack_page;
1563
1564 stack_page = __get_free_page(GFP_KERNEL);
1565 if (!stack_page) {
1566 err = -ENOMEM;
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001567 goto out_err;
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001568 }
1569
1570 per_cpu(kvm_arm_hyp_stack_page, cpu) = stack_page;
1571 }
1572
1573 /*
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001574 * Map the Hyp-code called directly from the host
1575 */
Linus Torvalds588ab3f2016-03-17 20:03:47 -07001576 err = create_hyp_mappings(kvm_ksym_ref(__hyp_text_start),
Marc Zyngier59002702016-06-13 15:00:48 +01001577 kvm_ksym_ref(__hyp_text_end), PAGE_HYP_EXEC);
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001578 if (err) {
1579 kvm_err("Cannot map world-switch code\n");
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001580 goto out_err;
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001581 }
1582
Ard Biesheuvela0bf9772016-02-16 13:52:39 +01001583 err = create_hyp_mappings(kvm_ksym_ref(__start_rodata),
Marc Zyngier74a6b882016-06-13 15:00:47 +01001584 kvm_ksym_ref(__end_rodata), PAGE_HYP_RO);
Marc Zyngier910917b2015-10-27 12:18:48 +00001585 if (err) {
1586 kvm_err("Cannot map rodata section\n");
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001587 goto out_err;
Marc Zyngier910917b2015-10-27 12:18:48 +00001588 }
1589
Marc Zyngierc8ea0392016-10-20 10:17:21 +01001590 err = create_hyp_mappings(kvm_ksym_ref(__bss_start),
1591 kvm_ksym_ref(__bss_stop), PAGE_HYP_RO);
1592 if (err) {
1593 kvm_err("Cannot map bss section\n");
1594 goto out_err;
1595 }
1596
Marc Zyngier6840bdd2018-01-03 16:38:35 +00001597 err = kvm_map_vectors();
1598 if (err) {
1599 kvm_err("Cannot map vectors\n");
1600 goto out_err;
1601 }
1602
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001603 /*
1604 * Map the Hyp stack pages
1605 */
1606 for_each_possible_cpu(cpu) {
1607 char *stack_page = (char *)per_cpu(kvm_arm_hyp_stack_page, cpu);
Marc Zyngierc8dddec2016-06-13 15:00:45 +01001608 err = create_hyp_mappings(stack_page, stack_page + PAGE_SIZE,
1609 PAGE_HYP);
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001610
1611 if (err) {
1612 kvm_err("Cannot map hyp stack\n");
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001613 goto out_err;
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001614 }
1615 }
1616
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001617 for_each_possible_cpu(cpu) {
Andrew Murray630a1682019-04-09 20:22:11 +01001618 kvm_host_data_t *cpu_data;
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001619
Andrew Murray630a1682019-04-09 20:22:11 +01001620 cpu_data = per_cpu_ptr(&kvm_host_data, cpu);
Andrew Murray630a1682019-04-09 20:22:11 +01001621 err = create_hyp_mappings(cpu_data, cpu_data + 1, PAGE_HYP);
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001622
1623 if (err) {
Marc Zyngier3de50da2013-04-08 16:47:19 +01001624 kvm_err("Cannot map host CPU state: %d\n", err);
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001625 goto out_err;
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001626 }
1627 }
1628
Marc Zyngier55e37482018-05-29 13:11:16 +01001629 err = hyp_map_aux_data();
1630 if (err)
Colin Ian Kinga37f0c32019-02-17 22:36:26 +00001631 kvm_err("Cannot map host auxiliary data: %d\n", err);
Marc Zyngier55e37482018-05-29 13:11:16 +01001632
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001633 return 0;
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001634
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001635out_err:
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001636 teardown_hyp_mode();
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001637 kvm_err("error initializing Hyp mode: %d\n", err);
1638 return err;
1639}
1640
Andre Przywarad4e071c2013-04-17 12:52:01 +02001641static void check_kvm_target_cpu(void *ret)
1642{
1643 *(int *)ret = kvm_target_cpu();
1644}
1645
Andre Przywara4429fc62014-06-02 15:37:13 +02001646struct kvm_vcpu *kvm_mpidr_to_vcpu(struct kvm *kvm, unsigned long mpidr)
1647{
1648 struct kvm_vcpu *vcpu;
1649 int i;
1650
1651 mpidr &= MPIDR_HWID_BITMASK;
1652 kvm_for_each_vcpu(i, vcpu, kvm) {
1653 if (mpidr == kvm_vcpu_get_mpidr_aff(vcpu))
1654 return vcpu;
1655 }
1656 return NULL;
1657}
1658
Eric Auger24124052017-10-27 15:28:31 +01001659bool kvm_arch_has_irq_bypass(void)
1660{
1661 return true;
1662}
1663
1664int kvm_arch_irq_bypass_add_producer(struct irq_bypass_consumer *cons,
1665 struct irq_bypass_producer *prod)
1666{
1667 struct kvm_kernel_irqfd *irqfd =
1668 container_of(cons, struct kvm_kernel_irqfd, consumer);
1669
Marc Zyngier196b1362017-10-27 15:28:39 +01001670 return kvm_vgic_v4_set_forwarding(irqfd->kvm, prod->irq,
1671 &irqfd->irq_entry);
Eric Auger24124052017-10-27 15:28:31 +01001672}
1673void kvm_arch_irq_bypass_del_producer(struct irq_bypass_consumer *cons,
1674 struct irq_bypass_producer *prod)
1675{
1676 struct kvm_kernel_irqfd *irqfd =
1677 container_of(cons, struct kvm_kernel_irqfd, consumer);
1678
Marc Zyngier196b1362017-10-27 15:28:39 +01001679 kvm_vgic_v4_unset_forwarding(irqfd->kvm, prod->irq,
1680 &irqfd->irq_entry);
Eric Auger24124052017-10-27 15:28:31 +01001681}
1682
1683void kvm_arch_irq_bypass_stop(struct irq_bypass_consumer *cons)
1684{
1685 struct kvm_kernel_irqfd *irqfd =
1686 container_of(cons, struct kvm_kernel_irqfd, consumer);
1687
1688 kvm_arm_halt_guest(irqfd->kvm);
1689}
1690
1691void kvm_arch_irq_bypass_start(struct irq_bypass_consumer *cons)
1692{
1693 struct kvm_kernel_irqfd *irqfd =
1694 container_of(cons, struct kvm_kernel_irqfd, consumer);
1695
1696 kvm_arm_resume_guest(irqfd->kvm);
1697}
1698
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001699/**
1700 * Initialize Hyp-mode and memory mappings on all CPUs.
1701 */
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001702int kvm_arch_init(void *opaque)
1703{
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001704 int err;
Andre Przywarad4e071c2013-04-17 12:52:01 +02001705 int ret, cpu;
Julien Thierryfe7d7b02017-10-20 12:34:16 +01001706 bool in_hyp_mode;
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001707
1708 if (!is_hyp_mode_available()) {
Ard Biesheuvel58d0d192017-11-28 15:18:19 +00001709 kvm_info("HYP mode not available\n");
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001710 return -ENODEV;
1711 }
1712
Marc Zyngier33e5f4e2018-12-06 17:31:20 +00001713 in_hyp_mode = is_kernel_in_hyp_mode();
1714
1715 if (!in_hyp_mode && kvm_arch_requires_vhe()) {
1716 kvm_pr_unimpl("CPU unsupported in non-VHE mode, not initializing\n");
Dave Martin85acda32018-04-20 16:20:43 +01001717 return -ENODEV;
1718 }
1719
Andre Przywarad4e071c2013-04-17 12:52:01 +02001720 for_each_online_cpu(cpu) {
1721 smp_call_function_single(cpu, check_kvm_target_cpu, &ret, 1);
1722 if (ret < 0) {
1723 kvm_err("Error, CPU %d not supported!\n", cpu);
1724 return -ENODEV;
1725 }
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001726 }
1727
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001728 err = init_common_resources();
1729 if (err)
1730 return err;
Srivatsa S. Bhat81468752014-03-18 15:53:05 +05301731
Dave Martina3be8362019-04-12 15:30:58 +01001732 err = kvm_arm_init_sve();
Dave Martin0f062bf2019-02-28 18:33:00 +00001733 if (err)
1734 return err;
1735
Julien Thierryfe7d7b02017-10-20 12:34:16 +01001736 if (!in_hyp_mode) {
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001737 err = init_hyp_mode();
Julien Thierryfe7d7b02017-10-20 12:34:16 +01001738 if (err)
1739 goto out_err;
1740 }
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001741
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001742 err = init_subsystems();
1743 if (err)
1744 goto out_hyp;
Marc Zyngierd157f4a2013-04-12 19:12:07 +01001745
Julien Thierryfe7d7b02017-10-20 12:34:16 +01001746 if (in_hyp_mode)
1747 kvm_info("VHE mode initialized successfully\n");
1748 else
1749 kvm_info("Hyp mode initialized successfully\n");
1750
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001751 return 0;
Marc Zyngier1e947ba2015-01-29 11:59:54 +00001752
1753out_hyp:
Julien Thierryfe7d7b02017-10-20 12:34:16 +01001754 if (!in_hyp_mode)
1755 teardown_hyp_mode();
Christoffer Dall342cd0a2013-01-20 18:28:06 -05001756out_err:
1757 return err;
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001758}
1759
1760/* NOP: Compiling as a module not supported */
1761void kvm_arch_exit(void)
1762{
Marc Zyngier210552c2013-03-05 03:18:00 +00001763 kvm_perf_teardown();
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001764}
1765
1766static int arm_init(void)
1767{
1768 int rc = kvm_init(NULL, sizeof(struct kvm_vcpu), 0, THIS_MODULE);
1769 return rc;
1770}
1771
1772module_init(arm_init);