usblp: do not set TASK_INTERRUPTIBLE before lock
[linux/fpc-iii.git] / arch / s390 / kvm / kvm-s390.c
blob698fb826e149d9c8c32f629fdb9d982c07c197db
1 /*
2 * hosting zSeries kernel virtual machines
4 * Copyright IBM Corp. 2008, 2009
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.
10 * Author(s): Carsten Otte <cotte@de.ibm.com>
11 * Christian Borntraeger <borntraeger@de.ibm.com>
12 * Heiko Carstens <heiko.carstens@de.ibm.com>
13 * Christian Ehrhardt <ehrhardt@de.ibm.com>
16 #include <linux/compiler.h>
17 #include <linux/err.h>
18 #include <linux/fs.h>
19 #include <linux/hrtimer.h>
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>
25 #include <linux/timer.h>
26 #include <asm/asm-offsets.h>
27 #include <asm/lowcore.h>
28 #include <asm/pgtable.h>
29 #include <asm/nmi.h>
30 #include <asm/switch_to.h>
31 #include <asm/sclp.h>
32 #include "kvm-s390.h"
33 #include "gaccess.h"
35 #define CREATE_TRACE_POINTS
36 #include "trace.h"
37 #include "trace-s390.h"
39 #define VCPU_STAT(x) offsetof(struct kvm_vcpu, stat.x), KVM_STAT_VCPU
41 struct kvm_stats_debugfs_item debugfs_entries[] = {
42 { "userspace_handled", VCPU_STAT(exit_userspace) },
43 { "exit_null", VCPU_STAT(exit_null) },
44 { "exit_validity", VCPU_STAT(exit_validity) },
45 { "exit_stop_request", VCPU_STAT(exit_stop_request) },
46 { "exit_external_request", VCPU_STAT(exit_external_request) },
47 { "exit_external_interrupt", VCPU_STAT(exit_external_interrupt) },
48 { "exit_instruction", VCPU_STAT(exit_instruction) },
49 { "exit_program_interruption", VCPU_STAT(exit_program_interruption) },
50 { "exit_instr_and_program_int", VCPU_STAT(exit_instr_and_program) },
51 { "instruction_lctlg", VCPU_STAT(instruction_lctlg) },
52 { "instruction_lctl", VCPU_STAT(instruction_lctl) },
53 { "deliver_emergency_signal", VCPU_STAT(deliver_emergency_signal) },
54 { "deliver_external_call", VCPU_STAT(deliver_external_call) },
55 { "deliver_service_signal", VCPU_STAT(deliver_service_signal) },
56 { "deliver_virtio_interrupt", VCPU_STAT(deliver_virtio_interrupt) },
57 { "deliver_stop_signal", VCPU_STAT(deliver_stop_signal) },
58 { "deliver_prefix_signal", VCPU_STAT(deliver_prefix_signal) },
59 { "deliver_restart_signal", VCPU_STAT(deliver_restart_signal) },
60 { "deliver_program_interruption", VCPU_STAT(deliver_program_int) },
61 { "exit_wait_state", VCPU_STAT(exit_wait_state) },
62 { "instruction_stidp", VCPU_STAT(instruction_stidp) },
63 { "instruction_spx", VCPU_STAT(instruction_spx) },
64 { "instruction_stpx", VCPU_STAT(instruction_stpx) },
65 { "instruction_stap", VCPU_STAT(instruction_stap) },
66 { "instruction_storage_key", VCPU_STAT(instruction_storage_key) },
67 { "instruction_stsch", VCPU_STAT(instruction_stsch) },
68 { "instruction_chsc", VCPU_STAT(instruction_chsc) },
69 { "instruction_stsi", VCPU_STAT(instruction_stsi) },
70 { "instruction_stfl", VCPU_STAT(instruction_stfl) },
71 { "instruction_tprot", VCPU_STAT(instruction_tprot) },
72 { "instruction_sigp_sense", VCPU_STAT(instruction_sigp_sense) },
73 { "instruction_sigp_sense_running", VCPU_STAT(instruction_sigp_sense_running) },
74 { "instruction_sigp_external_call", VCPU_STAT(instruction_sigp_external_call) },
75 { "instruction_sigp_emergency", VCPU_STAT(instruction_sigp_emergency) },
76 { "instruction_sigp_stop", VCPU_STAT(instruction_sigp_stop) },
77 { "instruction_sigp_set_arch", VCPU_STAT(instruction_sigp_arch) },
78 { "instruction_sigp_set_prefix", VCPU_STAT(instruction_sigp_prefix) },
79 { "instruction_sigp_restart", VCPU_STAT(instruction_sigp_restart) },
80 { "diagnose_10", VCPU_STAT(diagnose_10) },
81 { "diagnose_44", VCPU_STAT(diagnose_44) },
82 { "diagnose_9c", VCPU_STAT(diagnose_9c) },
83 { NULL }
86 static unsigned long long *facilities;
88 /* Section: not file related */
89 int kvm_arch_hardware_enable(void *garbage)
91 /* every s390 is virtualization enabled ;-) */
92 return 0;
95 void kvm_arch_hardware_disable(void *garbage)
99 int kvm_arch_hardware_setup(void)
101 return 0;
104 void kvm_arch_hardware_unsetup(void)
108 void kvm_arch_check_processor_compat(void *rtn)
112 int kvm_arch_init(void *opaque)
114 return 0;
117 void kvm_arch_exit(void)
121 /* Section: device related */
122 long kvm_arch_dev_ioctl(struct file *filp,
123 unsigned int ioctl, unsigned long arg)
125 if (ioctl == KVM_S390_ENABLE_SIE)
126 return s390_enable_sie();
127 return -EINVAL;
130 int kvm_dev_ioctl_check_extension(long ext)
132 int r;
134 switch (ext) {
135 case KVM_CAP_S390_PSW:
136 case KVM_CAP_S390_GMAP:
137 case KVM_CAP_SYNC_MMU:
138 #ifdef CONFIG_KVM_S390_UCONTROL
139 case KVM_CAP_S390_UCONTROL:
140 #endif
141 case KVM_CAP_SYNC_REGS:
142 case KVM_CAP_ONE_REG:
143 case KVM_CAP_ENABLE_CAP:
144 case KVM_CAP_S390_CSS_SUPPORT:
145 case KVM_CAP_IOEVENTFD:
146 r = 1;
147 break;
148 case KVM_CAP_NR_VCPUS:
149 case KVM_CAP_MAX_VCPUS:
150 r = KVM_MAX_VCPUS;
151 break;
152 case KVM_CAP_NR_MEMSLOTS:
153 r = KVM_USER_MEM_SLOTS;
154 break;
155 case KVM_CAP_S390_COW:
156 r = MACHINE_HAS_ESOP;
157 break;
158 default:
159 r = 0;
161 return r;
164 /* Section: vm related */
166 * Get (and clear) the dirty memory log for a memory slot.
168 int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
169 struct kvm_dirty_log *log)
171 return 0;
174 long kvm_arch_vm_ioctl(struct file *filp,
175 unsigned int ioctl, unsigned long arg)
177 struct kvm *kvm = filp->private_data;
178 void __user *argp = (void __user *)arg;
179 int r;
181 switch (ioctl) {
182 case KVM_S390_INTERRUPT: {
183 struct kvm_s390_interrupt s390int;
185 r = -EFAULT;
186 if (copy_from_user(&s390int, argp, sizeof(s390int)))
187 break;
188 r = kvm_s390_inject_vm(kvm, &s390int);
189 break;
191 default:
192 r = -ENOTTY;
195 return r;
198 int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
200 int rc;
201 char debug_name[16];
203 rc = -EINVAL;
204 #ifdef CONFIG_KVM_S390_UCONTROL
205 if (type & ~KVM_VM_S390_UCONTROL)
206 goto out_err;
207 if ((type & KVM_VM_S390_UCONTROL) && (!capable(CAP_SYS_ADMIN)))
208 goto out_err;
209 #else
210 if (type)
211 goto out_err;
212 #endif
214 rc = s390_enable_sie();
215 if (rc)
216 goto out_err;
218 rc = -ENOMEM;
220 kvm->arch.sca = (struct sca_block *) get_zeroed_page(GFP_KERNEL);
221 if (!kvm->arch.sca)
222 goto out_err;
224 sprintf(debug_name, "kvm-%u", current->pid);
226 kvm->arch.dbf = debug_register(debug_name, 8, 2, 8 * sizeof(long));
227 if (!kvm->arch.dbf)
228 goto out_nodbf;
230 spin_lock_init(&kvm->arch.float_int.lock);
231 INIT_LIST_HEAD(&kvm->arch.float_int.list);
233 debug_register_view(kvm->arch.dbf, &debug_sprintf_view);
234 VM_EVENT(kvm, 3, "%s", "vm created");
236 if (type & KVM_VM_S390_UCONTROL) {
237 kvm->arch.gmap = NULL;
238 } else {
239 kvm->arch.gmap = gmap_alloc(current->mm);
240 if (!kvm->arch.gmap)
241 goto out_nogmap;
244 kvm->arch.css_support = 0;
246 return 0;
247 out_nogmap:
248 debug_unregister(kvm->arch.dbf);
249 out_nodbf:
250 free_page((unsigned long)(kvm->arch.sca));
251 out_err:
252 return rc;
255 void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
257 VCPU_EVENT(vcpu, 3, "%s", "free cpu");
258 trace_kvm_s390_destroy_vcpu(vcpu->vcpu_id);
259 if (!kvm_is_ucontrol(vcpu->kvm)) {
260 clear_bit(63 - vcpu->vcpu_id,
261 (unsigned long *) &vcpu->kvm->arch.sca->mcn);
262 if (vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sda ==
263 (__u64) vcpu->arch.sie_block)
264 vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sda = 0;
266 smp_mb();
268 if (kvm_is_ucontrol(vcpu->kvm))
269 gmap_free(vcpu->arch.gmap);
271 free_page((unsigned long)(vcpu->arch.sie_block));
272 kvm_vcpu_uninit(vcpu);
273 kfree(vcpu);
276 static void kvm_free_vcpus(struct kvm *kvm)
278 unsigned int i;
279 struct kvm_vcpu *vcpu;
281 kvm_for_each_vcpu(i, vcpu, kvm)
282 kvm_arch_vcpu_destroy(vcpu);
284 mutex_lock(&kvm->lock);
285 for (i = 0; i < atomic_read(&kvm->online_vcpus); i++)
286 kvm->vcpus[i] = NULL;
288 atomic_set(&kvm->online_vcpus, 0);
289 mutex_unlock(&kvm->lock);
292 void kvm_arch_sync_events(struct kvm *kvm)
296 void kvm_arch_destroy_vm(struct kvm *kvm)
298 kvm_free_vcpus(kvm);
299 free_page((unsigned long)(kvm->arch.sca));
300 debug_unregister(kvm->arch.dbf);
301 if (!kvm_is_ucontrol(kvm))
302 gmap_free(kvm->arch.gmap);
305 /* Section: vcpu related */
306 int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu)
308 if (kvm_is_ucontrol(vcpu->kvm)) {
309 vcpu->arch.gmap = gmap_alloc(current->mm);
310 if (!vcpu->arch.gmap)
311 return -ENOMEM;
312 return 0;
315 vcpu->arch.gmap = vcpu->kvm->arch.gmap;
316 vcpu->run->kvm_valid_regs = KVM_SYNC_PREFIX |
317 KVM_SYNC_GPRS |
318 KVM_SYNC_ACRS |
319 KVM_SYNC_CRS;
320 return 0;
323 void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu)
325 /* Nothing todo */
328 void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
330 save_fp_regs(&vcpu->arch.host_fpregs);
331 save_access_regs(vcpu->arch.host_acrs);
332 vcpu->arch.guest_fpregs.fpc &= FPC_VALID_MASK;
333 restore_fp_regs(&vcpu->arch.guest_fpregs);
334 restore_access_regs(vcpu->run->s.regs.acrs);
335 gmap_enable(vcpu->arch.gmap);
336 atomic_set_mask(CPUSTAT_RUNNING, &vcpu->arch.sie_block->cpuflags);
339 void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
341 atomic_clear_mask(CPUSTAT_RUNNING, &vcpu->arch.sie_block->cpuflags);
342 gmap_disable(vcpu->arch.gmap);
343 save_fp_regs(&vcpu->arch.guest_fpregs);
344 save_access_regs(vcpu->run->s.regs.acrs);
345 restore_fp_regs(&vcpu->arch.host_fpregs);
346 restore_access_regs(vcpu->arch.host_acrs);
349 static void kvm_s390_vcpu_initial_reset(struct kvm_vcpu *vcpu)
351 /* this equals initial cpu reset in pop, but we don't switch to ESA */
352 vcpu->arch.sie_block->gpsw.mask = 0UL;
353 vcpu->arch.sie_block->gpsw.addr = 0UL;
354 kvm_s390_set_prefix(vcpu, 0);
355 vcpu->arch.sie_block->cputm = 0UL;
356 vcpu->arch.sie_block->ckc = 0UL;
357 vcpu->arch.sie_block->todpr = 0;
358 memset(vcpu->arch.sie_block->gcr, 0, 16 * sizeof(__u64));
359 vcpu->arch.sie_block->gcr[0] = 0xE0UL;
360 vcpu->arch.sie_block->gcr[14] = 0xC2000000UL;
361 vcpu->arch.guest_fpregs.fpc = 0;
362 asm volatile("lfpc %0" : : "Q" (vcpu->arch.guest_fpregs.fpc));
363 vcpu->arch.sie_block->gbea = 1;
364 atomic_set_mask(CPUSTAT_STOPPED, &vcpu->arch.sie_block->cpuflags);
367 int kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu)
369 return 0;
372 int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
374 atomic_set(&vcpu->arch.sie_block->cpuflags, CPUSTAT_ZARCH |
375 CPUSTAT_SM |
376 CPUSTAT_STOPPED);
377 vcpu->arch.sie_block->ecb = 6;
378 vcpu->arch.sie_block->eca = 0xC1002001U;
379 vcpu->arch.sie_block->fac = (int) (long) facilities;
380 hrtimer_init(&vcpu->arch.ckc_timer, CLOCK_REALTIME, HRTIMER_MODE_ABS);
381 tasklet_init(&vcpu->arch.tasklet, kvm_s390_tasklet,
382 (unsigned long) vcpu);
383 vcpu->arch.ckc_timer.function = kvm_s390_idle_wakeup;
384 get_cpu_id(&vcpu->arch.cpu_id);
385 vcpu->arch.cpu_id.version = 0xff;
386 return 0;
389 struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm,
390 unsigned int id)
392 struct kvm_vcpu *vcpu;
393 int rc = -EINVAL;
395 if (id >= KVM_MAX_VCPUS)
396 goto out;
398 rc = -ENOMEM;
400 vcpu = kzalloc(sizeof(struct kvm_vcpu), GFP_KERNEL);
401 if (!vcpu)
402 goto out;
404 vcpu->arch.sie_block = (struct kvm_s390_sie_block *)
405 get_zeroed_page(GFP_KERNEL);
407 if (!vcpu->arch.sie_block)
408 goto out_free_cpu;
410 vcpu->arch.sie_block->icpua = id;
411 if (!kvm_is_ucontrol(kvm)) {
412 if (!kvm->arch.sca) {
413 WARN_ON_ONCE(1);
414 goto out_free_cpu;
416 if (!kvm->arch.sca->cpu[id].sda)
417 kvm->arch.sca->cpu[id].sda =
418 (__u64) vcpu->arch.sie_block;
419 vcpu->arch.sie_block->scaoh =
420 (__u32)(((__u64)kvm->arch.sca) >> 32);
421 vcpu->arch.sie_block->scaol = (__u32)(__u64)kvm->arch.sca;
422 set_bit(63 - id, (unsigned long *) &kvm->arch.sca->mcn);
425 spin_lock_init(&vcpu->arch.local_int.lock);
426 INIT_LIST_HEAD(&vcpu->arch.local_int.list);
427 vcpu->arch.local_int.float_int = &kvm->arch.float_int;
428 spin_lock(&kvm->arch.float_int.lock);
429 kvm->arch.float_int.local_int[id] = &vcpu->arch.local_int;
430 init_waitqueue_head(&vcpu->arch.local_int.wq);
431 vcpu->arch.local_int.cpuflags = &vcpu->arch.sie_block->cpuflags;
432 spin_unlock(&kvm->arch.float_int.lock);
434 rc = kvm_vcpu_init(vcpu, kvm, id);
435 if (rc)
436 goto out_free_sie_block;
437 VM_EVENT(kvm, 3, "create cpu %d at %p, sie block at %p", id, vcpu,
438 vcpu->arch.sie_block);
439 trace_kvm_s390_create_vcpu(id, vcpu, vcpu->arch.sie_block);
441 return vcpu;
442 out_free_sie_block:
443 free_page((unsigned long)(vcpu->arch.sie_block));
444 out_free_cpu:
445 kfree(vcpu);
446 out:
447 return ERR_PTR(rc);
450 int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu)
452 /* kvm common code refers to this, but never calls it */
453 BUG();
454 return 0;
457 int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu)
459 /* kvm common code refers to this, but never calls it */
460 BUG();
461 return 0;
464 static int kvm_arch_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu,
465 struct kvm_one_reg *reg)
467 int r = -EINVAL;
469 switch (reg->id) {
470 case KVM_REG_S390_TODPR:
471 r = put_user(vcpu->arch.sie_block->todpr,
472 (u32 __user *)reg->addr);
473 break;
474 case KVM_REG_S390_EPOCHDIFF:
475 r = put_user(vcpu->arch.sie_block->epoch,
476 (u64 __user *)reg->addr);
477 break;
478 case KVM_REG_S390_CPU_TIMER:
479 r = put_user(vcpu->arch.sie_block->cputm,
480 (u64 __user *)reg->addr);
481 break;
482 case KVM_REG_S390_CLOCK_COMP:
483 r = put_user(vcpu->arch.sie_block->ckc,
484 (u64 __user *)reg->addr);
485 break;
486 default:
487 break;
490 return r;
493 static int kvm_arch_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu,
494 struct kvm_one_reg *reg)
496 int r = -EINVAL;
498 switch (reg->id) {
499 case KVM_REG_S390_TODPR:
500 r = get_user(vcpu->arch.sie_block->todpr,
501 (u32 __user *)reg->addr);
502 break;
503 case KVM_REG_S390_EPOCHDIFF:
504 r = get_user(vcpu->arch.sie_block->epoch,
505 (u64 __user *)reg->addr);
506 break;
507 case KVM_REG_S390_CPU_TIMER:
508 r = get_user(vcpu->arch.sie_block->cputm,
509 (u64 __user *)reg->addr);
510 break;
511 case KVM_REG_S390_CLOCK_COMP:
512 r = get_user(vcpu->arch.sie_block->ckc,
513 (u64 __user *)reg->addr);
514 break;
515 default:
516 break;
519 return r;
522 static int kvm_arch_vcpu_ioctl_initial_reset(struct kvm_vcpu *vcpu)
524 kvm_s390_vcpu_initial_reset(vcpu);
525 return 0;
528 int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
530 memcpy(&vcpu->run->s.regs.gprs, &regs->gprs, sizeof(regs->gprs));
531 return 0;
534 int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
536 memcpy(&regs->gprs, &vcpu->run->s.regs.gprs, sizeof(regs->gprs));
537 return 0;
540 int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
541 struct kvm_sregs *sregs)
543 memcpy(&vcpu->run->s.regs.acrs, &sregs->acrs, sizeof(sregs->acrs));
544 memcpy(&vcpu->arch.sie_block->gcr, &sregs->crs, sizeof(sregs->crs));
545 restore_access_regs(vcpu->run->s.regs.acrs);
546 return 0;
549 int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,
550 struct kvm_sregs *sregs)
552 memcpy(&sregs->acrs, &vcpu->run->s.regs.acrs, sizeof(sregs->acrs));
553 memcpy(&sregs->crs, &vcpu->arch.sie_block->gcr, sizeof(sregs->crs));
554 return 0;
557 int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
559 memcpy(&vcpu->arch.guest_fpregs.fprs, &fpu->fprs, sizeof(fpu->fprs));
560 vcpu->arch.guest_fpregs.fpc = fpu->fpc & FPC_VALID_MASK;
561 restore_fp_regs(&vcpu->arch.guest_fpregs);
562 return 0;
565 int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
567 memcpy(&fpu->fprs, &vcpu->arch.guest_fpregs.fprs, sizeof(fpu->fprs));
568 fpu->fpc = vcpu->arch.guest_fpregs.fpc;
569 return 0;
572 static int kvm_arch_vcpu_ioctl_set_initial_psw(struct kvm_vcpu *vcpu, psw_t psw)
574 int rc = 0;
576 if (!(atomic_read(&vcpu->arch.sie_block->cpuflags) & CPUSTAT_STOPPED))
577 rc = -EBUSY;
578 else {
579 vcpu->run->psw_mask = psw.mask;
580 vcpu->run->psw_addr = psw.addr;
582 return rc;
585 int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu,
586 struct kvm_translation *tr)
588 return -EINVAL; /* not implemented yet */
591 int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
592 struct kvm_guest_debug *dbg)
594 return -EINVAL; /* not implemented yet */
597 int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu,
598 struct kvm_mp_state *mp_state)
600 return -EINVAL; /* not implemented yet */
603 int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,
604 struct kvm_mp_state *mp_state)
606 return -EINVAL; /* not implemented yet */
609 static int __vcpu_run(struct kvm_vcpu *vcpu)
611 int rc;
613 memcpy(&vcpu->arch.sie_block->gg14, &vcpu->run->s.regs.gprs[14], 16);
615 if (need_resched())
616 schedule();
618 if (test_thread_flag(TIF_MCCK_PENDING))
619 s390_handle_mcck();
621 if (!kvm_is_ucontrol(vcpu->kvm))
622 kvm_s390_deliver_pending_interrupts(vcpu);
624 vcpu->arch.sie_block->icptcode = 0;
625 VCPU_EVENT(vcpu, 6, "entering sie flags %x",
626 atomic_read(&vcpu->arch.sie_block->cpuflags));
627 trace_kvm_s390_sie_enter(vcpu,
628 atomic_read(&vcpu->arch.sie_block->cpuflags));
631 * As PF_VCPU will be used in fault handler, between guest_enter
632 * and guest_exit should be no uaccess.
634 preempt_disable();
635 kvm_guest_enter();
636 preempt_enable();
637 rc = sie64a(vcpu->arch.sie_block, vcpu->run->s.regs.gprs);
638 kvm_guest_exit();
640 VCPU_EVENT(vcpu, 6, "exit sie icptcode %d",
641 vcpu->arch.sie_block->icptcode);
642 trace_kvm_s390_sie_exit(vcpu, vcpu->arch.sie_block->icptcode);
644 if (rc) {
645 if (kvm_is_ucontrol(vcpu->kvm)) {
646 rc = SIE_INTERCEPT_UCONTROL;
647 } else {
648 VCPU_EVENT(vcpu, 3, "%s", "fault in sie instruction");
649 trace_kvm_s390_sie_fault(vcpu);
650 rc = kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
654 memcpy(&vcpu->run->s.regs.gprs[14], &vcpu->arch.sie_block->gg14, 16);
655 return rc;
658 int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
660 int rc;
661 sigset_t sigsaved;
663 rerun_vcpu:
664 if (vcpu->sigset_active)
665 sigprocmask(SIG_SETMASK, &vcpu->sigset, &sigsaved);
667 atomic_clear_mask(CPUSTAT_STOPPED, &vcpu->arch.sie_block->cpuflags);
669 BUG_ON(vcpu->kvm->arch.float_int.local_int[vcpu->vcpu_id] == NULL);
671 switch (kvm_run->exit_reason) {
672 case KVM_EXIT_S390_SIEIC:
673 case KVM_EXIT_UNKNOWN:
674 case KVM_EXIT_INTR:
675 case KVM_EXIT_S390_RESET:
676 case KVM_EXIT_S390_UCONTROL:
677 case KVM_EXIT_S390_TSCH:
678 break;
679 default:
680 BUG();
683 vcpu->arch.sie_block->gpsw.mask = kvm_run->psw_mask;
684 vcpu->arch.sie_block->gpsw.addr = kvm_run->psw_addr;
685 if (kvm_run->kvm_dirty_regs & KVM_SYNC_PREFIX) {
686 kvm_run->kvm_dirty_regs &= ~KVM_SYNC_PREFIX;
687 kvm_s390_set_prefix(vcpu, kvm_run->s.regs.prefix);
689 if (kvm_run->kvm_dirty_regs & KVM_SYNC_CRS) {
690 kvm_run->kvm_dirty_regs &= ~KVM_SYNC_CRS;
691 memcpy(&vcpu->arch.sie_block->gcr, &kvm_run->s.regs.crs, 128);
692 kvm_s390_set_prefix(vcpu, kvm_run->s.regs.prefix);
695 might_fault();
697 do {
698 rc = __vcpu_run(vcpu);
699 if (rc)
700 break;
701 if (kvm_is_ucontrol(vcpu->kvm))
702 rc = -EOPNOTSUPP;
703 else
704 rc = kvm_handle_sie_intercept(vcpu);
705 } while (!signal_pending(current) && !rc);
707 if (rc == SIE_INTERCEPT_RERUNVCPU)
708 goto rerun_vcpu;
710 if (signal_pending(current) && !rc) {
711 kvm_run->exit_reason = KVM_EXIT_INTR;
712 rc = -EINTR;
715 #ifdef CONFIG_KVM_S390_UCONTROL
716 if (rc == SIE_INTERCEPT_UCONTROL) {
717 kvm_run->exit_reason = KVM_EXIT_S390_UCONTROL;
718 kvm_run->s390_ucontrol.trans_exc_code =
719 current->thread.gmap_addr;
720 kvm_run->s390_ucontrol.pgm_code = 0x10;
721 rc = 0;
723 #endif
725 if (rc == -EOPNOTSUPP) {
726 /* intercept cannot be handled in-kernel, prepare kvm-run */
727 kvm_run->exit_reason = KVM_EXIT_S390_SIEIC;
728 kvm_run->s390_sieic.icptcode = vcpu->arch.sie_block->icptcode;
729 kvm_run->s390_sieic.ipa = vcpu->arch.sie_block->ipa;
730 kvm_run->s390_sieic.ipb = vcpu->arch.sie_block->ipb;
731 rc = 0;
734 if (rc == -EREMOTE) {
735 /* intercept was handled, but userspace support is needed
736 * kvm_run has been prepared by the handler */
737 rc = 0;
740 kvm_run->psw_mask = vcpu->arch.sie_block->gpsw.mask;
741 kvm_run->psw_addr = vcpu->arch.sie_block->gpsw.addr;
742 kvm_run->s.regs.prefix = vcpu->arch.sie_block->prefix;
743 memcpy(&kvm_run->s.regs.crs, &vcpu->arch.sie_block->gcr, 128);
745 if (vcpu->sigset_active)
746 sigprocmask(SIG_SETMASK, &sigsaved, NULL);
748 vcpu->stat.exit_userspace++;
749 return rc;
752 static int __guestcopy(struct kvm_vcpu *vcpu, u64 guestdest, void *from,
753 unsigned long n, int prefix)
755 if (prefix)
756 return copy_to_guest(vcpu, guestdest, from, n);
757 else
758 return copy_to_guest_absolute(vcpu, guestdest, from, n);
762 * store status at address
763 * we use have two special cases:
764 * KVM_S390_STORE_STATUS_NOADDR: -> 0x1200 on 64 bit
765 * KVM_S390_STORE_STATUS_PREFIXED: -> prefix
767 int kvm_s390_vcpu_store_status(struct kvm_vcpu *vcpu, unsigned long addr)
769 unsigned char archmode = 1;
770 int prefix;
772 if (addr == KVM_S390_STORE_STATUS_NOADDR) {
773 if (copy_to_guest_absolute(vcpu, 163ul, &archmode, 1))
774 return -EFAULT;
775 addr = SAVE_AREA_BASE;
776 prefix = 0;
777 } else if (addr == KVM_S390_STORE_STATUS_PREFIXED) {
778 if (copy_to_guest(vcpu, 163ul, &archmode, 1))
779 return -EFAULT;
780 addr = SAVE_AREA_BASE;
781 prefix = 1;
782 } else
783 prefix = 0;
786 * The guest FPRS and ACRS are in the host FPRS/ACRS due to the lazy
787 * copying in vcpu load/put. Lets update our copies before we save
788 * it into the save area
790 save_fp_regs(&vcpu->arch.guest_fpregs);
791 save_access_regs(vcpu->run->s.regs.acrs);
793 if (__guestcopy(vcpu, addr + offsetof(struct save_area, fp_regs),
794 vcpu->arch.guest_fpregs.fprs, 128, prefix))
795 return -EFAULT;
797 if (__guestcopy(vcpu, addr + offsetof(struct save_area, gp_regs),
798 vcpu->run->s.regs.gprs, 128, prefix))
799 return -EFAULT;
801 if (__guestcopy(vcpu, addr + offsetof(struct save_area, psw),
802 &vcpu->arch.sie_block->gpsw, 16, prefix))
803 return -EFAULT;
805 if (__guestcopy(vcpu, addr + offsetof(struct save_area, pref_reg),
806 &vcpu->arch.sie_block->prefix, 4, prefix))
807 return -EFAULT;
809 if (__guestcopy(vcpu,
810 addr + offsetof(struct save_area, fp_ctrl_reg),
811 &vcpu->arch.guest_fpregs.fpc, 4, prefix))
812 return -EFAULT;
814 if (__guestcopy(vcpu, addr + offsetof(struct save_area, tod_reg),
815 &vcpu->arch.sie_block->todpr, 4, prefix))
816 return -EFAULT;
818 if (__guestcopy(vcpu, addr + offsetof(struct save_area, timer),
819 &vcpu->arch.sie_block->cputm, 8, prefix))
820 return -EFAULT;
822 if (__guestcopy(vcpu, addr + offsetof(struct save_area, clk_cmp),
823 &vcpu->arch.sie_block->ckc, 8, prefix))
824 return -EFAULT;
826 if (__guestcopy(vcpu, addr + offsetof(struct save_area, acc_regs),
827 &vcpu->run->s.regs.acrs, 64, prefix))
828 return -EFAULT;
830 if (__guestcopy(vcpu,
831 addr + offsetof(struct save_area, ctrl_regs),
832 &vcpu->arch.sie_block->gcr, 128, prefix))
833 return -EFAULT;
834 return 0;
837 static int kvm_vcpu_ioctl_enable_cap(struct kvm_vcpu *vcpu,
838 struct kvm_enable_cap *cap)
840 int r;
842 if (cap->flags)
843 return -EINVAL;
845 switch (cap->cap) {
846 case KVM_CAP_S390_CSS_SUPPORT:
847 if (!vcpu->kvm->arch.css_support) {
848 vcpu->kvm->arch.css_support = 1;
849 trace_kvm_s390_enable_css(vcpu->kvm);
851 r = 0;
852 break;
853 default:
854 r = -EINVAL;
855 break;
857 return r;
860 long kvm_arch_vcpu_ioctl(struct file *filp,
861 unsigned int ioctl, unsigned long arg)
863 struct kvm_vcpu *vcpu = filp->private_data;
864 void __user *argp = (void __user *)arg;
865 long r;
867 switch (ioctl) {
868 case KVM_S390_INTERRUPT: {
869 struct kvm_s390_interrupt s390int;
871 r = -EFAULT;
872 if (copy_from_user(&s390int, argp, sizeof(s390int)))
873 break;
874 r = kvm_s390_inject_vcpu(vcpu, &s390int);
875 break;
877 case KVM_S390_STORE_STATUS:
878 r = kvm_s390_vcpu_store_status(vcpu, arg);
879 break;
880 case KVM_S390_SET_INITIAL_PSW: {
881 psw_t psw;
883 r = -EFAULT;
884 if (copy_from_user(&psw, argp, sizeof(psw)))
885 break;
886 r = kvm_arch_vcpu_ioctl_set_initial_psw(vcpu, psw);
887 break;
889 case KVM_S390_INITIAL_RESET:
890 r = kvm_arch_vcpu_ioctl_initial_reset(vcpu);
891 break;
892 case KVM_SET_ONE_REG:
893 case KVM_GET_ONE_REG: {
894 struct kvm_one_reg reg;
895 r = -EFAULT;
896 if (copy_from_user(&reg, argp, sizeof(reg)))
897 break;
898 if (ioctl == KVM_SET_ONE_REG)
899 r = kvm_arch_vcpu_ioctl_set_one_reg(vcpu, &reg);
900 else
901 r = kvm_arch_vcpu_ioctl_get_one_reg(vcpu, &reg);
902 break;
904 #ifdef CONFIG_KVM_S390_UCONTROL
905 case KVM_S390_UCAS_MAP: {
906 struct kvm_s390_ucas_mapping ucasmap;
908 if (copy_from_user(&ucasmap, argp, sizeof(ucasmap))) {
909 r = -EFAULT;
910 break;
913 if (!kvm_is_ucontrol(vcpu->kvm)) {
914 r = -EINVAL;
915 break;
918 r = gmap_map_segment(vcpu->arch.gmap, ucasmap.user_addr,
919 ucasmap.vcpu_addr, ucasmap.length);
920 break;
922 case KVM_S390_UCAS_UNMAP: {
923 struct kvm_s390_ucas_mapping ucasmap;
925 if (copy_from_user(&ucasmap, argp, sizeof(ucasmap))) {
926 r = -EFAULT;
927 break;
930 if (!kvm_is_ucontrol(vcpu->kvm)) {
931 r = -EINVAL;
932 break;
935 r = gmap_unmap_segment(vcpu->arch.gmap, ucasmap.vcpu_addr,
936 ucasmap.length);
937 break;
939 #endif
940 case KVM_S390_VCPU_FAULT: {
941 r = gmap_fault(arg, vcpu->arch.gmap);
942 if (!IS_ERR_VALUE(r))
943 r = 0;
944 break;
946 case KVM_ENABLE_CAP:
948 struct kvm_enable_cap cap;
949 r = -EFAULT;
950 if (copy_from_user(&cap, argp, sizeof(cap)))
951 break;
952 r = kvm_vcpu_ioctl_enable_cap(vcpu, &cap);
953 break;
955 default:
956 r = -ENOTTY;
958 return r;
961 int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf)
963 #ifdef CONFIG_KVM_S390_UCONTROL
964 if ((vmf->pgoff == KVM_S390_SIE_PAGE_OFFSET)
965 && (kvm_is_ucontrol(vcpu->kvm))) {
966 vmf->page = virt_to_page(vcpu->arch.sie_block);
967 get_page(vmf->page);
968 return 0;
970 #endif
971 return VM_FAULT_SIGBUS;
974 void kvm_arch_free_memslot(struct kvm_memory_slot *free,
975 struct kvm_memory_slot *dont)
979 int kvm_arch_create_memslot(struct kvm_memory_slot *slot, unsigned long npages)
981 return 0;
984 /* Section: memory related */
985 int kvm_arch_prepare_memory_region(struct kvm *kvm,
986 struct kvm_memory_slot *memslot,
987 struct kvm_userspace_memory_region *mem,
988 enum kvm_mr_change change)
990 /* A few sanity checks. We can have memory slots which have to be
991 located/ended at a segment boundary (1MB). The memory in userland is
992 ok to be fragmented into various different vmas. It is okay to mmap()
993 and munmap() stuff in this slot after doing this call at any time */
995 if (mem->userspace_addr & 0xffffful)
996 return -EINVAL;
998 if (mem->memory_size & 0xffffful)
999 return -EINVAL;
1001 return 0;
1004 void kvm_arch_commit_memory_region(struct kvm *kvm,
1005 struct kvm_userspace_memory_region *mem,
1006 const struct kvm_memory_slot *old,
1007 enum kvm_mr_change change)
1009 int rc;
1011 /* If the basics of the memslot do not change, we do not want
1012 * to update the gmap. Every update causes several unnecessary
1013 * segment translation exceptions. This is usually handled just
1014 * fine by the normal fault handler + gmap, but it will also
1015 * cause faults on the prefix page of running guest CPUs.
1017 if (old->userspace_addr == mem->userspace_addr &&
1018 old->base_gfn * PAGE_SIZE == mem->guest_phys_addr &&
1019 old->npages * PAGE_SIZE == mem->memory_size)
1020 return;
1022 rc = gmap_map_segment(kvm->arch.gmap, mem->userspace_addr,
1023 mem->guest_phys_addr, mem->memory_size);
1024 if (rc)
1025 printk(KERN_WARNING "kvm-s390: failed to commit memory region\n");
1026 return;
1029 void kvm_arch_flush_shadow_all(struct kvm *kvm)
1033 void kvm_arch_flush_shadow_memslot(struct kvm *kvm,
1034 struct kvm_memory_slot *slot)
1038 static int __init kvm_s390_init(void)
1040 int ret;
1041 ret = kvm_init(NULL, sizeof(struct kvm_vcpu), 0, THIS_MODULE);
1042 if (ret)
1043 return ret;
1046 * guests can ask for up to 255+1 double words, we need a full page
1047 * to hold the maximum amount of facilities. On the other hand, we
1048 * only set facilities that are known to work in KVM.
1050 facilities = (unsigned long long *) get_zeroed_page(GFP_KERNEL|GFP_DMA);
1051 if (!facilities) {
1052 kvm_exit();
1053 return -ENOMEM;
1055 memcpy(facilities, S390_lowcore.stfle_fac_list, 16);
1056 facilities[0] &= 0xff00fff3f47c0000ULL;
1057 facilities[1] &= 0x001c000000000000ULL;
1058 return 0;
1061 static void __exit kvm_s390_exit(void)
1063 free_page((unsigned long) facilities);
1064 kvm_exit();
1067 module_init(kvm_s390_init);
1068 module_exit(kvm_s390_exit);