]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blame - arch/s390/kvm/kvm-s390.c
Merge tag 'signed-for-3.15' of git://github.com/agraf/linux-2.6 into kvm-master
[mirror_ubuntu-jammy-kernel.git] / arch / s390 / kvm / kvm-s390.c
CommitLineData
b0c632db 1/*
a53c8fab 2 * hosting zSeries kernel virtual machines
b0c632db 3 *
a53c8fab 4 * Copyright IBM Corp. 2008, 2009
b0c632db
HC
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License (version 2 only)
8 * as published by the Free Software Foundation.
9 *
10 * Author(s): Carsten Otte <cotte@de.ibm.com>
11 * Christian Borntraeger <borntraeger@de.ibm.com>
12 * Heiko Carstens <heiko.carstens@de.ibm.com>
628eb9b8 13 * Christian Ehrhardt <ehrhardt@de.ibm.com>
b0c632db
HC
14 */
15
16#include <linux/compiler.h>
17#include <linux/err.h>
18#include <linux/fs.h>
ca872302 19#include <linux/hrtimer.h>
b0c632db
HC
20#include <linux/init.h>
21#include <linux/kvm.h>
22#include <linux/kvm_host.h>
23#include <linux/module.h>
24#include <linux/slab.h>
ba5c1e9b 25#include <linux/timer.h>
cbb870c8 26#include <asm/asm-offsets.h>
b0c632db
HC
27#include <asm/lowcore.h>
28#include <asm/pgtable.h>
f5daba1d 29#include <asm/nmi.h>
a0616cde 30#include <asm/switch_to.h>
78c4b59f 31#include <asm/facility.h>
1526bf9c 32#include <asm/sclp.h>
8f2abe6a 33#include "kvm-s390.h"
b0c632db
HC
34#include "gaccess.h"
35
5786fffa
CH
36#define CREATE_TRACE_POINTS
37#include "trace.h"
ade38c31 38#include "trace-s390.h"
5786fffa 39
b0c632db
HC
40#define VCPU_STAT(x) offsetof(struct kvm_vcpu, stat.x), KVM_STAT_VCPU
41
42struct kvm_stats_debugfs_item debugfs_entries[] = {
43 { "userspace_handled", VCPU_STAT(exit_userspace) },
0eaeafa1 44 { "exit_null", VCPU_STAT(exit_null) },
8f2abe6a
CB
45 { "exit_validity", VCPU_STAT(exit_validity) },
46 { "exit_stop_request", VCPU_STAT(exit_stop_request) },
47 { "exit_external_request", VCPU_STAT(exit_external_request) },
48 { "exit_external_interrupt", VCPU_STAT(exit_external_interrupt) },
ba5c1e9b
CO
49 { "exit_instruction", VCPU_STAT(exit_instruction) },
50 { "exit_program_interruption", VCPU_STAT(exit_program_interruption) },
51 { "exit_instr_and_program_int", VCPU_STAT(exit_instr_and_program) },
f5e10b09 52 { "instruction_lctlg", VCPU_STAT(instruction_lctlg) },
ba5c1e9b
CO
53 { "instruction_lctl", VCPU_STAT(instruction_lctl) },
54 { "deliver_emergency_signal", VCPU_STAT(deliver_emergency_signal) },
7697e71f 55 { "deliver_external_call", VCPU_STAT(deliver_external_call) },
ba5c1e9b
CO
56 { "deliver_service_signal", VCPU_STAT(deliver_service_signal) },
57 { "deliver_virtio_interrupt", VCPU_STAT(deliver_virtio_interrupt) },
58 { "deliver_stop_signal", VCPU_STAT(deliver_stop_signal) },
59 { "deliver_prefix_signal", VCPU_STAT(deliver_prefix_signal) },
60 { "deliver_restart_signal", VCPU_STAT(deliver_restart_signal) },
61 { "deliver_program_interruption", VCPU_STAT(deliver_program_int) },
62 { "exit_wait_state", VCPU_STAT(exit_wait_state) },
69d0d3a3 63 { "instruction_pfmf", VCPU_STAT(instruction_pfmf) },
453423dc
CB
64 { "instruction_stidp", VCPU_STAT(instruction_stidp) },
65 { "instruction_spx", VCPU_STAT(instruction_spx) },
66 { "instruction_stpx", VCPU_STAT(instruction_stpx) },
67 { "instruction_stap", VCPU_STAT(instruction_stap) },
68 { "instruction_storage_key", VCPU_STAT(instruction_storage_key) },
69 { "instruction_stsch", VCPU_STAT(instruction_stsch) },
70 { "instruction_chsc", VCPU_STAT(instruction_chsc) },
b31288fa 71 { "instruction_essa", VCPU_STAT(instruction_essa) },
453423dc
CB
72 { "instruction_stsi", VCPU_STAT(instruction_stsi) },
73 { "instruction_stfl", VCPU_STAT(instruction_stfl) },
bb25b9ba 74 { "instruction_tprot", VCPU_STAT(instruction_tprot) },
5288fbf0 75 { "instruction_sigp_sense", VCPU_STAT(instruction_sigp_sense) },
bd59d3a4 76 { "instruction_sigp_sense_running", VCPU_STAT(instruction_sigp_sense_running) },
7697e71f 77 { "instruction_sigp_external_call", VCPU_STAT(instruction_sigp_external_call) },
5288fbf0
CB
78 { "instruction_sigp_emergency", VCPU_STAT(instruction_sigp_emergency) },
79 { "instruction_sigp_stop", VCPU_STAT(instruction_sigp_stop) },
80 { "instruction_sigp_set_arch", VCPU_STAT(instruction_sigp_arch) },
81 { "instruction_sigp_set_prefix", VCPU_STAT(instruction_sigp_prefix) },
82 { "instruction_sigp_restart", VCPU_STAT(instruction_sigp_restart) },
388186bc 83 { "diagnose_10", VCPU_STAT(diagnose_10) },
e28acfea 84 { "diagnose_44", VCPU_STAT(diagnose_44) },
41628d33 85 { "diagnose_9c", VCPU_STAT(diagnose_9c) },
b0c632db
HC
86 { NULL }
87};
88
78c4b59f 89unsigned long *vfacilities;
2c70fe44 90static struct gmap_notifier gmap_notifier;
b0c632db 91
78c4b59f
MM
92/* test availability of vfacility */
93static inline int test_vfacility(unsigned long nr)
94{
95 return __test_facility(nr, (void *) vfacilities);
96}
97
b0c632db 98/* Section: not file related */
10474ae8 99int kvm_arch_hardware_enable(void *garbage)
b0c632db
HC
100{
101 /* every s390 is virtualization enabled ;-) */
10474ae8 102 return 0;
b0c632db
HC
103}
104
105void kvm_arch_hardware_disable(void *garbage)
106{
107}
108
2c70fe44
CB
109static void kvm_gmap_notifier(struct gmap *gmap, unsigned long address);
110
b0c632db
HC
111int kvm_arch_hardware_setup(void)
112{
2c70fe44
CB
113 gmap_notifier.notifier_call = kvm_gmap_notifier;
114 gmap_register_ipte_notifier(&gmap_notifier);
b0c632db
HC
115 return 0;
116}
117
118void kvm_arch_hardware_unsetup(void)
119{
2c70fe44 120 gmap_unregister_ipte_notifier(&gmap_notifier);
b0c632db
HC
121}
122
123void kvm_arch_check_processor_compat(void *rtn)
124{
125}
126
127int kvm_arch_init(void *opaque)
128{
129 return 0;
130}
131
132void kvm_arch_exit(void)
133{
134}
135
136/* Section: device related */
137long kvm_arch_dev_ioctl(struct file *filp,
138 unsigned int ioctl, unsigned long arg)
139{
140 if (ioctl == KVM_S390_ENABLE_SIE)
141 return s390_enable_sie();
142 return -EINVAL;
143}
144
145int kvm_dev_ioctl_check_extension(long ext)
146{
d7b0b5eb
CO
147 int r;
148
2bd0ac4e 149 switch (ext) {
d7b0b5eb 150 case KVM_CAP_S390_PSW:
b6cf8788 151 case KVM_CAP_S390_GMAP:
52e16b18 152 case KVM_CAP_SYNC_MMU:
1efd0f59
CO
153#ifdef CONFIG_KVM_S390_UCONTROL
154 case KVM_CAP_S390_UCONTROL:
155#endif
3c038e6b 156 case KVM_CAP_ASYNC_PF:
60b413c9 157 case KVM_CAP_SYNC_REGS:
14eebd91 158 case KVM_CAP_ONE_REG:
d6712df9 159 case KVM_CAP_ENABLE_CAP:
fa6b7fe9 160 case KVM_CAP_S390_CSS_SUPPORT:
10ccaa1e 161 case KVM_CAP_IOEVENTFD:
c05c4186 162 case KVM_CAP_DEVICE_CTRL:
d938dc55 163 case KVM_CAP_ENABLE_CAP_VM:
d7b0b5eb
CO
164 r = 1;
165 break;
e726b1bd
CB
166 case KVM_CAP_NR_VCPUS:
167 case KVM_CAP_MAX_VCPUS:
168 r = KVM_MAX_VCPUS;
169 break;
e1e2e605
NW
170 case KVM_CAP_NR_MEMSLOTS:
171 r = KVM_USER_MEM_SLOTS;
172 break;
1526bf9c 173 case KVM_CAP_S390_COW:
abf09bed 174 r = MACHINE_HAS_ESOP;
1526bf9c 175 break;
2bd0ac4e 176 default:
d7b0b5eb 177 r = 0;
2bd0ac4e 178 }
d7b0b5eb 179 return r;
b0c632db
HC
180}
181
182/* Section: vm related */
183/*
184 * Get (and clear) the dirty memory log for a memory slot.
185 */
186int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
187 struct kvm_dirty_log *log)
188{
189 return 0;
190}
191
d938dc55
CH
192static int kvm_vm_ioctl_enable_cap(struct kvm *kvm, struct kvm_enable_cap *cap)
193{
194 int r;
195
196 if (cap->flags)
197 return -EINVAL;
198
199 switch (cap->cap) {
84223598
CH
200 case KVM_CAP_S390_IRQCHIP:
201 kvm->arch.use_irqchip = 1;
202 r = 0;
203 break;
d938dc55
CH
204 default:
205 r = -EINVAL;
206 break;
207 }
208 return r;
209}
210
b0c632db
HC
211long kvm_arch_vm_ioctl(struct file *filp,
212 unsigned int ioctl, unsigned long arg)
213{
214 struct kvm *kvm = filp->private_data;
215 void __user *argp = (void __user *)arg;
216 int r;
217
218 switch (ioctl) {
ba5c1e9b
CO
219 case KVM_S390_INTERRUPT: {
220 struct kvm_s390_interrupt s390int;
221
222 r = -EFAULT;
223 if (copy_from_user(&s390int, argp, sizeof(s390int)))
224 break;
225 r = kvm_s390_inject_vm(kvm, &s390int);
226 break;
227 }
d938dc55
CH
228 case KVM_ENABLE_CAP: {
229 struct kvm_enable_cap cap;
230 r = -EFAULT;
231 if (copy_from_user(&cap, argp, sizeof(cap)))
232 break;
233 r = kvm_vm_ioctl_enable_cap(kvm, &cap);
234 break;
235 }
84223598
CH
236 case KVM_CREATE_IRQCHIP: {
237 struct kvm_irq_routing_entry routing;
238
239 r = -EINVAL;
240 if (kvm->arch.use_irqchip) {
241 /* Set up dummy routing. */
242 memset(&routing, 0, sizeof(routing));
243 kvm_set_irq_routing(kvm, &routing, 0, 0);
244 r = 0;
245 }
246 break;
247 }
b0c632db 248 default:
367e1319 249 r = -ENOTTY;
b0c632db
HC
250 }
251
252 return r;
253}
254
e08b9637 255int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
b0c632db 256{
b0c632db
HC
257 int rc;
258 char debug_name[16];
f6c137ff 259 static unsigned long sca_offset;
b0c632db 260
e08b9637
CO
261 rc = -EINVAL;
262#ifdef CONFIG_KVM_S390_UCONTROL
263 if (type & ~KVM_VM_S390_UCONTROL)
264 goto out_err;
265 if ((type & KVM_VM_S390_UCONTROL) && (!capable(CAP_SYS_ADMIN)))
266 goto out_err;
267#else
268 if (type)
269 goto out_err;
270#endif
271
b0c632db
HC
272 rc = s390_enable_sie();
273 if (rc)
d89f5eff 274 goto out_err;
b0c632db 275
b290411a
CO
276 rc = -ENOMEM;
277
b0c632db
HC
278 kvm->arch.sca = (struct sca_block *) get_zeroed_page(GFP_KERNEL);
279 if (!kvm->arch.sca)
d89f5eff 280 goto out_err;
f6c137ff
CB
281 spin_lock(&kvm_lock);
282 sca_offset = (sca_offset + 16) & 0x7f0;
283 kvm->arch.sca = (struct sca_block *) ((char *) kvm->arch.sca + sca_offset);
284 spin_unlock(&kvm_lock);
b0c632db
HC
285
286 sprintf(debug_name, "kvm-%u", current->pid);
287
288 kvm->arch.dbf = debug_register(debug_name, 8, 2, 8 * sizeof(long));
289 if (!kvm->arch.dbf)
290 goto out_nodbf;
291
ba5c1e9b
CO
292 spin_lock_init(&kvm->arch.float_int.lock);
293 INIT_LIST_HEAD(&kvm->arch.float_int.list);
294
b0c632db
HC
295 debug_register_view(kvm->arch.dbf, &debug_sprintf_view);
296 VM_EVENT(kvm, 3, "%s", "vm created");
297
e08b9637
CO
298 if (type & KVM_VM_S390_UCONTROL) {
299 kvm->arch.gmap = NULL;
300 } else {
301 kvm->arch.gmap = gmap_alloc(current->mm);
302 if (!kvm->arch.gmap)
303 goto out_nogmap;
2c70fe44 304 kvm->arch.gmap->private = kvm;
24eb3a82 305 kvm->arch.gmap->pfault_enabled = 0;
e08b9637 306 }
fa6b7fe9
CH
307
308 kvm->arch.css_support = 0;
84223598 309 kvm->arch.use_irqchip = 0;
fa6b7fe9 310
d89f5eff 311 return 0;
598841ca
CO
312out_nogmap:
313 debug_unregister(kvm->arch.dbf);
b0c632db
HC
314out_nodbf:
315 free_page((unsigned long)(kvm->arch.sca));
d89f5eff
JK
316out_err:
317 return rc;
b0c632db
HC
318}
319
d329c035
CB
320void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
321{
322 VCPU_EVENT(vcpu, 3, "%s", "free cpu");
ade38c31 323 trace_kvm_s390_destroy_vcpu(vcpu->vcpu_id);
3c038e6b 324 kvm_clear_async_pf_completion_queue(vcpu);
58f9460b
CO
325 if (!kvm_is_ucontrol(vcpu->kvm)) {
326 clear_bit(63 - vcpu->vcpu_id,
327 (unsigned long *) &vcpu->kvm->arch.sca->mcn);
328 if (vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sda ==
329 (__u64) vcpu->arch.sie_block)
330 vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sda = 0;
331 }
abf4a71e 332 smp_mb();
27e0393f
CO
333
334 if (kvm_is_ucontrol(vcpu->kvm))
335 gmap_free(vcpu->arch.gmap);
336
b31288fa
KW
337 if (vcpu->arch.sie_block->cbrlo)
338 __free_page(__pfn_to_page(
339 vcpu->arch.sie_block->cbrlo >> PAGE_SHIFT));
d329c035 340 free_page((unsigned long)(vcpu->arch.sie_block));
b31288fa 341
6692cef3 342 kvm_vcpu_uninit(vcpu);
b110feaf 343 kmem_cache_free(kvm_vcpu_cache, vcpu);
d329c035
CB
344}
345
346static void kvm_free_vcpus(struct kvm *kvm)
347{
348 unsigned int i;
988a2cae 349 struct kvm_vcpu *vcpu;
d329c035 350
988a2cae
GN
351 kvm_for_each_vcpu(i, vcpu, kvm)
352 kvm_arch_vcpu_destroy(vcpu);
353
354 mutex_lock(&kvm->lock);
355 for (i = 0; i < atomic_read(&kvm->online_vcpus); i++)
356 kvm->vcpus[i] = NULL;
357
358 atomic_set(&kvm->online_vcpus, 0);
359 mutex_unlock(&kvm->lock);
d329c035
CB
360}
361
ad8ba2cd
SY
362void kvm_arch_sync_events(struct kvm *kvm)
363{
364}
365
b0c632db
HC
366void kvm_arch_destroy_vm(struct kvm *kvm)
367{
d329c035 368 kvm_free_vcpus(kvm);
b0c632db 369 free_page((unsigned long)(kvm->arch.sca));
d329c035 370 debug_unregister(kvm->arch.dbf);
27e0393f
CO
371 if (!kvm_is_ucontrol(kvm))
372 gmap_free(kvm->arch.gmap);
841b91c5 373 kvm_s390_destroy_adapters(kvm);
b0c632db
HC
374}
375
376/* Section: vcpu related */
377int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu)
378{
3c038e6b
DD
379 vcpu->arch.pfault_token = KVM_S390_PFAULT_TOKEN_INVALID;
380 kvm_clear_async_pf_completion_queue(vcpu);
27e0393f
CO
381 if (kvm_is_ucontrol(vcpu->kvm)) {
382 vcpu->arch.gmap = gmap_alloc(current->mm);
383 if (!vcpu->arch.gmap)
384 return -ENOMEM;
2c70fe44 385 vcpu->arch.gmap->private = vcpu->kvm;
27e0393f
CO
386 return 0;
387 }
388
598841ca 389 vcpu->arch.gmap = vcpu->kvm->arch.gmap;
59674c1a
CB
390 vcpu->run->kvm_valid_regs = KVM_SYNC_PREFIX |
391 KVM_SYNC_GPRS |
9eed0735
CB
392 KVM_SYNC_ACRS |
393 KVM_SYNC_CRS;
b0c632db
HC
394 return 0;
395}
396
397void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu)
398{
6692cef3 399 /* Nothing todo */
b0c632db
HC
400}
401
402void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
403{
4725c860
MS
404 save_fp_ctl(&vcpu->arch.host_fpregs.fpc);
405 save_fp_regs(vcpu->arch.host_fpregs.fprs);
b0c632db 406 save_access_regs(vcpu->arch.host_acrs);
4725c860
MS
407 restore_fp_ctl(&vcpu->arch.guest_fpregs.fpc);
408 restore_fp_regs(vcpu->arch.guest_fpregs.fprs);
59674c1a 409 restore_access_regs(vcpu->run->s.regs.acrs);
480e5926 410 gmap_enable(vcpu->arch.gmap);
9e6dabef 411 atomic_set_mask(CPUSTAT_RUNNING, &vcpu->arch.sie_block->cpuflags);
b0c632db
HC
412}
413
414void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
415{
9e6dabef 416 atomic_clear_mask(CPUSTAT_RUNNING, &vcpu->arch.sie_block->cpuflags);
480e5926 417 gmap_disable(vcpu->arch.gmap);
4725c860
MS
418 save_fp_ctl(&vcpu->arch.guest_fpregs.fpc);
419 save_fp_regs(vcpu->arch.guest_fpregs.fprs);
59674c1a 420 save_access_regs(vcpu->run->s.regs.acrs);
4725c860
MS
421 restore_fp_ctl(&vcpu->arch.host_fpregs.fpc);
422 restore_fp_regs(vcpu->arch.host_fpregs.fprs);
b0c632db
HC
423 restore_access_regs(vcpu->arch.host_acrs);
424}
425
426static void kvm_s390_vcpu_initial_reset(struct kvm_vcpu *vcpu)
427{
428 /* this equals initial cpu reset in pop, but we don't switch to ESA */
429 vcpu->arch.sie_block->gpsw.mask = 0UL;
430 vcpu->arch.sie_block->gpsw.addr = 0UL;
8d26cf7b 431 kvm_s390_set_prefix(vcpu, 0);
b0c632db
HC
432 vcpu->arch.sie_block->cputm = 0UL;
433 vcpu->arch.sie_block->ckc = 0UL;
434 vcpu->arch.sie_block->todpr = 0;
435 memset(vcpu->arch.sie_block->gcr, 0, 16 * sizeof(__u64));
436 vcpu->arch.sie_block->gcr[0] = 0xE0UL;
437 vcpu->arch.sie_block->gcr[14] = 0xC2000000UL;
438 vcpu->arch.guest_fpregs.fpc = 0;
439 asm volatile("lfpc %0" : : "Q" (vcpu->arch.guest_fpregs.fpc));
440 vcpu->arch.sie_block->gbea = 1;
672550fb 441 vcpu->arch.sie_block->pp = 0;
3c038e6b
DD
442 vcpu->arch.pfault_token = KVM_S390_PFAULT_TOKEN_INVALID;
443 kvm_clear_async_pf_completion_queue(vcpu);
61bde82c 444 atomic_set_mask(CPUSTAT_STOPPED, &vcpu->arch.sie_block->cpuflags);
2ed10cc1 445 kvm_s390_clear_local_irqs(vcpu);
b0c632db
HC
446}
447
42897d86
MT
448int kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu)
449{
450 return 0;
451}
452
b0c632db
HC
453int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
454{
b31288fa
KW
455 struct page *cbrl;
456
9e6dabef
CH
457 atomic_set(&vcpu->arch.sie_block->cpuflags, CPUSTAT_ZARCH |
458 CPUSTAT_SM |
69d0d3a3
CB
459 CPUSTAT_STOPPED |
460 CPUSTAT_GED);
fc34531d 461 vcpu->arch.sie_block->ecb = 6;
7feb6bb8
MM
462 if (test_vfacility(50) && test_vfacility(73))
463 vcpu->arch.sie_block->ecb |= 0x10;
464
69d0d3a3 465 vcpu->arch.sie_block->ecb2 = 8;
b0c632db 466 vcpu->arch.sie_block->eca = 0xC1002001U;
78c4b59f 467 vcpu->arch.sie_block->fac = (int) (long) vfacilities;
b31288fa
KW
468 if (kvm_enabled_cmma()) {
469 cbrl = alloc_page(GFP_KERNEL | __GFP_ZERO);
470 if (cbrl) {
471 vcpu->arch.sie_block->ecb2 |= 0x80;
472 vcpu->arch.sie_block->ecb2 &= ~0x08;
473 vcpu->arch.sie_block->cbrlo = page_to_phys(cbrl);
474 }
475 }
ca872302
CB
476 hrtimer_init(&vcpu->arch.ckc_timer, CLOCK_REALTIME, HRTIMER_MODE_ABS);
477 tasklet_init(&vcpu->arch.tasklet, kvm_s390_tasklet,
478 (unsigned long) vcpu);
479 vcpu->arch.ckc_timer.function = kvm_s390_idle_wakeup;
453423dc 480 get_cpu_id(&vcpu->arch.cpu_id);
92e6ecf3 481 vcpu->arch.cpu_id.version = 0xff;
b0c632db
HC
482 return 0;
483}
484
485struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm,
486 unsigned int id)
487{
4d47555a 488 struct kvm_vcpu *vcpu;
7feb6bb8 489 struct sie_page *sie_page;
4d47555a
CO
490 int rc = -EINVAL;
491
492 if (id >= KVM_MAX_VCPUS)
493 goto out;
494
495 rc = -ENOMEM;
b0c632db 496
b110feaf 497 vcpu = kmem_cache_zalloc(kvm_vcpu_cache, GFP_KERNEL);
b0c632db 498 if (!vcpu)
4d47555a 499 goto out;
b0c632db 500
7feb6bb8
MM
501 sie_page = (struct sie_page *) get_zeroed_page(GFP_KERNEL);
502 if (!sie_page)
b0c632db
HC
503 goto out_free_cpu;
504
7feb6bb8
MM
505 vcpu->arch.sie_block = &sie_page->sie_block;
506 vcpu->arch.sie_block->itdba = (unsigned long) &sie_page->itdb;
507
b0c632db 508 vcpu->arch.sie_block->icpua = id;
58f9460b
CO
509 if (!kvm_is_ucontrol(kvm)) {
510 if (!kvm->arch.sca) {
511 WARN_ON_ONCE(1);
512 goto out_free_cpu;
513 }
514 if (!kvm->arch.sca->cpu[id].sda)
515 kvm->arch.sca->cpu[id].sda =
516 (__u64) vcpu->arch.sie_block;
517 vcpu->arch.sie_block->scaoh =
518 (__u32)(((__u64)kvm->arch.sca) >> 32);
519 vcpu->arch.sie_block->scaol = (__u32)(__u64)kvm->arch.sca;
520 set_bit(63 - id, (unsigned long *) &kvm->arch.sca->mcn);
521 }
b0c632db 522
ba5c1e9b
CO
523 spin_lock_init(&vcpu->arch.local_int.lock);
524 INIT_LIST_HEAD(&vcpu->arch.local_int.list);
525 vcpu->arch.local_int.float_int = &kvm->arch.float_int;
d0321a24 526 vcpu->arch.local_int.wq = &vcpu->wq;
5288fbf0 527 vcpu->arch.local_int.cpuflags = &vcpu->arch.sie_block->cpuflags;
ba5c1e9b 528
b0c632db
HC
529 rc = kvm_vcpu_init(vcpu, kvm, id);
530 if (rc)
7b06bf2f 531 goto out_free_sie_block;
b0c632db
HC
532 VM_EVENT(kvm, 3, "create cpu %d at %p, sie block at %p", id, vcpu,
533 vcpu->arch.sie_block);
ade38c31 534 trace_kvm_s390_create_vcpu(id, vcpu, vcpu->arch.sie_block);
b0c632db 535
b0c632db 536 return vcpu;
7b06bf2f
WY
537out_free_sie_block:
538 free_page((unsigned long)(vcpu->arch.sie_block));
b0c632db 539out_free_cpu:
b110feaf 540 kmem_cache_free(kvm_vcpu_cache, vcpu);
4d47555a 541out:
b0c632db
HC
542 return ERR_PTR(rc);
543}
544
b0c632db
HC
545int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu)
546{
f87618e8 547 return kvm_cpu_has_interrupt(vcpu);
b0c632db
HC
548}
549
49b99e1e
CB
550void s390_vcpu_block(struct kvm_vcpu *vcpu)
551{
552 atomic_set_mask(PROG_BLOCK_SIE, &vcpu->arch.sie_block->prog20);
553}
554
555void s390_vcpu_unblock(struct kvm_vcpu *vcpu)
556{
557 atomic_clear_mask(PROG_BLOCK_SIE, &vcpu->arch.sie_block->prog20);
558}
559
560/*
561 * Kick a guest cpu out of SIE and wait until SIE is not running.
562 * If the CPU is not running (e.g. waiting as idle) the function will
563 * return immediately. */
564void exit_sie(struct kvm_vcpu *vcpu)
565{
566 atomic_set_mask(CPUSTAT_STOP_INT, &vcpu->arch.sie_block->cpuflags);
567 while (vcpu->arch.sie_block->prog0c & PROG_IN_SIE)
568 cpu_relax();
569}
570
571/* Kick a guest cpu out of SIE and prevent SIE-reentry */
572void exit_sie_sync(struct kvm_vcpu *vcpu)
573{
574 s390_vcpu_block(vcpu);
575 exit_sie(vcpu);
576}
577
2c70fe44
CB
578static void kvm_gmap_notifier(struct gmap *gmap, unsigned long address)
579{
580 int i;
581 struct kvm *kvm = gmap->private;
582 struct kvm_vcpu *vcpu;
583
584 kvm_for_each_vcpu(i, vcpu, kvm) {
585 /* match against both prefix pages */
586 if (vcpu->arch.sie_block->prefix == (address & ~0x1000UL)) {
587 VCPU_EVENT(vcpu, 2, "gmap notifier for %lx", address);
588 kvm_make_request(KVM_REQ_MMU_RELOAD, vcpu);
589 exit_sie_sync(vcpu);
590 }
591 }
592}
593
b6d33834
CD
594int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu)
595{
596 /* kvm common code refers to this, but never calls it */
597 BUG();
598 return 0;
599}
600
14eebd91
CO
601static int kvm_arch_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu,
602 struct kvm_one_reg *reg)
603{
604 int r = -EINVAL;
605
606 switch (reg->id) {
29b7c71b
CO
607 case KVM_REG_S390_TODPR:
608 r = put_user(vcpu->arch.sie_block->todpr,
609 (u32 __user *)reg->addr);
610 break;
611 case KVM_REG_S390_EPOCHDIFF:
612 r = put_user(vcpu->arch.sie_block->epoch,
613 (u64 __user *)reg->addr);
614 break;
46a6dd1c
J
615 case KVM_REG_S390_CPU_TIMER:
616 r = put_user(vcpu->arch.sie_block->cputm,
617 (u64 __user *)reg->addr);
618 break;
619 case KVM_REG_S390_CLOCK_COMP:
620 r = put_user(vcpu->arch.sie_block->ckc,
621 (u64 __user *)reg->addr);
622 break;
536336c2
DD
623 case KVM_REG_S390_PFTOKEN:
624 r = put_user(vcpu->arch.pfault_token,
625 (u64 __user *)reg->addr);
626 break;
627 case KVM_REG_S390_PFCOMPARE:
628 r = put_user(vcpu->arch.pfault_compare,
629 (u64 __user *)reg->addr);
630 break;
631 case KVM_REG_S390_PFSELECT:
632 r = put_user(vcpu->arch.pfault_select,
633 (u64 __user *)reg->addr);
634 break;
672550fb
CB
635 case KVM_REG_S390_PP:
636 r = put_user(vcpu->arch.sie_block->pp,
637 (u64 __user *)reg->addr);
638 break;
afa45ff5
CB
639 case KVM_REG_S390_GBEA:
640 r = put_user(vcpu->arch.sie_block->gbea,
641 (u64 __user *)reg->addr);
642 break;
14eebd91
CO
643 default:
644 break;
645 }
646
647 return r;
648}
649
650static int kvm_arch_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu,
651 struct kvm_one_reg *reg)
652{
653 int r = -EINVAL;
654
655 switch (reg->id) {
29b7c71b
CO
656 case KVM_REG_S390_TODPR:
657 r = get_user(vcpu->arch.sie_block->todpr,
658 (u32 __user *)reg->addr);
659 break;
660 case KVM_REG_S390_EPOCHDIFF:
661 r = get_user(vcpu->arch.sie_block->epoch,
662 (u64 __user *)reg->addr);
663 break;
46a6dd1c
J
664 case KVM_REG_S390_CPU_TIMER:
665 r = get_user(vcpu->arch.sie_block->cputm,
666 (u64 __user *)reg->addr);
667 break;
668 case KVM_REG_S390_CLOCK_COMP:
669 r = get_user(vcpu->arch.sie_block->ckc,
670 (u64 __user *)reg->addr);
671 break;
536336c2
DD
672 case KVM_REG_S390_PFTOKEN:
673 r = get_user(vcpu->arch.pfault_token,
674 (u64 __user *)reg->addr);
675 break;
676 case KVM_REG_S390_PFCOMPARE:
677 r = get_user(vcpu->arch.pfault_compare,
678 (u64 __user *)reg->addr);
679 break;
680 case KVM_REG_S390_PFSELECT:
681 r = get_user(vcpu->arch.pfault_select,
682 (u64 __user *)reg->addr);
683 break;
672550fb
CB
684 case KVM_REG_S390_PP:
685 r = get_user(vcpu->arch.sie_block->pp,
686 (u64 __user *)reg->addr);
687 break;
afa45ff5
CB
688 case KVM_REG_S390_GBEA:
689 r = get_user(vcpu->arch.sie_block->gbea,
690 (u64 __user *)reg->addr);
691 break;
14eebd91
CO
692 default:
693 break;
694 }
695
696 return r;
697}
b6d33834 698
b0c632db
HC
699static int kvm_arch_vcpu_ioctl_initial_reset(struct kvm_vcpu *vcpu)
700{
b0c632db 701 kvm_s390_vcpu_initial_reset(vcpu);
b0c632db
HC
702 return 0;
703}
704
705int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
706{
5a32c1af 707 memcpy(&vcpu->run->s.regs.gprs, &regs->gprs, sizeof(regs->gprs));
b0c632db
HC
708 return 0;
709}
710
711int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
712{
5a32c1af 713 memcpy(&regs->gprs, &vcpu->run->s.regs.gprs, sizeof(regs->gprs));
b0c632db
HC
714 return 0;
715}
716
717int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
718 struct kvm_sregs *sregs)
719{
59674c1a 720 memcpy(&vcpu->run->s.regs.acrs, &sregs->acrs, sizeof(sregs->acrs));
b0c632db 721 memcpy(&vcpu->arch.sie_block->gcr, &sregs->crs, sizeof(sregs->crs));
59674c1a 722 restore_access_regs(vcpu->run->s.regs.acrs);
b0c632db
HC
723 return 0;
724}
725
726int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,
727 struct kvm_sregs *sregs)
728{
59674c1a 729 memcpy(&sregs->acrs, &vcpu->run->s.regs.acrs, sizeof(sregs->acrs));
b0c632db 730 memcpy(&sregs->crs, &vcpu->arch.sie_block->gcr, sizeof(sregs->crs));
b0c632db
HC
731 return 0;
732}
733
734int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
735{
4725c860
MS
736 if (test_fp_ctl(fpu->fpc))
737 return -EINVAL;
b0c632db 738 memcpy(&vcpu->arch.guest_fpregs.fprs, &fpu->fprs, sizeof(fpu->fprs));
4725c860
MS
739 vcpu->arch.guest_fpregs.fpc = fpu->fpc;
740 restore_fp_ctl(&vcpu->arch.guest_fpregs.fpc);
741 restore_fp_regs(vcpu->arch.guest_fpregs.fprs);
b0c632db
HC
742 return 0;
743}
744
745int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
746{
b0c632db
HC
747 memcpy(&fpu->fprs, &vcpu->arch.guest_fpregs.fprs, sizeof(fpu->fprs));
748 fpu->fpc = vcpu->arch.guest_fpregs.fpc;
b0c632db
HC
749 return 0;
750}
751
752static int kvm_arch_vcpu_ioctl_set_initial_psw(struct kvm_vcpu *vcpu, psw_t psw)
753{
754 int rc = 0;
755
9e6dabef 756 if (!(atomic_read(&vcpu->arch.sie_block->cpuflags) & CPUSTAT_STOPPED))
b0c632db 757 rc = -EBUSY;
d7b0b5eb
CO
758 else {
759 vcpu->run->psw_mask = psw.mask;
760 vcpu->run->psw_addr = psw.addr;
761 }
b0c632db
HC
762 return rc;
763}
764
765int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu,
766 struct kvm_translation *tr)
767{
768 return -EINVAL; /* not implemented yet */
769}
770
d0bfb940
JK
771int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
772 struct kvm_guest_debug *dbg)
b0c632db
HC
773{
774 return -EINVAL; /* not implemented yet */
775}
776
62d9f0db
MT
777int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu,
778 struct kvm_mp_state *mp_state)
779{
780 return -EINVAL; /* not implemented yet */
781}
782
783int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,
784 struct kvm_mp_state *mp_state)
785{
786 return -EINVAL; /* not implemented yet */
787}
788
2c70fe44
CB
789static int kvm_s390_handle_requests(struct kvm_vcpu *vcpu)
790{
791 /*
792 * We use MMU_RELOAD just to re-arm the ipte notifier for the
793 * guest prefix page. gmap_ipte_notify will wait on the ptl lock.
794 * This ensures that the ipte instruction for this request has
795 * already finished. We might race against a second unmapper that
796 * wants to set the blocking bit. Lets just retry the request loop.
797 */
798 while (kvm_check_request(KVM_REQ_MMU_RELOAD, vcpu)) {
799 int rc;
800 rc = gmap_ipte_notify(vcpu->arch.gmap,
801 vcpu->arch.sie_block->prefix,
802 PAGE_SIZE * 2);
803 if (rc)
804 return rc;
805 s390_vcpu_unblock(vcpu);
806 }
807 return 0;
808}
809
24eb3a82
DD
810static long kvm_arch_fault_in_sync(struct kvm_vcpu *vcpu)
811{
812 long rc;
813 hva_t fault = gmap_fault(current->thread.gmap_addr, vcpu->arch.gmap);
814 struct mm_struct *mm = current->mm;
815 down_read(&mm->mmap_sem);
816 rc = get_user_pages(current, mm, fault, 1, 1, 0, NULL, NULL);
817 up_read(&mm->mmap_sem);
818 return rc;
819}
820
3c038e6b
DD
821static void __kvm_inject_pfault_token(struct kvm_vcpu *vcpu, bool start_token,
822 unsigned long token)
823{
824 struct kvm_s390_interrupt inti;
825 inti.parm64 = token;
826
827 if (start_token) {
828 inti.type = KVM_S390_INT_PFAULT_INIT;
829 WARN_ON_ONCE(kvm_s390_inject_vcpu(vcpu, &inti));
830 } else {
831 inti.type = KVM_S390_INT_PFAULT_DONE;
832 WARN_ON_ONCE(kvm_s390_inject_vm(vcpu->kvm, &inti));
833 }
834}
835
836void kvm_arch_async_page_not_present(struct kvm_vcpu *vcpu,
837 struct kvm_async_pf *work)
838{
839 trace_kvm_s390_pfault_init(vcpu, work->arch.pfault_token);
840 __kvm_inject_pfault_token(vcpu, true, work->arch.pfault_token);
841}
842
843void kvm_arch_async_page_present(struct kvm_vcpu *vcpu,
844 struct kvm_async_pf *work)
845{
846 trace_kvm_s390_pfault_done(vcpu, work->arch.pfault_token);
847 __kvm_inject_pfault_token(vcpu, false, work->arch.pfault_token);
848}
849
850void kvm_arch_async_page_ready(struct kvm_vcpu *vcpu,
851 struct kvm_async_pf *work)
852{
853 /* s390 will always inject the page directly */
854}
855
856bool kvm_arch_can_inject_async_page_present(struct kvm_vcpu *vcpu)
857{
858 /*
859 * s390 will always inject the page directly,
860 * but we still want check_async_completion to cleanup
861 */
862 return true;
863}
864
865static int kvm_arch_setup_async_pf(struct kvm_vcpu *vcpu)
866{
867 hva_t hva;
868 struct kvm_arch_async_pf arch;
869 int rc;
870
871 if (vcpu->arch.pfault_token == KVM_S390_PFAULT_TOKEN_INVALID)
872 return 0;
873 if ((vcpu->arch.sie_block->gpsw.mask & vcpu->arch.pfault_select) !=
874 vcpu->arch.pfault_compare)
875 return 0;
876 if (psw_extint_disabled(vcpu))
877 return 0;
878 if (kvm_cpu_has_interrupt(vcpu))
879 return 0;
880 if (!(vcpu->arch.sie_block->gcr[0] & 0x200ul))
881 return 0;
882 if (!vcpu->arch.gmap->pfault_enabled)
883 return 0;
884
885 hva = gmap_fault(current->thread.gmap_addr, vcpu->arch.gmap);
886 if (copy_from_guest(vcpu, &arch.pfault_token, vcpu->arch.pfault_token, 8))
887 return 0;
888
889 rc = kvm_setup_async_pf(vcpu, current->thread.gmap_addr, hva, &arch);
890 return rc;
891}
892
3fb4c40f 893static int vcpu_pre_run(struct kvm_vcpu *vcpu)
b0c632db 894{
3fb4c40f 895 int rc, cpuflags;
e168bf8d 896
3c038e6b
DD
897 /*
898 * On s390 notifications for arriving pages will be delivered directly
899 * to the guest but the house keeping for completed pfaults is
900 * handled outside the worker.
901 */
902 kvm_check_async_pf_completion(vcpu);
903
5a32c1af 904 memcpy(&vcpu->arch.sie_block->gg14, &vcpu->run->s.regs.gprs[14], 16);
b0c632db
HC
905
906 if (need_resched())
907 schedule();
908
71cde587
CB
909 if (test_thread_flag(TIF_MCCK_PENDING))
910 s390_handle_mcck();
911
d6b6d166
CO
912 if (!kvm_is_ucontrol(vcpu->kvm))
913 kvm_s390_deliver_pending_interrupts(vcpu);
0ff31867 914
2c70fe44
CB
915 rc = kvm_s390_handle_requests(vcpu);
916 if (rc)
917 return rc;
918
b0c632db 919 vcpu->arch.sie_block->icptcode = 0;
3fb4c40f
TH
920 cpuflags = atomic_read(&vcpu->arch.sie_block->cpuflags);
921 VCPU_EVENT(vcpu, 6, "entering sie flags %x", cpuflags);
922 trace_kvm_s390_sie_enter(vcpu, cpuflags);
2b29a9fd 923
3fb4c40f
TH
924 return 0;
925}
926
927static int vcpu_post_run(struct kvm_vcpu *vcpu, int exit_reason)
928{
24eb3a82 929 int rc = -1;
2b29a9fd
DD
930
931 VCPU_EVENT(vcpu, 6, "exit sie icptcode %d",
932 vcpu->arch.sie_block->icptcode);
933 trace_kvm_s390_sie_exit(vcpu, vcpu->arch.sie_block->icptcode);
934
3fb4c40f 935 if (exit_reason >= 0) {
7c470539 936 rc = 0;
210b1607
TH
937 } else if (kvm_is_ucontrol(vcpu->kvm)) {
938 vcpu->run->exit_reason = KVM_EXIT_S390_UCONTROL;
939 vcpu->run->s390_ucontrol.trans_exc_code =
940 current->thread.gmap_addr;
941 vcpu->run->s390_ucontrol.pgm_code = 0x10;
942 rc = -EREMOTE;
24eb3a82
DD
943
944 } else if (current->thread.gmap_pfault) {
3c038e6b 945 trace_kvm_s390_major_guest_pfault(vcpu);
24eb3a82 946 current->thread.gmap_pfault = 0;
3c038e6b
DD
947 if (kvm_arch_setup_async_pf(vcpu) ||
948 (kvm_arch_fault_in_sync(vcpu) >= 0))
24eb3a82
DD
949 rc = 0;
950 }
951
952 if (rc == -1) {
699bde3b
CB
953 VCPU_EVENT(vcpu, 3, "%s", "fault in sie instruction");
954 trace_kvm_s390_sie_fault(vcpu);
955 rc = kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
1f0d0f09 956 }
b0c632db 957
5a32c1af 958 memcpy(&vcpu->run->s.regs.gprs[14], &vcpu->arch.sie_block->gg14, 16);
3fb4c40f 959
a76ccff6
TH
960 if (rc == 0) {
961 if (kvm_is_ucontrol(vcpu->kvm))
2955c83f
CB
962 /* Don't exit for host interrupts. */
963 rc = vcpu->arch.sie_block->icptcode ? -EOPNOTSUPP : 0;
a76ccff6
TH
964 else
965 rc = kvm_handle_sie_intercept(vcpu);
966 }
967
3fb4c40f
TH
968 return rc;
969}
970
b31288fa
KW
971bool kvm_enabled_cmma(void)
972{
973 if (!MACHINE_IS_LPAR)
974 return false;
975 /* only enable for z10 and later */
976 if (!MACHINE_HAS_EDAT1)
977 return false;
978 return true;
979}
980
3fb4c40f
TH
981static int __vcpu_run(struct kvm_vcpu *vcpu)
982{
983 int rc, exit_reason;
984
800c1065
TH
985 /*
986 * We try to hold kvm->srcu during most of vcpu_run (except when run-
987 * ning the guest), so that memslots (and other stuff) are protected
988 */
989 vcpu->srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
990
a76ccff6
TH
991 do {
992 rc = vcpu_pre_run(vcpu);
993 if (rc)
994 break;
3fb4c40f 995
800c1065 996 srcu_read_unlock(&vcpu->kvm->srcu, vcpu->srcu_idx);
a76ccff6
TH
997 /*
998 * As PF_VCPU will be used in fault handler, between
999 * guest_enter and guest_exit should be no uaccess.
1000 */
1001 preempt_disable();
1002 kvm_guest_enter();
1003 preempt_enable();
1004 exit_reason = sie64a(vcpu->arch.sie_block,
1005 vcpu->run->s.regs.gprs);
1006 kvm_guest_exit();
800c1065 1007 vcpu->srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
a76ccff6
TH
1008
1009 rc = vcpu_post_run(vcpu, exit_reason);
1010 } while (!signal_pending(current) && !rc);
3fb4c40f 1011
800c1065 1012 srcu_read_unlock(&vcpu->kvm->srcu, vcpu->srcu_idx);
e168bf8d 1013 return rc;
b0c632db
HC
1014}
1015
1016int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
1017{
8f2abe6a 1018 int rc;
b0c632db
HC
1019 sigset_t sigsaved;
1020
b0c632db
HC
1021 if (vcpu->sigset_active)
1022 sigprocmask(SIG_SETMASK, &vcpu->sigset, &sigsaved);
1023
9e6dabef 1024 atomic_clear_mask(CPUSTAT_STOPPED, &vcpu->arch.sie_block->cpuflags);
b0c632db 1025
8f2abe6a
CB
1026 switch (kvm_run->exit_reason) {
1027 case KVM_EXIT_S390_SIEIC:
8f2abe6a 1028 case KVM_EXIT_UNKNOWN:
9ace903d 1029 case KVM_EXIT_INTR:
8f2abe6a 1030 case KVM_EXIT_S390_RESET:
e168bf8d 1031 case KVM_EXIT_S390_UCONTROL:
fa6b7fe9 1032 case KVM_EXIT_S390_TSCH:
8f2abe6a
CB
1033 break;
1034 default:
1035 BUG();
1036 }
1037
d7b0b5eb
CO
1038 vcpu->arch.sie_block->gpsw.mask = kvm_run->psw_mask;
1039 vcpu->arch.sie_block->gpsw.addr = kvm_run->psw_addr;
60b413c9
CB
1040 if (kvm_run->kvm_dirty_regs & KVM_SYNC_PREFIX) {
1041 kvm_run->kvm_dirty_regs &= ~KVM_SYNC_PREFIX;
1042 kvm_s390_set_prefix(vcpu, kvm_run->s.regs.prefix);
1043 }
9eed0735
CB
1044 if (kvm_run->kvm_dirty_regs & KVM_SYNC_CRS) {
1045 kvm_run->kvm_dirty_regs &= ~KVM_SYNC_CRS;
1046 memcpy(&vcpu->arch.sie_block->gcr, &kvm_run->s.regs.crs, 128);
1047 kvm_s390_set_prefix(vcpu, kvm_run->s.regs.prefix);
1048 }
d7b0b5eb 1049
dab4079d 1050 might_fault();
a76ccff6 1051 rc = __vcpu_run(vcpu);
9ace903d 1052
b1d16c49
CE
1053 if (signal_pending(current) && !rc) {
1054 kvm_run->exit_reason = KVM_EXIT_INTR;
8f2abe6a 1055 rc = -EINTR;
b1d16c49 1056 }
8f2abe6a 1057
b8e660b8 1058 if (rc == -EOPNOTSUPP) {
8f2abe6a
CB
1059 /* intercept cannot be handled in-kernel, prepare kvm-run */
1060 kvm_run->exit_reason = KVM_EXIT_S390_SIEIC;
1061 kvm_run->s390_sieic.icptcode = vcpu->arch.sie_block->icptcode;
8f2abe6a
CB
1062 kvm_run->s390_sieic.ipa = vcpu->arch.sie_block->ipa;
1063 kvm_run->s390_sieic.ipb = vcpu->arch.sie_block->ipb;
1064 rc = 0;
1065 }
1066
1067 if (rc == -EREMOTE) {
1068 /* intercept was handled, but userspace support is needed
1069 * kvm_run has been prepared by the handler */
1070 rc = 0;
1071 }
b0c632db 1072
d7b0b5eb
CO
1073 kvm_run->psw_mask = vcpu->arch.sie_block->gpsw.mask;
1074 kvm_run->psw_addr = vcpu->arch.sie_block->gpsw.addr;
60b413c9 1075 kvm_run->s.regs.prefix = vcpu->arch.sie_block->prefix;
9eed0735 1076 memcpy(&kvm_run->s.regs.crs, &vcpu->arch.sie_block->gcr, 128);
d7b0b5eb 1077
b0c632db
HC
1078 if (vcpu->sigset_active)
1079 sigprocmask(SIG_SETMASK, &sigsaved, NULL);
1080
b0c632db 1081 vcpu->stat.exit_userspace++;
7e8e6ab4 1082 return rc;
b0c632db
HC
1083}
1084
092670cd 1085static int __guestcopy(struct kvm_vcpu *vcpu, u64 guestdest, void *from,
b0c632db
HC
1086 unsigned long n, int prefix)
1087{
1088 if (prefix)
1089 return copy_to_guest(vcpu, guestdest, from, n);
1090 else
1091 return copy_to_guest_absolute(vcpu, guestdest, from, n);
1092}
1093
1094/*
1095 * store status at address
1096 * we use have two special cases:
1097 * KVM_S390_STORE_STATUS_NOADDR: -> 0x1200 on 64 bit
1098 * KVM_S390_STORE_STATUS_PREFIXED: -> prefix
1099 */
e879892c 1100int kvm_s390_store_status_unloaded(struct kvm_vcpu *vcpu, unsigned long addr)
b0c632db 1101{
092670cd 1102 unsigned char archmode = 1;
b0c632db 1103 int prefix;
178bd789 1104 u64 clkcomp;
b0c632db
HC
1105
1106 if (addr == KVM_S390_STORE_STATUS_NOADDR) {
1107 if (copy_to_guest_absolute(vcpu, 163ul, &archmode, 1))
1108 return -EFAULT;
1109 addr = SAVE_AREA_BASE;
1110 prefix = 0;
1111 } else if (addr == KVM_S390_STORE_STATUS_PREFIXED) {
1112 if (copy_to_guest(vcpu, 163ul, &archmode, 1))
1113 return -EFAULT;
1114 addr = SAVE_AREA_BASE;
1115 prefix = 1;
1116 } else
1117 prefix = 0;
1118
f64ca217 1119 if (__guestcopy(vcpu, addr + offsetof(struct save_area, fp_regs),
b0c632db
HC
1120 vcpu->arch.guest_fpregs.fprs, 128, prefix))
1121 return -EFAULT;
1122
f64ca217 1123 if (__guestcopy(vcpu, addr + offsetof(struct save_area, gp_regs),
5a32c1af 1124 vcpu->run->s.regs.gprs, 128, prefix))
b0c632db
HC
1125 return -EFAULT;
1126
f64ca217 1127 if (__guestcopy(vcpu, addr + offsetof(struct save_area, psw),
b0c632db
HC
1128 &vcpu->arch.sie_block->gpsw, 16, prefix))
1129 return -EFAULT;
1130
f64ca217 1131 if (__guestcopy(vcpu, addr + offsetof(struct save_area, pref_reg),
b0c632db
HC
1132 &vcpu->arch.sie_block->prefix, 4, prefix))
1133 return -EFAULT;
1134
1135 if (__guestcopy(vcpu,
f64ca217 1136 addr + offsetof(struct save_area, fp_ctrl_reg),
b0c632db
HC
1137 &vcpu->arch.guest_fpregs.fpc, 4, prefix))
1138 return -EFAULT;
1139
f64ca217 1140 if (__guestcopy(vcpu, addr + offsetof(struct save_area, tod_reg),
b0c632db
HC
1141 &vcpu->arch.sie_block->todpr, 4, prefix))
1142 return -EFAULT;
1143
f64ca217 1144 if (__guestcopy(vcpu, addr + offsetof(struct save_area, timer),
b0c632db
HC
1145 &vcpu->arch.sie_block->cputm, 8, prefix))
1146 return -EFAULT;
1147
178bd789 1148 clkcomp = vcpu->arch.sie_block->ckc >> 8;
f64ca217 1149 if (__guestcopy(vcpu, addr + offsetof(struct save_area, clk_cmp),
178bd789 1150 &clkcomp, 8, prefix))
b0c632db
HC
1151 return -EFAULT;
1152
f64ca217 1153 if (__guestcopy(vcpu, addr + offsetof(struct save_area, acc_regs),
59674c1a 1154 &vcpu->run->s.regs.acrs, 64, prefix))
b0c632db
HC
1155 return -EFAULT;
1156
1157 if (__guestcopy(vcpu,
f64ca217 1158 addr + offsetof(struct save_area, ctrl_regs),
b0c632db
HC
1159 &vcpu->arch.sie_block->gcr, 128, prefix))
1160 return -EFAULT;
1161 return 0;
1162}
1163
e879892c
TH
1164int kvm_s390_vcpu_store_status(struct kvm_vcpu *vcpu, unsigned long addr)
1165{
1166 /*
1167 * The guest FPRS and ACRS are in the host FPRS/ACRS due to the lazy
1168 * copying in vcpu load/put. Lets update our copies before we save
1169 * it into the save area
1170 */
1171 save_fp_ctl(&vcpu->arch.guest_fpregs.fpc);
1172 save_fp_regs(vcpu->arch.guest_fpregs.fprs);
1173 save_access_regs(vcpu->run->s.regs.acrs);
1174
1175 return kvm_s390_store_status_unloaded(vcpu, addr);
1176}
1177
d6712df9
CH
1178static int kvm_vcpu_ioctl_enable_cap(struct kvm_vcpu *vcpu,
1179 struct kvm_enable_cap *cap)
1180{
1181 int r;
1182
1183 if (cap->flags)
1184 return -EINVAL;
1185
1186 switch (cap->cap) {
fa6b7fe9
CH
1187 case KVM_CAP_S390_CSS_SUPPORT:
1188 if (!vcpu->kvm->arch.css_support) {
1189 vcpu->kvm->arch.css_support = 1;
1190 trace_kvm_s390_enable_css(vcpu->kvm);
1191 }
1192 r = 0;
1193 break;
d6712df9
CH
1194 default:
1195 r = -EINVAL;
1196 break;
1197 }
1198 return r;
1199}
1200
b0c632db
HC
1201long kvm_arch_vcpu_ioctl(struct file *filp,
1202 unsigned int ioctl, unsigned long arg)
1203{
1204 struct kvm_vcpu *vcpu = filp->private_data;
1205 void __user *argp = (void __user *)arg;
800c1065 1206 int idx;
bc923cc9 1207 long r;
b0c632db 1208
93736624
AK
1209 switch (ioctl) {
1210 case KVM_S390_INTERRUPT: {
ba5c1e9b
CO
1211 struct kvm_s390_interrupt s390int;
1212
93736624 1213 r = -EFAULT;
ba5c1e9b 1214 if (copy_from_user(&s390int, argp, sizeof(s390int)))
93736624
AK
1215 break;
1216 r = kvm_s390_inject_vcpu(vcpu, &s390int);
1217 break;
ba5c1e9b 1218 }
b0c632db 1219 case KVM_S390_STORE_STATUS:
800c1065 1220 idx = srcu_read_lock(&vcpu->kvm->srcu);
bc923cc9 1221 r = kvm_s390_vcpu_store_status(vcpu, arg);
800c1065 1222 srcu_read_unlock(&vcpu->kvm->srcu, idx);
bc923cc9 1223 break;
b0c632db
HC
1224 case KVM_S390_SET_INITIAL_PSW: {
1225 psw_t psw;
1226
bc923cc9 1227 r = -EFAULT;
b0c632db 1228 if (copy_from_user(&psw, argp, sizeof(psw)))
bc923cc9
AK
1229 break;
1230 r = kvm_arch_vcpu_ioctl_set_initial_psw(vcpu, psw);
1231 break;
b0c632db
HC
1232 }
1233 case KVM_S390_INITIAL_RESET:
bc923cc9
AK
1234 r = kvm_arch_vcpu_ioctl_initial_reset(vcpu);
1235 break;
14eebd91
CO
1236 case KVM_SET_ONE_REG:
1237 case KVM_GET_ONE_REG: {
1238 struct kvm_one_reg reg;
1239 r = -EFAULT;
1240 if (copy_from_user(&reg, argp, sizeof(reg)))
1241 break;
1242 if (ioctl == KVM_SET_ONE_REG)
1243 r = kvm_arch_vcpu_ioctl_set_one_reg(vcpu, &reg);
1244 else
1245 r = kvm_arch_vcpu_ioctl_get_one_reg(vcpu, &reg);
1246 break;
1247 }
27e0393f
CO
1248#ifdef CONFIG_KVM_S390_UCONTROL
1249 case KVM_S390_UCAS_MAP: {
1250 struct kvm_s390_ucas_mapping ucasmap;
1251
1252 if (copy_from_user(&ucasmap, argp, sizeof(ucasmap))) {
1253 r = -EFAULT;
1254 break;
1255 }
1256
1257 if (!kvm_is_ucontrol(vcpu->kvm)) {
1258 r = -EINVAL;
1259 break;
1260 }
1261
1262 r = gmap_map_segment(vcpu->arch.gmap, ucasmap.user_addr,
1263 ucasmap.vcpu_addr, ucasmap.length);
1264 break;
1265 }
1266 case KVM_S390_UCAS_UNMAP: {
1267 struct kvm_s390_ucas_mapping ucasmap;
1268
1269 if (copy_from_user(&ucasmap, argp, sizeof(ucasmap))) {
1270 r = -EFAULT;
1271 break;
1272 }
1273
1274 if (!kvm_is_ucontrol(vcpu->kvm)) {
1275 r = -EINVAL;
1276 break;
1277 }
1278
1279 r = gmap_unmap_segment(vcpu->arch.gmap, ucasmap.vcpu_addr,
1280 ucasmap.length);
1281 break;
1282 }
1283#endif
ccc7910f
CO
1284 case KVM_S390_VCPU_FAULT: {
1285 r = gmap_fault(arg, vcpu->arch.gmap);
1286 if (!IS_ERR_VALUE(r))
1287 r = 0;
1288 break;
1289 }
d6712df9
CH
1290 case KVM_ENABLE_CAP:
1291 {
1292 struct kvm_enable_cap cap;
1293 r = -EFAULT;
1294 if (copy_from_user(&cap, argp, sizeof(cap)))
1295 break;
1296 r = kvm_vcpu_ioctl_enable_cap(vcpu, &cap);
1297 break;
1298 }
b0c632db 1299 default:
3e6afcf1 1300 r = -ENOTTY;
b0c632db 1301 }
bc923cc9 1302 return r;
b0c632db
HC
1303}
1304
5b1c1493
CO
1305int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf)
1306{
1307#ifdef CONFIG_KVM_S390_UCONTROL
1308 if ((vmf->pgoff == KVM_S390_SIE_PAGE_OFFSET)
1309 && (kvm_is_ucontrol(vcpu->kvm))) {
1310 vmf->page = virt_to_page(vcpu->arch.sie_block);
1311 get_page(vmf->page);
1312 return 0;
1313 }
1314#endif
1315 return VM_FAULT_SIGBUS;
1316}
1317
5587027c 1318void kvm_arch_free_memslot(struct kvm *kvm, struct kvm_memory_slot *free,
db3fe4eb
TY
1319 struct kvm_memory_slot *dont)
1320{
1321}
1322
5587027c
AK
1323int kvm_arch_create_memslot(struct kvm *kvm, struct kvm_memory_slot *slot,
1324 unsigned long npages)
db3fe4eb
TY
1325{
1326 return 0;
1327}
1328
e59dbe09
TY
1329void kvm_arch_memslots_updated(struct kvm *kvm)
1330{
1331}
1332
b0c632db 1333/* Section: memory related */
f7784b8e
MT
1334int kvm_arch_prepare_memory_region(struct kvm *kvm,
1335 struct kvm_memory_slot *memslot,
7b6195a9
TY
1336 struct kvm_userspace_memory_region *mem,
1337 enum kvm_mr_change change)
b0c632db 1338{
dd2887e7
NW
1339 /* A few sanity checks. We can have memory slots which have to be
1340 located/ended at a segment boundary (1MB). The memory in userland is
1341 ok to be fragmented into various different vmas. It is okay to mmap()
1342 and munmap() stuff in this slot after doing this call at any time */
b0c632db 1343
598841ca 1344 if (mem->userspace_addr & 0xffffful)
b0c632db
HC
1345 return -EINVAL;
1346
598841ca 1347 if (mem->memory_size & 0xffffful)
b0c632db
HC
1348 return -EINVAL;
1349
f7784b8e
MT
1350 return 0;
1351}
1352
1353void kvm_arch_commit_memory_region(struct kvm *kvm,
1354 struct kvm_userspace_memory_region *mem,
8482644a
TY
1355 const struct kvm_memory_slot *old,
1356 enum kvm_mr_change change)
f7784b8e 1357{
f7850c92 1358 int rc;
f7784b8e 1359
2cef4deb
CB
1360 /* If the basics of the memslot do not change, we do not want
1361 * to update the gmap. Every update causes several unnecessary
1362 * segment translation exceptions. This is usually handled just
1363 * fine by the normal fault handler + gmap, but it will also
1364 * cause faults on the prefix page of running guest CPUs.
1365 */
1366 if (old->userspace_addr == mem->userspace_addr &&
1367 old->base_gfn * PAGE_SIZE == mem->guest_phys_addr &&
1368 old->npages * PAGE_SIZE == mem->memory_size)
1369 return;
598841ca
CO
1370
1371 rc = gmap_map_segment(kvm->arch.gmap, mem->userspace_addr,
1372 mem->guest_phys_addr, mem->memory_size);
1373 if (rc)
f7850c92 1374 printk(KERN_WARNING "kvm-s390: failed to commit memory region\n");
598841ca 1375 return;
b0c632db
HC
1376}
1377
2df72e9b
MT
1378void kvm_arch_flush_shadow_all(struct kvm *kvm)
1379{
1380}
1381
1382void kvm_arch_flush_shadow_memslot(struct kvm *kvm,
1383 struct kvm_memory_slot *slot)
34d4cb8f
MT
1384{
1385}
1386
b0c632db
HC
1387static int __init kvm_s390_init(void)
1388{
ef50f7ac 1389 int ret;
0ee75bea 1390 ret = kvm_init(NULL, sizeof(struct kvm_vcpu), 0, THIS_MODULE);
ef50f7ac
CB
1391 if (ret)
1392 return ret;
1393
1394 /*
1395 * guests can ask for up to 255+1 double words, we need a full page
25985edc 1396 * to hold the maximum amount of facilities. On the other hand, we
ef50f7ac
CB
1397 * only set facilities that are known to work in KVM.
1398 */
78c4b59f
MM
1399 vfacilities = (unsigned long *) get_zeroed_page(GFP_KERNEL|GFP_DMA);
1400 if (!vfacilities) {
ef50f7ac
CB
1401 kvm_exit();
1402 return -ENOMEM;
1403 }
78c4b59f 1404 memcpy(vfacilities, S390_lowcore.stfle_fac_list, 16);
d208c79d 1405 vfacilities[0] &= 0xff82fff3f4fc2000UL;
7feb6bb8 1406 vfacilities[1] &= 0x005c000000000000UL;
ef50f7ac 1407 return 0;
b0c632db
HC
1408}
1409
1410static void __exit kvm_s390_exit(void)
1411{
78c4b59f 1412 free_page((unsigned long) vfacilities);
b0c632db
HC
1413 kvm_exit();
1414}
1415
1416module_init(kvm_s390_init);
1417module_exit(kvm_s390_exit);
566af940
CH
1418
1419/*
1420 * Enable autoloading of the kvm module.
1421 * Note that we add the module alias here instead of virt/kvm/kvm_main.c
1422 * since x86 takes a different approach.
1423 */
1424#include <linux/miscdevice.h>
1425MODULE_ALIAS_MISCDEV(KVM_MINOR);
1426MODULE_ALIAS("devname:kvm");