blob: 4fe68650535cf2acc4d3e968b839a1e750a00529 [file] [log] [blame]
Heiko Carstensb0c632d2008-03-25 18:47:20 +01001/*
2 * s390host.c -- hosting zSeries kernel virtual machines
3 *
Christian Ehrhardt628eb9b2009-05-25 13:40:51 +02004 * Copyright IBM Corp. 2008,2009
Heiko Carstensb0c632d2008-03-25 18:47:20 +01005 *
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>
Christian Ehrhardt628eb9b2009-05-25 13:40:51 +020013 * Christian Ehrhardt <ehrhardt@de.ibm.com>
Heiko Carstensb0c632d2008-03-25 18:47:20 +010014 */
15
16#include <linux/compiler.h>
17#include <linux/err.h>
18#include <linux/fs.h>
Christian Borntraegerca872302009-05-12 17:21:49 +020019#include <linux/hrtimer.h>
Heiko Carstensb0c632d2008-03-25 18:47:20 +010020#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>
Carsten Otteba5c1e92008-03-25 18:47:26 +010025#include <linux/timer.h>
Heiko Carstenscbb870c2010-02-26 22:37:43 +010026#include <asm/asm-offsets.h>
Heiko Carstensb0c632d2008-03-25 18:47:20 +010027#include <asm/lowcore.h>
28#include <asm/pgtable.h>
Heiko Carstensf5daba12009-03-26 15:24:01 +010029#include <asm/nmi.h>
Christian Borntraegeref50f7a2009-06-23 17:24:07 +020030#include <asm/system.h>
Christian Borntraeger8f2abe62008-03-25 18:47:23 +010031#include "kvm-s390.h"
Heiko Carstensb0c632d2008-03-25 18:47:20 +010032#include "gaccess.h"
33
34#define VCPU_STAT(x) offsetof(struct kvm_vcpu, stat.x), KVM_STAT_VCPU
35
36struct kvm_stats_debugfs_item debugfs_entries[] = {
37 { "userspace_handled", VCPU_STAT(exit_userspace) },
Christian Borntraeger0eaeafa2008-05-07 09:22:53 +020038 { "exit_null", VCPU_STAT(exit_null) },
Christian Borntraeger8f2abe62008-03-25 18:47:23 +010039 { "exit_validity", VCPU_STAT(exit_validity) },
40 { "exit_stop_request", VCPU_STAT(exit_stop_request) },
41 { "exit_external_request", VCPU_STAT(exit_external_request) },
42 { "exit_external_interrupt", VCPU_STAT(exit_external_interrupt) },
Carsten Otteba5c1e92008-03-25 18:47:26 +010043 { "exit_instruction", VCPU_STAT(exit_instruction) },
44 { "exit_program_interruption", VCPU_STAT(exit_program_interruption) },
45 { "exit_instr_and_program_int", VCPU_STAT(exit_instr_and_program) },
Christian Borntraegerf5e10b02008-07-25 15:52:44 +020046 { "instruction_lctlg", VCPU_STAT(instruction_lctlg) },
Carsten Otteba5c1e92008-03-25 18:47:26 +010047 { "instruction_lctl", VCPU_STAT(instruction_lctl) },
48 { "deliver_emergency_signal", VCPU_STAT(deliver_emergency_signal) },
49 { "deliver_service_signal", VCPU_STAT(deliver_service_signal) },
50 { "deliver_virtio_interrupt", VCPU_STAT(deliver_virtio_interrupt) },
51 { "deliver_stop_signal", VCPU_STAT(deliver_stop_signal) },
52 { "deliver_prefix_signal", VCPU_STAT(deliver_prefix_signal) },
53 { "deliver_restart_signal", VCPU_STAT(deliver_restart_signal) },
54 { "deliver_program_interruption", VCPU_STAT(deliver_program_int) },
55 { "exit_wait_state", VCPU_STAT(exit_wait_state) },
Christian Borntraeger453423d2008-03-25 18:47:29 +010056 { "instruction_stidp", VCPU_STAT(instruction_stidp) },
57 { "instruction_spx", VCPU_STAT(instruction_spx) },
58 { "instruction_stpx", VCPU_STAT(instruction_stpx) },
59 { "instruction_stap", VCPU_STAT(instruction_stap) },
60 { "instruction_storage_key", VCPU_STAT(instruction_storage_key) },
61 { "instruction_stsch", VCPU_STAT(instruction_stsch) },
62 { "instruction_chsc", VCPU_STAT(instruction_chsc) },
63 { "instruction_stsi", VCPU_STAT(instruction_stsi) },
64 { "instruction_stfl", VCPU_STAT(instruction_stfl) },
Christian Borntraeger5288fbf2008-03-25 18:47:31 +010065 { "instruction_sigp_sense", VCPU_STAT(instruction_sigp_sense) },
66 { "instruction_sigp_emergency", VCPU_STAT(instruction_sigp_emergency) },
67 { "instruction_sigp_stop", VCPU_STAT(instruction_sigp_stop) },
68 { "instruction_sigp_set_arch", VCPU_STAT(instruction_sigp_arch) },
69 { "instruction_sigp_set_prefix", VCPU_STAT(instruction_sigp_prefix) },
70 { "instruction_sigp_restart", VCPU_STAT(instruction_sigp_restart) },
Christian Borntraegere28acfe2008-03-25 18:47:34 +010071 { "diagnose_44", VCPU_STAT(diagnose_44) },
Heiko Carstensb0c632d2008-03-25 18:47:20 +010072 { NULL }
73};
74
Christian Borntraegeref50f7a2009-06-23 17:24:07 +020075static unsigned long long *facilities;
Heiko Carstensb0c632d2008-03-25 18:47:20 +010076
77/* Section: not file related */
Alexander Graf10474ae2009-09-15 11:37:46 +020078int kvm_arch_hardware_enable(void *garbage)
Heiko Carstensb0c632d2008-03-25 18:47:20 +010079{
80 /* every s390 is virtualization enabled ;-) */
Alexander Graf10474ae2009-09-15 11:37:46 +020081 return 0;
Heiko Carstensb0c632d2008-03-25 18:47:20 +010082}
83
84void kvm_arch_hardware_disable(void *garbage)
85{
86}
87
Heiko Carstensb0c632d2008-03-25 18:47:20 +010088int kvm_arch_hardware_setup(void)
89{
90 return 0;
91}
92
93void kvm_arch_hardware_unsetup(void)
94{
95}
96
97void kvm_arch_check_processor_compat(void *rtn)
98{
99}
100
101int kvm_arch_init(void *opaque)
102{
103 return 0;
104}
105
106void kvm_arch_exit(void)
107{
108}
109
110/* Section: device related */
111long kvm_arch_dev_ioctl(struct file *filp,
112 unsigned int ioctl, unsigned long arg)
113{
114 if (ioctl == KVM_S390_ENABLE_SIE)
115 return s390_enable_sie();
116 return -EINVAL;
117}
118
119int kvm_dev_ioctl_check_extension(long ext)
120{
Carsten Otted7b0b5e2009-11-19 14:21:16 +0100121 int r;
122
Carsten Otte2bd0ac42008-07-25 15:49:13 +0200123 switch (ext) {
Carsten Otted7b0b5e2009-11-19 14:21:16 +0100124 case KVM_CAP_S390_PSW:
125 r = 1;
126 break;
Carsten Otte2bd0ac42008-07-25 15:49:13 +0200127 default:
Carsten Otted7b0b5e2009-11-19 14:21:16 +0100128 r = 0;
Carsten Otte2bd0ac42008-07-25 15:49:13 +0200129 }
Carsten Otted7b0b5e2009-11-19 14:21:16 +0100130 return r;
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100131}
132
133/* Section: vm related */
134/*
135 * Get (and clear) the dirty memory log for a memory slot.
136 */
137int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
138 struct kvm_dirty_log *log)
139{
140 return 0;
141}
142
143long kvm_arch_vm_ioctl(struct file *filp,
144 unsigned int ioctl, unsigned long arg)
145{
146 struct kvm *kvm = filp->private_data;
147 void __user *argp = (void __user *)arg;
148 int r;
149
150 switch (ioctl) {
Carsten Otteba5c1e92008-03-25 18:47:26 +0100151 case KVM_S390_INTERRUPT: {
152 struct kvm_s390_interrupt s390int;
153
154 r = -EFAULT;
155 if (copy_from_user(&s390int, argp, sizeof(s390int)))
156 break;
157 r = kvm_s390_inject_vm(kvm, &s390int);
158 break;
159 }
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100160 default:
Avi Kivity367e1312009-08-26 14:57:07 +0300161 r = -ENOTTY;
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100162 }
163
164 return r;
165}
166
167struct kvm *kvm_arch_create_vm(void)
168{
169 struct kvm *kvm;
170 int rc;
171 char debug_name[16];
172
173 rc = s390_enable_sie();
174 if (rc)
175 goto out_nokvm;
176
177 rc = -ENOMEM;
178 kvm = kzalloc(sizeof(struct kvm), GFP_KERNEL);
179 if (!kvm)
180 goto out_nokvm;
181
182 kvm->arch.sca = (struct sca_block *) get_zeroed_page(GFP_KERNEL);
183 if (!kvm->arch.sca)
184 goto out_nosca;
185
186 sprintf(debug_name, "kvm-%u", current->pid);
187
188 kvm->arch.dbf = debug_register(debug_name, 8, 2, 8 * sizeof(long));
189 if (!kvm->arch.dbf)
190 goto out_nodbf;
191
Carsten Otteba5c1e92008-03-25 18:47:26 +0100192 spin_lock_init(&kvm->arch.float_int.lock);
193 INIT_LIST_HEAD(&kvm->arch.float_int.list);
194
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100195 debug_register_view(kvm->arch.dbf, &debug_sprintf_view);
196 VM_EVENT(kvm, 3, "%s", "vm created");
197
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100198 return kvm;
199out_nodbf:
200 free_page((unsigned long)(kvm->arch.sca));
201out_nosca:
202 kfree(kvm);
203out_nokvm:
204 return ERR_PTR(rc);
205}
206
Christian Borntraegerd329c032008-11-26 14:50:27 +0100207void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
208{
209 VCPU_EVENT(vcpu, 3, "%s", "free cpu");
Christian Borntraegerfc345312010-06-17 23:16:20 +0200210 clear_bit(63 - vcpu->vcpu_id, (unsigned long *) &vcpu->kvm->arch.sca->mcn);
Carsten Otteabf4a712009-05-12 17:21:51 +0200211 if (vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sda ==
212 (__u64) vcpu->arch.sie_block)
213 vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sda = 0;
214 smp_mb();
Christian Borntraegerd329c032008-11-26 14:50:27 +0100215 free_page((unsigned long)(vcpu->arch.sie_block));
Christian Borntraeger6692cef2008-11-26 14:51:08 +0100216 kvm_vcpu_uninit(vcpu);
Christian Borntraegerd329c032008-11-26 14:50:27 +0100217 kfree(vcpu);
218}
219
220static void kvm_free_vcpus(struct kvm *kvm)
221{
222 unsigned int i;
Gleb Natapov988a2ca2009-06-09 15:56:29 +0300223 struct kvm_vcpu *vcpu;
Christian Borntraegerd329c032008-11-26 14:50:27 +0100224
Gleb Natapov988a2ca2009-06-09 15:56:29 +0300225 kvm_for_each_vcpu(i, vcpu, kvm)
226 kvm_arch_vcpu_destroy(vcpu);
227
228 mutex_lock(&kvm->lock);
229 for (i = 0; i < atomic_read(&kvm->online_vcpus); i++)
230 kvm->vcpus[i] = NULL;
231
232 atomic_set(&kvm->online_vcpus, 0);
233 mutex_unlock(&kvm->lock);
Christian Borntraegerd329c032008-11-26 14:50:27 +0100234}
235
Sheng Yangad8ba2c2009-01-06 10:03:02 +0800236void kvm_arch_sync_events(struct kvm *kvm)
237{
238}
239
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100240void kvm_arch_destroy_vm(struct kvm *kvm)
241{
Christian Borntraegerd329c032008-11-26 14:50:27 +0100242 kvm_free_vcpus(kvm);
Carsten Ottedfdded72008-06-27 15:05:34 +0200243 kvm_free_physmem(kvm);
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100244 free_page((unsigned long)(kvm->arch.sca));
Christian Borntraegerd329c032008-11-26 14:50:27 +0100245 debug_unregister(kvm->arch.dbf);
Marcelo Tosatti64749202010-01-19 12:45:23 -0200246 cleanup_srcu_struct(&kvm->srcu);
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100247 kfree(kvm);
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100248}
249
250/* Section: vcpu related */
251int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu)
252{
253 return 0;
254}
255
256void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu)
257{
Christian Borntraeger6692cef2008-11-26 14:51:08 +0100258 /* Nothing todo */
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100259}
260
261void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
262{
263 save_fp_regs(&vcpu->arch.host_fpregs);
264 save_access_regs(vcpu->arch.host_acrs);
265 vcpu->arch.guest_fpregs.fpc &= FPC_VALID_MASK;
266 restore_fp_regs(&vcpu->arch.guest_fpregs);
267 restore_access_regs(vcpu->arch.guest_acrs);
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100268}
269
270void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
271{
272 save_fp_regs(&vcpu->arch.guest_fpregs);
273 save_access_regs(vcpu->arch.guest_acrs);
274 restore_fp_regs(&vcpu->arch.host_fpregs);
275 restore_access_regs(vcpu->arch.host_acrs);
276}
277
278static void kvm_s390_vcpu_initial_reset(struct kvm_vcpu *vcpu)
279{
280 /* this equals initial cpu reset in pop, but we don't switch to ESA */
281 vcpu->arch.sie_block->gpsw.mask = 0UL;
282 vcpu->arch.sie_block->gpsw.addr = 0UL;
283 vcpu->arch.sie_block->prefix = 0UL;
284 vcpu->arch.sie_block->ihcpu = 0xffff;
285 vcpu->arch.sie_block->cputm = 0UL;
286 vcpu->arch.sie_block->ckc = 0UL;
287 vcpu->arch.sie_block->todpr = 0;
288 memset(vcpu->arch.sie_block->gcr, 0, 16 * sizeof(__u64));
289 vcpu->arch.sie_block->gcr[0] = 0xE0UL;
290 vcpu->arch.sie_block->gcr[14] = 0xC2000000UL;
291 vcpu->arch.guest_fpregs.fpc = 0;
292 asm volatile("lfpc %0" : : "Q" (vcpu->arch.guest_fpregs.fpc));
293 vcpu->arch.sie_block->gbea = 1;
294}
295
296int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
297{
298 atomic_set(&vcpu->arch.sie_block->cpuflags, CPUSTAT_ZARCH);
Christian Ehrhardt628eb9b2009-05-25 13:40:51 +0200299 set_bit(KVM_REQ_MMU_RELOAD, &vcpu->requests);
Christian Borntraegerfc345312010-06-17 23:16:20 +0200300 vcpu->arch.sie_block->ecb = 6;
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100301 vcpu->arch.sie_block->eca = 0xC1002001U;
Christian Borntraegeref50f7a2009-06-23 17:24:07 +0200302 vcpu->arch.sie_block->fac = (int) (long) facilities;
Christian Borntraegerca872302009-05-12 17:21:49 +0200303 hrtimer_init(&vcpu->arch.ckc_timer, CLOCK_REALTIME, HRTIMER_MODE_ABS);
304 tasklet_init(&vcpu->arch.tasklet, kvm_s390_tasklet,
305 (unsigned long) vcpu);
306 vcpu->arch.ckc_timer.function = kvm_s390_idle_wakeup;
Christian Borntraeger453423d2008-03-25 18:47:29 +0100307 get_cpu_id(&vcpu->arch.cpu_id);
Christian Borntraeger92e6ecf2009-03-26 15:23:58 +0100308 vcpu->arch.cpu_id.version = 0xff;
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100309 return 0;
310}
311
312struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm,
313 unsigned int id)
314{
315 struct kvm_vcpu *vcpu = kzalloc(sizeof(struct kvm_vcpu), GFP_KERNEL);
316 int rc = -ENOMEM;
317
318 if (!vcpu)
319 goto out_nomem;
320
Christian Borntraeger180c12f2008-06-27 15:05:40 +0200321 vcpu->arch.sie_block = (struct kvm_s390_sie_block *)
322 get_zeroed_page(GFP_KERNEL);
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100323
324 if (!vcpu->arch.sie_block)
325 goto out_free_cpu;
326
327 vcpu->arch.sie_block->icpua = id;
328 BUG_ON(!kvm->arch.sca);
Carsten Otteabf4a712009-05-12 17:21:51 +0200329 if (!kvm->arch.sca->cpu[id].sda)
330 kvm->arch.sca->cpu[id].sda = (__u64) vcpu->arch.sie_block;
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100331 vcpu->arch.sie_block->scaoh = (__u32)(((__u64)kvm->arch.sca) >> 32);
332 vcpu->arch.sie_block->scaol = (__u32)(__u64)kvm->arch.sca;
Christian Borntraegerfc345312010-06-17 23:16:20 +0200333 set_bit(63 - id, (unsigned long *) &kvm->arch.sca->mcn);
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100334
Carsten Otteba5c1e92008-03-25 18:47:26 +0100335 spin_lock_init(&vcpu->arch.local_int.lock);
336 INIT_LIST_HEAD(&vcpu->arch.local_int.list);
337 vcpu->arch.local_int.float_int = &kvm->arch.float_int;
Christian Borntraegerb037a4f2009-05-12 17:21:50 +0200338 spin_lock(&kvm->arch.float_int.lock);
Carsten Otteba5c1e92008-03-25 18:47:26 +0100339 kvm->arch.float_int.local_int[id] = &vcpu->arch.local_int;
340 init_waitqueue_head(&vcpu->arch.local_int.wq);
Christian Borntraeger5288fbf2008-03-25 18:47:31 +0100341 vcpu->arch.local_int.cpuflags = &vcpu->arch.sie_block->cpuflags;
Christian Borntraegerb037a4f2009-05-12 17:21:50 +0200342 spin_unlock(&kvm->arch.float_int.lock);
Carsten Otteba5c1e92008-03-25 18:47:26 +0100343
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100344 rc = kvm_vcpu_init(vcpu, kvm, id);
345 if (rc)
Wei Yongjun7b06bf22010-03-09 14:37:53 +0800346 goto out_free_sie_block;
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100347 VM_EVENT(kvm, 3, "create cpu %d at %p, sie block at %p", id, vcpu,
348 vcpu->arch.sie_block);
349
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100350 return vcpu;
Wei Yongjun7b06bf22010-03-09 14:37:53 +0800351out_free_sie_block:
352 free_page((unsigned long)(vcpu->arch.sie_block));
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100353out_free_cpu:
354 kfree(vcpu);
355out_nomem:
356 return ERR_PTR(rc);
357}
358
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100359int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu)
360{
361 /* kvm common code refers to this, but never calls it */
362 BUG();
363 return 0;
364}
365
366static int kvm_arch_vcpu_ioctl_initial_reset(struct kvm_vcpu *vcpu)
367{
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100368 kvm_s390_vcpu_initial_reset(vcpu);
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100369 return 0;
370}
371
372int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
373{
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100374 memcpy(&vcpu->arch.guest_gprs, &regs->gprs, sizeof(regs->gprs));
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100375 return 0;
376}
377
378int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
379{
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100380 memcpy(&regs->gprs, &vcpu->arch.guest_gprs, sizeof(regs->gprs));
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100381 return 0;
382}
383
384int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
385 struct kvm_sregs *sregs)
386{
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100387 memcpy(&vcpu->arch.guest_acrs, &sregs->acrs, sizeof(sregs->acrs));
388 memcpy(&vcpu->arch.sie_block->gcr, &sregs->crs, sizeof(sregs->crs));
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100389 return 0;
390}
391
392int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,
393 struct kvm_sregs *sregs)
394{
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100395 memcpy(&sregs->acrs, &vcpu->arch.guest_acrs, sizeof(sregs->acrs));
396 memcpy(&sregs->crs, &vcpu->arch.sie_block->gcr, sizeof(sregs->crs));
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100397 return 0;
398}
399
400int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
401{
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100402 memcpy(&vcpu->arch.guest_fpregs.fprs, &fpu->fprs, sizeof(fpu->fprs));
403 vcpu->arch.guest_fpregs.fpc = fpu->fpc;
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100404 return 0;
405}
406
407int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
408{
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100409 memcpy(&fpu->fprs, &vcpu->arch.guest_fpregs.fprs, sizeof(fpu->fprs));
410 fpu->fpc = vcpu->arch.guest_fpregs.fpc;
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100411 return 0;
412}
413
414static int kvm_arch_vcpu_ioctl_set_initial_psw(struct kvm_vcpu *vcpu, psw_t psw)
415{
416 int rc = 0;
417
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100418 if (atomic_read(&vcpu->arch.sie_block->cpuflags) & CPUSTAT_RUNNING)
419 rc = -EBUSY;
Carsten Otted7b0b5e2009-11-19 14:21:16 +0100420 else {
421 vcpu->run->psw_mask = psw.mask;
422 vcpu->run->psw_addr = psw.addr;
423 }
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100424 return rc;
425}
426
427int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu,
428 struct kvm_translation *tr)
429{
430 return -EINVAL; /* not implemented yet */
431}
432
Jan Kiszkad0bfb942008-12-15 13:52:10 +0100433int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
434 struct kvm_guest_debug *dbg)
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100435{
436 return -EINVAL; /* not implemented yet */
437}
438
Marcelo Tosatti62d9f0d2008-04-11 13:24:45 -0300439int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu,
440 struct kvm_mp_state *mp_state)
441{
442 return -EINVAL; /* not implemented yet */
443}
444
445int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,
446 struct kvm_mp_state *mp_state)
447{
448 return -EINVAL; /* not implemented yet */
449}
450
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100451static void __vcpu_run(struct kvm_vcpu *vcpu)
452{
453 memcpy(&vcpu->arch.sie_block->gg14, &vcpu->arch.guest_gprs[14], 16);
454
455 if (need_resched())
456 schedule();
457
Christian Borntraeger71cde582008-05-21 13:37:34 +0200458 if (test_thread_flag(TIF_MCCK_PENDING))
459 s390_handle_mcck();
460
Carsten Otte0ff31862008-05-21 13:37:37 +0200461 kvm_s390_deliver_pending_interrupts(vcpu);
462
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100463 vcpu->arch.sie_block->icptcode = 0;
464 local_irq_disable();
465 kvm_guest_enter();
466 local_irq_enable();
467 VCPU_EVENT(vcpu, 6, "entering sie flags %x",
468 atomic_read(&vcpu->arch.sie_block->cpuflags));
Carsten Otte1f0d0f02008-05-21 13:37:40 +0200469 if (sie64a(vcpu->arch.sie_block, vcpu->arch.guest_gprs)) {
470 VCPU_EVENT(vcpu, 3, "%s", "fault in sie instruction");
471 kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
472 }
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100473 VCPU_EVENT(vcpu, 6, "exit sie icptcode %d",
474 vcpu->arch.sie_block->icptcode);
475 local_irq_disable();
476 kvm_guest_exit();
477 local_irq_enable();
478
479 memcpy(&vcpu->arch.guest_gprs[14], &vcpu->arch.sie_block->gg14, 16);
480}
481
482int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
483{
Christian Borntraeger8f2abe62008-03-25 18:47:23 +0100484 int rc;
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100485 sigset_t sigsaved;
486
Christian Ehrhardt9ace9032009-05-20 15:34:55 +0200487rerun_vcpu:
Christian Ehrhardt628eb9b2009-05-25 13:40:51 +0200488 if (vcpu->requests)
489 if (test_and_clear_bit(KVM_REQ_MMU_RELOAD, &vcpu->requests))
490 kvm_s390_vcpu_set_mem(vcpu);
491
Carsten Otte51e4d5a2009-05-12 17:21:53 +0200492 /* verify, that memory has been registered */
Christian Ehrhardt628eb9b2009-05-25 13:40:51 +0200493 if (!vcpu->arch.sie_block->gmslm) {
Carsten Otte51e4d5a2009-05-12 17:21:53 +0200494 vcpu_put(vcpu);
Christian Ehrhardt628eb9b2009-05-25 13:40:51 +0200495 VCPU_EVENT(vcpu, 3, "%s", "no memory registered to run vcpu");
Carsten Otte51e4d5a2009-05-12 17:21:53 +0200496 return -EINVAL;
497 }
498
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100499 if (vcpu->sigset_active)
500 sigprocmask(SIG_SETMASK, &vcpu->sigset, &sigsaved);
501
502 atomic_set_mask(CPUSTAT_RUNNING, &vcpu->arch.sie_block->cpuflags);
503
Carsten Otteba5c1e92008-03-25 18:47:26 +0100504 BUG_ON(vcpu->kvm->arch.float_int.local_int[vcpu->vcpu_id] == NULL);
505
Christian Borntraeger8f2abe62008-03-25 18:47:23 +0100506 switch (kvm_run->exit_reason) {
507 case KVM_EXIT_S390_SIEIC:
Christian Borntraeger8f2abe62008-03-25 18:47:23 +0100508 case KVM_EXIT_UNKNOWN:
Christian Ehrhardt9ace9032009-05-20 15:34:55 +0200509 case KVM_EXIT_INTR:
Christian Borntraeger8f2abe62008-03-25 18:47:23 +0100510 case KVM_EXIT_S390_RESET:
511 break;
512 default:
513 BUG();
514 }
515
Carsten Otted7b0b5e2009-11-19 14:21:16 +0100516 vcpu->arch.sie_block->gpsw.mask = kvm_run->psw_mask;
517 vcpu->arch.sie_block->gpsw.addr = kvm_run->psw_addr;
518
Heiko Carstensdab4079d2009-06-12 10:26:32 +0200519 might_fault();
Christian Borntraeger8f2abe62008-03-25 18:47:23 +0100520
521 do {
522 __vcpu_run(vcpu);
Christian Borntraeger8f2abe62008-03-25 18:47:23 +0100523 rc = kvm_handle_sie_intercept(vcpu);
524 } while (!signal_pending(current) && !rc);
525
Christian Ehrhardt9ace9032009-05-20 15:34:55 +0200526 if (rc == SIE_INTERCEPT_RERUNVCPU)
527 goto rerun_vcpu;
528
Christian Ehrhardtb1d16c42009-05-20 15:34:56 +0200529 if (signal_pending(current) && !rc) {
530 kvm_run->exit_reason = KVM_EXIT_INTR;
Christian Borntraeger8f2abe62008-03-25 18:47:23 +0100531 rc = -EINTR;
Christian Ehrhardtb1d16c42009-05-20 15:34:56 +0200532 }
Christian Borntraeger8f2abe62008-03-25 18:47:23 +0100533
Heiko Carstensb8e660b2010-02-26 22:37:41 +0100534 if (rc == -EOPNOTSUPP) {
Christian Borntraeger8f2abe62008-03-25 18:47:23 +0100535 /* intercept cannot be handled in-kernel, prepare kvm-run */
536 kvm_run->exit_reason = KVM_EXIT_S390_SIEIC;
537 kvm_run->s390_sieic.icptcode = vcpu->arch.sie_block->icptcode;
Christian Borntraeger8f2abe62008-03-25 18:47:23 +0100538 kvm_run->s390_sieic.ipa = vcpu->arch.sie_block->ipa;
539 kvm_run->s390_sieic.ipb = vcpu->arch.sie_block->ipb;
540 rc = 0;
541 }
542
543 if (rc == -EREMOTE) {
544 /* intercept was handled, but userspace support is needed
545 * kvm_run has been prepared by the handler */
546 rc = 0;
547 }
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100548
Carsten Otted7b0b5e2009-11-19 14:21:16 +0100549 kvm_run->psw_mask = vcpu->arch.sie_block->gpsw.mask;
550 kvm_run->psw_addr = vcpu->arch.sie_block->gpsw.addr;
551
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100552 if (vcpu->sigset_active)
553 sigprocmask(SIG_SETMASK, &sigsaved, NULL);
554
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100555 vcpu->stat.exit_userspace++;
Heiko Carstens7e8e6ab2008-04-04 15:12:35 +0200556 return rc;
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100557}
558
559static int __guestcopy(struct kvm_vcpu *vcpu, u64 guestdest, const void *from,
560 unsigned long n, int prefix)
561{
562 if (prefix)
563 return copy_to_guest(vcpu, guestdest, from, n);
564 else
565 return copy_to_guest_absolute(vcpu, guestdest, from, n);
566}
567
568/*
569 * store status at address
570 * we use have two special cases:
571 * KVM_S390_STORE_STATUS_NOADDR: -> 0x1200 on 64 bit
572 * KVM_S390_STORE_STATUS_PREFIXED: -> prefix
573 */
Christian Borntraeger971eb772010-06-12 08:54:13 +0200574int kvm_s390_vcpu_store_status(struct kvm_vcpu *vcpu, unsigned long addr)
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100575{
576 const unsigned char archmode = 1;
577 int prefix;
578
579 if (addr == KVM_S390_STORE_STATUS_NOADDR) {
580 if (copy_to_guest_absolute(vcpu, 163ul, &archmode, 1))
581 return -EFAULT;
582 addr = SAVE_AREA_BASE;
583 prefix = 0;
584 } else if (addr == KVM_S390_STORE_STATUS_PREFIXED) {
585 if (copy_to_guest(vcpu, 163ul, &archmode, 1))
586 return -EFAULT;
587 addr = SAVE_AREA_BASE;
588 prefix = 1;
589 } else
590 prefix = 0;
591
Heiko Carstensf64ca212010-02-26 22:37:32 +0100592 if (__guestcopy(vcpu, addr + offsetof(struct save_area, fp_regs),
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100593 vcpu->arch.guest_fpregs.fprs, 128, prefix))
594 return -EFAULT;
595
Heiko Carstensf64ca212010-02-26 22:37:32 +0100596 if (__guestcopy(vcpu, addr + offsetof(struct save_area, gp_regs),
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100597 vcpu->arch.guest_gprs, 128, prefix))
598 return -EFAULT;
599
Heiko Carstensf64ca212010-02-26 22:37:32 +0100600 if (__guestcopy(vcpu, addr + offsetof(struct save_area, psw),
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100601 &vcpu->arch.sie_block->gpsw, 16, prefix))
602 return -EFAULT;
603
Heiko Carstensf64ca212010-02-26 22:37:32 +0100604 if (__guestcopy(vcpu, addr + offsetof(struct save_area, pref_reg),
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100605 &vcpu->arch.sie_block->prefix, 4, prefix))
606 return -EFAULT;
607
608 if (__guestcopy(vcpu,
Heiko Carstensf64ca212010-02-26 22:37:32 +0100609 addr + offsetof(struct save_area, fp_ctrl_reg),
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100610 &vcpu->arch.guest_fpregs.fpc, 4, prefix))
611 return -EFAULT;
612
Heiko Carstensf64ca212010-02-26 22:37:32 +0100613 if (__guestcopy(vcpu, addr + offsetof(struct save_area, tod_reg),
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100614 &vcpu->arch.sie_block->todpr, 4, prefix))
615 return -EFAULT;
616
Heiko Carstensf64ca212010-02-26 22:37:32 +0100617 if (__guestcopy(vcpu, addr + offsetof(struct save_area, timer),
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100618 &vcpu->arch.sie_block->cputm, 8, prefix))
619 return -EFAULT;
620
Heiko Carstensf64ca212010-02-26 22:37:32 +0100621 if (__guestcopy(vcpu, addr + offsetof(struct save_area, clk_cmp),
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100622 &vcpu->arch.sie_block->ckc, 8, prefix))
623 return -EFAULT;
624
Heiko Carstensf64ca212010-02-26 22:37:32 +0100625 if (__guestcopy(vcpu, addr + offsetof(struct save_area, acc_regs),
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100626 &vcpu->arch.guest_acrs, 64, prefix))
627 return -EFAULT;
628
629 if (__guestcopy(vcpu,
Heiko Carstensf64ca212010-02-26 22:37:32 +0100630 addr + offsetof(struct save_area, ctrl_regs),
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100631 &vcpu->arch.sie_block->gcr, 128, prefix))
632 return -EFAULT;
633 return 0;
634}
635
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100636long kvm_arch_vcpu_ioctl(struct file *filp,
637 unsigned int ioctl, unsigned long arg)
638{
639 struct kvm_vcpu *vcpu = filp->private_data;
640 void __user *argp = (void __user *)arg;
Avi Kivitybc923cc2010-05-13 12:21:46 +0300641 long r;
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100642
Avi Kivity93736622010-05-13 12:35:17 +0300643 switch (ioctl) {
644 case KVM_S390_INTERRUPT: {
Carsten Otteba5c1e92008-03-25 18:47:26 +0100645 struct kvm_s390_interrupt s390int;
646
Avi Kivity93736622010-05-13 12:35:17 +0300647 r = -EFAULT;
Carsten Otteba5c1e92008-03-25 18:47:26 +0100648 if (copy_from_user(&s390int, argp, sizeof(s390int)))
Avi Kivity93736622010-05-13 12:35:17 +0300649 break;
650 r = kvm_s390_inject_vcpu(vcpu, &s390int);
651 break;
Carsten Otteba5c1e92008-03-25 18:47:26 +0100652 }
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100653 case KVM_S390_STORE_STATUS:
Avi Kivitybc923cc2010-05-13 12:21:46 +0300654 r = kvm_s390_vcpu_store_status(vcpu, arg);
655 break;
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100656 case KVM_S390_SET_INITIAL_PSW: {
657 psw_t psw;
658
Avi Kivitybc923cc2010-05-13 12:21:46 +0300659 r = -EFAULT;
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100660 if (copy_from_user(&psw, argp, sizeof(psw)))
Avi Kivitybc923cc2010-05-13 12:21:46 +0300661 break;
662 r = kvm_arch_vcpu_ioctl_set_initial_psw(vcpu, psw);
663 break;
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100664 }
665 case KVM_S390_INITIAL_RESET:
Avi Kivitybc923cc2010-05-13 12:21:46 +0300666 r = kvm_arch_vcpu_ioctl_initial_reset(vcpu);
667 break;
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100668 default:
Avi Kivitybc923cc2010-05-13 12:21:46 +0300669 r = -EINVAL;
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100670 }
Avi Kivitybc923cc2010-05-13 12:21:46 +0300671 return r;
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100672}
673
674/* Section: memory related */
Marcelo Tosattif7784b82009-12-23 14:35:18 -0200675int kvm_arch_prepare_memory_region(struct kvm *kvm,
676 struct kvm_memory_slot *memslot,
677 struct kvm_memory_slot old,
678 struct kvm_userspace_memory_region *mem,
679 int user_alloc)
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100680{
681 /* A few sanity checks. We can have exactly one memory slot which has
682 to start at guest virtual zero and which has to be located at a
683 page boundary in userland and which has to end at a page boundary.
684 The memory in userland is ok to be fragmented into various different
685 vmas. It is okay to mmap() and munmap() stuff in this slot after
686 doing this call at any time */
687
Christian Ehrhardt628eb9b2009-05-25 13:40:51 +0200688 if (mem->slot)
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100689 return -EINVAL;
690
691 if (mem->guest_phys_addr)
692 return -EINVAL;
693
694 if (mem->userspace_addr & (PAGE_SIZE - 1))
695 return -EINVAL;
696
697 if (mem->memory_size & (PAGE_SIZE - 1))
698 return -EINVAL;
699
Carsten Otte2668dab2009-05-12 17:21:48 +0200700 if (!user_alloc)
701 return -EINVAL;
702
Marcelo Tosattif7784b82009-12-23 14:35:18 -0200703 return 0;
704}
705
706void kvm_arch_commit_memory_region(struct kvm *kvm,
707 struct kvm_userspace_memory_region *mem,
708 struct kvm_memory_slot old,
709 int user_alloc)
710{
711 int i;
712 struct kvm_vcpu *vcpu;
713
Christian Ehrhardt628eb9b2009-05-25 13:40:51 +0200714 /* request update of sie control block for all available vcpus */
Gleb Natapov988a2ca2009-06-09 15:56:29 +0300715 kvm_for_each_vcpu(i, vcpu, kvm) {
716 if (test_and_set_bit(KVM_REQ_MMU_RELOAD, &vcpu->requests))
717 continue;
718 kvm_s390_inject_sigp_stop(vcpu, ACTION_RELOADVCPU_ON_STOP);
Carsten Otte2668dab2009-05-12 17:21:48 +0200719 }
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100720}
721
Marcelo Tosatti34d4cb82008-07-10 20:49:31 -0300722void kvm_arch_flush_shadow(struct kvm *kvm)
723{
724}
725
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100726static int __init kvm_s390_init(void)
727{
Christian Borntraegeref50f7a2009-06-23 17:24:07 +0200728 int ret;
Avi Kivity0ee75be2010-04-28 15:39:01 +0300729 ret = kvm_init(NULL, sizeof(struct kvm_vcpu), 0, THIS_MODULE);
Christian Borntraegeref50f7a2009-06-23 17:24:07 +0200730 if (ret)
731 return ret;
732
733 /*
734 * guests can ask for up to 255+1 double words, we need a full page
735 * to hold the maximum amount of facilites. On the other hand, we
736 * only set facilities that are known to work in KVM.
737 */
Heiko Carstensc2f0e8c2010-06-08 18:58:09 +0200738 facilities = (unsigned long long *) get_zeroed_page(GFP_KERNEL|GFP_DMA);
Christian Borntraegeref50f7a2009-06-23 17:24:07 +0200739 if (!facilities) {
740 kvm_exit();
741 return -ENOMEM;
742 }
743 stfle(facilities, 1);
744 facilities[0] &= 0xff00fff3f0700000ULL;
745 return 0;
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100746}
747
748static void __exit kvm_s390_exit(void)
749{
Christian Borntraegeref50f7a2009-06-23 17:24:07 +0200750 free_page((unsigned long) facilities);
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100751 kvm_exit();
752}
753
754module_init(kvm_s390_init);
755module_exit(kvm_s390_exit);