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