1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * hosting IBM Z kernel virtual machines (s390x)
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright IBM Corp. 2008, 2020
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * Author(s): Carsten Otte <cotte@de.ibm.com>
8*4882a593Smuzhiyun * Christian Borntraeger <borntraeger@de.ibm.com>
9*4882a593Smuzhiyun * Heiko Carstens <heiko.carstens@de.ibm.com>
10*4882a593Smuzhiyun * Christian Ehrhardt <ehrhardt@de.ibm.com>
11*4882a593Smuzhiyun * Jason J. Herne <jjherne@us.ibm.com>
12*4882a593Smuzhiyun */
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun #define KMSG_COMPONENT "kvm-s390"
15*4882a593Smuzhiyun #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun #include <linux/compiler.h>
18*4882a593Smuzhiyun #include <linux/err.h>
19*4882a593Smuzhiyun #include <linux/fs.h>
20*4882a593Smuzhiyun #include <linux/hrtimer.h>
21*4882a593Smuzhiyun #include <linux/init.h>
22*4882a593Smuzhiyun #include <linux/kvm.h>
23*4882a593Smuzhiyun #include <linux/kvm_host.h>
24*4882a593Smuzhiyun #include <linux/mman.h>
25*4882a593Smuzhiyun #include <linux/module.h>
26*4882a593Smuzhiyun #include <linux/moduleparam.h>
27*4882a593Smuzhiyun #include <linux/random.h>
28*4882a593Smuzhiyun #include <linux/slab.h>
29*4882a593Smuzhiyun #include <linux/timer.h>
30*4882a593Smuzhiyun #include <linux/vmalloc.h>
31*4882a593Smuzhiyun #include <linux/bitmap.h>
32*4882a593Smuzhiyun #include <linux/sched/signal.h>
33*4882a593Smuzhiyun #include <linux/string.h>
34*4882a593Smuzhiyun #include <linux/pgtable.h>
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun #include <asm/asm-offsets.h>
37*4882a593Smuzhiyun #include <asm/lowcore.h>
38*4882a593Smuzhiyun #include <asm/stp.h>
39*4882a593Smuzhiyun #include <asm/gmap.h>
40*4882a593Smuzhiyun #include <asm/nmi.h>
41*4882a593Smuzhiyun #include <asm/switch_to.h>
42*4882a593Smuzhiyun #include <asm/isc.h>
43*4882a593Smuzhiyun #include <asm/sclp.h>
44*4882a593Smuzhiyun #include <asm/cpacf.h>
45*4882a593Smuzhiyun #include <asm/timex.h>
46*4882a593Smuzhiyun #include <asm/ap.h>
47*4882a593Smuzhiyun #include <asm/uv.h>
48*4882a593Smuzhiyun #include "kvm-s390.h"
49*4882a593Smuzhiyun #include "gaccess.h"
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun #define CREATE_TRACE_POINTS
52*4882a593Smuzhiyun #include "trace.h"
53*4882a593Smuzhiyun #include "trace-s390.h"
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun #define MEM_OP_MAX_SIZE 65536 /* Maximum transfer size for KVM_S390_MEM_OP */
56*4882a593Smuzhiyun #define LOCAL_IRQS 32
57*4882a593Smuzhiyun #define VCPU_IRQS_MAX_BUF (sizeof(struct kvm_s390_irq) * \
58*4882a593Smuzhiyun (KVM_MAX_VCPUS + LOCAL_IRQS))
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun struct kvm_stats_debugfs_item debugfs_entries[] = {
61*4882a593Smuzhiyun VCPU_STAT("userspace_handled", exit_userspace),
62*4882a593Smuzhiyun VCPU_STAT("exit_null", exit_null),
63*4882a593Smuzhiyun VCPU_STAT("exit_validity", exit_validity),
64*4882a593Smuzhiyun VCPU_STAT("exit_stop_request", exit_stop_request),
65*4882a593Smuzhiyun VCPU_STAT("exit_external_request", exit_external_request),
66*4882a593Smuzhiyun VCPU_STAT("exit_io_request", exit_io_request),
67*4882a593Smuzhiyun VCPU_STAT("exit_external_interrupt", exit_external_interrupt),
68*4882a593Smuzhiyun VCPU_STAT("exit_instruction", exit_instruction),
69*4882a593Smuzhiyun VCPU_STAT("exit_pei", exit_pei),
70*4882a593Smuzhiyun VCPU_STAT("exit_program_interruption", exit_program_interruption),
71*4882a593Smuzhiyun VCPU_STAT("exit_instr_and_program_int", exit_instr_and_program),
72*4882a593Smuzhiyun VCPU_STAT("exit_operation_exception", exit_operation_exception),
73*4882a593Smuzhiyun VCPU_STAT("halt_successful_poll", halt_successful_poll),
74*4882a593Smuzhiyun VCPU_STAT("halt_attempted_poll", halt_attempted_poll),
75*4882a593Smuzhiyun VCPU_STAT("halt_poll_invalid", halt_poll_invalid),
76*4882a593Smuzhiyun VCPU_STAT("halt_no_poll_steal", halt_no_poll_steal),
77*4882a593Smuzhiyun VCPU_STAT("halt_wakeup", halt_wakeup),
78*4882a593Smuzhiyun VCPU_STAT("halt_poll_success_ns", halt_poll_success_ns),
79*4882a593Smuzhiyun VCPU_STAT("halt_poll_fail_ns", halt_poll_fail_ns),
80*4882a593Smuzhiyun VCPU_STAT("instruction_lctlg", instruction_lctlg),
81*4882a593Smuzhiyun VCPU_STAT("instruction_lctl", instruction_lctl),
82*4882a593Smuzhiyun VCPU_STAT("instruction_stctl", instruction_stctl),
83*4882a593Smuzhiyun VCPU_STAT("instruction_stctg", instruction_stctg),
84*4882a593Smuzhiyun VCPU_STAT("deliver_ckc", deliver_ckc),
85*4882a593Smuzhiyun VCPU_STAT("deliver_cputm", deliver_cputm),
86*4882a593Smuzhiyun VCPU_STAT("deliver_emergency_signal", deliver_emergency_signal),
87*4882a593Smuzhiyun VCPU_STAT("deliver_external_call", deliver_external_call),
88*4882a593Smuzhiyun VCPU_STAT("deliver_service_signal", deliver_service_signal),
89*4882a593Smuzhiyun VCPU_STAT("deliver_virtio", deliver_virtio),
90*4882a593Smuzhiyun VCPU_STAT("deliver_stop_signal", deliver_stop_signal),
91*4882a593Smuzhiyun VCPU_STAT("deliver_prefix_signal", deliver_prefix_signal),
92*4882a593Smuzhiyun VCPU_STAT("deliver_restart_signal", deliver_restart_signal),
93*4882a593Smuzhiyun VCPU_STAT("deliver_program", deliver_program),
94*4882a593Smuzhiyun VCPU_STAT("deliver_io", deliver_io),
95*4882a593Smuzhiyun VCPU_STAT("deliver_machine_check", deliver_machine_check),
96*4882a593Smuzhiyun VCPU_STAT("exit_wait_state", exit_wait_state),
97*4882a593Smuzhiyun VCPU_STAT("inject_ckc", inject_ckc),
98*4882a593Smuzhiyun VCPU_STAT("inject_cputm", inject_cputm),
99*4882a593Smuzhiyun VCPU_STAT("inject_external_call", inject_external_call),
100*4882a593Smuzhiyun VM_STAT("inject_float_mchk", inject_float_mchk),
101*4882a593Smuzhiyun VCPU_STAT("inject_emergency_signal", inject_emergency_signal),
102*4882a593Smuzhiyun VM_STAT("inject_io", inject_io),
103*4882a593Smuzhiyun VCPU_STAT("inject_mchk", inject_mchk),
104*4882a593Smuzhiyun VM_STAT("inject_pfault_done", inject_pfault_done),
105*4882a593Smuzhiyun VCPU_STAT("inject_program", inject_program),
106*4882a593Smuzhiyun VCPU_STAT("inject_restart", inject_restart),
107*4882a593Smuzhiyun VM_STAT("inject_service_signal", inject_service_signal),
108*4882a593Smuzhiyun VCPU_STAT("inject_set_prefix", inject_set_prefix),
109*4882a593Smuzhiyun VCPU_STAT("inject_stop_signal", inject_stop_signal),
110*4882a593Smuzhiyun VCPU_STAT("inject_pfault_init", inject_pfault_init),
111*4882a593Smuzhiyun VM_STAT("inject_virtio", inject_virtio),
112*4882a593Smuzhiyun VCPU_STAT("instruction_epsw", instruction_epsw),
113*4882a593Smuzhiyun VCPU_STAT("instruction_gs", instruction_gs),
114*4882a593Smuzhiyun VCPU_STAT("instruction_io_other", instruction_io_other),
115*4882a593Smuzhiyun VCPU_STAT("instruction_lpsw", instruction_lpsw),
116*4882a593Smuzhiyun VCPU_STAT("instruction_lpswe", instruction_lpswe),
117*4882a593Smuzhiyun VCPU_STAT("instruction_pfmf", instruction_pfmf),
118*4882a593Smuzhiyun VCPU_STAT("instruction_ptff", instruction_ptff),
119*4882a593Smuzhiyun VCPU_STAT("instruction_stidp", instruction_stidp),
120*4882a593Smuzhiyun VCPU_STAT("instruction_sck", instruction_sck),
121*4882a593Smuzhiyun VCPU_STAT("instruction_sckpf", instruction_sckpf),
122*4882a593Smuzhiyun VCPU_STAT("instruction_spx", instruction_spx),
123*4882a593Smuzhiyun VCPU_STAT("instruction_stpx", instruction_stpx),
124*4882a593Smuzhiyun VCPU_STAT("instruction_stap", instruction_stap),
125*4882a593Smuzhiyun VCPU_STAT("instruction_iske", instruction_iske),
126*4882a593Smuzhiyun VCPU_STAT("instruction_ri", instruction_ri),
127*4882a593Smuzhiyun VCPU_STAT("instruction_rrbe", instruction_rrbe),
128*4882a593Smuzhiyun VCPU_STAT("instruction_sske", instruction_sske),
129*4882a593Smuzhiyun VCPU_STAT("instruction_ipte_interlock", instruction_ipte_interlock),
130*4882a593Smuzhiyun VCPU_STAT("instruction_essa", instruction_essa),
131*4882a593Smuzhiyun VCPU_STAT("instruction_stsi", instruction_stsi),
132*4882a593Smuzhiyun VCPU_STAT("instruction_stfl", instruction_stfl),
133*4882a593Smuzhiyun VCPU_STAT("instruction_tb", instruction_tb),
134*4882a593Smuzhiyun VCPU_STAT("instruction_tpi", instruction_tpi),
135*4882a593Smuzhiyun VCPU_STAT("instruction_tprot", instruction_tprot),
136*4882a593Smuzhiyun VCPU_STAT("instruction_tsch", instruction_tsch),
137*4882a593Smuzhiyun VCPU_STAT("instruction_sthyi", instruction_sthyi),
138*4882a593Smuzhiyun VCPU_STAT("instruction_sie", instruction_sie),
139*4882a593Smuzhiyun VCPU_STAT("instruction_sigp_sense", instruction_sigp_sense),
140*4882a593Smuzhiyun VCPU_STAT("instruction_sigp_sense_running", instruction_sigp_sense_running),
141*4882a593Smuzhiyun VCPU_STAT("instruction_sigp_external_call", instruction_sigp_external_call),
142*4882a593Smuzhiyun VCPU_STAT("instruction_sigp_emergency", instruction_sigp_emergency),
143*4882a593Smuzhiyun VCPU_STAT("instruction_sigp_cond_emergency", instruction_sigp_cond_emergency),
144*4882a593Smuzhiyun VCPU_STAT("instruction_sigp_start", instruction_sigp_start),
145*4882a593Smuzhiyun VCPU_STAT("instruction_sigp_stop", instruction_sigp_stop),
146*4882a593Smuzhiyun VCPU_STAT("instruction_sigp_stop_store_status", instruction_sigp_stop_store_status),
147*4882a593Smuzhiyun VCPU_STAT("instruction_sigp_store_status", instruction_sigp_store_status),
148*4882a593Smuzhiyun VCPU_STAT("instruction_sigp_store_adtl_status", instruction_sigp_store_adtl_status),
149*4882a593Smuzhiyun VCPU_STAT("instruction_sigp_set_arch", instruction_sigp_arch),
150*4882a593Smuzhiyun VCPU_STAT("instruction_sigp_set_prefix", instruction_sigp_prefix),
151*4882a593Smuzhiyun VCPU_STAT("instruction_sigp_restart", instruction_sigp_restart),
152*4882a593Smuzhiyun VCPU_STAT("instruction_sigp_cpu_reset", instruction_sigp_cpu_reset),
153*4882a593Smuzhiyun VCPU_STAT("instruction_sigp_init_cpu_reset", instruction_sigp_init_cpu_reset),
154*4882a593Smuzhiyun VCPU_STAT("instruction_sigp_unknown", instruction_sigp_unknown),
155*4882a593Smuzhiyun VCPU_STAT("instruction_diag_10", diagnose_10),
156*4882a593Smuzhiyun VCPU_STAT("instruction_diag_44", diagnose_44),
157*4882a593Smuzhiyun VCPU_STAT("instruction_diag_9c", diagnose_9c),
158*4882a593Smuzhiyun VCPU_STAT("diag_9c_ignored", diagnose_9c_ignored),
159*4882a593Smuzhiyun VCPU_STAT("instruction_diag_258", diagnose_258),
160*4882a593Smuzhiyun VCPU_STAT("instruction_diag_308", diagnose_308),
161*4882a593Smuzhiyun VCPU_STAT("instruction_diag_500", diagnose_500),
162*4882a593Smuzhiyun VCPU_STAT("instruction_diag_other", diagnose_other),
163*4882a593Smuzhiyun { NULL }
164*4882a593Smuzhiyun };
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun struct kvm_s390_tod_clock_ext {
167*4882a593Smuzhiyun __u8 epoch_idx;
168*4882a593Smuzhiyun __u64 tod;
169*4882a593Smuzhiyun __u8 reserved[7];
170*4882a593Smuzhiyun } __packed;
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun /* allow nested virtualization in KVM (if enabled by user space) */
173*4882a593Smuzhiyun static int nested;
174*4882a593Smuzhiyun module_param(nested, int, S_IRUGO);
175*4882a593Smuzhiyun MODULE_PARM_DESC(nested, "Nested virtualization support");
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun /* allow 1m huge page guest backing, if !nested */
178*4882a593Smuzhiyun static int hpage;
179*4882a593Smuzhiyun module_param(hpage, int, 0444);
180*4882a593Smuzhiyun MODULE_PARM_DESC(hpage, "1m huge page backing support");
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun /* maximum percentage of steal time for polling. >100 is treated like 100 */
183*4882a593Smuzhiyun static u8 halt_poll_max_steal = 10;
184*4882a593Smuzhiyun module_param(halt_poll_max_steal, byte, 0644);
185*4882a593Smuzhiyun MODULE_PARM_DESC(halt_poll_max_steal, "Maximum percentage of steal time to allow polling");
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun /* if set to true, the GISA will be initialized and used if available */
188*4882a593Smuzhiyun static bool use_gisa = true;
189*4882a593Smuzhiyun module_param(use_gisa, bool, 0644);
190*4882a593Smuzhiyun MODULE_PARM_DESC(use_gisa, "Use the GISA if the host supports it.");
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun /*
193*4882a593Smuzhiyun * For now we handle at most 16 double words as this is what the s390 base
194*4882a593Smuzhiyun * kernel handles and stores in the prefix page. If we ever need to go beyond
195*4882a593Smuzhiyun * this, this requires changes to code, but the external uapi can stay.
196*4882a593Smuzhiyun */
197*4882a593Smuzhiyun #define SIZE_INTERNAL 16
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun /*
200*4882a593Smuzhiyun * Base feature mask that defines default mask for facilities. Consists of the
201*4882a593Smuzhiyun * defines in FACILITIES_KVM and the non-hypervisor managed bits.
202*4882a593Smuzhiyun */
203*4882a593Smuzhiyun static unsigned long kvm_s390_fac_base[SIZE_INTERNAL] = { FACILITIES_KVM };
204*4882a593Smuzhiyun /*
205*4882a593Smuzhiyun * Extended feature mask. Consists of the defines in FACILITIES_KVM_CPUMODEL
206*4882a593Smuzhiyun * and defines the facilities that can be enabled via a cpu model.
207*4882a593Smuzhiyun */
208*4882a593Smuzhiyun static unsigned long kvm_s390_fac_ext[SIZE_INTERNAL] = { FACILITIES_KVM_CPUMODEL };
209*4882a593Smuzhiyun
kvm_s390_fac_size(void)210*4882a593Smuzhiyun static unsigned long kvm_s390_fac_size(void)
211*4882a593Smuzhiyun {
212*4882a593Smuzhiyun BUILD_BUG_ON(SIZE_INTERNAL > S390_ARCH_FAC_MASK_SIZE_U64);
213*4882a593Smuzhiyun BUILD_BUG_ON(SIZE_INTERNAL > S390_ARCH_FAC_LIST_SIZE_U64);
214*4882a593Smuzhiyun BUILD_BUG_ON(SIZE_INTERNAL * sizeof(unsigned long) >
215*4882a593Smuzhiyun sizeof(S390_lowcore.stfle_fac_list));
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun return SIZE_INTERNAL;
218*4882a593Smuzhiyun }
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun /* available cpu features supported by kvm */
221*4882a593Smuzhiyun static DECLARE_BITMAP(kvm_s390_available_cpu_feat, KVM_S390_VM_CPU_FEAT_NR_BITS);
222*4882a593Smuzhiyun /* available subfunctions indicated via query / "test bit" */
223*4882a593Smuzhiyun static struct kvm_s390_vm_cpu_subfunc kvm_s390_available_subfunc;
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun static struct gmap_notifier gmap_notifier;
226*4882a593Smuzhiyun static struct gmap_notifier vsie_gmap_notifier;
227*4882a593Smuzhiyun debug_info_t *kvm_s390_dbf;
228*4882a593Smuzhiyun debug_info_t *kvm_s390_dbf_uv;
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun /* Section: not file related */
kvm_arch_hardware_enable(void)231*4882a593Smuzhiyun int kvm_arch_hardware_enable(void)
232*4882a593Smuzhiyun {
233*4882a593Smuzhiyun /* every s390 is virtualization enabled ;-) */
234*4882a593Smuzhiyun return 0;
235*4882a593Smuzhiyun }
236*4882a593Smuzhiyun
kvm_arch_check_processor_compat(void * opaque)237*4882a593Smuzhiyun int kvm_arch_check_processor_compat(void *opaque)
238*4882a593Smuzhiyun {
239*4882a593Smuzhiyun return 0;
240*4882a593Smuzhiyun }
241*4882a593Smuzhiyun
242*4882a593Smuzhiyun /* forward declarations */
243*4882a593Smuzhiyun static void kvm_gmap_notifier(struct gmap *gmap, unsigned long start,
244*4882a593Smuzhiyun unsigned long end);
245*4882a593Smuzhiyun static int sca_switch_to_extended(struct kvm *kvm);
246*4882a593Smuzhiyun
kvm_clock_sync_scb(struct kvm_s390_sie_block * scb,u64 delta)247*4882a593Smuzhiyun static void kvm_clock_sync_scb(struct kvm_s390_sie_block *scb, u64 delta)
248*4882a593Smuzhiyun {
249*4882a593Smuzhiyun u8 delta_idx = 0;
250*4882a593Smuzhiyun
251*4882a593Smuzhiyun /*
252*4882a593Smuzhiyun * The TOD jumps by delta, we have to compensate this by adding
253*4882a593Smuzhiyun * -delta to the epoch.
254*4882a593Smuzhiyun */
255*4882a593Smuzhiyun delta = -delta;
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun /* sign-extension - we're adding to signed values below */
258*4882a593Smuzhiyun if ((s64)delta < 0)
259*4882a593Smuzhiyun delta_idx = -1;
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun scb->epoch += delta;
262*4882a593Smuzhiyun if (scb->ecd & ECD_MEF) {
263*4882a593Smuzhiyun scb->epdx += delta_idx;
264*4882a593Smuzhiyun if (scb->epoch < delta)
265*4882a593Smuzhiyun scb->epdx += 1;
266*4882a593Smuzhiyun }
267*4882a593Smuzhiyun }
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun /*
270*4882a593Smuzhiyun * This callback is executed during stop_machine(). All CPUs are therefore
271*4882a593Smuzhiyun * temporarily stopped. In order not to change guest behavior, we have to
272*4882a593Smuzhiyun * disable preemption whenever we touch the epoch of kvm and the VCPUs,
273*4882a593Smuzhiyun * so a CPU won't be stopped while calculating with the epoch.
274*4882a593Smuzhiyun */
kvm_clock_sync(struct notifier_block * notifier,unsigned long val,void * v)275*4882a593Smuzhiyun static int kvm_clock_sync(struct notifier_block *notifier, unsigned long val,
276*4882a593Smuzhiyun void *v)
277*4882a593Smuzhiyun {
278*4882a593Smuzhiyun struct kvm *kvm;
279*4882a593Smuzhiyun struct kvm_vcpu *vcpu;
280*4882a593Smuzhiyun int i;
281*4882a593Smuzhiyun unsigned long long *delta = v;
282*4882a593Smuzhiyun
283*4882a593Smuzhiyun list_for_each_entry(kvm, &vm_list, vm_list) {
284*4882a593Smuzhiyun kvm_for_each_vcpu(i, vcpu, kvm) {
285*4882a593Smuzhiyun kvm_clock_sync_scb(vcpu->arch.sie_block, *delta);
286*4882a593Smuzhiyun if (i == 0) {
287*4882a593Smuzhiyun kvm->arch.epoch = vcpu->arch.sie_block->epoch;
288*4882a593Smuzhiyun kvm->arch.epdx = vcpu->arch.sie_block->epdx;
289*4882a593Smuzhiyun }
290*4882a593Smuzhiyun if (vcpu->arch.cputm_enabled)
291*4882a593Smuzhiyun vcpu->arch.cputm_start += *delta;
292*4882a593Smuzhiyun if (vcpu->arch.vsie_block)
293*4882a593Smuzhiyun kvm_clock_sync_scb(vcpu->arch.vsie_block,
294*4882a593Smuzhiyun *delta);
295*4882a593Smuzhiyun }
296*4882a593Smuzhiyun }
297*4882a593Smuzhiyun return NOTIFY_OK;
298*4882a593Smuzhiyun }
299*4882a593Smuzhiyun
300*4882a593Smuzhiyun static struct notifier_block kvm_clock_notifier = {
301*4882a593Smuzhiyun .notifier_call = kvm_clock_sync,
302*4882a593Smuzhiyun };
303*4882a593Smuzhiyun
kvm_arch_hardware_setup(void * opaque)304*4882a593Smuzhiyun int kvm_arch_hardware_setup(void *opaque)
305*4882a593Smuzhiyun {
306*4882a593Smuzhiyun gmap_notifier.notifier_call = kvm_gmap_notifier;
307*4882a593Smuzhiyun gmap_register_pte_notifier(&gmap_notifier);
308*4882a593Smuzhiyun vsie_gmap_notifier.notifier_call = kvm_s390_vsie_gmap_notifier;
309*4882a593Smuzhiyun gmap_register_pte_notifier(&vsie_gmap_notifier);
310*4882a593Smuzhiyun atomic_notifier_chain_register(&s390_epoch_delta_notifier,
311*4882a593Smuzhiyun &kvm_clock_notifier);
312*4882a593Smuzhiyun return 0;
313*4882a593Smuzhiyun }
314*4882a593Smuzhiyun
kvm_arch_hardware_unsetup(void)315*4882a593Smuzhiyun void kvm_arch_hardware_unsetup(void)
316*4882a593Smuzhiyun {
317*4882a593Smuzhiyun gmap_unregister_pte_notifier(&gmap_notifier);
318*4882a593Smuzhiyun gmap_unregister_pte_notifier(&vsie_gmap_notifier);
319*4882a593Smuzhiyun atomic_notifier_chain_unregister(&s390_epoch_delta_notifier,
320*4882a593Smuzhiyun &kvm_clock_notifier);
321*4882a593Smuzhiyun }
322*4882a593Smuzhiyun
allow_cpu_feat(unsigned long nr)323*4882a593Smuzhiyun static void allow_cpu_feat(unsigned long nr)
324*4882a593Smuzhiyun {
325*4882a593Smuzhiyun set_bit_inv(nr, kvm_s390_available_cpu_feat);
326*4882a593Smuzhiyun }
327*4882a593Smuzhiyun
plo_test_bit(unsigned char nr)328*4882a593Smuzhiyun static inline int plo_test_bit(unsigned char nr)
329*4882a593Smuzhiyun {
330*4882a593Smuzhiyun unsigned long function = (unsigned long)nr | 0x100;
331*4882a593Smuzhiyun int cc;
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun asm volatile(
334*4882a593Smuzhiyun " lgr 0,%[function]\n"
335*4882a593Smuzhiyun /* Parameter registers are ignored for "test bit" */
336*4882a593Smuzhiyun " plo 0,0,0,0(0)\n"
337*4882a593Smuzhiyun " ipm %0\n"
338*4882a593Smuzhiyun " srl %0,28\n"
339*4882a593Smuzhiyun : "=d" (cc)
340*4882a593Smuzhiyun : [function] "d" (function)
341*4882a593Smuzhiyun : "cc", "0");
342*4882a593Smuzhiyun return cc == 0;
343*4882a593Smuzhiyun }
344*4882a593Smuzhiyun
__insn32_query(unsigned int opcode,u8 * query)345*4882a593Smuzhiyun static __always_inline void __insn32_query(unsigned int opcode, u8 *query)
346*4882a593Smuzhiyun {
347*4882a593Smuzhiyun asm volatile(
348*4882a593Smuzhiyun " lghi 0,0\n"
349*4882a593Smuzhiyun " lgr 1,%[query]\n"
350*4882a593Smuzhiyun /* Parameter registers are ignored */
351*4882a593Smuzhiyun " .insn rrf,%[opc] << 16,2,4,6,0\n"
352*4882a593Smuzhiyun :
353*4882a593Smuzhiyun : [query] "d" ((unsigned long)query), [opc] "i" (opcode)
354*4882a593Smuzhiyun : "cc", "memory", "0", "1");
355*4882a593Smuzhiyun }
356*4882a593Smuzhiyun
357*4882a593Smuzhiyun #define INSN_SORTL 0xb938
358*4882a593Smuzhiyun #define INSN_DFLTCC 0xb939
359*4882a593Smuzhiyun
kvm_s390_cpu_feat_init(void)360*4882a593Smuzhiyun static void kvm_s390_cpu_feat_init(void)
361*4882a593Smuzhiyun {
362*4882a593Smuzhiyun int i;
363*4882a593Smuzhiyun
364*4882a593Smuzhiyun for (i = 0; i < 256; ++i) {
365*4882a593Smuzhiyun if (plo_test_bit(i))
366*4882a593Smuzhiyun kvm_s390_available_subfunc.plo[i >> 3] |= 0x80 >> (i & 7);
367*4882a593Smuzhiyun }
368*4882a593Smuzhiyun
369*4882a593Smuzhiyun if (test_facility(28)) /* TOD-clock steering */
370*4882a593Smuzhiyun ptff(kvm_s390_available_subfunc.ptff,
371*4882a593Smuzhiyun sizeof(kvm_s390_available_subfunc.ptff),
372*4882a593Smuzhiyun PTFF_QAF);
373*4882a593Smuzhiyun
374*4882a593Smuzhiyun if (test_facility(17)) { /* MSA */
375*4882a593Smuzhiyun __cpacf_query(CPACF_KMAC, (cpacf_mask_t *)
376*4882a593Smuzhiyun kvm_s390_available_subfunc.kmac);
377*4882a593Smuzhiyun __cpacf_query(CPACF_KMC, (cpacf_mask_t *)
378*4882a593Smuzhiyun kvm_s390_available_subfunc.kmc);
379*4882a593Smuzhiyun __cpacf_query(CPACF_KM, (cpacf_mask_t *)
380*4882a593Smuzhiyun kvm_s390_available_subfunc.km);
381*4882a593Smuzhiyun __cpacf_query(CPACF_KIMD, (cpacf_mask_t *)
382*4882a593Smuzhiyun kvm_s390_available_subfunc.kimd);
383*4882a593Smuzhiyun __cpacf_query(CPACF_KLMD, (cpacf_mask_t *)
384*4882a593Smuzhiyun kvm_s390_available_subfunc.klmd);
385*4882a593Smuzhiyun }
386*4882a593Smuzhiyun if (test_facility(76)) /* MSA3 */
387*4882a593Smuzhiyun __cpacf_query(CPACF_PCKMO, (cpacf_mask_t *)
388*4882a593Smuzhiyun kvm_s390_available_subfunc.pckmo);
389*4882a593Smuzhiyun if (test_facility(77)) { /* MSA4 */
390*4882a593Smuzhiyun __cpacf_query(CPACF_KMCTR, (cpacf_mask_t *)
391*4882a593Smuzhiyun kvm_s390_available_subfunc.kmctr);
392*4882a593Smuzhiyun __cpacf_query(CPACF_KMF, (cpacf_mask_t *)
393*4882a593Smuzhiyun kvm_s390_available_subfunc.kmf);
394*4882a593Smuzhiyun __cpacf_query(CPACF_KMO, (cpacf_mask_t *)
395*4882a593Smuzhiyun kvm_s390_available_subfunc.kmo);
396*4882a593Smuzhiyun __cpacf_query(CPACF_PCC, (cpacf_mask_t *)
397*4882a593Smuzhiyun kvm_s390_available_subfunc.pcc);
398*4882a593Smuzhiyun }
399*4882a593Smuzhiyun if (test_facility(57)) /* MSA5 */
400*4882a593Smuzhiyun __cpacf_query(CPACF_PRNO, (cpacf_mask_t *)
401*4882a593Smuzhiyun kvm_s390_available_subfunc.ppno);
402*4882a593Smuzhiyun
403*4882a593Smuzhiyun if (test_facility(146)) /* MSA8 */
404*4882a593Smuzhiyun __cpacf_query(CPACF_KMA, (cpacf_mask_t *)
405*4882a593Smuzhiyun kvm_s390_available_subfunc.kma);
406*4882a593Smuzhiyun
407*4882a593Smuzhiyun if (test_facility(155)) /* MSA9 */
408*4882a593Smuzhiyun __cpacf_query(CPACF_KDSA, (cpacf_mask_t *)
409*4882a593Smuzhiyun kvm_s390_available_subfunc.kdsa);
410*4882a593Smuzhiyun
411*4882a593Smuzhiyun if (test_facility(150)) /* SORTL */
412*4882a593Smuzhiyun __insn32_query(INSN_SORTL, kvm_s390_available_subfunc.sortl);
413*4882a593Smuzhiyun
414*4882a593Smuzhiyun if (test_facility(151)) /* DFLTCC */
415*4882a593Smuzhiyun __insn32_query(INSN_DFLTCC, kvm_s390_available_subfunc.dfltcc);
416*4882a593Smuzhiyun
417*4882a593Smuzhiyun if (MACHINE_HAS_ESOP)
418*4882a593Smuzhiyun allow_cpu_feat(KVM_S390_VM_CPU_FEAT_ESOP);
419*4882a593Smuzhiyun /*
420*4882a593Smuzhiyun * We need SIE support, ESOP (PROT_READ protection for gmap_shadow),
421*4882a593Smuzhiyun * 64bit SCAO (SCA passthrough) and IDTE (for gmap_shadow unshadowing).
422*4882a593Smuzhiyun */
423*4882a593Smuzhiyun if (!sclp.has_sief2 || !MACHINE_HAS_ESOP || !sclp.has_64bscao ||
424*4882a593Smuzhiyun !test_facility(3) || !nested)
425*4882a593Smuzhiyun return;
426*4882a593Smuzhiyun allow_cpu_feat(KVM_S390_VM_CPU_FEAT_SIEF2);
427*4882a593Smuzhiyun if (sclp.has_64bscao)
428*4882a593Smuzhiyun allow_cpu_feat(KVM_S390_VM_CPU_FEAT_64BSCAO);
429*4882a593Smuzhiyun if (sclp.has_siif)
430*4882a593Smuzhiyun allow_cpu_feat(KVM_S390_VM_CPU_FEAT_SIIF);
431*4882a593Smuzhiyun if (sclp.has_gpere)
432*4882a593Smuzhiyun allow_cpu_feat(KVM_S390_VM_CPU_FEAT_GPERE);
433*4882a593Smuzhiyun if (sclp.has_gsls)
434*4882a593Smuzhiyun allow_cpu_feat(KVM_S390_VM_CPU_FEAT_GSLS);
435*4882a593Smuzhiyun if (sclp.has_ib)
436*4882a593Smuzhiyun allow_cpu_feat(KVM_S390_VM_CPU_FEAT_IB);
437*4882a593Smuzhiyun if (sclp.has_cei)
438*4882a593Smuzhiyun allow_cpu_feat(KVM_S390_VM_CPU_FEAT_CEI);
439*4882a593Smuzhiyun if (sclp.has_ibs)
440*4882a593Smuzhiyun allow_cpu_feat(KVM_S390_VM_CPU_FEAT_IBS);
441*4882a593Smuzhiyun if (sclp.has_kss)
442*4882a593Smuzhiyun allow_cpu_feat(KVM_S390_VM_CPU_FEAT_KSS);
443*4882a593Smuzhiyun /*
444*4882a593Smuzhiyun * KVM_S390_VM_CPU_FEAT_SKEY: Wrong shadow of PTE.I bits will make
445*4882a593Smuzhiyun * all skey handling functions read/set the skey from the PGSTE
446*4882a593Smuzhiyun * instead of the real storage key.
447*4882a593Smuzhiyun *
448*4882a593Smuzhiyun * KVM_S390_VM_CPU_FEAT_CMMA: Wrong shadow of PTE.I bits will make
449*4882a593Smuzhiyun * pages being detected as preserved although they are resident.
450*4882a593Smuzhiyun *
451*4882a593Smuzhiyun * KVM_S390_VM_CPU_FEAT_PFMFI: Wrong shadow of PTE.I bits will
452*4882a593Smuzhiyun * have the same effect as for KVM_S390_VM_CPU_FEAT_SKEY.
453*4882a593Smuzhiyun *
454*4882a593Smuzhiyun * For KVM_S390_VM_CPU_FEAT_SKEY, KVM_S390_VM_CPU_FEAT_CMMA and
455*4882a593Smuzhiyun * KVM_S390_VM_CPU_FEAT_PFMFI, all PTE.I and PGSTE bits have to be
456*4882a593Smuzhiyun * correctly shadowed. We can do that for the PGSTE but not for PTE.I.
457*4882a593Smuzhiyun *
458*4882a593Smuzhiyun * KVM_S390_VM_CPU_FEAT_SIGPIF: Wrong SCB addresses in the SCA. We
459*4882a593Smuzhiyun * cannot easily shadow the SCA because of the ipte lock.
460*4882a593Smuzhiyun */
461*4882a593Smuzhiyun }
462*4882a593Smuzhiyun
kvm_arch_init(void * opaque)463*4882a593Smuzhiyun int kvm_arch_init(void *opaque)
464*4882a593Smuzhiyun {
465*4882a593Smuzhiyun int rc = -ENOMEM;
466*4882a593Smuzhiyun
467*4882a593Smuzhiyun kvm_s390_dbf = debug_register("kvm-trace", 32, 1, 7 * sizeof(long));
468*4882a593Smuzhiyun if (!kvm_s390_dbf)
469*4882a593Smuzhiyun return -ENOMEM;
470*4882a593Smuzhiyun
471*4882a593Smuzhiyun kvm_s390_dbf_uv = debug_register("kvm-uv", 32, 1, 7 * sizeof(long));
472*4882a593Smuzhiyun if (!kvm_s390_dbf_uv)
473*4882a593Smuzhiyun goto out;
474*4882a593Smuzhiyun
475*4882a593Smuzhiyun if (debug_register_view(kvm_s390_dbf, &debug_sprintf_view) ||
476*4882a593Smuzhiyun debug_register_view(kvm_s390_dbf_uv, &debug_sprintf_view))
477*4882a593Smuzhiyun goto out;
478*4882a593Smuzhiyun
479*4882a593Smuzhiyun kvm_s390_cpu_feat_init();
480*4882a593Smuzhiyun
481*4882a593Smuzhiyun /* Register floating interrupt controller interface. */
482*4882a593Smuzhiyun rc = kvm_register_device_ops(&kvm_flic_ops, KVM_DEV_TYPE_FLIC);
483*4882a593Smuzhiyun if (rc) {
484*4882a593Smuzhiyun pr_err("A FLIC registration call failed with rc=%d\n", rc);
485*4882a593Smuzhiyun goto out;
486*4882a593Smuzhiyun }
487*4882a593Smuzhiyun
488*4882a593Smuzhiyun rc = kvm_s390_gib_init(GAL_ISC);
489*4882a593Smuzhiyun if (rc)
490*4882a593Smuzhiyun goto out;
491*4882a593Smuzhiyun
492*4882a593Smuzhiyun return 0;
493*4882a593Smuzhiyun
494*4882a593Smuzhiyun out:
495*4882a593Smuzhiyun kvm_arch_exit();
496*4882a593Smuzhiyun return rc;
497*4882a593Smuzhiyun }
498*4882a593Smuzhiyun
kvm_arch_exit(void)499*4882a593Smuzhiyun void kvm_arch_exit(void)
500*4882a593Smuzhiyun {
501*4882a593Smuzhiyun kvm_s390_gib_destroy();
502*4882a593Smuzhiyun debug_unregister(kvm_s390_dbf);
503*4882a593Smuzhiyun debug_unregister(kvm_s390_dbf_uv);
504*4882a593Smuzhiyun }
505*4882a593Smuzhiyun
506*4882a593Smuzhiyun /* Section: device related */
kvm_arch_dev_ioctl(struct file * filp,unsigned int ioctl,unsigned long arg)507*4882a593Smuzhiyun long kvm_arch_dev_ioctl(struct file *filp,
508*4882a593Smuzhiyun unsigned int ioctl, unsigned long arg)
509*4882a593Smuzhiyun {
510*4882a593Smuzhiyun if (ioctl == KVM_S390_ENABLE_SIE)
511*4882a593Smuzhiyun return s390_enable_sie();
512*4882a593Smuzhiyun return -EINVAL;
513*4882a593Smuzhiyun }
514*4882a593Smuzhiyun
kvm_vm_ioctl_check_extension(struct kvm * kvm,long ext)515*4882a593Smuzhiyun int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
516*4882a593Smuzhiyun {
517*4882a593Smuzhiyun int r;
518*4882a593Smuzhiyun
519*4882a593Smuzhiyun switch (ext) {
520*4882a593Smuzhiyun case KVM_CAP_S390_PSW:
521*4882a593Smuzhiyun case KVM_CAP_S390_GMAP:
522*4882a593Smuzhiyun case KVM_CAP_SYNC_MMU:
523*4882a593Smuzhiyun #ifdef CONFIG_KVM_S390_UCONTROL
524*4882a593Smuzhiyun case KVM_CAP_S390_UCONTROL:
525*4882a593Smuzhiyun #endif
526*4882a593Smuzhiyun case KVM_CAP_ASYNC_PF:
527*4882a593Smuzhiyun case KVM_CAP_SYNC_REGS:
528*4882a593Smuzhiyun case KVM_CAP_ONE_REG:
529*4882a593Smuzhiyun case KVM_CAP_ENABLE_CAP:
530*4882a593Smuzhiyun case KVM_CAP_S390_CSS_SUPPORT:
531*4882a593Smuzhiyun case KVM_CAP_IOEVENTFD:
532*4882a593Smuzhiyun case KVM_CAP_DEVICE_CTRL:
533*4882a593Smuzhiyun case KVM_CAP_S390_IRQCHIP:
534*4882a593Smuzhiyun case KVM_CAP_VM_ATTRIBUTES:
535*4882a593Smuzhiyun case KVM_CAP_MP_STATE:
536*4882a593Smuzhiyun case KVM_CAP_IMMEDIATE_EXIT:
537*4882a593Smuzhiyun case KVM_CAP_S390_INJECT_IRQ:
538*4882a593Smuzhiyun case KVM_CAP_S390_USER_SIGP:
539*4882a593Smuzhiyun case KVM_CAP_S390_USER_STSI:
540*4882a593Smuzhiyun case KVM_CAP_S390_SKEYS:
541*4882a593Smuzhiyun case KVM_CAP_S390_IRQ_STATE:
542*4882a593Smuzhiyun case KVM_CAP_S390_USER_INSTR0:
543*4882a593Smuzhiyun case KVM_CAP_S390_CMMA_MIGRATION:
544*4882a593Smuzhiyun case KVM_CAP_S390_AIS:
545*4882a593Smuzhiyun case KVM_CAP_S390_AIS_MIGRATION:
546*4882a593Smuzhiyun case KVM_CAP_S390_VCPU_RESETS:
547*4882a593Smuzhiyun case KVM_CAP_SET_GUEST_DEBUG:
548*4882a593Smuzhiyun case KVM_CAP_S390_DIAG318:
549*4882a593Smuzhiyun r = 1;
550*4882a593Smuzhiyun break;
551*4882a593Smuzhiyun case KVM_CAP_S390_HPAGE_1M:
552*4882a593Smuzhiyun r = 0;
553*4882a593Smuzhiyun if (hpage && !kvm_is_ucontrol(kvm))
554*4882a593Smuzhiyun r = 1;
555*4882a593Smuzhiyun break;
556*4882a593Smuzhiyun case KVM_CAP_S390_MEM_OP:
557*4882a593Smuzhiyun r = MEM_OP_MAX_SIZE;
558*4882a593Smuzhiyun break;
559*4882a593Smuzhiyun case KVM_CAP_NR_VCPUS:
560*4882a593Smuzhiyun case KVM_CAP_MAX_VCPUS:
561*4882a593Smuzhiyun case KVM_CAP_MAX_VCPU_ID:
562*4882a593Smuzhiyun r = KVM_S390_BSCA_CPU_SLOTS;
563*4882a593Smuzhiyun if (!kvm_s390_use_sca_entries())
564*4882a593Smuzhiyun r = KVM_MAX_VCPUS;
565*4882a593Smuzhiyun else if (sclp.has_esca && sclp.has_64bscao)
566*4882a593Smuzhiyun r = KVM_S390_ESCA_CPU_SLOTS;
567*4882a593Smuzhiyun break;
568*4882a593Smuzhiyun case KVM_CAP_S390_COW:
569*4882a593Smuzhiyun r = MACHINE_HAS_ESOP;
570*4882a593Smuzhiyun break;
571*4882a593Smuzhiyun case KVM_CAP_S390_VECTOR_REGISTERS:
572*4882a593Smuzhiyun r = MACHINE_HAS_VX;
573*4882a593Smuzhiyun break;
574*4882a593Smuzhiyun case KVM_CAP_S390_RI:
575*4882a593Smuzhiyun r = test_facility(64);
576*4882a593Smuzhiyun break;
577*4882a593Smuzhiyun case KVM_CAP_S390_GS:
578*4882a593Smuzhiyun r = test_facility(133);
579*4882a593Smuzhiyun break;
580*4882a593Smuzhiyun case KVM_CAP_S390_BPB:
581*4882a593Smuzhiyun r = test_facility(82);
582*4882a593Smuzhiyun break;
583*4882a593Smuzhiyun case KVM_CAP_S390_PROTECTED:
584*4882a593Smuzhiyun r = is_prot_virt_host();
585*4882a593Smuzhiyun break;
586*4882a593Smuzhiyun default:
587*4882a593Smuzhiyun r = 0;
588*4882a593Smuzhiyun }
589*4882a593Smuzhiyun return r;
590*4882a593Smuzhiyun }
591*4882a593Smuzhiyun
kvm_arch_sync_dirty_log(struct kvm * kvm,struct kvm_memory_slot * memslot)592*4882a593Smuzhiyun void kvm_arch_sync_dirty_log(struct kvm *kvm, struct kvm_memory_slot *memslot)
593*4882a593Smuzhiyun {
594*4882a593Smuzhiyun int i;
595*4882a593Smuzhiyun gfn_t cur_gfn, last_gfn;
596*4882a593Smuzhiyun unsigned long gaddr, vmaddr;
597*4882a593Smuzhiyun struct gmap *gmap = kvm->arch.gmap;
598*4882a593Smuzhiyun DECLARE_BITMAP(bitmap, _PAGE_ENTRIES);
599*4882a593Smuzhiyun
600*4882a593Smuzhiyun /* Loop over all guest segments */
601*4882a593Smuzhiyun cur_gfn = memslot->base_gfn;
602*4882a593Smuzhiyun last_gfn = memslot->base_gfn + memslot->npages;
603*4882a593Smuzhiyun for (; cur_gfn <= last_gfn; cur_gfn += _PAGE_ENTRIES) {
604*4882a593Smuzhiyun gaddr = gfn_to_gpa(cur_gfn);
605*4882a593Smuzhiyun vmaddr = gfn_to_hva_memslot(memslot, cur_gfn);
606*4882a593Smuzhiyun if (kvm_is_error_hva(vmaddr))
607*4882a593Smuzhiyun continue;
608*4882a593Smuzhiyun
609*4882a593Smuzhiyun bitmap_zero(bitmap, _PAGE_ENTRIES);
610*4882a593Smuzhiyun gmap_sync_dirty_log_pmd(gmap, bitmap, gaddr, vmaddr);
611*4882a593Smuzhiyun for (i = 0; i < _PAGE_ENTRIES; i++) {
612*4882a593Smuzhiyun if (test_bit(i, bitmap))
613*4882a593Smuzhiyun mark_page_dirty(kvm, cur_gfn + i);
614*4882a593Smuzhiyun }
615*4882a593Smuzhiyun
616*4882a593Smuzhiyun if (fatal_signal_pending(current))
617*4882a593Smuzhiyun return;
618*4882a593Smuzhiyun cond_resched();
619*4882a593Smuzhiyun }
620*4882a593Smuzhiyun }
621*4882a593Smuzhiyun
622*4882a593Smuzhiyun /* Section: vm related */
623*4882a593Smuzhiyun static void sca_del_vcpu(struct kvm_vcpu *vcpu);
624*4882a593Smuzhiyun
625*4882a593Smuzhiyun /*
626*4882a593Smuzhiyun * Get (and clear) the dirty memory log for a memory slot.
627*4882a593Smuzhiyun */
kvm_vm_ioctl_get_dirty_log(struct kvm * kvm,struct kvm_dirty_log * log)628*4882a593Smuzhiyun int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
629*4882a593Smuzhiyun struct kvm_dirty_log *log)
630*4882a593Smuzhiyun {
631*4882a593Smuzhiyun int r;
632*4882a593Smuzhiyun unsigned long n;
633*4882a593Smuzhiyun struct kvm_memory_slot *memslot;
634*4882a593Smuzhiyun int is_dirty;
635*4882a593Smuzhiyun
636*4882a593Smuzhiyun if (kvm_is_ucontrol(kvm))
637*4882a593Smuzhiyun return -EINVAL;
638*4882a593Smuzhiyun
639*4882a593Smuzhiyun mutex_lock(&kvm->slots_lock);
640*4882a593Smuzhiyun
641*4882a593Smuzhiyun r = -EINVAL;
642*4882a593Smuzhiyun if (log->slot >= KVM_USER_MEM_SLOTS)
643*4882a593Smuzhiyun goto out;
644*4882a593Smuzhiyun
645*4882a593Smuzhiyun r = kvm_get_dirty_log(kvm, log, &is_dirty, &memslot);
646*4882a593Smuzhiyun if (r)
647*4882a593Smuzhiyun goto out;
648*4882a593Smuzhiyun
649*4882a593Smuzhiyun /* Clear the dirty log */
650*4882a593Smuzhiyun if (is_dirty) {
651*4882a593Smuzhiyun n = kvm_dirty_bitmap_bytes(memslot);
652*4882a593Smuzhiyun memset(memslot->dirty_bitmap, 0, n);
653*4882a593Smuzhiyun }
654*4882a593Smuzhiyun r = 0;
655*4882a593Smuzhiyun out:
656*4882a593Smuzhiyun mutex_unlock(&kvm->slots_lock);
657*4882a593Smuzhiyun return r;
658*4882a593Smuzhiyun }
659*4882a593Smuzhiyun
icpt_operexc_on_all_vcpus(struct kvm * kvm)660*4882a593Smuzhiyun static void icpt_operexc_on_all_vcpus(struct kvm *kvm)
661*4882a593Smuzhiyun {
662*4882a593Smuzhiyun unsigned int i;
663*4882a593Smuzhiyun struct kvm_vcpu *vcpu;
664*4882a593Smuzhiyun
665*4882a593Smuzhiyun kvm_for_each_vcpu(i, vcpu, kvm) {
666*4882a593Smuzhiyun kvm_s390_sync_request(KVM_REQ_ICPT_OPEREXC, vcpu);
667*4882a593Smuzhiyun }
668*4882a593Smuzhiyun }
669*4882a593Smuzhiyun
kvm_vm_ioctl_enable_cap(struct kvm * kvm,struct kvm_enable_cap * cap)670*4882a593Smuzhiyun int kvm_vm_ioctl_enable_cap(struct kvm *kvm, struct kvm_enable_cap *cap)
671*4882a593Smuzhiyun {
672*4882a593Smuzhiyun int r;
673*4882a593Smuzhiyun
674*4882a593Smuzhiyun if (cap->flags)
675*4882a593Smuzhiyun return -EINVAL;
676*4882a593Smuzhiyun
677*4882a593Smuzhiyun switch (cap->cap) {
678*4882a593Smuzhiyun case KVM_CAP_S390_IRQCHIP:
679*4882a593Smuzhiyun VM_EVENT(kvm, 3, "%s", "ENABLE: CAP_S390_IRQCHIP");
680*4882a593Smuzhiyun kvm->arch.use_irqchip = 1;
681*4882a593Smuzhiyun r = 0;
682*4882a593Smuzhiyun break;
683*4882a593Smuzhiyun case KVM_CAP_S390_USER_SIGP:
684*4882a593Smuzhiyun VM_EVENT(kvm, 3, "%s", "ENABLE: CAP_S390_USER_SIGP");
685*4882a593Smuzhiyun kvm->arch.user_sigp = 1;
686*4882a593Smuzhiyun r = 0;
687*4882a593Smuzhiyun break;
688*4882a593Smuzhiyun case KVM_CAP_S390_VECTOR_REGISTERS:
689*4882a593Smuzhiyun mutex_lock(&kvm->lock);
690*4882a593Smuzhiyun if (kvm->created_vcpus) {
691*4882a593Smuzhiyun r = -EBUSY;
692*4882a593Smuzhiyun } else if (MACHINE_HAS_VX) {
693*4882a593Smuzhiyun set_kvm_facility(kvm->arch.model.fac_mask, 129);
694*4882a593Smuzhiyun set_kvm_facility(kvm->arch.model.fac_list, 129);
695*4882a593Smuzhiyun if (test_facility(134)) {
696*4882a593Smuzhiyun set_kvm_facility(kvm->arch.model.fac_mask, 134);
697*4882a593Smuzhiyun set_kvm_facility(kvm->arch.model.fac_list, 134);
698*4882a593Smuzhiyun }
699*4882a593Smuzhiyun if (test_facility(135)) {
700*4882a593Smuzhiyun set_kvm_facility(kvm->arch.model.fac_mask, 135);
701*4882a593Smuzhiyun set_kvm_facility(kvm->arch.model.fac_list, 135);
702*4882a593Smuzhiyun }
703*4882a593Smuzhiyun if (test_facility(148)) {
704*4882a593Smuzhiyun set_kvm_facility(kvm->arch.model.fac_mask, 148);
705*4882a593Smuzhiyun set_kvm_facility(kvm->arch.model.fac_list, 148);
706*4882a593Smuzhiyun }
707*4882a593Smuzhiyun if (test_facility(152)) {
708*4882a593Smuzhiyun set_kvm_facility(kvm->arch.model.fac_mask, 152);
709*4882a593Smuzhiyun set_kvm_facility(kvm->arch.model.fac_list, 152);
710*4882a593Smuzhiyun }
711*4882a593Smuzhiyun r = 0;
712*4882a593Smuzhiyun } else
713*4882a593Smuzhiyun r = -EINVAL;
714*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
715*4882a593Smuzhiyun VM_EVENT(kvm, 3, "ENABLE: CAP_S390_VECTOR_REGISTERS %s",
716*4882a593Smuzhiyun r ? "(not available)" : "(success)");
717*4882a593Smuzhiyun break;
718*4882a593Smuzhiyun case KVM_CAP_S390_RI:
719*4882a593Smuzhiyun r = -EINVAL;
720*4882a593Smuzhiyun mutex_lock(&kvm->lock);
721*4882a593Smuzhiyun if (kvm->created_vcpus) {
722*4882a593Smuzhiyun r = -EBUSY;
723*4882a593Smuzhiyun } else if (test_facility(64)) {
724*4882a593Smuzhiyun set_kvm_facility(kvm->arch.model.fac_mask, 64);
725*4882a593Smuzhiyun set_kvm_facility(kvm->arch.model.fac_list, 64);
726*4882a593Smuzhiyun r = 0;
727*4882a593Smuzhiyun }
728*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
729*4882a593Smuzhiyun VM_EVENT(kvm, 3, "ENABLE: CAP_S390_RI %s",
730*4882a593Smuzhiyun r ? "(not available)" : "(success)");
731*4882a593Smuzhiyun break;
732*4882a593Smuzhiyun case KVM_CAP_S390_AIS:
733*4882a593Smuzhiyun mutex_lock(&kvm->lock);
734*4882a593Smuzhiyun if (kvm->created_vcpus) {
735*4882a593Smuzhiyun r = -EBUSY;
736*4882a593Smuzhiyun } else {
737*4882a593Smuzhiyun set_kvm_facility(kvm->arch.model.fac_mask, 72);
738*4882a593Smuzhiyun set_kvm_facility(kvm->arch.model.fac_list, 72);
739*4882a593Smuzhiyun r = 0;
740*4882a593Smuzhiyun }
741*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
742*4882a593Smuzhiyun VM_EVENT(kvm, 3, "ENABLE: AIS %s",
743*4882a593Smuzhiyun r ? "(not available)" : "(success)");
744*4882a593Smuzhiyun break;
745*4882a593Smuzhiyun case KVM_CAP_S390_GS:
746*4882a593Smuzhiyun r = -EINVAL;
747*4882a593Smuzhiyun mutex_lock(&kvm->lock);
748*4882a593Smuzhiyun if (kvm->created_vcpus) {
749*4882a593Smuzhiyun r = -EBUSY;
750*4882a593Smuzhiyun } else if (test_facility(133)) {
751*4882a593Smuzhiyun set_kvm_facility(kvm->arch.model.fac_mask, 133);
752*4882a593Smuzhiyun set_kvm_facility(kvm->arch.model.fac_list, 133);
753*4882a593Smuzhiyun r = 0;
754*4882a593Smuzhiyun }
755*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
756*4882a593Smuzhiyun VM_EVENT(kvm, 3, "ENABLE: CAP_S390_GS %s",
757*4882a593Smuzhiyun r ? "(not available)" : "(success)");
758*4882a593Smuzhiyun break;
759*4882a593Smuzhiyun case KVM_CAP_S390_HPAGE_1M:
760*4882a593Smuzhiyun mutex_lock(&kvm->lock);
761*4882a593Smuzhiyun if (kvm->created_vcpus)
762*4882a593Smuzhiyun r = -EBUSY;
763*4882a593Smuzhiyun else if (!hpage || kvm->arch.use_cmma || kvm_is_ucontrol(kvm))
764*4882a593Smuzhiyun r = -EINVAL;
765*4882a593Smuzhiyun else {
766*4882a593Smuzhiyun r = 0;
767*4882a593Smuzhiyun mmap_write_lock(kvm->mm);
768*4882a593Smuzhiyun kvm->mm->context.allow_gmap_hpage_1m = 1;
769*4882a593Smuzhiyun mmap_write_unlock(kvm->mm);
770*4882a593Smuzhiyun /*
771*4882a593Smuzhiyun * We might have to create fake 4k page
772*4882a593Smuzhiyun * tables. To avoid that the hardware works on
773*4882a593Smuzhiyun * stale PGSTEs, we emulate these instructions.
774*4882a593Smuzhiyun */
775*4882a593Smuzhiyun kvm->arch.use_skf = 0;
776*4882a593Smuzhiyun kvm->arch.use_pfmfi = 0;
777*4882a593Smuzhiyun }
778*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
779*4882a593Smuzhiyun VM_EVENT(kvm, 3, "ENABLE: CAP_S390_HPAGE %s",
780*4882a593Smuzhiyun r ? "(not available)" : "(success)");
781*4882a593Smuzhiyun break;
782*4882a593Smuzhiyun case KVM_CAP_S390_USER_STSI:
783*4882a593Smuzhiyun VM_EVENT(kvm, 3, "%s", "ENABLE: CAP_S390_USER_STSI");
784*4882a593Smuzhiyun kvm->arch.user_stsi = 1;
785*4882a593Smuzhiyun r = 0;
786*4882a593Smuzhiyun break;
787*4882a593Smuzhiyun case KVM_CAP_S390_USER_INSTR0:
788*4882a593Smuzhiyun VM_EVENT(kvm, 3, "%s", "ENABLE: CAP_S390_USER_INSTR0");
789*4882a593Smuzhiyun kvm->arch.user_instr0 = 1;
790*4882a593Smuzhiyun icpt_operexc_on_all_vcpus(kvm);
791*4882a593Smuzhiyun r = 0;
792*4882a593Smuzhiyun break;
793*4882a593Smuzhiyun default:
794*4882a593Smuzhiyun r = -EINVAL;
795*4882a593Smuzhiyun break;
796*4882a593Smuzhiyun }
797*4882a593Smuzhiyun return r;
798*4882a593Smuzhiyun }
799*4882a593Smuzhiyun
kvm_s390_get_mem_control(struct kvm * kvm,struct kvm_device_attr * attr)800*4882a593Smuzhiyun static int kvm_s390_get_mem_control(struct kvm *kvm, struct kvm_device_attr *attr)
801*4882a593Smuzhiyun {
802*4882a593Smuzhiyun int ret;
803*4882a593Smuzhiyun
804*4882a593Smuzhiyun switch (attr->attr) {
805*4882a593Smuzhiyun case KVM_S390_VM_MEM_LIMIT_SIZE:
806*4882a593Smuzhiyun ret = 0;
807*4882a593Smuzhiyun VM_EVENT(kvm, 3, "QUERY: max guest memory: %lu bytes",
808*4882a593Smuzhiyun kvm->arch.mem_limit);
809*4882a593Smuzhiyun if (put_user(kvm->arch.mem_limit, (u64 __user *)attr->addr))
810*4882a593Smuzhiyun ret = -EFAULT;
811*4882a593Smuzhiyun break;
812*4882a593Smuzhiyun default:
813*4882a593Smuzhiyun ret = -ENXIO;
814*4882a593Smuzhiyun break;
815*4882a593Smuzhiyun }
816*4882a593Smuzhiyun return ret;
817*4882a593Smuzhiyun }
818*4882a593Smuzhiyun
kvm_s390_set_mem_control(struct kvm * kvm,struct kvm_device_attr * attr)819*4882a593Smuzhiyun static int kvm_s390_set_mem_control(struct kvm *kvm, struct kvm_device_attr *attr)
820*4882a593Smuzhiyun {
821*4882a593Smuzhiyun int ret;
822*4882a593Smuzhiyun unsigned int idx;
823*4882a593Smuzhiyun switch (attr->attr) {
824*4882a593Smuzhiyun case KVM_S390_VM_MEM_ENABLE_CMMA:
825*4882a593Smuzhiyun ret = -ENXIO;
826*4882a593Smuzhiyun if (!sclp.has_cmma)
827*4882a593Smuzhiyun break;
828*4882a593Smuzhiyun
829*4882a593Smuzhiyun VM_EVENT(kvm, 3, "%s", "ENABLE: CMMA support");
830*4882a593Smuzhiyun mutex_lock(&kvm->lock);
831*4882a593Smuzhiyun if (kvm->created_vcpus)
832*4882a593Smuzhiyun ret = -EBUSY;
833*4882a593Smuzhiyun else if (kvm->mm->context.allow_gmap_hpage_1m)
834*4882a593Smuzhiyun ret = -EINVAL;
835*4882a593Smuzhiyun else {
836*4882a593Smuzhiyun kvm->arch.use_cmma = 1;
837*4882a593Smuzhiyun /* Not compatible with cmma. */
838*4882a593Smuzhiyun kvm->arch.use_pfmfi = 0;
839*4882a593Smuzhiyun ret = 0;
840*4882a593Smuzhiyun }
841*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
842*4882a593Smuzhiyun break;
843*4882a593Smuzhiyun case KVM_S390_VM_MEM_CLR_CMMA:
844*4882a593Smuzhiyun ret = -ENXIO;
845*4882a593Smuzhiyun if (!sclp.has_cmma)
846*4882a593Smuzhiyun break;
847*4882a593Smuzhiyun ret = -EINVAL;
848*4882a593Smuzhiyun if (!kvm->arch.use_cmma)
849*4882a593Smuzhiyun break;
850*4882a593Smuzhiyun
851*4882a593Smuzhiyun VM_EVENT(kvm, 3, "%s", "RESET: CMMA states");
852*4882a593Smuzhiyun mutex_lock(&kvm->lock);
853*4882a593Smuzhiyun idx = srcu_read_lock(&kvm->srcu);
854*4882a593Smuzhiyun s390_reset_cmma(kvm->arch.gmap->mm);
855*4882a593Smuzhiyun srcu_read_unlock(&kvm->srcu, idx);
856*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
857*4882a593Smuzhiyun ret = 0;
858*4882a593Smuzhiyun break;
859*4882a593Smuzhiyun case KVM_S390_VM_MEM_LIMIT_SIZE: {
860*4882a593Smuzhiyun unsigned long new_limit;
861*4882a593Smuzhiyun
862*4882a593Smuzhiyun if (kvm_is_ucontrol(kvm))
863*4882a593Smuzhiyun return -EINVAL;
864*4882a593Smuzhiyun
865*4882a593Smuzhiyun if (get_user(new_limit, (u64 __user *)attr->addr))
866*4882a593Smuzhiyun return -EFAULT;
867*4882a593Smuzhiyun
868*4882a593Smuzhiyun if (kvm->arch.mem_limit != KVM_S390_NO_MEM_LIMIT &&
869*4882a593Smuzhiyun new_limit > kvm->arch.mem_limit)
870*4882a593Smuzhiyun return -E2BIG;
871*4882a593Smuzhiyun
872*4882a593Smuzhiyun if (!new_limit)
873*4882a593Smuzhiyun return -EINVAL;
874*4882a593Smuzhiyun
875*4882a593Smuzhiyun /* gmap_create takes last usable address */
876*4882a593Smuzhiyun if (new_limit != KVM_S390_NO_MEM_LIMIT)
877*4882a593Smuzhiyun new_limit -= 1;
878*4882a593Smuzhiyun
879*4882a593Smuzhiyun ret = -EBUSY;
880*4882a593Smuzhiyun mutex_lock(&kvm->lock);
881*4882a593Smuzhiyun if (!kvm->created_vcpus) {
882*4882a593Smuzhiyun /* gmap_create will round the limit up */
883*4882a593Smuzhiyun struct gmap *new = gmap_create(current->mm, new_limit);
884*4882a593Smuzhiyun
885*4882a593Smuzhiyun if (!new) {
886*4882a593Smuzhiyun ret = -ENOMEM;
887*4882a593Smuzhiyun } else {
888*4882a593Smuzhiyun gmap_remove(kvm->arch.gmap);
889*4882a593Smuzhiyun new->private = kvm;
890*4882a593Smuzhiyun kvm->arch.gmap = new;
891*4882a593Smuzhiyun ret = 0;
892*4882a593Smuzhiyun }
893*4882a593Smuzhiyun }
894*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
895*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET: max guest address: %lu", new_limit);
896*4882a593Smuzhiyun VM_EVENT(kvm, 3, "New guest asce: 0x%pK",
897*4882a593Smuzhiyun (void *) kvm->arch.gmap->asce);
898*4882a593Smuzhiyun break;
899*4882a593Smuzhiyun }
900*4882a593Smuzhiyun default:
901*4882a593Smuzhiyun ret = -ENXIO;
902*4882a593Smuzhiyun break;
903*4882a593Smuzhiyun }
904*4882a593Smuzhiyun return ret;
905*4882a593Smuzhiyun }
906*4882a593Smuzhiyun
907*4882a593Smuzhiyun static void kvm_s390_vcpu_crypto_setup(struct kvm_vcpu *vcpu);
908*4882a593Smuzhiyun
kvm_s390_vcpu_crypto_reset_all(struct kvm * kvm)909*4882a593Smuzhiyun void kvm_s390_vcpu_crypto_reset_all(struct kvm *kvm)
910*4882a593Smuzhiyun {
911*4882a593Smuzhiyun struct kvm_vcpu *vcpu;
912*4882a593Smuzhiyun int i;
913*4882a593Smuzhiyun
914*4882a593Smuzhiyun kvm_s390_vcpu_block_all(kvm);
915*4882a593Smuzhiyun
916*4882a593Smuzhiyun kvm_for_each_vcpu(i, vcpu, kvm) {
917*4882a593Smuzhiyun kvm_s390_vcpu_crypto_setup(vcpu);
918*4882a593Smuzhiyun /* recreate the shadow crycb by leaving the VSIE handler */
919*4882a593Smuzhiyun kvm_s390_sync_request(KVM_REQ_VSIE_RESTART, vcpu);
920*4882a593Smuzhiyun }
921*4882a593Smuzhiyun
922*4882a593Smuzhiyun kvm_s390_vcpu_unblock_all(kvm);
923*4882a593Smuzhiyun }
924*4882a593Smuzhiyun
kvm_s390_vm_set_crypto(struct kvm * kvm,struct kvm_device_attr * attr)925*4882a593Smuzhiyun static int kvm_s390_vm_set_crypto(struct kvm *kvm, struct kvm_device_attr *attr)
926*4882a593Smuzhiyun {
927*4882a593Smuzhiyun mutex_lock(&kvm->lock);
928*4882a593Smuzhiyun switch (attr->attr) {
929*4882a593Smuzhiyun case KVM_S390_VM_CRYPTO_ENABLE_AES_KW:
930*4882a593Smuzhiyun if (!test_kvm_facility(kvm, 76)) {
931*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
932*4882a593Smuzhiyun return -EINVAL;
933*4882a593Smuzhiyun }
934*4882a593Smuzhiyun get_random_bytes(
935*4882a593Smuzhiyun kvm->arch.crypto.crycb->aes_wrapping_key_mask,
936*4882a593Smuzhiyun sizeof(kvm->arch.crypto.crycb->aes_wrapping_key_mask));
937*4882a593Smuzhiyun kvm->arch.crypto.aes_kw = 1;
938*4882a593Smuzhiyun VM_EVENT(kvm, 3, "%s", "ENABLE: AES keywrapping support");
939*4882a593Smuzhiyun break;
940*4882a593Smuzhiyun case KVM_S390_VM_CRYPTO_ENABLE_DEA_KW:
941*4882a593Smuzhiyun if (!test_kvm_facility(kvm, 76)) {
942*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
943*4882a593Smuzhiyun return -EINVAL;
944*4882a593Smuzhiyun }
945*4882a593Smuzhiyun get_random_bytes(
946*4882a593Smuzhiyun kvm->arch.crypto.crycb->dea_wrapping_key_mask,
947*4882a593Smuzhiyun sizeof(kvm->arch.crypto.crycb->dea_wrapping_key_mask));
948*4882a593Smuzhiyun kvm->arch.crypto.dea_kw = 1;
949*4882a593Smuzhiyun VM_EVENT(kvm, 3, "%s", "ENABLE: DEA keywrapping support");
950*4882a593Smuzhiyun break;
951*4882a593Smuzhiyun case KVM_S390_VM_CRYPTO_DISABLE_AES_KW:
952*4882a593Smuzhiyun if (!test_kvm_facility(kvm, 76)) {
953*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
954*4882a593Smuzhiyun return -EINVAL;
955*4882a593Smuzhiyun }
956*4882a593Smuzhiyun kvm->arch.crypto.aes_kw = 0;
957*4882a593Smuzhiyun memset(kvm->arch.crypto.crycb->aes_wrapping_key_mask, 0,
958*4882a593Smuzhiyun sizeof(kvm->arch.crypto.crycb->aes_wrapping_key_mask));
959*4882a593Smuzhiyun VM_EVENT(kvm, 3, "%s", "DISABLE: AES keywrapping support");
960*4882a593Smuzhiyun break;
961*4882a593Smuzhiyun case KVM_S390_VM_CRYPTO_DISABLE_DEA_KW:
962*4882a593Smuzhiyun if (!test_kvm_facility(kvm, 76)) {
963*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
964*4882a593Smuzhiyun return -EINVAL;
965*4882a593Smuzhiyun }
966*4882a593Smuzhiyun kvm->arch.crypto.dea_kw = 0;
967*4882a593Smuzhiyun memset(kvm->arch.crypto.crycb->dea_wrapping_key_mask, 0,
968*4882a593Smuzhiyun sizeof(kvm->arch.crypto.crycb->dea_wrapping_key_mask));
969*4882a593Smuzhiyun VM_EVENT(kvm, 3, "%s", "DISABLE: DEA keywrapping support");
970*4882a593Smuzhiyun break;
971*4882a593Smuzhiyun case KVM_S390_VM_CRYPTO_ENABLE_APIE:
972*4882a593Smuzhiyun if (!ap_instructions_available()) {
973*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
974*4882a593Smuzhiyun return -EOPNOTSUPP;
975*4882a593Smuzhiyun }
976*4882a593Smuzhiyun kvm->arch.crypto.apie = 1;
977*4882a593Smuzhiyun break;
978*4882a593Smuzhiyun case KVM_S390_VM_CRYPTO_DISABLE_APIE:
979*4882a593Smuzhiyun if (!ap_instructions_available()) {
980*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
981*4882a593Smuzhiyun return -EOPNOTSUPP;
982*4882a593Smuzhiyun }
983*4882a593Smuzhiyun kvm->arch.crypto.apie = 0;
984*4882a593Smuzhiyun break;
985*4882a593Smuzhiyun default:
986*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
987*4882a593Smuzhiyun return -ENXIO;
988*4882a593Smuzhiyun }
989*4882a593Smuzhiyun
990*4882a593Smuzhiyun kvm_s390_vcpu_crypto_reset_all(kvm);
991*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
992*4882a593Smuzhiyun return 0;
993*4882a593Smuzhiyun }
994*4882a593Smuzhiyun
kvm_s390_sync_request_broadcast(struct kvm * kvm,int req)995*4882a593Smuzhiyun static void kvm_s390_sync_request_broadcast(struct kvm *kvm, int req)
996*4882a593Smuzhiyun {
997*4882a593Smuzhiyun int cx;
998*4882a593Smuzhiyun struct kvm_vcpu *vcpu;
999*4882a593Smuzhiyun
1000*4882a593Smuzhiyun kvm_for_each_vcpu(cx, vcpu, kvm)
1001*4882a593Smuzhiyun kvm_s390_sync_request(req, vcpu);
1002*4882a593Smuzhiyun }
1003*4882a593Smuzhiyun
1004*4882a593Smuzhiyun /*
1005*4882a593Smuzhiyun * Must be called with kvm->srcu held to avoid races on memslots, and with
1006*4882a593Smuzhiyun * kvm->slots_lock to avoid races with ourselves and kvm_s390_vm_stop_migration.
1007*4882a593Smuzhiyun */
kvm_s390_vm_start_migration(struct kvm * kvm)1008*4882a593Smuzhiyun static int kvm_s390_vm_start_migration(struct kvm *kvm)
1009*4882a593Smuzhiyun {
1010*4882a593Smuzhiyun struct kvm_memory_slot *ms;
1011*4882a593Smuzhiyun struct kvm_memslots *slots;
1012*4882a593Smuzhiyun unsigned long ram_pages = 0;
1013*4882a593Smuzhiyun int slotnr;
1014*4882a593Smuzhiyun
1015*4882a593Smuzhiyun /* migration mode already enabled */
1016*4882a593Smuzhiyun if (kvm->arch.migration_mode)
1017*4882a593Smuzhiyun return 0;
1018*4882a593Smuzhiyun slots = kvm_memslots(kvm);
1019*4882a593Smuzhiyun if (!slots || !slots->used_slots)
1020*4882a593Smuzhiyun return -EINVAL;
1021*4882a593Smuzhiyun
1022*4882a593Smuzhiyun if (!kvm->arch.use_cmma) {
1023*4882a593Smuzhiyun kvm->arch.migration_mode = 1;
1024*4882a593Smuzhiyun return 0;
1025*4882a593Smuzhiyun }
1026*4882a593Smuzhiyun /* mark all the pages in active slots as dirty */
1027*4882a593Smuzhiyun for (slotnr = 0; slotnr < slots->used_slots; slotnr++) {
1028*4882a593Smuzhiyun ms = slots->memslots + slotnr;
1029*4882a593Smuzhiyun if (!ms->dirty_bitmap)
1030*4882a593Smuzhiyun return -EINVAL;
1031*4882a593Smuzhiyun /*
1032*4882a593Smuzhiyun * The second half of the bitmap is only used on x86,
1033*4882a593Smuzhiyun * and would be wasted otherwise, so we put it to good
1034*4882a593Smuzhiyun * use here to keep track of the state of the storage
1035*4882a593Smuzhiyun * attributes.
1036*4882a593Smuzhiyun */
1037*4882a593Smuzhiyun memset(kvm_second_dirty_bitmap(ms), 0xff, kvm_dirty_bitmap_bytes(ms));
1038*4882a593Smuzhiyun ram_pages += ms->npages;
1039*4882a593Smuzhiyun }
1040*4882a593Smuzhiyun atomic64_set(&kvm->arch.cmma_dirty_pages, ram_pages);
1041*4882a593Smuzhiyun kvm->arch.migration_mode = 1;
1042*4882a593Smuzhiyun kvm_s390_sync_request_broadcast(kvm, KVM_REQ_START_MIGRATION);
1043*4882a593Smuzhiyun return 0;
1044*4882a593Smuzhiyun }
1045*4882a593Smuzhiyun
1046*4882a593Smuzhiyun /*
1047*4882a593Smuzhiyun * Must be called with kvm->slots_lock to avoid races with ourselves and
1048*4882a593Smuzhiyun * kvm_s390_vm_start_migration.
1049*4882a593Smuzhiyun */
kvm_s390_vm_stop_migration(struct kvm * kvm)1050*4882a593Smuzhiyun static int kvm_s390_vm_stop_migration(struct kvm *kvm)
1051*4882a593Smuzhiyun {
1052*4882a593Smuzhiyun /* migration mode already disabled */
1053*4882a593Smuzhiyun if (!kvm->arch.migration_mode)
1054*4882a593Smuzhiyun return 0;
1055*4882a593Smuzhiyun kvm->arch.migration_mode = 0;
1056*4882a593Smuzhiyun if (kvm->arch.use_cmma)
1057*4882a593Smuzhiyun kvm_s390_sync_request_broadcast(kvm, KVM_REQ_STOP_MIGRATION);
1058*4882a593Smuzhiyun return 0;
1059*4882a593Smuzhiyun }
1060*4882a593Smuzhiyun
kvm_s390_vm_set_migration(struct kvm * kvm,struct kvm_device_attr * attr)1061*4882a593Smuzhiyun static int kvm_s390_vm_set_migration(struct kvm *kvm,
1062*4882a593Smuzhiyun struct kvm_device_attr *attr)
1063*4882a593Smuzhiyun {
1064*4882a593Smuzhiyun int res = -ENXIO;
1065*4882a593Smuzhiyun
1066*4882a593Smuzhiyun mutex_lock(&kvm->slots_lock);
1067*4882a593Smuzhiyun switch (attr->attr) {
1068*4882a593Smuzhiyun case KVM_S390_VM_MIGRATION_START:
1069*4882a593Smuzhiyun res = kvm_s390_vm_start_migration(kvm);
1070*4882a593Smuzhiyun break;
1071*4882a593Smuzhiyun case KVM_S390_VM_MIGRATION_STOP:
1072*4882a593Smuzhiyun res = kvm_s390_vm_stop_migration(kvm);
1073*4882a593Smuzhiyun break;
1074*4882a593Smuzhiyun default:
1075*4882a593Smuzhiyun break;
1076*4882a593Smuzhiyun }
1077*4882a593Smuzhiyun mutex_unlock(&kvm->slots_lock);
1078*4882a593Smuzhiyun
1079*4882a593Smuzhiyun return res;
1080*4882a593Smuzhiyun }
1081*4882a593Smuzhiyun
kvm_s390_vm_get_migration(struct kvm * kvm,struct kvm_device_attr * attr)1082*4882a593Smuzhiyun static int kvm_s390_vm_get_migration(struct kvm *kvm,
1083*4882a593Smuzhiyun struct kvm_device_attr *attr)
1084*4882a593Smuzhiyun {
1085*4882a593Smuzhiyun u64 mig = kvm->arch.migration_mode;
1086*4882a593Smuzhiyun
1087*4882a593Smuzhiyun if (attr->attr != KVM_S390_VM_MIGRATION_STATUS)
1088*4882a593Smuzhiyun return -ENXIO;
1089*4882a593Smuzhiyun
1090*4882a593Smuzhiyun if (copy_to_user((void __user *)attr->addr, &mig, sizeof(mig)))
1091*4882a593Smuzhiyun return -EFAULT;
1092*4882a593Smuzhiyun return 0;
1093*4882a593Smuzhiyun }
1094*4882a593Smuzhiyun
1095*4882a593Smuzhiyun static void __kvm_s390_set_tod_clock(struct kvm *kvm, const struct kvm_s390_vm_tod_clock *gtod);
1096*4882a593Smuzhiyun
kvm_s390_set_tod_ext(struct kvm * kvm,struct kvm_device_attr * attr)1097*4882a593Smuzhiyun static int kvm_s390_set_tod_ext(struct kvm *kvm, struct kvm_device_attr *attr)
1098*4882a593Smuzhiyun {
1099*4882a593Smuzhiyun struct kvm_s390_vm_tod_clock gtod;
1100*4882a593Smuzhiyun
1101*4882a593Smuzhiyun if (copy_from_user(>od, (void __user *)attr->addr, sizeof(gtod)))
1102*4882a593Smuzhiyun return -EFAULT;
1103*4882a593Smuzhiyun
1104*4882a593Smuzhiyun if (!test_kvm_facility(kvm, 139) && gtod.epoch_idx)
1105*4882a593Smuzhiyun return -EINVAL;
1106*4882a593Smuzhiyun __kvm_s390_set_tod_clock(kvm, >od);
1107*4882a593Smuzhiyun
1108*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET: TOD extension: 0x%x, TOD base: 0x%llx",
1109*4882a593Smuzhiyun gtod.epoch_idx, gtod.tod);
1110*4882a593Smuzhiyun
1111*4882a593Smuzhiyun return 0;
1112*4882a593Smuzhiyun }
1113*4882a593Smuzhiyun
kvm_s390_set_tod_high(struct kvm * kvm,struct kvm_device_attr * attr)1114*4882a593Smuzhiyun static int kvm_s390_set_tod_high(struct kvm *kvm, struct kvm_device_attr *attr)
1115*4882a593Smuzhiyun {
1116*4882a593Smuzhiyun u8 gtod_high;
1117*4882a593Smuzhiyun
1118*4882a593Smuzhiyun if (copy_from_user(>od_high, (void __user *)attr->addr,
1119*4882a593Smuzhiyun sizeof(gtod_high)))
1120*4882a593Smuzhiyun return -EFAULT;
1121*4882a593Smuzhiyun
1122*4882a593Smuzhiyun if (gtod_high != 0)
1123*4882a593Smuzhiyun return -EINVAL;
1124*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET: TOD extension: 0x%x", gtod_high);
1125*4882a593Smuzhiyun
1126*4882a593Smuzhiyun return 0;
1127*4882a593Smuzhiyun }
1128*4882a593Smuzhiyun
kvm_s390_set_tod_low(struct kvm * kvm,struct kvm_device_attr * attr)1129*4882a593Smuzhiyun static int kvm_s390_set_tod_low(struct kvm *kvm, struct kvm_device_attr *attr)
1130*4882a593Smuzhiyun {
1131*4882a593Smuzhiyun struct kvm_s390_vm_tod_clock gtod = { 0 };
1132*4882a593Smuzhiyun
1133*4882a593Smuzhiyun if (copy_from_user(>od.tod, (void __user *)attr->addr,
1134*4882a593Smuzhiyun sizeof(gtod.tod)))
1135*4882a593Smuzhiyun return -EFAULT;
1136*4882a593Smuzhiyun
1137*4882a593Smuzhiyun __kvm_s390_set_tod_clock(kvm, >od);
1138*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET: TOD base: 0x%llx", gtod.tod);
1139*4882a593Smuzhiyun return 0;
1140*4882a593Smuzhiyun }
1141*4882a593Smuzhiyun
kvm_s390_set_tod(struct kvm * kvm,struct kvm_device_attr * attr)1142*4882a593Smuzhiyun static int kvm_s390_set_tod(struct kvm *kvm, struct kvm_device_attr *attr)
1143*4882a593Smuzhiyun {
1144*4882a593Smuzhiyun int ret;
1145*4882a593Smuzhiyun
1146*4882a593Smuzhiyun if (attr->flags)
1147*4882a593Smuzhiyun return -EINVAL;
1148*4882a593Smuzhiyun
1149*4882a593Smuzhiyun mutex_lock(&kvm->lock);
1150*4882a593Smuzhiyun /*
1151*4882a593Smuzhiyun * For protected guests, the TOD is managed by the ultravisor, so trying
1152*4882a593Smuzhiyun * to change it will never bring the expected results.
1153*4882a593Smuzhiyun */
1154*4882a593Smuzhiyun if (kvm_s390_pv_is_protected(kvm)) {
1155*4882a593Smuzhiyun ret = -EOPNOTSUPP;
1156*4882a593Smuzhiyun goto out_unlock;
1157*4882a593Smuzhiyun }
1158*4882a593Smuzhiyun
1159*4882a593Smuzhiyun switch (attr->attr) {
1160*4882a593Smuzhiyun case KVM_S390_VM_TOD_EXT:
1161*4882a593Smuzhiyun ret = kvm_s390_set_tod_ext(kvm, attr);
1162*4882a593Smuzhiyun break;
1163*4882a593Smuzhiyun case KVM_S390_VM_TOD_HIGH:
1164*4882a593Smuzhiyun ret = kvm_s390_set_tod_high(kvm, attr);
1165*4882a593Smuzhiyun break;
1166*4882a593Smuzhiyun case KVM_S390_VM_TOD_LOW:
1167*4882a593Smuzhiyun ret = kvm_s390_set_tod_low(kvm, attr);
1168*4882a593Smuzhiyun break;
1169*4882a593Smuzhiyun default:
1170*4882a593Smuzhiyun ret = -ENXIO;
1171*4882a593Smuzhiyun break;
1172*4882a593Smuzhiyun }
1173*4882a593Smuzhiyun
1174*4882a593Smuzhiyun out_unlock:
1175*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
1176*4882a593Smuzhiyun return ret;
1177*4882a593Smuzhiyun }
1178*4882a593Smuzhiyun
kvm_s390_get_tod_clock(struct kvm * kvm,struct kvm_s390_vm_tod_clock * gtod)1179*4882a593Smuzhiyun static void kvm_s390_get_tod_clock(struct kvm *kvm,
1180*4882a593Smuzhiyun struct kvm_s390_vm_tod_clock *gtod)
1181*4882a593Smuzhiyun {
1182*4882a593Smuzhiyun struct kvm_s390_tod_clock_ext htod;
1183*4882a593Smuzhiyun
1184*4882a593Smuzhiyun preempt_disable();
1185*4882a593Smuzhiyun
1186*4882a593Smuzhiyun get_tod_clock_ext((char *)&htod);
1187*4882a593Smuzhiyun
1188*4882a593Smuzhiyun gtod->tod = htod.tod + kvm->arch.epoch;
1189*4882a593Smuzhiyun gtod->epoch_idx = 0;
1190*4882a593Smuzhiyun if (test_kvm_facility(kvm, 139)) {
1191*4882a593Smuzhiyun gtod->epoch_idx = htod.epoch_idx + kvm->arch.epdx;
1192*4882a593Smuzhiyun if (gtod->tod < htod.tod)
1193*4882a593Smuzhiyun gtod->epoch_idx += 1;
1194*4882a593Smuzhiyun }
1195*4882a593Smuzhiyun
1196*4882a593Smuzhiyun preempt_enable();
1197*4882a593Smuzhiyun }
1198*4882a593Smuzhiyun
kvm_s390_get_tod_ext(struct kvm * kvm,struct kvm_device_attr * attr)1199*4882a593Smuzhiyun static int kvm_s390_get_tod_ext(struct kvm *kvm, struct kvm_device_attr *attr)
1200*4882a593Smuzhiyun {
1201*4882a593Smuzhiyun struct kvm_s390_vm_tod_clock gtod;
1202*4882a593Smuzhiyun
1203*4882a593Smuzhiyun memset(>od, 0, sizeof(gtod));
1204*4882a593Smuzhiyun kvm_s390_get_tod_clock(kvm, >od);
1205*4882a593Smuzhiyun if (copy_to_user((void __user *)attr->addr, >od, sizeof(gtod)))
1206*4882a593Smuzhiyun return -EFAULT;
1207*4882a593Smuzhiyun
1208*4882a593Smuzhiyun VM_EVENT(kvm, 3, "QUERY: TOD extension: 0x%x, TOD base: 0x%llx",
1209*4882a593Smuzhiyun gtod.epoch_idx, gtod.tod);
1210*4882a593Smuzhiyun return 0;
1211*4882a593Smuzhiyun }
1212*4882a593Smuzhiyun
kvm_s390_get_tod_high(struct kvm * kvm,struct kvm_device_attr * attr)1213*4882a593Smuzhiyun static int kvm_s390_get_tod_high(struct kvm *kvm, struct kvm_device_attr *attr)
1214*4882a593Smuzhiyun {
1215*4882a593Smuzhiyun u8 gtod_high = 0;
1216*4882a593Smuzhiyun
1217*4882a593Smuzhiyun if (copy_to_user((void __user *)attr->addr, >od_high,
1218*4882a593Smuzhiyun sizeof(gtod_high)))
1219*4882a593Smuzhiyun return -EFAULT;
1220*4882a593Smuzhiyun VM_EVENT(kvm, 3, "QUERY: TOD extension: 0x%x", gtod_high);
1221*4882a593Smuzhiyun
1222*4882a593Smuzhiyun return 0;
1223*4882a593Smuzhiyun }
1224*4882a593Smuzhiyun
kvm_s390_get_tod_low(struct kvm * kvm,struct kvm_device_attr * attr)1225*4882a593Smuzhiyun static int kvm_s390_get_tod_low(struct kvm *kvm, struct kvm_device_attr *attr)
1226*4882a593Smuzhiyun {
1227*4882a593Smuzhiyun u64 gtod;
1228*4882a593Smuzhiyun
1229*4882a593Smuzhiyun gtod = kvm_s390_get_tod_clock_fast(kvm);
1230*4882a593Smuzhiyun if (copy_to_user((void __user *)attr->addr, >od, sizeof(gtod)))
1231*4882a593Smuzhiyun return -EFAULT;
1232*4882a593Smuzhiyun VM_EVENT(kvm, 3, "QUERY: TOD base: 0x%llx", gtod);
1233*4882a593Smuzhiyun
1234*4882a593Smuzhiyun return 0;
1235*4882a593Smuzhiyun }
1236*4882a593Smuzhiyun
kvm_s390_get_tod(struct kvm * kvm,struct kvm_device_attr * attr)1237*4882a593Smuzhiyun static int kvm_s390_get_tod(struct kvm *kvm, struct kvm_device_attr *attr)
1238*4882a593Smuzhiyun {
1239*4882a593Smuzhiyun int ret;
1240*4882a593Smuzhiyun
1241*4882a593Smuzhiyun if (attr->flags)
1242*4882a593Smuzhiyun return -EINVAL;
1243*4882a593Smuzhiyun
1244*4882a593Smuzhiyun switch (attr->attr) {
1245*4882a593Smuzhiyun case KVM_S390_VM_TOD_EXT:
1246*4882a593Smuzhiyun ret = kvm_s390_get_tod_ext(kvm, attr);
1247*4882a593Smuzhiyun break;
1248*4882a593Smuzhiyun case KVM_S390_VM_TOD_HIGH:
1249*4882a593Smuzhiyun ret = kvm_s390_get_tod_high(kvm, attr);
1250*4882a593Smuzhiyun break;
1251*4882a593Smuzhiyun case KVM_S390_VM_TOD_LOW:
1252*4882a593Smuzhiyun ret = kvm_s390_get_tod_low(kvm, attr);
1253*4882a593Smuzhiyun break;
1254*4882a593Smuzhiyun default:
1255*4882a593Smuzhiyun ret = -ENXIO;
1256*4882a593Smuzhiyun break;
1257*4882a593Smuzhiyun }
1258*4882a593Smuzhiyun return ret;
1259*4882a593Smuzhiyun }
1260*4882a593Smuzhiyun
kvm_s390_set_processor(struct kvm * kvm,struct kvm_device_attr * attr)1261*4882a593Smuzhiyun static int kvm_s390_set_processor(struct kvm *kvm, struct kvm_device_attr *attr)
1262*4882a593Smuzhiyun {
1263*4882a593Smuzhiyun struct kvm_s390_vm_cpu_processor *proc;
1264*4882a593Smuzhiyun u16 lowest_ibc, unblocked_ibc;
1265*4882a593Smuzhiyun int ret = 0;
1266*4882a593Smuzhiyun
1267*4882a593Smuzhiyun mutex_lock(&kvm->lock);
1268*4882a593Smuzhiyun if (kvm->created_vcpus) {
1269*4882a593Smuzhiyun ret = -EBUSY;
1270*4882a593Smuzhiyun goto out;
1271*4882a593Smuzhiyun }
1272*4882a593Smuzhiyun proc = kzalloc(sizeof(*proc), GFP_KERNEL);
1273*4882a593Smuzhiyun if (!proc) {
1274*4882a593Smuzhiyun ret = -ENOMEM;
1275*4882a593Smuzhiyun goto out;
1276*4882a593Smuzhiyun }
1277*4882a593Smuzhiyun if (!copy_from_user(proc, (void __user *)attr->addr,
1278*4882a593Smuzhiyun sizeof(*proc))) {
1279*4882a593Smuzhiyun kvm->arch.model.cpuid = proc->cpuid;
1280*4882a593Smuzhiyun lowest_ibc = sclp.ibc >> 16 & 0xfff;
1281*4882a593Smuzhiyun unblocked_ibc = sclp.ibc & 0xfff;
1282*4882a593Smuzhiyun if (lowest_ibc && proc->ibc) {
1283*4882a593Smuzhiyun if (proc->ibc > unblocked_ibc)
1284*4882a593Smuzhiyun kvm->arch.model.ibc = unblocked_ibc;
1285*4882a593Smuzhiyun else if (proc->ibc < lowest_ibc)
1286*4882a593Smuzhiyun kvm->arch.model.ibc = lowest_ibc;
1287*4882a593Smuzhiyun else
1288*4882a593Smuzhiyun kvm->arch.model.ibc = proc->ibc;
1289*4882a593Smuzhiyun }
1290*4882a593Smuzhiyun memcpy(kvm->arch.model.fac_list, proc->fac_list,
1291*4882a593Smuzhiyun S390_ARCH_FAC_LIST_SIZE_BYTE);
1292*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET: guest ibc: 0x%4.4x, guest cpuid: 0x%16.16llx",
1293*4882a593Smuzhiyun kvm->arch.model.ibc,
1294*4882a593Smuzhiyun kvm->arch.model.cpuid);
1295*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET: guest faclist: 0x%16.16llx.%16.16llx.%16.16llx",
1296*4882a593Smuzhiyun kvm->arch.model.fac_list[0],
1297*4882a593Smuzhiyun kvm->arch.model.fac_list[1],
1298*4882a593Smuzhiyun kvm->arch.model.fac_list[2]);
1299*4882a593Smuzhiyun } else
1300*4882a593Smuzhiyun ret = -EFAULT;
1301*4882a593Smuzhiyun kfree(proc);
1302*4882a593Smuzhiyun out:
1303*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
1304*4882a593Smuzhiyun return ret;
1305*4882a593Smuzhiyun }
1306*4882a593Smuzhiyun
kvm_s390_set_processor_feat(struct kvm * kvm,struct kvm_device_attr * attr)1307*4882a593Smuzhiyun static int kvm_s390_set_processor_feat(struct kvm *kvm,
1308*4882a593Smuzhiyun struct kvm_device_attr *attr)
1309*4882a593Smuzhiyun {
1310*4882a593Smuzhiyun struct kvm_s390_vm_cpu_feat data;
1311*4882a593Smuzhiyun
1312*4882a593Smuzhiyun if (copy_from_user(&data, (void __user *)attr->addr, sizeof(data)))
1313*4882a593Smuzhiyun return -EFAULT;
1314*4882a593Smuzhiyun if (!bitmap_subset((unsigned long *) data.feat,
1315*4882a593Smuzhiyun kvm_s390_available_cpu_feat,
1316*4882a593Smuzhiyun KVM_S390_VM_CPU_FEAT_NR_BITS))
1317*4882a593Smuzhiyun return -EINVAL;
1318*4882a593Smuzhiyun
1319*4882a593Smuzhiyun mutex_lock(&kvm->lock);
1320*4882a593Smuzhiyun if (kvm->created_vcpus) {
1321*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
1322*4882a593Smuzhiyun return -EBUSY;
1323*4882a593Smuzhiyun }
1324*4882a593Smuzhiyun bitmap_copy(kvm->arch.cpu_feat, (unsigned long *) data.feat,
1325*4882a593Smuzhiyun KVM_S390_VM_CPU_FEAT_NR_BITS);
1326*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
1327*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET: guest feat: 0x%16.16llx.0x%16.16llx.0x%16.16llx",
1328*4882a593Smuzhiyun data.feat[0],
1329*4882a593Smuzhiyun data.feat[1],
1330*4882a593Smuzhiyun data.feat[2]);
1331*4882a593Smuzhiyun return 0;
1332*4882a593Smuzhiyun }
1333*4882a593Smuzhiyun
kvm_s390_set_processor_subfunc(struct kvm * kvm,struct kvm_device_attr * attr)1334*4882a593Smuzhiyun static int kvm_s390_set_processor_subfunc(struct kvm *kvm,
1335*4882a593Smuzhiyun struct kvm_device_attr *attr)
1336*4882a593Smuzhiyun {
1337*4882a593Smuzhiyun mutex_lock(&kvm->lock);
1338*4882a593Smuzhiyun if (kvm->created_vcpus) {
1339*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
1340*4882a593Smuzhiyun return -EBUSY;
1341*4882a593Smuzhiyun }
1342*4882a593Smuzhiyun
1343*4882a593Smuzhiyun if (copy_from_user(&kvm->arch.model.subfuncs, (void __user *)attr->addr,
1344*4882a593Smuzhiyun sizeof(struct kvm_s390_vm_cpu_subfunc))) {
1345*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
1346*4882a593Smuzhiyun return -EFAULT;
1347*4882a593Smuzhiyun }
1348*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
1349*4882a593Smuzhiyun
1350*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET: guest PLO subfunc 0x%16.16lx.%16.16lx.%16.16lx.%16.16lx",
1351*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.plo)[0],
1352*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.plo)[1],
1353*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.plo)[2],
1354*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.plo)[3]);
1355*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET: guest PTFF subfunc 0x%16.16lx.%16.16lx",
1356*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.ptff)[0],
1357*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.ptff)[1]);
1358*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET: guest KMAC subfunc 0x%16.16lx.%16.16lx",
1359*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kmac)[0],
1360*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kmac)[1]);
1361*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET: guest KMC subfunc 0x%16.16lx.%16.16lx",
1362*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kmc)[0],
1363*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kmc)[1]);
1364*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET: guest KM subfunc 0x%16.16lx.%16.16lx",
1365*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.km)[0],
1366*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.km)[1]);
1367*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET: guest KIMD subfunc 0x%16.16lx.%16.16lx",
1368*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kimd)[0],
1369*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kimd)[1]);
1370*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET: guest KLMD subfunc 0x%16.16lx.%16.16lx",
1371*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.klmd)[0],
1372*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.klmd)[1]);
1373*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET: guest PCKMO subfunc 0x%16.16lx.%16.16lx",
1374*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.pckmo)[0],
1375*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.pckmo)[1]);
1376*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET: guest KMCTR subfunc 0x%16.16lx.%16.16lx",
1377*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kmctr)[0],
1378*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kmctr)[1]);
1379*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET: guest KMF subfunc 0x%16.16lx.%16.16lx",
1380*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kmf)[0],
1381*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kmf)[1]);
1382*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET: guest KMO subfunc 0x%16.16lx.%16.16lx",
1383*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kmo)[0],
1384*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kmo)[1]);
1385*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET: guest PCC subfunc 0x%16.16lx.%16.16lx",
1386*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.pcc)[0],
1387*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.pcc)[1]);
1388*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET: guest PPNO subfunc 0x%16.16lx.%16.16lx",
1389*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.ppno)[0],
1390*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.ppno)[1]);
1391*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET: guest KMA subfunc 0x%16.16lx.%16.16lx",
1392*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kma)[0],
1393*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kma)[1]);
1394*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET: guest KDSA subfunc 0x%16.16lx.%16.16lx",
1395*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kdsa)[0],
1396*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kdsa)[1]);
1397*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET: guest SORTL subfunc 0x%16.16lx.%16.16lx.%16.16lx.%16.16lx",
1398*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.sortl)[0],
1399*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.sortl)[1],
1400*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.sortl)[2],
1401*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.sortl)[3]);
1402*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET: guest DFLTCC subfunc 0x%16.16lx.%16.16lx.%16.16lx.%16.16lx",
1403*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.dfltcc)[0],
1404*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.dfltcc)[1],
1405*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.dfltcc)[2],
1406*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.dfltcc)[3]);
1407*4882a593Smuzhiyun
1408*4882a593Smuzhiyun return 0;
1409*4882a593Smuzhiyun }
1410*4882a593Smuzhiyun
kvm_s390_set_cpu_model(struct kvm * kvm,struct kvm_device_attr * attr)1411*4882a593Smuzhiyun static int kvm_s390_set_cpu_model(struct kvm *kvm, struct kvm_device_attr *attr)
1412*4882a593Smuzhiyun {
1413*4882a593Smuzhiyun int ret = -ENXIO;
1414*4882a593Smuzhiyun
1415*4882a593Smuzhiyun switch (attr->attr) {
1416*4882a593Smuzhiyun case KVM_S390_VM_CPU_PROCESSOR:
1417*4882a593Smuzhiyun ret = kvm_s390_set_processor(kvm, attr);
1418*4882a593Smuzhiyun break;
1419*4882a593Smuzhiyun case KVM_S390_VM_CPU_PROCESSOR_FEAT:
1420*4882a593Smuzhiyun ret = kvm_s390_set_processor_feat(kvm, attr);
1421*4882a593Smuzhiyun break;
1422*4882a593Smuzhiyun case KVM_S390_VM_CPU_PROCESSOR_SUBFUNC:
1423*4882a593Smuzhiyun ret = kvm_s390_set_processor_subfunc(kvm, attr);
1424*4882a593Smuzhiyun break;
1425*4882a593Smuzhiyun }
1426*4882a593Smuzhiyun return ret;
1427*4882a593Smuzhiyun }
1428*4882a593Smuzhiyun
kvm_s390_get_processor(struct kvm * kvm,struct kvm_device_attr * attr)1429*4882a593Smuzhiyun static int kvm_s390_get_processor(struct kvm *kvm, struct kvm_device_attr *attr)
1430*4882a593Smuzhiyun {
1431*4882a593Smuzhiyun struct kvm_s390_vm_cpu_processor *proc;
1432*4882a593Smuzhiyun int ret = 0;
1433*4882a593Smuzhiyun
1434*4882a593Smuzhiyun proc = kzalloc(sizeof(*proc), GFP_KERNEL);
1435*4882a593Smuzhiyun if (!proc) {
1436*4882a593Smuzhiyun ret = -ENOMEM;
1437*4882a593Smuzhiyun goto out;
1438*4882a593Smuzhiyun }
1439*4882a593Smuzhiyun proc->cpuid = kvm->arch.model.cpuid;
1440*4882a593Smuzhiyun proc->ibc = kvm->arch.model.ibc;
1441*4882a593Smuzhiyun memcpy(&proc->fac_list, kvm->arch.model.fac_list,
1442*4882a593Smuzhiyun S390_ARCH_FAC_LIST_SIZE_BYTE);
1443*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: guest ibc: 0x%4.4x, guest cpuid: 0x%16.16llx",
1444*4882a593Smuzhiyun kvm->arch.model.ibc,
1445*4882a593Smuzhiyun kvm->arch.model.cpuid);
1446*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: guest faclist: 0x%16.16llx.%16.16llx.%16.16llx",
1447*4882a593Smuzhiyun kvm->arch.model.fac_list[0],
1448*4882a593Smuzhiyun kvm->arch.model.fac_list[1],
1449*4882a593Smuzhiyun kvm->arch.model.fac_list[2]);
1450*4882a593Smuzhiyun if (copy_to_user((void __user *)attr->addr, proc, sizeof(*proc)))
1451*4882a593Smuzhiyun ret = -EFAULT;
1452*4882a593Smuzhiyun kfree(proc);
1453*4882a593Smuzhiyun out:
1454*4882a593Smuzhiyun return ret;
1455*4882a593Smuzhiyun }
1456*4882a593Smuzhiyun
kvm_s390_get_machine(struct kvm * kvm,struct kvm_device_attr * attr)1457*4882a593Smuzhiyun static int kvm_s390_get_machine(struct kvm *kvm, struct kvm_device_attr *attr)
1458*4882a593Smuzhiyun {
1459*4882a593Smuzhiyun struct kvm_s390_vm_cpu_machine *mach;
1460*4882a593Smuzhiyun int ret = 0;
1461*4882a593Smuzhiyun
1462*4882a593Smuzhiyun mach = kzalloc(sizeof(*mach), GFP_KERNEL);
1463*4882a593Smuzhiyun if (!mach) {
1464*4882a593Smuzhiyun ret = -ENOMEM;
1465*4882a593Smuzhiyun goto out;
1466*4882a593Smuzhiyun }
1467*4882a593Smuzhiyun get_cpu_id((struct cpuid *) &mach->cpuid);
1468*4882a593Smuzhiyun mach->ibc = sclp.ibc;
1469*4882a593Smuzhiyun memcpy(&mach->fac_mask, kvm->arch.model.fac_mask,
1470*4882a593Smuzhiyun S390_ARCH_FAC_LIST_SIZE_BYTE);
1471*4882a593Smuzhiyun memcpy((unsigned long *)&mach->fac_list, S390_lowcore.stfle_fac_list,
1472*4882a593Smuzhiyun sizeof(S390_lowcore.stfle_fac_list));
1473*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: host ibc: 0x%4.4x, host cpuid: 0x%16.16llx",
1474*4882a593Smuzhiyun kvm->arch.model.ibc,
1475*4882a593Smuzhiyun kvm->arch.model.cpuid);
1476*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: host facmask: 0x%16.16llx.%16.16llx.%16.16llx",
1477*4882a593Smuzhiyun mach->fac_mask[0],
1478*4882a593Smuzhiyun mach->fac_mask[1],
1479*4882a593Smuzhiyun mach->fac_mask[2]);
1480*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: host faclist: 0x%16.16llx.%16.16llx.%16.16llx",
1481*4882a593Smuzhiyun mach->fac_list[0],
1482*4882a593Smuzhiyun mach->fac_list[1],
1483*4882a593Smuzhiyun mach->fac_list[2]);
1484*4882a593Smuzhiyun if (copy_to_user((void __user *)attr->addr, mach, sizeof(*mach)))
1485*4882a593Smuzhiyun ret = -EFAULT;
1486*4882a593Smuzhiyun kfree(mach);
1487*4882a593Smuzhiyun out:
1488*4882a593Smuzhiyun return ret;
1489*4882a593Smuzhiyun }
1490*4882a593Smuzhiyun
kvm_s390_get_processor_feat(struct kvm * kvm,struct kvm_device_attr * attr)1491*4882a593Smuzhiyun static int kvm_s390_get_processor_feat(struct kvm *kvm,
1492*4882a593Smuzhiyun struct kvm_device_attr *attr)
1493*4882a593Smuzhiyun {
1494*4882a593Smuzhiyun struct kvm_s390_vm_cpu_feat data;
1495*4882a593Smuzhiyun
1496*4882a593Smuzhiyun bitmap_copy((unsigned long *) data.feat, kvm->arch.cpu_feat,
1497*4882a593Smuzhiyun KVM_S390_VM_CPU_FEAT_NR_BITS);
1498*4882a593Smuzhiyun if (copy_to_user((void __user *)attr->addr, &data, sizeof(data)))
1499*4882a593Smuzhiyun return -EFAULT;
1500*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: guest feat: 0x%16.16llx.0x%16.16llx.0x%16.16llx",
1501*4882a593Smuzhiyun data.feat[0],
1502*4882a593Smuzhiyun data.feat[1],
1503*4882a593Smuzhiyun data.feat[2]);
1504*4882a593Smuzhiyun return 0;
1505*4882a593Smuzhiyun }
1506*4882a593Smuzhiyun
kvm_s390_get_machine_feat(struct kvm * kvm,struct kvm_device_attr * attr)1507*4882a593Smuzhiyun static int kvm_s390_get_machine_feat(struct kvm *kvm,
1508*4882a593Smuzhiyun struct kvm_device_attr *attr)
1509*4882a593Smuzhiyun {
1510*4882a593Smuzhiyun struct kvm_s390_vm_cpu_feat data;
1511*4882a593Smuzhiyun
1512*4882a593Smuzhiyun bitmap_copy((unsigned long *) data.feat,
1513*4882a593Smuzhiyun kvm_s390_available_cpu_feat,
1514*4882a593Smuzhiyun KVM_S390_VM_CPU_FEAT_NR_BITS);
1515*4882a593Smuzhiyun if (copy_to_user((void __user *)attr->addr, &data, sizeof(data)))
1516*4882a593Smuzhiyun return -EFAULT;
1517*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: host feat: 0x%16.16llx.0x%16.16llx.0x%16.16llx",
1518*4882a593Smuzhiyun data.feat[0],
1519*4882a593Smuzhiyun data.feat[1],
1520*4882a593Smuzhiyun data.feat[2]);
1521*4882a593Smuzhiyun return 0;
1522*4882a593Smuzhiyun }
1523*4882a593Smuzhiyun
kvm_s390_get_processor_subfunc(struct kvm * kvm,struct kvm_device_attr * attr)1524*4882a593Smuzhiyun static int kvm_s390_get_processor_subfunc(struct kvm *kvm,
1525*4882a593Smuzhiyun struct kvm_device_attr *attr)
1526*4882a593Smuzhiyun {
1527*4882a593Smuzhiyun if (copy_to_user((void __user *)attr->addr, &kvm->arch.model.subfuncs,
1528*4882a593Smuzhiyun sizeof(struct kvm_s390_vm_cpu_subfunc)))
1529*4882a593Smuzhiyun return -EFAULT;
1530*4882a593Smuzhiyun
1531*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: guest PLO subfunc 0x%16.16lx.%16.16lx.%16.16lx.%16.16lx",
1532*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.plo)[0],
1533*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.plo)[1],
1534*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.plo)[2],
1535*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.plo)[3]);
1536*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: guest PTFF subfunc 0x%16.16lx.%16.16lx",
1537*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.ptff)[0],
1538*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.ptff)[1]);
1539*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: guest KMAC subfunc 0x%16.16lx.%16.16lx",
1540*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kmac)[0],
1541*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kmac)[1]);
1542*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: guest KMC subfunc 0x%16.16lx.%16.16lx",
1543*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kmc)[0],
1544*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kmc)[1]);
1545*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: guest KM subfunc 0x%16.16lx.%16.16lx",
1546*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.km)[0],
1547*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.km)[1]);
1548*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: guest KIMD subfunc 0x%16.16lx.%16.16lx",
1549*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kimd)[0],
1550*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kimd)[1]);
1551*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: guest KLMD subfunc 0x%16.16lx.%16.16lx",
1552*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.klmd)[0],
1553*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.klmd)[1]);
1554*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: guest PCKMO subfunc 0x%16.16lx.%16.16lx",
1555*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.pckmo)[0],
1556*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.pckmo)[1]);
1557*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: guest KMCTR subfunc 0x%16.16lx.%16.16lx",
1558*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kmctr)[0],
1559*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kmctr)[1]);
1560*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: guest KMF subfunc 0x%16.16lx.%16.16lx",
1561*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kmf)[0],
1562*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kmf)[1]);
1563*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: guest KMO subfunc 0x%16.16lx.%16.16lx",
1564*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kmo)[0],
1565*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kmo)[1]);
1566*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: guest PCC subfunc 0x%16.16lx.%16.16lx",
1567*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.pcc)[0],
1568*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.pcc)[1]);
1569*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: guest PPNO subfunc 0x%16.16lx.%16.16lx",
1570*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.ppno)[0],
1571*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.ppno)[1]);
1572*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: guest KMA subfunc 0x%16.16lx.%16.16lx",
1573*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kma)[0],
1574*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kma)[1]);
1575*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: guest KDSA subfunc 0x%16.16lx.%16.16lx",
1576*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kdsa)[0],
1577*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.kdsa)[1]);
1578*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: guest SORTL subfunc 0x%16.16lx.%16.16lx.%16.16lx.%16.16lx",
1579*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.sortl)[0],
1580*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.sortl)[1],
1581*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.sortl)[2],
1582*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.sortl)[3]);
1583*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: guest DFLTCC subfunc 0x%16.16lx.%16.16lx.%16.16lx.%16.16lx",
1584*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.dfltcc)[0],
1585*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.dfltcc)[1],
1586*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.dfltcc)[2],
1587*4882a593Smuzhiyun ((unsigned long *) &kvm->arch.model.subfuncs.dfltcc)[3]);
1588*4882a593Smuzhiyun
1589*4882a593Smuzhiyun return 0;
1590*4882a593Smuzhiyun }
1591*4882a593Smuzhiyun
kvm_s390_get_machine_subfunc(struct kvm * kvm,struct kvm_device_attr * attr)1592*4882a593Smuzhiyun static int kvm_s390_get_machine_subfunc(struct kvm *kvm,
1593*4882a593Smuzhiyun struct kvm_device_attr *attr)
1594*4882a593Smuzhiyun {
1595*4882a593Smuzhiyun if (copy_to_user((void __user *)attr->addr, &kvm_s390_available_subfunc,
1596*4882a593Smuzhiyun sizeof(struct kvm_s390_vm_cpu_subfunc)))
1597*4882a593Smuzhiyun return -EFAULT;
1598*4882a593Smuzhiyun
1599*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: host PLO subfunc 0x%16.16lx.%16.16lx.%16.16lx.%16.16lx",
1600*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.plo)[0],
1601*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.plo)[1],
1602*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.plo)[2],
1603*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.plo)[3]);
1604*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: host PTFF subfunc 0x%16.16lx.%16.16lx",
1605*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.ptff)[0],
1606*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.ptff)[1]);
1607*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: host KMAC subfunc 0x%16.16lx.%16.16lx",
1608*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.kmac)[0],
1609*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.kmac)[1]);
1610*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: host KMC subfunc 0x%16.16lx.%16.16lx",
1611*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.kmc)[0],
1612*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.kmc)[1]);
1613*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: host KM subfunc 0x%16.16lx.%16.16lx",
1614*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.km)[0],
1615*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.km)[1]);
1616*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: host KIMD subfunc 0x%16.16lx.%16.16lx",
1617*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.kimd)[0],
1618*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.kimd)[1]);
1619*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: host KLMD subfunc 0x%16.16lx.%16.16lx",
1620*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.klmd)[0],
1621*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.klmd)[1]);
1622*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: host PCKMO subfunc 0x%16.16lx.%16.16lx",
1623*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.pckmo)[0],
1624*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.pckmo)[1]);
1625*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: host KMCTR subfunc 0x%16.16lx.%16.16lx",
1626*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.kmctr)[0],
1627*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.kmctr)[1]);
1628*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: host KMF subfunc 0x%16.16lx.%16.16lx",
1629*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.kmf)[0],
1630*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.kmf)[1]);
1631*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: host KMO subfunc 0x%16.16lx.%16.16lx",
1632*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.kmo)[0],
1633*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.kmo)[1]);
1634*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: host PCC subfunc 0x%16.16lx.%16.16lx",
1635*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.pcc)[0],
1636*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.pcc)[1]);
1637*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: host PPNO subfunc 0x%16.16lx.%16.16lx",
1638*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.ppno)[0],
1639*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.ppno)[1]);
1640*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: host KMA subfunc 0x%16.16lx.%16.16lx",
1641*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.kma)[0],
1642*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.kma)[1]);
1643*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: host KDSA subfunc 0x%16.16lx.%16.16lx",
1644*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.kdsa)[0],
1645*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.kdsa)[1]);
1646*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: host SORTL subfunc 0x%16.16lx.%16.16lx.%16.16lx.%16.16lx",
1647*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.sortl)[0],
1648*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.sortl)[1],
1649*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.sortl)[2],
1650*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.sortl)[3]);
1651*4882a593Smuzhiyun VM_EVENT(kvm, 3, "GET: host DFLTCC subfunc 0x%16.16lx.%16.16lx.%16.16lx.%16.16lx",
1652*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.dfltcc)[0],
1653*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.dfltcc)[1],
1654*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.dfltcc)[2],
1655*4882a593Smuzhiyun ((unsigned long *) &kvm_s390_available_subfunc.dfltcc)[3]);
1656*4882a593Smuzhiyun
1657*4882a593Smuzhiyun return 0;
1658*4882a593Smuzhiyun }
1659*4882a593Smuzhiyun
kvm_s390_get_cpu_model(struct kvm * kvm,struct kvm_device_attr * attr)1660*4882a593Smuzhiyun static int kvm_s390_get_cpu_model(struct kvm *kvm, struct kvm_device_attr *attr)
1661*4882a593Smuzhiyun {
1662*4882a593Smuzhiyun int ret = -ENXIO;
1663*4882a593Smuzhiyun
1664*4882a593Smuzhiyun switch (attr->attr) {
1665*4882a593Smuzhiyun case KVM_S390_VM_CPU_PROCESSOR:
1666*4882a593Smuzhiyun ret = kvm_s390_get_processor(kvm, attr);
1667*4882a593Smuzhiyun break;
1668*4882a593Smuzhiyun case KVM_S390_VM_CPU_MACHINE:
1669*4882a593Smuzhiyun ret = kvm_s390_get_machine(kvm, attr);
1670*4882a593Smuzhiyun break;
1671*4882a593Smuzhiyun case KVM_S390_VM_CPU_PROCESSOR_FEAT:
1672*4882a593Smuzhiyun ret = kvm_s390_get_processor_feat(kvm, attr);
1673*4882a593Smuzhiyun break;
1674*4882a593Smuzhiyun case KVM_S390_VM_CPU_MACHINE_FEAT:
1675*4882a593Smuzhiyun ret = kvm_s390_get_machine_feat(kvm, attr);
1676*4882a593Smuzhiyun break;
1677*4882a593Smuzhiyun case KVM_S390_VM_CPU_PROCESSOR_SUBFUNC:
1678*4882a593Smuzhiyun ret = kvm_s390_get_processor_subfunc(kvm, attr);
1679*4882a593Smuzhiyun break;
1680*4882a593Smuzhiyun case KVM_S390_VM_CPU_MACHINE_SUBFUNC:
1681*4882a593Smuzhiyun ret = kvm_s390_get_machine_subfunc(kvm, attr);
1682*4882a593Smuzhiyun break;
1683*4882a593Smuzhiyun }
1684*4882a593Smuzhiyun return ret;
1685*4882a593Smuzhiyun }
1686*4882a593Smuzhiyun
kvm_s390_vm_set_attr(struct kvm * kvm,struct kvm_device_attr * attr)1687*4882a593Smuzhiyun static int kvm_s390_vm_set_attr(struct kvm *kvm, struct kvm_device_attr *attr)
1688*4882a593Smuzhiyun {
1689*4882a593Smuzhiyun int ret;
1690*4882a593Smuzhiyun
1691*4882a593Smuzhiyun switch (attr->group) {
1692*4882a593Smuzhiyun case KVM_S390_VM_MEM_CTRL:
1693*4882a593Smuzhiyun ret = kvm_s390_set_mem_control(kvm, attr);
1694*4882a593Smuzhiyun break;
1695*4882a593Smuzhiyun case KVM_S390_VM_TOD:
1696*4882a593Smuzhiyun ret = kvm_s390_set_tod(kvm, attr);
1697*4882a593Smuzhiyun break;
1698*4882a593Smuzhiyun case KVM_S390_VM_CPU_MODEL:
1699*4882a593Smuzhiyun ret = kvm_s390_set_cpu_model(kvm, attr);
1700*4882a593Smuzhiyun break;
1701*4882a593Smuzhiyun case KVM_S390_VM_CRYPTO:
1702*4882a593Smuzhiyun ret = kvm_s390_vm_set_crypto(kvm, attr);
1703*4882a593Smuzhiyun break;
1704*4882a593Smuzhiyun case KVM_S390_VM_MIGRATION:
1705*4882a593Smuzhiyun ret = kvm_s390_vm_set_migration(kvm, attr);
1706*4882a593Smuzhiyun break;
1707*4882a593Smuzhiyun default:
1708*4882a593Smuzhiyun ret = -ENXIO;
1709*4882a593Smuzhiyun break;
1710*4882a593Smuzhiyun }
1711*4882a593Smuzhiyun
1712*4882a593Smuzhiyun return ret;
1713*4882a593Smuzhiyun }
1714*4882a593Smuzhiyun
kvm_s390_vm_get_attr(struct kvm * kvm,struct kvm_device_attr * attr)1715*4882a593Smuzhiyun static int kvm_s390_vm_get_attr(struct kvm *kvm, struct kvm_device_attr *attr)
1716*4882a593Smuzhiyun {
1717*4882a593Smuzhiyun int ret;
1718*4882a593Smuzhiyun
1719*4882a593Smuzhiyun switch (attr->group) {
1720*4882a593Smuzhiyun case KVM_S390_VM_MEM_CTRL:
1721*4882a593Smuzhiyun ret = kvm_s390_get_mem_control(kvm, attr);
1722*4882a593Smuzhiyun break;
1723*4882a593Smuzhiyun case KVM_S390_VM_TOD:
1724*4882a593Smuzhiyun ret = kvm_s390_get_tod(kvm, attr);
1725*4882a593Smuzhiyun break;
1726*4882a593Smuzhiyun case KVM_S390_VM_CPU_MODEL:
1727*4882a593Smuzhiyun ret = kvm_s390_get_cpu_model(kvm, attr);
1728*4882a593Smuzhiyun break;
1729*4882a593Smuzhiyun case KVM_S390_VM_MIGRATION:
1730*4882a593Smuzhiyun ret = kvm_s390_vm_get_migration(kvm, attr);
1731*4882a593Smuzhiyun break;
1732*4882a593Smuzhiyun default:
1733*4882a593Smuzhiyun ret = -ENXIO;
1734*4882a593Smuzhiyun break;
1735*4882a593Smuzhiyun }
1736*4882a593Smuzhiyun
1737*4882a593Smuzhiyun return ret;
1738*4882a593Smuzhiyun }
1739*4882a593Smuzhiyun
kvm_s390_vm_has_attr(struct kvm * kvm,struct kvm_device_attr * attr)1740*4882a593Smuzhiyun static int kvm_s390_vm_has_attr(struct kvm *kvm, struct kvm_device_attr *attr)
1741*4882a593Smuzhiyun {
1742*4882a593Smuzhiyun int ret;
1743*4882a593Smuzhiyun
1744*4882a593Smuzhiyun switch (attr->group) {
1745*4882a593Smuzhiyun case KVM_S390_VM_MEM_CTRL:
1746*4882a593Smuzhiyun switch (attr->attr) {
1747*4882a593Smuzhiyun case KVM_S390_VM_MEM_ENABLE_CMMA:
1748*4882a593Smuzhiyun case KVM_S390_VM_MEM_CLR_CMMA:
1749*4882a593Smuzhiyun ret = sclp.has_cmma ? 0 : -ENXIO;
1750*4882a593Smuzhiyun break;
1751*4882a593Smuzhiyun case KVM_S390_VM_MEM_LIMIT_SIZE:
1752*4882a593Smuzhiyun ret = 0;
1753*4882a593Smuzhiyun break;
1754*4882a593Smuzhiyun default:
1755*4882a593Smuzhiyun ret = -ENXIO;
1756*4882a593Smuzhiyun break;
1757*4882a593Smuzhiyun }
1758*4882a593Smuzhiyun break;
1759*4882a593Smuzhiyun case KVM_S390_VM_TOD:
1760*4882a593Smuzhiyun switch (attr->attr) {
1761*4882a593Smuzhiyun case KVM_S390_VM_TOD_LOW:
1762*4882a593Smuzhiyun case KVM_S390_VM_TOD_HIGH:
1763*4882a593Smuzhiyun ret = 0;
1764*4882a593Smuzhiyun break;
1765*4882a593Smuzhiyun default:
1766*4882a593Smuzhiyun ret = -ENXIO;
1767*4882a593Smuzhiyun break;
1768*4882a593Smuzhiyun }
1769*4882a593Smuzhiyun break;
1770*4882a593Smuzhiyun case KVM_S390_VM_CPU_MODEL:
1771*4882a593Smuzhiyun switch (attr->attr) {
1772*4882a593Smuzhiyun case KVM_S390_VM_CPU_PROCESSOR:
1773*4882a593Smuzhiyun case KVM_S390_VM_CPU_MACHINE:
1774*4882a593Smuzhiyun case KVM_S390_VM_CPU_PROCESSOR_FEAT:
1775*4882a593Smuzhiyun case KVM_S390_VM_CPU_MACHINE_FEAT:
1776*4882a593Smuzhiyun case KVM_S390_VM_CPU_MACHINE_SUBFUNC:
1777*4882a593Smuzhiyun case KVM_S390_VM_CPU_PROCESSOR_SUBFUNC:
1778*4882a593Smuzhiyun ret = 0;
1779*4882a593Smuzhiyun break;
1780*4882a593Smuzhiyun default:
1781*4882a593Smuzhiyun ret = -ENXIO;
1782*4882a593Smuzhiyun break;
1783*4882a593Smuzhiyun }
1784*4882a593Smuzhiyun break;
1785*4882a593Smuzhiyun case KVM_S390_VM_CRYPTO:
1786*4882a593Smuzhiyun switch (attr->attr) {
1787*4882a593Smuzhiyun case KVM_S390_VM_CRYPTO_ENABLE_AES_KW:
1788*4882a593Smuzhiyun case KVM_S390_VM_CRYPTO_ENABLE_DEA_KW:
1789*4882a593Smuzhiyun case KVM_S390_VM_CRYPTO_DISABLE_AES_KW:
1790*4882a593Smuzhiyun case KVM_S390_VM_CRYPTO_DISABLE_DEA_KW:
1791*4882a593Smuzhiyun ret = 0;
1792*4882a593Smuzhiyun break;
1793*4882a593Smuzhiyun case KVM_S390_VM_CRYPTO_ENABLE_APIE:
1794*4882a593Smuzhiyun case KVM_S390_VM_CRYPTO_DISABLE_APIE:
1795*4882a593Smuzhiyun ret = ap_instructions_available() ? 0 : -ENXIO;
1796*4882a593Smuzhiyun break;
1797*4882a593Smuzhiyun default:
1798*4882a593Smuzhiyun ret = -ENXIO;
1799*4882a593Smuzhiyun break;
1800*4882a593Smuzhiyun }
1801*4882a593Smuzhiyun break;
1802*4882a593Smuzhiyun case KVM_S390_VM_MIGRATION:
1803*4882a593Smuzhiyun ret = 0;
1804*4882a593Smuzhiyun break;
1805*4882a593Smuzhiyun default:
1806*4882a593Smuzhiyun ret = -ENXIO;
1807*4882a593Smuzhiyun break;
1808*4882a593Smuzhiyun }
1809*4882a593Smuzhiyun
1810*4882a593Smuzhiyun return ret;
1811*4882a593Smuzhiyun }
1812*4882a593Smuzhiyun
kvm_s390_get_skeys(struct kvm * kvm,struct kvm_s390_skeys * args)1813*4882a593Smuzhiyun static long kvm_s390_get_skeys(struct kvm *kvm, struct kvm_s390_skeys *args)
1814*4882a593Smuzhiyun {
1815*4882a593Smuzhiyun uint8_t *keys;
1816*4882a593Smuzhiyun uint64_t hva;
1817*4882a593Smuzhiyun int srcu_idx, i, r = 0;
1818*4882a593Smuzhiyun
1819*4882a593Smuzhiyun if (args->flags != 0)
1820*4882a593Smuzhiyun return -EINVAL;
1821*4882a593Smuzhiyun
1822*4882a593Smuzhiyun /* Is this guest using storage keys? */
1823*4882a593Smuzhiyun if (!mm_uses_skeys(current->mm))
1824*4882a593Smuzhiyun return KVM_S390_GET_SKEYS_NONE;
1825*4882a593Smuzhiyun
1826*4882a593Smuzhiyun /* Enforce sane limit on memory allocation */
1827*4882a593Smuzhiyun if (args->count < 1 || args->count > KVM_S390_SKEYS_MAX)
1828*4882a593Smuzhiyun return -EINVAL;
1829*4882a593Smuzhiyun
1830*4882a593Smuzhiyun keys = kvmalloc_array(args->count, sizeof(uint8_t), GFP_KERNEL);
1831*4882a593Smuzhiyun if (!keys)
1832*4882a593Smuzhiyun return -ENOMEM;
1833*4882a593Smuzhiyun
1834*4882a593Smuzhiyun mmap_read_lock(current->mm);
1835*4882a593Smuzhiyun srcu_idx = srcu_read_lock(&kvm->srcu);
1836*4882a593Smuzhiyun for (i = 0; i < args->count; i++) {
1837*4882a593Smuzhiyun hva = gfn_to_hva(kvm, args->start_gfn + i);
1838*4882a593Smuzhiyun if (kvm_is_error_hva(hva)) {
1839*4882a593Smuzhiyun r = -EFAULT;
1840*4882a593Smuzhiyun break;
1841*4882a593Smuzhiyun }
1842*4882a593Smuzhiyun
1843*4882a593Smuzhiyun r = get_guest_storage_key(current->mm, hva, &keys[i]);
1844*4882a593Smuzhiyun if (r)
1845*4882a593Smuzhiyun break;
1846*4882a593Smuzhiyun }
1847*4882a593Smuzhiyun srcu_read_unlock(&kvm->srcu, srcu_idx);
1848*4882a593Smuzhiyun mmap_read_unlock(current->mm);
1849*4882a593Smuzhiyun
1850*4882a593Smuzhiyun if (!r) {
1851*4882a593Smuzhiyun r = copy_to_user((uint8_t __user *)args->skeydata_addr, keys,
1852*4882a593Smuzhiyun sizeof(uint8_t) * args->count);
1853*4882a593Smuzhiyun if (r)
1854*4882a593Smuzhiyun r = -EFAULT;
1855*4882a593Smuzhiyun }
1856*4882a593Smuzhiyun
1857*4882a593Smuzhiyun kvfree(keys);
1858*4882a593Smuzhiyun return r;
1859*4882a593Smuzhiyun }
1860*4882a593Smuzhiyun
kvm_s390_set_skeys(struct kvm * kvm,struct kvm_s390_skeys * args)1861*4882a593Smuzhiyun static long kvm_s390_set_skeys(struct kvm *kvm, struct kvm_s390_skeys *args)
1862*4882a593Smuzhiyun {
1863*4882a593Smuzhiyun uint8_t *keys;
1864*4882a593Smuzhiyun uint64_t hva;
1865*4882a593Smuzhiyun int srcu_idx, i, r = 0;
1866*4882a593Smuzhiyun bool unlocked;
1867*4882a593Smuzhiyun
1868*4882a593Smuzhiyun if (args->flags != 0)
1869*4882a593Smuzhiyun return -EINVAL;
1870*4882a593Smuzhiyun
1871*4882a593Smuzhiyun /* Enforce sane limit on memory allocation */
1872*4882a593Smuzhiyun if (args->count < 1 || args->count > KVM_S390_SKEYS_MAX)
1873*4882a593Smuzhiyun return -EINVAL;
1874*4882a593Smuzhiyun
1875*4882a593Smuzhiyun keys = kvmalloc_array(args->count, sizeof(uint8_t), GFP_KERNEL);
1876*4882a593Smuzhiyun if (!keys)
1877*4882a593Smuzhiyun return -ENOMEM;
1878*4882a593Smuzhiyun
1879*4882a593Smuzhiyun r = copy_from_user(keys, (uint8_t __user *)args->skeydata_addr,
1880*4882a593Smuzhiyun sizeof(uint8_t) * args->count);
1881*4882a593Smuzhiyun if (r) {
1882*4882a593Smuzhiyun r = -EFAULT;
1883*4882a593Smuzhiyun goto out;
1884*4882a593Smuzhiyun }
1885*4882a593Smuzhiyun
1886*4882a593Smuzhiyun /* Enable storage key handling for the guest */
1887*4882a593Smuzhiyun r = s390_enable_skey();
1888*4882a593Smuzhiyun if (r)
1889*4882a593Smuzhiyun goto out;
1890*4882a593Smuzhiyun
1891*4882a593Smuzhiyun i = 0;
1892*4882a593Smuzhiyun mmap_read_lock(current->mm);
1893*4882a593Smuzhiyun srcu_idx = srcu_read_lock(&kvm->srcu);
1894*4882a593Smuzhiyun while (i < args->count) {
1895*4882a593Smuzhiyun unlocked = false;
1896*4882a593Smuzhiyun hva = gfn_to_hva(kvm, args->start_gfn + i);
1897*4882a593Smuzhiyun if (kvm_is_error_hva(hva)) {
1898*4882a593Smuzhiyun r = -EFAULT;
1899*4882a593Smuzhiyun break;
1900*4882a593Smuzhiyun }
1901*4882a593Smuzhiyun
1902*4882a593Smuzhiyun /* Lowest order bit is reserved */
1903*4882a593Smuzhiyun if (keys[i] & 0x01) {
1904*4882a593Smuzhiyun r = -EINVAL;
1905*4882a593Smuzhiyun break;
1906*4882a593Smuzhiyun }
1907*4882a593Smuzhiyun
1908*4882a593Smuzhiyun r = set_guest_storage_key(current->mm, hva, keys[i], 0);
1909*4882a593Smuzhiyun if (r) {
1910*4882a593Smuzhiyun r = fixup_user_fault(current->mm, hva,
1911*4882a593Smuzhiyun FAULT_FLAG_WRITE, &unlocked);
1912*4882a593Smuzhiyun if (r)
1913*4882a593Smuzhiyun break;
1914*4882a593Smuzhiyun }
1915*4882a593Smuzhiyun if (!r)
1916*4882a593Smuzhiyun i++;
1917*4882a593Smuzhiyun }
1918*4882a593Smuzhiyun srcu_read_unlock(&kvm->srcu, srcu_idx);
1919*4882a593Smuzhiyun mmap_read_unlock(current->mm);
1920*4882a593Smuzhiyun out:
1921*4882a593Smuzhiyun kvfree(keys);
1922*4882a593Smuzhiyun return r;
1923*4882a593Smuzhiyun }
1924*4882a593Smuzhiyun
1925*4882a593Smuzhiyun /*
1926*4882a593Smuzhiyun * Base address and length must be sent at the start of each block, therefore
1927*4882a593Smuzhiyun * it's cheaper to send some clean data, as long as it's less than the size of
1928*4882a593Smuzhiyun * two longs.
1929*4882a593Smuzhiyun */
1930*4882a593Smuzhiyun #define KVM_S390_MAX_BIT_DISTANCE (2 * sizeof(void *))
1931*4882a593Smuzhiyun /* for consistency */
1932*4882a593Smuzhiyun #define KVM_S390_CMMA_SIZE_MAX ((u32)KVM_S390_SKEYS_MAX)
1933*4882a593Smuzhiyun
1934*4882a593Smuzhiyun /*
1935*4882a593Smuzhiyun * Similar to gfn_to_memslot, but returns the index of a memslot also when the
1936*4882a593Smuzhiyun * address falls in a hole. In that case the index of one of the memslots
1937*4882a593Smuzhiyun * bordering the hole is returned.
1938*4882a593Smuzhiyun */
gfn_to_memslot_approx(struct kvm_memslots * slots,gfn_t gfn)1939*4882a593Smuzhiyun static int gfn_to_memslot_approx(struct kvm_memslots *slots, gfn_t gfn)
1940*4882a593Smuzhiyun {
1941*4882a593Smuzhiyun int start = 0, end = slots->used_slots;
1942*4882a593Smuzhiyun int slot = atomic_read(&slots->lru_slot);
1943*4882a593Smuzhiyun struct kvm_memory_slot *memslots = slots->memslots;
1944*4882a593Smuzhiyun
1945*4882a593Smuzhiyun if (gfn >= memslots[slot].base_gfn &&
1946*4882a593Smuzhiyun gfn < memslots[slot].base_gfn + memslots[slot].npages)
1947*4882a593Smuzhiyun return slot;
1948*4882a593Smuzhiyun
1949*4882a593Smuzhiyun while (start < end) {
1950*4882a593Smuzhiyun slot = start + (end - start) / 2;
1951*4882a593Smuzhiyun
1952*4882a593Smuzhiyun if (gfn >= memslots[slot].base_gfn)
1953*4882a593Smuzhiyun end = slot;
1954*4882a593Smuzhiyun else
1955*4882a593Smuzhiyun start = slot + 1;
1956*4882a593Smuzhiyun }
1957*4882a593Smuzhiyun
1958*4882a593Smuzhiyun if (start >= slots->used_slots)
1959*4882a593Smuzhiyun return slots->used_slots - 1;
1960*4882a593Smuzhiyun
1961*4882a593Smuzhiyun if (gfn >= memslots[start].base_gfn &&
1962*4882a593Smuzhiyun gfn < memslots[start].base_gfn + memslots[start].npages) {
1963*4882a593Smuzhiyun atomic_set(&slots->lru_slot, start);
1964*4882a593Smuzhiyun }
1965*4882a593Smuzhiyun
1966*4882a593Smuzhiyun return start;
1967*4882a593Smuzhiyun }
1968*4882a593Smuzhiyun
kvm_s390_peek_cmma(struct kvm * kvm,struct kvm_s390_cmma_log * args,u8 * res,unsigned long bufsize)1969*4882a593Smuzhiyun static int kvm_s390_peek_cmma(struct kvm *kvm, struct kvm_s390_cmma_log *args,
1970*4882a593Smuzhiyun u8 *res, unsigned long bufsize)
1971*4882a593Smuzhiyun {
1972*4882a593Smuzhiyun unsigned long pgstev, hva, cur_gfn = args->start_gfn;
1973*4882a593Smuzhiyun
1974*4882a593Smuzhiyun args->count = 0;
1975*4882a593Smuzhiyun while (args->count < bufsize) {
1976*4882a593Smuzhiyun hva = gfn_to_hva(kvm, cur_gfn);
1977*4882a593Smuzhiyun /*
1978*4882a593Smuzhiyun * We return an error if the first value was invalid, but we
1979*4882a593Smuzhiyun * return successfully if at least one value was copied.
1980*4882a593Smuzhiyun */
1981*4882a593Smuzhiyun if (kvm_is_error_hva(hva))
1982*4882a593Smuzhiyun return args->count ? 0 : -EFAULT;
1983*4882a593Smuzhiyun if (get_pgste(kvm->mm, hva, &pgstev) < 0)
1984*4882a593Smuzhiyun pgstev = 0;
1985*4882a593Smuzhiyun res[args->count++] = (pgstev >> 24) & 0x43;
1986*4882a593Smuzhiyun cur_gfn++;
1987*4882a593Smuzhiyun }
1988*4882a593Smuzhiyun
1989*4882a593Smuzhiyun return 0;
1990*4882a593Smuzhiyun }
1991*4882a593Smuzhiyun
kvm_s390_next_dirty_cmma(struct kvm_memslots * slots,unsigned long cur_gfn)1992*4882a593Smuzhiyun static unsigned long kvm_s390_next_dirty_cmma(struct kvm_memslots *slots,
1993*4882a593Smuzhiyun unsigned long cur_gfn)
1994*4882a593Smuzhiyun {
1995*4882a593Smuzhiyun int slotidx = gfn_to_memslot_approx(slots, cur_gfn);
1996*4882a593Smuzhiyun struct kvm_memory_slot *ms = slots->memslots + slotidx;
1997*4882a593Smuzhiyun unsigned long ofs = cur_gfn - ms->base_gfn;
1998*4882a593Smuzhiyun
1999*4882a593Smuzhiyun if (ms->base_gfn + ms->npages <= cur_gfn) {
2000*4882a593Smuzhiyun slotidx--;
2001*4882a593Smuzhiyun /* If we are above the highest slot, wrap around */
2002*4882a593Smuzhiyun if (slotidx < 0)
2003*4882a593Smuzhiyun slotidx = slots->used_slots - 1;
2004*4882a593Smuzhiyun
2005*4882a593Smuzhiyun ms = slots->memslots + slotidx;
2006*4882a593Smuzhiyun ofs = 0;
2007*4882a593Smuzhiyun }
2008*4882a593Smuzhiyun ofs = find_next_bit(kvm_second_dirty_bitmap(ms), ms->npages, ofs);
2009*4882a593Smuzhiyun while ((slotidx > 0) && (ofs >= ms->npages)) {
2010*4882a593Smuzhiyun slotidx--;
2011*4882a593Smuzhiyun ms = slots->memslots + slotidx;
2012*4882a593Smuzhiyun ofs = find_next_bit(kvm_second_dirty_bitmap(ms), ms->npages, 0);
2013*4882a593Smuzhiyun }
2014*4882a593Smuzhiyun return ms->base_gfn + ofs;
2015*4882a593Smuzhiyun }
2016*4882a593Smuzhiyun
kvm_s390_get_cmma(struct kvm * kvm,struct kvm_s390_cmma_log * args,u8 * res,unsigned long bufsize)2017*4882a593Smuzhiyun static int kvm_s390_get_cmma(struct kvm *kvm, struct kvm_s390_cmma_log *args,
2018*4882a593Smuzhiyun u8 *res, unsigned long bufsize)
2019*4882a593Smuzhiyun {
2020*4882a593Smuzhiyun unsigned long mem_end, cur_gfn, next_gfn, hva, pgstev;
2021*4882a593Smuzhiyun struct kvm_memslots *slots = kvm_memslots(kvm);
2022*4882a593Smuzhiyun struct kvm_memory_slot *ms;
2023*4882a593Smuzhiyun
2024*4882a593Smuzhiyun if (unlikely(!slots->used_slots))
2025*4882a593Smuzhiyun return 0;
2026*4882a593Smuzhiyun
2027*4882a593Smuzhiyun cur_gfn = kvm_s390_next_dirty_cmma(slots, args->start_gfn);
2028*4882a593Smuzhiyun ms = gfn_to_memslot(kvm, cur_gfn);
2029*4882a593Smuzhiyun args->count = 0;
2030*4882a593Smuzhiyun args->start_gfn = cur_gfn;
2031*4882a593Smuzhiyun if (!ms)
2032*4882a593Smuzhiyun return 0;
2033*4882a593Smuzhiyun next_gfn = kvm_s390_next_dirty_cmma(slots, cur_gfn + 1);
2034*4882a593Smuzhiyun mem_end = slots->memslots[0].base_gfn + slots->memslots[0].npages;
2035*4882a593Smuzhiyun
2036*4882a593Smuzhiyun while (args->count < bufsize) {
2037*4882a593Smuzhiyun hva = gfn_to_hva(kvm, cur_gfn);
2038*4882a593Smuzhiyun if (kvm_is_error_hva(hva))
2039*4882a593Smuzhiyun return 0;
2040*4882a593Smuzhiyun /* Decrement only if we actually flipped the bit to 0 */
2041*4882a593Smuzhiyun if (test_and_clear_bit(cur_gfn - ms->base_gfn, kvm_second_dirty_bitmap(ms)))
2042*4882a593Smuzhiyun atomic64_dec(&kvm->arch.cmma_dirty_pages);
2043*4882a593Smuzhiyun if (get_pgste(kvm->mm, hva, &pgstev) < 0)
2044*4882a593Smuzhiyun pgstev = 0;
2045*4882a593Smuzhiyun /* Save the value */
2046*4882a593Smuzhiyun res[args->count++] = (pgstev >> 24) & 0x43;
2047*4882a593Smuzhiyun /* If the next bit is too far away, stop. */
2048*4882a593Smuzhiyun if (next_gfn > cur_gfn + KVM_S390_MAX_BIT_DISTANCE)
2049*4882a593Smuzhiyun return 0;
2050*4882a593Smuzhiyun /* If we reached the previous "next", find the next one */
2051*4882a593Smuzhiyun if (cur_gfn == next_gfn)
2052*4882a593Smuzhiyun next_gfn = kvm_s390_next_dirty_cmma(slots, cur_gfn + 1);
2053*4882a593Smuzhiyun /* Reached the end of memory or of the buffer, stop */
2054*4882a593Smuzhiyun if ((next_gfn >= mem_end) ||
2055*4882a593Smuzhiyun (next_gfn - args->start_gfn >= bufsize))
2056*4882a593Smuzhiyun return 0;
2057*4882a593Smuzhiyun cur_gfn++;
2058*4882a593Smuzhiyun /* Reached the end of the current memslot, take the next one. */
2059*4882a593Smuzhiyun if (cur_gfn - ms->base_gfn >= ms->npages) {
2060*4882a593Smuzhiyun ms = gfn_to_memslot(kvm, cur_gfn);
2061*4882a593Smuzhiyun if (!ms)
2062*4882a593Smuzhiyun return 0;
2063*4882a593Smuzhiyun }
2064*4882a593Smuzhiyun }
2065*4882a593Smuzhiyun return 0;
2066*4882a593Smuzhiyun }
2067*4882a593Smuzhiyun
2068*4882a593Smuzhiyun /*
2069*4882a593Smuzhiyun * This function searches for the next page with dirty CMMA attributes, and
2070*4882a593Smuzhiyun * saves the attributes in the buffer up to either the end of the buffer or
2071*4882a593Smuzhiyun * until a block of at least KVM_S390_MAX_BIT_DISTANCE clean bits is found;
2072*4882a593Smuzhiyun * no trailing clean bytes are saved.
2073*4882a593Smuzhiyun * In case no dirty bits were found, or if CMMA was not enabled or used, the
2074*4882a593Smuzhiyun * output buffer will indicate 0 as length.
2075*4882a593Smuzhiyun */
kvm_s390_get_cmma_bits(struct kvm * kvm,struct kvm_s390_cmma_log * args)2076*4882a593Smuzhiyun static int kvm_s390_get_cmma_bits(struct kvm *kvm,
2077*4882a593Smuzhiyun struct kvm_s390_cmma_log *args)
2078*4882a593Smuzhiyun {
2079*4882a593Smuzhiyun unsigned long bufsize;
2080*4882a593Smuzhiyun int srcu_idx, peek, ret;
2081*4882a593Smuzhiyun u8 *values;
2082*4882a593Smuzhiyun
2083*4882a593Smuzhiyun if (!kvm->arch.use_cmma)
2084*4882a593Smuzhiyun return -ENXIO;
2085*4882a593Smuzhiyun /* Invalid/unsupported flags were specified */
2086*4882a593Smuzhiyun if (args->flags & ~KVM_S390_CMMA_PEEK)
2087*4882a593Smuzhiyun return -EINVAL;
2088*4882a593Smuzhiyun /* Migration mode query, and we are not doing a migration */
2089*4882a593Smuzhiyun peek = !!(args->flags & KVM_S390_CMMA_PEEK);
2090*4882a593Smuzhiyun if (!peek && !kvm->arch.migration_mode)
2091*4882a593Smuzhiyun return -EINVAL;
2092*4882a593Smuzhiyun /* CMMA is disabled or was not used, or the buffer has length zero */
2093*4882a593Smuzhiyun bufsize = min(args->count, KVM_S390_CMMA_SIZE_MAX);
2094*4882a593Smuzhiyun if (!bufsize || !kvm->mm->context.uses_cmm) {
2095*4882a593Smuzhiyun memset(args, 0, sizeof(*args));
2096*4882a593Smuzhiyun return 0;
2097*4882a593Smuzhiyun }
2098*4882a593Smuzhiyun /* We are not peeking, and there are no dirty pages */
2099*4882a593Smuzhiyun if (!peek && !atomic64_read(&kvm->arch.cmma_dirty_pages)) {
2100*4882a593Smuzhiyun memset(args, 0, sizeof(*args));
2101*4882a593Smuzhiyun return 0;
2102*4882a593Smuzhiyun }
2103*4882a593Smuzhiyun
2104*4882a593Smuzhiyun values = vmalloc(bufsize);
2105*4882a593Smuzhiyun if (!values)
2106*4882a593Smuzhiyun return -ENOMEM;
2107*4882a593Smuzhiyun
2108*4882a593Smuzhiyun mmap_read_lock(kvm->mm);
2109*4882a593Smuzhiyun srcu_idx = srcu_read_lock(&kvm->srcu);
2110*4882a593Smuzhiyun if (peek)
2111*4882a593Smuzhiyun ret = kvm_s390_peek_cmma(kvm, args, values, bufsize);
2112*4882a593Smuzhiyun else
2113*4882a593Smuzhiyun ret = kvm_s390_get_cmma(kvm, args, values, bufsize);
2114*4882a593Smuzhiyun srcu_read_unlock(&kvm->srcu, srcu_idx);
2115*4882a593Smuzhiyun mmap_read_unlock(kvm->mm);
2116*4882a593Smuzhiyun
2117*4882a593Smuzhiyun if (kvm->arch.migration_mode)
2118*4882a593Smuzhiyun args->remaining = atomic64_read(&kvm->arch.cmma_dirty_pages);
2119*4882a593Smuzhiyun else
2120*4882a593Smuzhiyun args->remaining = 0;
2121*4882a593Smuzhiyun
2122*4882a593Smuzhiyun if (copy_to_user((void __user *)args->values, values, args->count))
2123*4882a593Smuzhiyun ret = -EFAULT;
2124*4882a593Smuzhiyun
2125*4882a593Smuzhiyun vfree(values);
2126*4882a593Smuzhiyun return ret;
2127*4882a593Smuzhiyun }
2128*4882a593Smuzhiyun
2129*4882a593Smuzhiyun /*
2130*4882a593Smuzhiyun * This function sets the CMMA attributes for the given pages. If the input
2131*4882a593Smuzhiyun * buffer has zero length, no action is taken, otherwise the attributes are
2132*4882a593Smuzhiyun * set and the mm->context.uses_cmm flag is set.
2133*4882a593Smuzhiyun */
kvm_s390_set_cmma_bits(struct kvm * kvm,const struct kvm_s390_cmma_log * args)2134*4882a593Smuzhiyun static int kvm_s390_set_cmma_bits(struct kvm *kvm,
2135*4882a593Smuzhiyun const struct kvm_s390_cmma_log *args)
2136*4882a593Smuzhiyun {
2137*4882a593Smuzhiyun unsigned long hva, mask, pgstev, i;
2138*4882a593Smuzhiyun uint8_t *bits;
2139*4882a593Smuzhiyun int srcu_idx, r = 0;
2140*4882a593Smuzhiyun
2141*4882a593Smuzhiyun mask = args->mask;
2142*4882a593Smuzhiyun
2143*4882a593Smuzhiyun if (!kvm->arch.use_cmma)
2144*4882a593Smuzhiyun return -ENXIO;
2145*4882a593Smuzhiyun /* invalid/unsupported flags */
2146*4882a593Smuzhiyun if (args->flags != 0)
2147*4882a593Smuzhiyun return -EINVAL;
2148*4882a593Smuzhiyun /* Enforce sane limit on memory allocation */
2149*4882a593Smuzhiyun if (args->count > KVM_S390_CMMA_SIZE_MAX)
2150*4882a593Smuzhiyun return -EINVAL;
2151*4882a593Smuzhiyun /* Nothing to do */
2152*4882a593Smuzhiyun if (args->count == 0)
2153*4882a593Smuzhiyun return 0;
2154*4882a593Smuzhiyun
2155*4882a593Smuzhiyun bits = vmalloc(array_size(sizeof(*bits), args->count));
2156*4882a593Smuzhiyun if (!bits)
2157*4882a593Smuzhiyun return -ENOMEM;
2158*4882a593Smuzhiyun
2159*4882a593Smuzhiyun r = copy_from_user(bits, (void __user *)args->values, args->count);
2160*4882a593Smuzhiyun if (r) {
2161*4882a593Smuzhiyun r = -EFAULT;
2162*4882a593Smuzhiyun goto out;
2163*4882a593Smuzhiyun }
2164*4882a593Smuzhiyun
2165*4882a593Smuzhiyun mmap_read_lock(kvm->mm);
2166*4882a593Smuzhiyun srcu_idx = srcu_read_lock(&kvm->srcu);
2167*4882a593Smuzhiyun for (i = 0; i < args->count; i++) {
2168*4882a593Smuzhiyun hva = gfn_to_hva(kvm, args->start_gfn + i);
2169*4882a593Smuzhiyun if (kvm_is_error_hva(hva)) {
2170*4882a593Smuzhiyun r = -EFAULT;
2171*4882a593Smuzhiyun break;
2172*4882a593Smuzhiyun }
2173*4882a593Smuzhiyun
2174*4882a593Smuzhiyun pgstev = bits[i];
2175*4882a593Smuzhiyun pgstev = pgstev << 24;
2176*4882a593Smuzhiyun mask &= _PGSTE_GPS_USAGE_MASK | _PGSTE_GPS_NODAT;
2177*4882a593Smuzhiyun set_pgste_bits(kvm->mm, hva, mask, pgstev);
2178*4882a593Smuzhiyun }
2179*4882a593Smuzhiyun srcu_read_unlock(&kvm->srcu, srcu_idx);
2180*4882a593Smuzhiyun mmap_read_unlock(kvm->mm);
2181*4882a593Smuzhiyun
2182*4882a593Smuzhiyun if (!kvm->mm->context.uses_cmm) {
2183*4882a593Smuzhiyun mmap_write_lock(kvm->mm);
2184*4882a593Smuzhiyun kvm->mm->context.uses_cmm = 1;
2185*4882a593Smuzhiyun mmap_write_unlock(kvm->mm);
2186*4882a593Smuzhiyun }
2187*4882a593Smuzhiyun out:
2188*4882a593Smuzhiyun vfree(bits);
2189*4882a593Smuzhiyun return r;
2190*4882a593Smuzhiyun }
2191*4882a593Smuzhiyun
kvm_s390_cpus_from_pv(struct kvm * kvm,u16 * rcp,u16 * rrcp)2192*4882a593Smuzhiyun static int kvm_s390_cpus_from_pv(struct kvm *kvm, u16 *rcp, u16 *rrcp)
2193*4882a593Smuzhiyun {
2194*4882a593Smuzhiyun struct kvm_vcpu *vcpu;
2195*4882a593Smuzhiyun u16 rc, rrc;
2196*4882a593Smuzhiyun int ret = 0;
2197*4882a593Smuzhiyun int i;
2198*4882a593Smuzhiyun
2199*4882a593Smuzhiyun /*
2200*4882a593Smuzhiyun * We ignore failures and try to destroy as many CPUs as possible.
2201*4882a593Smuzhiyun * At the same time we must not free the assigned resources when
2202*4882a593Smuzhiyun * this fails, as the ultravisor has still access to that memory.
2203*4882a593Smuzhiyun * So kvm_s390_pv_destroy_cpu can leave a "wanted" memory leak
2204*4882a593Smuzhiyun * behind.
2205*4882a593Smuzhiyun * We want to return the first failure rc and rrc, though.
2206*4882a593Smuzhiyun */
2207*4882a593Smuzhiyun kvm_for_each_vcpu(i, vcpu, kvm) {
2208*4882a593Smuzhiyun mutex_lock(&vcpu->mutex);
2209*4882a593Smuzhiyun if (kvm_s390_pv_destroy_cpu(vcpu, &rc, &rrc) && !ret) {
2210*4882a593Smuzhiyun *rcp = rc;
2211*4882a593Smuzhiyun *rrcp = rrc;
2212*4882a593Smuzhiyun ret = -EIO;
2213*4882a593Smuzhiyun }
2214*4882a593Smuzhiyun mutex_unlock(&vcpu->mutex);
2215*4882a593Smuzhiyun }
2216*4882a593Smuzhiyun return ret;
2217*4882a593Smuzhiyun }
2218*4882a593Smuzhiyun
kvm_s390_cpus_to_pv(struct kvm * kvm,u16 * rc,u16 * rrc)2219*4882a593Smuzhiyun static int kvm_s390_cpus_to_pv(struct kvm *kvm, u16 *rc, u16 *rrc)
2220*4882a593Smuzhiyun {
2221*4882a593Smuzhiyun int i, r = 0;
2222*4882a593Smuzhiyun u16 dummy;
2223*4882a593Smuzhiyun
2224*4882a593Smuzhiyun struct kvm_vcpu *vcpu;
2225*4882a593Smuzhiyun
2226*4882a593Smuzhiyun kvm_for_each_vcpu(i, vcpu, kvm) {
2227*4882a593Smuzhiyun mutex_lock(&vcpu->mutex);
2228*4882a593Smuzhiyun r = kvm_s390_pv_create_cpu(vcpu, rc, rrc);
2229*4882a593Smuzhiyun mutex_unlock(&vcpu->mutex);
2230*4882a593Smuzhiyun if (r)
2231*4882a593Smuzhiyun break;
2232*4882a593Smuzhiyun }
2233*4882a593Smuzhiyun if (r)
2234*4882a593Smuzhiyun kvm_s390_cpus_from_pv(kvm, &dummy, &dummy);
2235*4882a593Smuzhiyun return r;
2236*4882a593Smuzhiyun }
2237*4882a593Smuzhiyun
kvm_s390_handle_pv(struct kvm * kvm,struct kvm_pv_cmd * cmd)2238*4882a593Smuzhiyun static int kvm_s390_handle_pv(struct kvm *kvm, struct kvm_pv_cmd *cmd)
2239*4882a593Smuzhiyun {
2240*4882a593Smuzhiyun int r = 0;
2241*4882a593Smuzhiyun u16 dummy;
2242*4882a593Smuzhiyun void __user *argp = (void __user *)cmd->data;
2243*4882a593Smuzhiyun
2244*4882a593Smuzhiyun switch (cmd->cmd) {
2245*4882a593Smuzhiyun case KVM_PV_ENABLE: {
2246*4882a593Smuzhiyun r = -EINVAL;
2247*4882a593Smuzhiyun if (kvm_s390_pv_is_protected(kvm))
2248*4882a593Smuzhiyun break;
2249*4882a593Smuzhiyun
2250*4882a593Smuzhiyun /*
2251*4882a593Smuzhiyun * FMT 4 SIE needs esca. As we never switch back to bsca from
2252*4882a593Smuzhiyun * esca, we need no cleanup in the error cases below
2253*4882a593Smuzhiyun */
2254*4882a593Smuzhiyun r = sca_switch_to_extended(kvm);
2255*4882a593Smuzhiyun if (r)
2256*4882a593Smuzhiyun break;
2257*4882a593Smuzhiyun
2258*4882a593Smuzhiyun mmap_write_lock(current->mm);
2259*4882a593Smuzhiyun r = gmap_mark_unmergeable();
2260*4882a593Smuzhiyun mmap_write_unlock(current->mm);
2261*4882a593Smuzhiyun if (r)
2262*4882a593Smuzhiyun break;
2263*4882a593Smuzhiyun
2264*4882a593Smuzhiyun r = kvm_s390_pv_init_vm(kvm, &cmd->rc, &cmd->rrc);
2265*4882a593Smuzhiyun if (r)
2266*4882a593Smuzhiyun break;
2267*4882a593Smuzhiyun
2268*4882a593Smuzhiyun r = kvm_s390_cpus_to_pv(kvm, &cmd->rc, &cmd->rrc);
2269*4882a593Smuzhiyun if (r)
2270*4882a593Smuzhiyun kvm_s390_pv_deinit_vm(kvm, &dummy, &dummy);
2271*4882a593Smuzhiyun
2272*4882a593Smuzhiyun /* we need to block service interrupts from now on */
2273*4882a593Smuzhiyun set_bit(IRQ_PEND_EXT_SERVICE, &kvm->arch.float_int.masked_irqs);
2274*4882a593Smuzhiyun break;
2275*4882a593Smuzhiyun }
2276*4882a593Smuzhiyun case KVM_PV_DISABLE: {
2277*4882a593Smuzhiyun r = -EINVAL;
2278*4882a593Smuzhiyun if (!kvm_s390_pv_is_protected(kvm))
2279*4882a593Smuzhiyun break;
2280*4882a593Smuzhiyun
2281*4882a593Smuzhiyun r = kvm_s390_cpus_from_pv(kvm, &cmd->rc, &cmd->rrc);
2282*4882a593Smuzhiyun /*
2283*4882a593Smuzhiyun * If a CPU could not be destroyed, destroy VM will also fail.
2284*4882a593Smuzhiyun * There is no point in trying to destroy it. Instead return
2285*4882a593Smuzhiyun * the rc and rrc from the first CPU that failed destroying.
2286*4882a593Smuzhiyun */
2287*4882a593Smuzhiyun if (r)
2288*4882a593Smuzhiyun break;
2289*4882a593Smuzhiyun r = kvm_s390_pv_deinit_vm(kvm, &cmd->rc, &cmd->rrc);
2290*4882a593Smuzhiyun
2291*4882a593Smuzhiyun /* no need to block service interrupts any more */
2292*4882a593Smuzhiyun clear_bit(IRQ_PEND_EXT_SERVICE, &kvm->arch.float_int.masked_irqs);
2293*4882a593Smuzhiyun break;
2294*4882a593Smuzhiyun }
2295*4882a593Smuzhiyun case KVM_PV_SET_SEC_PARMS: {
2296*4882a593Smuzhiyun struct kvm_s390_pv_sec_parm parms = {};
2297*4882a593Smuzhiyun void *hdr;
2298*4882a593Smuzhiyun
2299*4882a593Smuzhiyun r = -EINVAL;
2300*4882a593Smuzhiyun if (!kvm_s390_pv_is_protected(kvm))
2301*4882a593Smuzhiyun break;
2302*4882a593Smuzhiyun
2303*4882a593Smuzhiyun r = -EFAULT;
2304*4882a593Smuzhiyun if (copy_from_user(&parms, argp, sizeof(parms)))
2305*4882a593Smuzhiyun break;
2306*4882a593Smuzhiyun
2307*4882a593Smuzhiyun /* Currently restricted to 8KB */
2308*4882a593Smuzhiyun r = -EINVAL;
2309*4882a593Smuzhiyun if (parms.length > PAGE_SIZE * 2)
2310*4882a593Smuzhiyun break;
2311*4882a593Smuzhiyun
2312*4882a593Smuzhiyun r = -ENOMEM;
2313*4882a593Smuzhiyun hdr = vmalloc(parms.length);
2314*4882a593Smuzhiyun if (!hdr)
2315*4882a593Smuzhiyun break;
2316*4882a593Smuzhiyun
2317*4882a593Smuzhiyun r = -EFAULT;
2318*4882a593Smuzhiyun if (!copy_from_user(hdr, (void __user *)parms.origin,
2319*4882a593Smuzhiyun parms.length))
2320*4882a593Smuzhiyun r = kvm_s390_pv_set_sec_parms(kvm, hdr, parms.length,
2321*4882a593Smuzhiyun &cmd->rc, &cmd->rrc);
2322*4882a593Smuzhiyun
2323*4882a593Smuzhiyun vfree(hdr);
2324*4882a593Smuzhiyun break;
2325*4882a593Smuzhiyun }
2326*4882a593Smuzhiyun case KVM_PV_UNPACK: {
2327*4882a593Smuzhiyun struct kvm_s390_pv_unp unp = {};
2328*4882a593Smuzhiyun
2329*4882a593Smuzhiyun r = -EINVAL;
2330*4882a593Smuzhiyun if (!kvm_s390_pv_is_protected(kvm) || !mm_is_protected(kvm->mm))
2331*4882a593Smuzhiyun break;
2332*4882a593Smuzhiyun
2333*4882a593Smuzhiyun r = -EFAULT;
2334*4882a593Smuzhiyun if (copy_from_user(&unp, argp, sizeof(unp)))
2335*4882a593Smuzhiyun break;
2336*4882a593Smuzhiyun
2337*4882a593Smuzhiyun r = kvm_s390_pv_unpack(kvm, unp.addr, unp.size, unp.tweak,
2338*4882a593Smuzhiyun &cmd->rc, &cmd->rrc);
2339*4882a593Smuzhiyun break;
2340*4882a593Smuzhiyun }
2341*4882a593Smuzhiyun case KVM_PV_VERIFY: {
2342*4882a593Smuzhiyun r = -EINVAL;
2343*4882a593Smuzhiyun if (!kvm_s390_pv_is_protected(kvm))
2344*4882a593Smuzhiyun break;
2345*4882a593Smuzhiyun
2346*4882a593Smuzhiyun r = uv_cmd_nodata(kvm_s390_pv_get_handle(kvm),
2347*4882a593Smuzhiyun UVC_CMD_VERIFY_IMG, &cmd->rc, &cmd->rrc);
2348*4882a593Smuzhiyun KVM_UV_EVENT(kvm, 3, "PROTVIRT VERIFY: rc %x rrc %x", cmd->rc,
2349*4882a593Smuzhiyun cmd->rrc);
2350*4882a593Smuzhiyun break;
2351*4882a593Smuzhiyun }
2352*4882a593Smuzhiyun case KVM_PV_PREP_RESET: {
2353*4882a593Smuzhiyun r = -EINVAL;
2354*4882a593Smuzhiyun if (!kvm_s390_pv_is_protected(kvm))
2355*4882a593Smuzhiyun break;
2356*4882a593Smuzhiyun
2357*4882a593Smuzhiyun r = uv_cmd_nodata(kvm_s390_pv_get_handle(kvm),
2358*4882a593Smuzhiyun UVC_CMD_PREPARE_RESET, &cmd->rc, &cmd->rrc);
2359*4882a593Smuzhiyun KVM_UV_EVENT(kvm, 3, "PROTVIRT PREP RESET: rc %x rrc %x",
2360*4882a593Smuzhiyun cmd->rc, cmd->rrc);
2361*4882a593Smuzhiyun break;
2362*4882a593Smuzhiyun }
2363*4882a593Smuzhiyun case KVM_PV_UNSHARE_ALL: {
2364*4882a593Smuzhiyun r = -EINVAL;
2365*4882a593Smuzhiyun if (!kvm_s390_pv_is_protected(kvm))
2366*4882a593Smuzhiyun break;
2367*4882a593Smuzhiyun
2368*4882a593Smuzhiyun r = uv_cmd_nodata(kvm_s390_pv_get_handle(kvm),
2369*4882a593Smuzhiyun UVC_CMD_SET_UNSHARE_ALL, &cmd->rc, &cmd->rrc);
2370*4882a593Smuzhiyun KVM_UV_EVENT(kvm, 3, "PROTVIRT UNSHARE: rc %x rrc %x",
2371*4882a593Smuzhiyun cmd->rc, cmd->rrc);
2372*4882a593Smuzhiyun break;
2373*4882a593Smuzhiyun }
2374*4882a593Smuzhiyun default:
2375*4882a593Smuzhiyun r = -ENOTTY;
2376*4882a593Smuzhiyun }
2377*4882a593Smuzhiyun return r;
2378*4882a593Smuzhiyun }
2379*4882a593Smuzhiyun
kvm_arch_vm_ioctl(struct file * filp,unsigned int ioctl,unsigned long arg)2380*4882a593Smuzhiyun long kvm_arch_vm_ioctl(struct file *filp,
2381*4882a593Smuzhiyun unsigned int ioctl, unsigned long arg)
2382*4882a593Smuzhiyun {
2383*4882a593Smuzhiyun struct kvm *kvm = filp->private_data;
2384*4882a593Smuzhiyun void __user *argp = (void __user *)arg;
2385*4882a593Smuzhiyun struct kvm_device_attr attr;
2386*4882a593Smuzhiyun int r;
2387*4882a593Smuzhiyun
2388*4882a593Smuzhiyun switch (ioctl) {
2389*4882a593Smuzhiyun case KVM_S390_INTERRUPT: {
2390*4882a593Smuzhiyun struct kvm_s390_interrupt s390int;
2391*4882a593Smuzhiyun
2392*4882a593Smuzhiyun r = -EFAULT;
2393*4882a593Smuzhiyun if (copy_from_user(&s390int, argp, sizeof(s390int)))
2394*4882a593Smuzhiyun break;
2395*4882a593Smuzhiyun r = kvm_s390_inject_vm(kvm, &s390int);
2396*4882a593Smuzhiyun break;
2397*4882a593Smuzhiyun }
2398*4882a593Smuzhiyun case KVM_CREATE_IRQCHIP: {
2399*4882a593Smuzhiyun struct kvm_irq_routing_entry routing;
2400*4882a593Smuzhiyun
2401*4882a593Smuzhiyun r = -EINVAL;
2402*4882a593Smuzhiyun if (kvm->arch.use_irqchip) {
2403*4882a593Smuzhiyun /* Set up dummy routing. */
2404*4882a593Smuzhiyun memset(&routing, 0, sizeof(routing));
2405*4882a593Smuzhiyun r = kvm_set_irq_routing(kvm, &routing, 0, 0);
2406*4882a593Smuzhiyun }
2407*4882a593Smuzhiyun break;
2408*4882a593Smuzhiyun }
2409*4882a593Smuzhiyun case KVM_SET_DEVICE_ATTR: {
2410*4882a593Smuzhiyun r = -EFAULT;
2411*4882a593Smuzhiyun if (copy_from_user(&attr, (void __user *)arg, sizeof(attr)))
2412*4882a593Smuzhiyun break;
2413*4882a593Smuzhiyun r = kvm_s390_vm_set_attr(kvm, &attr);
2414*4882a593Smuzhiyun break;
2415*4882a593Smuzhiyun }
2416*4882a593Smuzhiyun case KVM_GET_DEVICE_ATTR: {
2417*4882a593Smuzhiyun r = -EFAULT;
2418*4882a593Smuzhiyun if (copy_from_user(&attr, (void __user *)arg, sizeof(attr)))
2419*4882a593Smuzhiyun break;
2420*4882a593Smuzhiyun r = kvm_s390_vm_get_attr(kvm, &attr);
2421*4882a593Smuzhiyun break;
2422*4882a593Smuzhiyun }
2423*4882a593Smuzhiyun case KVM_HAS_DEVICE_ATTR: {
2424*4882a593Smuzhiyun r = -EFAULT;
2425*4882a593Smuzhiyun if (copy_from_user(&attr, (void __user *)arg, sizeof(attr)))
2426*4882a593Smuzhiyun break;
2427*4882a593Smuzhiyun r = kvm_s390_vm_has_attr(kvm, &attr);
2428*4882a593Smuzhiyun break;
2429*4882a593Smuzhiyun }
2430*4882a593Smuzhiyun case KVM_S390_GET_SKEYS: {
2431*4882a593Smuzhiyun struct kvm_s390_skeys args;
2432*4882a593Smuzhiyun
2433*4882a593Smuzhiyun r = -EFAULT;
2434*4882a593Smuzhiyun if (copy_from_user(&args, argp,
2435*4882a593Smuzhiyun sizeof(struct kvm_s390_skeys)))
2436*4882a593Smuzhiyun break;
2437*4882a593Smuzhiyun r = kvm_s390_get_skeys(kvm, &args);
2438*4882a593Smuzhiyun break;
2439*4882a593Smuzhiyun }
2440*4882a593Smuzhiyun case KVM_S390_SET_SKEYS: {
2441*4882a593Smuzhiyun struct kvm_s390_skeys args;
2442*4882a593Smuzhiyun
2443*4882a593Smuzhiyun r = -EFAULT;
2444*4882a593Smuzhiyun if (copy_from_user(&args, argp,
2445*4882a593Smuzhiyun sizeof(struct kvm_s390_skeys)))
2446*4882a593Smuzhiyun break;
2447*4882a593Smuzhiyun r = kvm_s390_set_skeys(kvm, &args);
2448*4882a593Smuzhiyun break;
2449*4882a593Smuzhiyun }
2450*4882a593Smuzhiyun case KVM_S390_GET_CMMA_BITS: {
2451*4882a593Smuzhiyun struct kvm_s390_cmma_log args;
2452*4882a593Smuzhiyun
2453*4882a593Smuzhiyun r = -EFAULT;
2454*4882a593Smuzhiyun if (copy_from_user(&args, argp, sizeof(args)))
2455*4882a593Smuzhiyun break;
2456*4882a593Smuzhiyun mutex_lock(&kvm->slots_lock);
2457*4882a593Smuzhiyun r = kvm_s390_get_cmma_bits(kvm, &args);
2458*4882a593Smuzhiyun mutex_unlock(&kvm->slots_lock);
2459*4882a593Smuzhiyun if (!r) {
2460*4882a593Smuzhiyun r = copy_to_user(argp, &args, sizeof(args));
2461*4882a593Smuzhiyun if (r)
2462*4882a593Smuzhiyun r = -EFAULT;
2463*4882a593Smuzhiyun }
2464*4882a593Smuzhiyun break;
2465*4882a593Smuzhiyun }
2466*4882a593Smuzhiyun case KVM_S390_SET_CMMA_BITS: {
2467*4882a593Smuzhiyun struct kvm_s390_cmma_log args;
2468*4882a593Smuzhiyun
2469*4882a593Smuzhiyun r = -EFAULT;
2470*4882a593Smuzhiyun if (copy_from_user(&args, argp, sizeof(args)))
2471*4882a593Smuzhiyun break;
2472*4882a593Smuzhiyun mutex_lock(&kvm->slots_lock);
2473*4882a593Smuzhiyun r = kvm_s390_set_cmma_bits(kvm, &args);
2474*4882a593Smuzhiyun mutex_unlock(&kvm->slots_lock);
2475*4882a593Smuzhiyun break;
2476*4882a593Smuzhiyun }
2477*4882a593Smuzhiyun case KVM_S390_PV_COMMAND: {
2478*4882a593Smuzhiyun struct kvm_pv_cmd args;
2479*4882a593Smuzhiyun
2480*4882a593Smuzhiyun /* protvirt means user sigp */
2481*4882a593Smuzhiyun kvm->arch.user_cpu_state_ctrl = 1;
2482*4882a593Smuzhiyun r = 0;
2483*4882a593Smuzhiyun if (!is_prot_virt_host()) {
2484*4882a593Smuzhiyun r = -EINVAL;
2485*4882a593Smuzhiyun break;
2486*4882a593Smuzhiyun }
2487*4882a593Smuzhiyun if (copy_from_user(&args, argp, sizeof(args))) {
2488*4882a593Smuzhiyun r = -EFAULT;
2489*4882a593Smuzhiyun break;
2490*4882a593Smuzhiyun }
2491*4882a593Smuzhiyun if (args.flags) {
2492*4882a593Smuzhiyun r = -EINVAL;
2493*4882a593Smuzhiyun break;
2494*4882a593Smuzhiyun }
2495*4882a593Smuzhiyun mutex_lock(&kvm->lock);
2496*4882a593Smuzhiyun r = kvm_s390_handle_pv(kvm, &args);
2497*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
2498*4882a593Smuzhiyun if (copy_to_user(argp, &args, sizeof(args))) {
2499*4882a593Smuzhiyun r = -EFAULT;
2500*4882a593Smuzhiyun break;
2501*4882a593Smuzhiyun }
2502*4882a593Smuzhiyun break;
2503*4882a593Smuzhiyun }
2504*4882a593Smuzhiyun default:
2505*4882a593Smuzhiyun r = -ENOTTY;
2506*4882a593Smuzhiyun }
2507*4882a593Smuzhiyun
2508*4882a593Smuzhiyun return r;
2509*4882a593Smuzhiyun }
2510*4882a593Smuzhiyun
kvm_s390_apxa_installed(void)2511*4882a593Smuzhiyun static int kvm_s390_apxa_installed(void)
2512*4882a593Smuzhiyun {
2513*4882a593Smuzhiyun struct ap_config_info info;
2514*4882a593Smuzhiyun
2515*4882a593Smuzhiyun if (ap_instructions_available()) {
2516*4882a593Smuzhiyun if (ap_qci(&info) == 0)
2517*4882a593Smuzhiyun return info.apxa;
2518*4882a593Smuzhiyun }
2519*4882a593Smuzhiyun
2520*4882a593Smuzhiyun return 0;
2521*4882a593Smuzhiyun }
2522*4882a593Smuzhiyun
2523*4882a593Smuzhiyun /*
2524*4882a593Smuzhiyun * The format of the crypto control block (CRYCB) is specified in the 3 low
2525*4882a593Smuzhiyun * order bits of the CRYCB designation (CRYCBD) field as follows:
2526*4882a593Smuzhiyun * Format 0: Neither the message security assist extension 3 (MSAX3) nor the
2527*4882a593Smuzhiyun * AP extended addressing (APXA) facility are installed.
2528*4882a593Smuzhiyun * Format 1: The APXA facility is not installed but the MSAX3 facility is.
2529*4882a593Smuzhiyun * Format 2: Both the APXA and MSAX3 facilities are installed
2530*4882a593Smuzhiyun */
kvm_s390_set_crycb_format(struct kvm * kvm)2531*4882a593Smuzhiyun static void kvm_s390_set_crycb_format(struct kvm *kvm)
2532*4882a593Smuzhiyun {
2533*4882a593Smuzhiyun kvm->arch.crypto.crycbd = (__u32)(unsigned long) kvm->arch.crypto.crycb;
2534*4882a593Smuzhiyun
2535*4882a593Smuzhiyun /* Clear the CRYCB format bits - i.e., set format 0 by default */
2536*4882a593Smuzhiyun kvm->arch.crypto.crycbd &= ~(CRYCB_FORMAT_MASK);
2537*4882a593Smuzhiyun
2538*4882a593Smuzhiyun /* Check whether MSAX3 is installed */
2539*4882a593Smuzhiyun if (!test_kvm_facility(kvm, 76))
2540*4882a593Smuzhiyun return;
2541*4882a593Smuzhiyun
2542*4882a593Smuzhiyun if (kvm_s390_apxa_installed())
2543*4882a593Smuzhiyun kvm->arch.crypto.crycbd |= CRYCB_FORMAT2;
2544*4882a593Smuzhiyun else
2545*4882a593Smuzhiyun kvm->arch.crypto.crycbd |= CRYCB_FORMAT1;
2546*4882a593Smuzhiyun }
2547*4882a593Smuzhiyun
kvm_arch_crypto_set_masks(struct kvm * kvm,unsigned long * apm,unsigned long * aqm,unsigned long * adm)2548*4882a593Smuzhiyun void kvm_arch_crypto_set_masks(struct kvm *kvm, unsigned long *apm,
2549*4882a593Smuzhiyun unsigned long *aqm, unsigned long *adm)
2550*4882a593Smuzhiyun {
2551*4882a593Smuzhiyun struct kvm_s390_crypto_cb *crycb = kvm->arch.crypto.crycb;
2552*4882a593Smuzhiyun
2553*4882a593Smuzhiyun mutex_lock(&kvm->lock);
2554*4882a593Smuzhiyun kvm_s390_vcpu_block_all(kvm);
2555*4882a593Smuzhiyun
2556*4882a593Smuzhiyun switch (kvm->arch.crypto.crycbd & CRYCB_FORMAT_MASK) {
2557*4882a593Smuzhiyun case CRYCB_FORMAT2: /* APCB1 use 256 bits */
2558*4882a593Smuzhiyun memcpy(crycb->apcb1.apm, apm, 32);
2559*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET CRYCB: apm %016lx %016lx %016lx %016lx",
2560*4882a593Smuzhiyun apm[0], apm[1], apm[2], apm[3]);
2561*4882a593Smuzhiyun memcpy(crycb->apcb1.aqm, aqm, 32);
2562*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET CRYCB: aqm %016lx %016lx %016lx %016lx",
2563*4882a593Smuzhiyun aqm[0], aqm[1], aqm[2], aqm[3]);
2564*4882a593Smuzhiyun memcpy(crycb->apcb1.adm, adm, 32);
2565*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET CRYCB: adm %016lx %016lx %016lx %016lx",
2566*4882a593Smuzhiyun adm[0], adm[1], adm[2], adm[3]);
2567*4882a593Smuzhiyun break;
2568*4882a593Smuzhiyun case CRYCB_FORMAT1:
2569*4882a593Smuzhiyun case CRYCB_FORMAT0: /* Fall through both use APCB0 */
2570*4882a593Smuzhiyun memcpy(crycb->apcb0.apm, apm, 8);
2571*4882a593Smuzhiyun memcpy(crycb->apcb0.aqm, aqm, 2);
2572*4882a593Smuzhiyun memcpy(crycb->apcb0.adm, adm, 2);
2573*4882a593Smuzhiyun VM_EVENT(kvm, 3, "SET CRYCB: apm %016lx aqm %04x adm %04x",
2574*4882a593Smuzhiyun apm[0], *((unsigned short *)aqm),
2575*4882a593Smuzhiyun *((unsigned short *)adm));
2576*4882a593Smuzhiyun break;
2577*4882a593Smuzhiyun default: /* Can not happen */
2578*4882a593Smuzhiyun break;
2579*4882a593Smuzhiyun }
2580*4882a593Smuzhiyun
2581*4882a593Smuzhiyun /* recreate the shadow crycb for each vcpu */
2582*4882a593Smuzhiyun kvm_s390_sync_request_broadcast(kvm, KVM_REQ_VSIE_RESTART);
2583*4882a593Smuzhiyun kvm_s390_vcpu_unblock_all(kvm);
2584*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
2585*4882a593Smuzhiyun }
2586*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(kvm_arch_crypto_set_masks);
2587*4882a593Smuzhiyun
kvm_arch_crypto_clear_masks(struct kvm * kvm)2588*4882a593Smuzhiyun void kvm_arch_crypto_clear_masks(struct kvm *kvm)
2589*4882a593Smuzhiyun {
2590*4882a593Smuzhiyun mutex_lock(&kvm->lock);
2591*4882a593Smuzhiyun kvm_s390_vcpu_block_all(kvm);
2592*4882a593Smuzhiyun
2593*4882a593Smuzhiyun memset(&kvm->arch.crypto.crycb->apcb0, 0,
2594*4882a593Smuzhiyun sizeof(kvm->arch.crypto.crycb->apcb0));
2595*4882a593Smuzhiyun memset(&kvm->arch.crypto.crycb->apcb1, 0,
2596*4882a593Smuzhiyun sizeof(kvm->arch.crypto.crycb->apcb1));
2597*4882a593Smuzhiyun
2598*4882a593Smuzhiyun VM_EVENT(kvm, 3, "%s", "CLR CRYCB:");
2599*4882a593Smuzhiyun /* recreate the shadow crycb for each vcpu */
2600*4882a593Smuzhiyun kvm_s390_sync_request_broadcast(kvm, KVM_REQ_VSIE_RESTART);
2601*4882a593Smuzhiyun kvm_s390_vcpu_unblock_all(kvm);
2602*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
2603*4882a593Smuzhiyun }
2604*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(kvm_arch_crypto_clear_masks);
2605*4882a593Smuzhiyun
kvm_s390_get_initial_cpuid(void)2606*4882a593Smuzhiyun static u64 kvm_s390_get_initial_cpuid(void)
2607*4882a593Smuzhiyun {
2608*4882a593Smuzhiyun struct cpuid cpuid;
2609*4882a593Smuzhiyun
2610*4882a593Smuzhiyun get_cpu_id(&cpuid);
2611*4882a593Smuzhiyun cpuid.version = 0xff;
2612*4882a593Smuzhiyun return *((u64 *) &cpuid);
2613*4882a593Smuzhiyun }
2614*4882a593Smuzhiyun
kvm_s390_crypto_init(struct kvm * kvm)2615*4882a593Smuzhiyun static void kvm_s390_crypto_init(struct kvm *kvm)
2616*4882a593Smuzhiyun {
2617*4882a593Smuzhiyun kvm->arch.crypto.crycb = &kvm->arch.sie_page2->crycb;
2618*4882a593Smuzhiyun kvm_s390_set_crycb_format(kvm);
2619*4882a593Smuzhiyun
2620*4882a593Smuzhiyun if (!test_kvm_facility(kvm, 76))
2621*4882a593Smuzhiyun return;
2622*4882a593Smuzhiyun
2623*4882a593Smuzhiyun /* Enable AES/DEA protected key functions by default */
2624*4882a593Smuzhiyun kvm->arch.crypto.aes_kw = 1;
2625*4882a593Smuzhiyun kvm->arch.crypto.dea_kw = 1;
2626*4882a593Smuzhiyun get_random_bytes(kvm->arch.crypto.crycb->aes_wrapping_key_mask,
2627*4882a593Smuzhiyun sizeof(kvm->arch.crypto.crycb->aes_wrapping_key_mask));
2628*4882a593Smuzhiyun get_random_bytes(kvm->arch.crypto.crycb->dea_wrapping_key_mask,
2629*4882a593Smuzhiyun sizeof(kvm->arch.crypto.crycb->dea_wrapping_key_mask));
2630*4882a593Smuzhiyun }
2631*4882a593Smuzhiyun
sca_dispose(struct kvm * kvm)2632*4882a593Smuzhiyun static void sca_dispose(struct kvm *kvm)
2633*4882a593Smuzhiyun {
2634*4882a593Smuzhiyun if (kvm->arch.use_esca)
2635*4882a593Smuzhiyun free_pages_exact(kvm->arch.sca, sizeof(struct esca_block));
2636*4882a593Smuzhiyun else
2637*4882a593Smuzhiyun free_page((unsigned long)(kvm->arch.sca));
2638*4882a593Smuzhiyun kvm->arch.sca = NULL;
2639*4882a593Smuzhiyun }
2640*4882a593Smuzhiyun
kvm_arch_init_vm(struct kvm * kvm,unsigned long type)2641*4882a593Smuzhiyun int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
2642*4882a593Smuzhiyun {
2643*4882a593Smuzhiyun gfp_t alloc_flags = GFP_KERNEL;
2644*4882a593Smuzhiyun int i, rc;
2645*4882a593Smuzhiyun char debug_name[16];
2646*4882a593Smuzhiyun static unsigned long sca_offset;
2647*4882a593Smuzhiyun
2648*4882a593Smuzhiyun rc = -EINVAL;
2649*4882a593Smuzhiyun #ifdef CONFIG_KVM_S390_UCONTROL
2650*4882a593Smuzhiyun if (type & ~KVM_VM_S390_UCONTROL)
2651*4882a593Smuzhiyun goto out_err;
2652*4882a593Smuzhiyun if ((type & KVM_VM_S390_UCONTROL) && (!capable(CAP_SYS_ADMIN)))
2653*4882a593Smuzhiyun goto out_err;
2654*4882a593Smuzhiyun #else
2655*4882a593Smuzhiyun if (type)
2656*4882a593Smuzhiyun goto out_err;
2657*4882a593Smuzhiyun #endif
2658*4882a593Smuzhiyun
2659*4882a593Smuzhiyun rc = s390_enable_sie();
2660*4882a593Smuzhiyun if (rc)
2661*4882a593Smuzhiyun goto out_err;
2662*4882a593Smuzhiyun
2663*4882a593Smuzhiyun rc = -ENOMEM;
2664*4882a593Smuzhiyun
2665*4882a593Smuzhiyun if (!sclp.has_64bscao)
2666*4882a593Smuzhiyun alloc_flags |= GFP_DMA;
2667*4882a593Smuzhiyun rwlock_init(&kvm->arch.sca_lock);
2668*4882a593Smuzhiyun /* start with basic SCA */
2669*4882a593Smuzhiyun kvm->arch.sca = (struct bsca_block *) get_zeroed_page(alloc_flags);
2670*4882a593Smuzhiyun if (!kvm->arch.sca)
2671*4882a593Smuzhiyun goto out_err;
2672*4882a593Smuzhiyun mutex_lock(&kvm_lock);
2673*4882a593Smuzhiyun sca_offset += 16;
2674*4882a593Smuzhiyun if (sca_offset + sizeof(struct bsca_block) > PAGE_SIZE)
2675*4882a593Smuzhiyun sca_offset = 0;
2676*4882a593Smuzhiyun kvm->arch.sca = (struct bsca_block *)
2677*4882a593Smuzhiyun ((char *) kvm->arch.sca + sca_offset);
2678*4882a593Smuzhiyun mutex_unlock(&kvm_lock);
2679*4882a593Smuzhiyun
2680*4882a593Smuzhiyun sprintf(debug_name, "kvm-%u", current->pid);
2681*4882a593Smuzhiyun
2682*4882a593Smuzhiyun kvm->arch.dbf = debug_register(debug_name, 32, 1, 7 * sizeof(long));
2683*4882a593Smuzhiyun if (!kvm->arch.dbf)
2684*4882a593Smuzhiyun goto out_err;
2685*4882a593Smuzhiyun
2686*4882a593Smuzhiyun BUILD_BUG_ON(sizeof(struct sie_page2) != 4096);
2687*4882a593Smuzhiyun kvm->arch.sie_page2 =
2688*4882a593Smuzhiyun (struct sie_page2 *) get_zeroed_page(GFP_KERNEL | GFP_DMA);
2689*4882a593Smuzhiyun if (!kvm->arch.sie_page2)
2690*4882a593Smuzhiyun goto out_err;
2691*4882a593Smuzhiyun
2692*4882a593Smuzhiyun kvm->arch.sie_page2->kvm = kvm;
2693*4882a593Smuzhiyun kvm->arch.model.fac_list = kvm->arch.sie_page2->fac_list;
2694*4882a593Smuzhiyun
2695*4882a593Smuzhiyun for (i = 0; i < kvm_s390_fac_size(); i++) {
2696*4882a593Smuzhiyun kvm->arch.model.fac_mask[i] = S390_lowcore.stfle_fac_list[i] &
2697*4882a593Smuzhiyun (kvm_s390_fac_base[i] |
2698*4882a593Smuzhiyun kvm_s390_fac_ext[i]);
2699*4882a593Smuzhiyun kvm->arch.model.fac_list[i] = S390_lowcore.stfle_fac_list[i] &
2700*4882a593Smuzhiyun kvm_s390_fac_base[i];
2701*4882a593Smuzhiyun }
2702*4882a593Smuzhiyun kvm->arch.model.subfuncs = kvm_s390_available_subfunc;
2703*4882a593Smuzhiyun
2704*4882a593Smuzhiyun /* we are always in czam mode - even on pre z14 machines */
2705*4882a593Smuzhiyun set_kvm_facility(kvm->arch.model.fac_mask, 138);
2706*4882a593Smuzhiyun set_kvm_facility(kvm->arch.model.fac_list, 138);
2707*4882a593Smuzhiyun /* we emulate STHYI in kvm */
2708*4882a593Smuzhiyun set_kvm_facility(kvm->arch.model.fac_mask, 74);
2709*4882a593Smuzhiyun set_kvm_facility(kvm->arch.model.fac_list, 74);
2710*4882a593Smuzhiyun if (MACHINE_HAS_TLB_GUEST) {
2711*4882a593Smuzhiyun set_kvm_facility(kvm->arch.model.fac_mask, 147);
2712*4882a593Smuzhiyun set_kvm_facility(kvm->arch.model.fac_list, 147);
2713*4882a593Smuzhiyun }
2714*4882a593Smuzhiyun
2715*4882a593Smuzhiyun if (css_general_characteristics.aiv && test_facility(65))
2716*4882a593Smuzhiyun set_kvm_facility(kvm->arch.model.fac_mask, 65);
2717*4882a593Smuzhiyun
2718*4882a593Smuzhiyun kvm->arch.model.cpuid = kvm_s390_get_initial_cpuid();
2719*4882a593Smuzhiyun kvm->arch.model.ibc = sclp.ibc & 0x0fff;
2720*4882a593Smuzhiyun
2721*4882a593Smuzhiyun kvm_s390_crypto_init(kvm);
2722*4882a593Smuzhiyun
2723*4882a593Smuzhiyun mutex_init(&kvm->arch.float_int.ais_lock);
2724*4882a593Smuzhiyun spin_lock_init(&kvm->arch.float_int.lock);
2725*4882a593Smuzhiyun for (i = 0; i < FIRQ_LIST_COUNT; i++)
2726*4882a593Smuzhiyun INIT_LIST_HEAD(&kvm->arch.float_int.lists[i]);
2727*4882a593Smuzhiyun init_waitqueue_head(&kvm->arch.ipte_wq);
2728*4882a593Smuzhiyun mutex_init(&kvm->arch.ipte_mutex);
2729*4882a593Smuzhiyun
2730*4882a593Smuzhiyun debug_register_view(kvm->arch.dbf, &debug_sprintf_view);
2731*4882a593Smuzhiyun VM_EVENT(kvm, 3, "vm created with type %lu", type);
2732*4882a593Smuzhiyun
2733*4882a593Smuzhiyun if (type & KVM_VM_S390_UCONTROL) {
2734*4882a593Smuzhiyun kvm->arch.gmap = NULL;
2735*4882a593Smuzhiyun kvm->arch.mem_limit = KVM_S390_NO_MEM_LIMIT;
2736*4882a593Smuzhiyun } else {
2737*4882a593Smuzhiyun if (sclp.hamax == U64_MAX)
2738*4882a593Smuzhiyun kvm->arch.mem_limit = TASK_SIZE_MAX;
2739*4882a593Smuzhiyun else
2740*4882a593Smuzhiyun kvm->arch.mem_limit = min_t(unsigned long, TASK_SIZE_MAX,
2741*4882a593Smuzhiyun sclp.hamax + 1);
2742*4882a593Smuzhiyun kvm->arch.gmap = gmap_create(current->mm, kvm->arch.mem_limit - 1);
2743*4882a593Smuzhiyun if (!kvm->arch.gmap)
2744*4882a593Smuzhiyun goto out_err;
2745*4882a593Smuzhiyun kvm->arch.gmap->private = kvm;
2746*4882a593Smuzhiyun kvm->arch.gmap->pfault_enabled = 0;
2747*4882a593Smuzhiyun }
2748*4882a593Smuzhiyun
2749*4882a593Smuzhiyun kvm->arch.use_pfmfi = sclp.has_pfmfi;
2750*4882a593Smuzhiyun kvm->arch.use_skf = sclp.has_skey;
2751*4882a593Smuzhiyun spin_lock_init(&kvm->arch.start_stop_lock);
2752*4882a593Smuzhiyun kvm_s390_vsie_init(kvm);
2753*4882a593Smuzhiyun if (use_gisa)
2754*4882a593Smuzhiyun kvm_s390_gisa_init(kvm);
2755*4882a593Smuzhiyun KVM_EVENT(3, "vm 0x%pK created by pid %u", kvm, current->pid);
2756*4882a593Smuzhiyun
2757*4882a593Smuzhiyun return 0;
2758*4882a593Smuzhiyun out_err:
2759*4882a593Smuzhiyun free_page((unsigned long)kvm->arch.sie_page2);
2760*4882a593Smuzhiyun debug_unregister(kvm->arch.dbf);
2761*4882a593Smuzhiyun sca_dispose(kvm);
2762*4882a593Smuzhiyun KVM_EVENT(3, "creation of vm failed: %d", rc);
2763*4882a593Smuzhiyun return rc;
2764*4882a593Smuzhiyun }
2765*4882a593Smuzhiyun
kvm_arch_vcpu_destroy(struct kvm_vcpu * vcpu)2766*4882a593Smuzhiyun void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
2767*4882a593Smuzhiyun {
2768*4882a593Smuzhiyun u16 rc, rrc;
2769*4882a593Smuzhiyun
2770*4882a593Smuzhiyun VCPU_EVENT(vcpu, 3, "%s", "free cpu");
2771*4882a593Smuzhiyun trace_kvm_s390_destroy_vcpu(vcpu->vcpu_id);
2772*4882a593Smuzhiyun kvm_s390_clear_local_irqs(vcpu);
2773*4882a593Smuzhiyun kvm_clear_async_pf_completion_queue(vcpu);
2774*4882a593Smuzhiyun if (!kvm_is_ucontrol(vcpu->kvm))
2775*4882a593Smuzhiyun sca_del_vcpu(vcpu);
2776*4882a593Smuzhiyun
2777*4882a593Smuzhiyun if (kvm_is_ucontrol(vcpu->kvm))
2778*4882a593Smuzhiyun gmap_remove(vcpu->arch.gmap);
2779*4882a593Smuzhiyun
2780*4882a593Smuzhiyun if (vcpu->kvm->arch.use_cmma)
2781*4882a593Smuzhiyun kvm_s390_vcpu_unsetup_cmma(vcpu);
2782*4882a593Smuzhiyun /* We can not hold the vcpu mutex here, we are already dying */
2783*4882a593Smuzhiyun if (kvm_s390_pv_cpu_get_handle(vcpu))
2784*4882a593Smuzhiyun kvm_s390_pv_destroy_cpu(vcpu, &rc, &rrc);
2785*4882a593Smuzhiyun free_page((unsigned long)(vcpu->arch.sie_block));
2786*4882a593Smuzhiyun }
2787*4882a593Smuzhiyun
kvm_free_vcpus(struct kvm * kvm)2788*4882a593Smuzhiyun static void kvm_free_vcpus(struct kvm *kvm)
2789*4882a593Smuzhiyun {
2790*4882a593Smuzhiyun unsigned int i;
2791*4882a593Smuzhiyun struct kvm_vcpu *vcpu;
2792*4882a593Smuzhiyun
2793*4882a593Smuzhiyun kvm_for_each_vcpu(i, vcpu, kvm)
2794*4882a593Smuzhiyun kvm_vcpu_destroy(vcpu);
2795*4882a593Smuzhiyun
2796*4882a593Smuzhiyun mutex_lock(&kvm->lock);
2797*4882a593Smuzhiyun for (i = 0; i < atomic_read(&kvm->online_vcpus); i++)
2798*4882a593Smuzhiyun kvm->vcpus[i] = NULL;
2799*4882a593Smuzhiyun
2800*4882a593Smuzhiyun atomic_set(&kvm->online_vcpus, 0);
2801*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
2802*4882a593Smuzhiyun }
2803*4882a593Smuzhiyun
kvm_arch_destroy_vm(struct kvm * kvm)2804*4882a593Smuzhiyun void kvm_arch_destroy_vm(struct kvm *kvm)
2805*4882a593Smuzhiyun {
2806*4882a593Smuzhiyun u16 rc, rrc;
2807*4882a593Smuzhiyun
2808*4882a593Smuzhiyun kvm_free_vcpus(kvm);
2809*4882a593Smuzhiyun sca_dispose(kvm);
2810*4882a593Smuzhiyun kvm_s390_gisa_destroy(kvm);
2811*4882a593Smuzhiyun /*
2812*4882a593Smuzhiyun * We are already at the end of life and kvm->lock is not taken.
2813*4882a593Smuzhiyun * This is ok as the file descriptor is closed by now and nobody
2814*4882a593Smuzhiyun * can mess with the pv state. To avoid lockdep_assert_held from
2815*4882a593Smuzhiyun * complaining we do not use kvm_s390_pv_is_protected.
2816*4882a593Smuzhiyun */
2817*4882a593Smuzhiyun if (kvm_s390_pv_get_handle(kvm))
2818*4882a593Smuzhiyun kvm_s390_pv_deinit_vm(kvm, &rc, &rrc);
2819*4882a593Smuzhiyun debug_unregister(kvm->arch.dbf);
2820*4882a593Smuzhiyun free_page((unsigned long)kvm->arch.sie_page2);
2821*4882a593Smuzhiyun if (!kvm_is_ucontrol(kvm))
2822*4882a593Smuzhiyun gmap_remove(kvm->arch.gmap);
2823*4882a593Smuzhiyun kvm_s390_destroy_adapters(kvm);
2824*4882a593Smuzhiyun kvm_s390_clear_float_irqs(kvm);
2825*4882a593Smuzhiyun kvm_s390_vsie_destroy(kvm);
2826*4882a593Smuzhiyun KVM_EVENT(3, "vm 0x%pK destroyed", kvm);
2827*4882a593Smuzhiyun }
2828*4882a593Smuzhiyun
2829*4882a593Smuzhiyun /* Section: vcpu related */
__kvm_ucontrol_vcpu_init(struct kvm_vcpu * vcpu)2830*4882a593Smuzhiyun static int __kvm_ucontrol_vcpu_init(struct kvm_vcpu *vcpu)
2831*4882a593Smuzhiyun {
2832*4882a593Smuzhiyun vcpu->arch.gmap = gmap_create(current->mm, -1UL);
2833*4882a593Smuzhiyun if (!vcpu->arch.gmap)
2834*4882a593Smuzhiyun return -ENOMEM;
2835*4882a593Smuzhiyun vcpu->arch.gmap->private = vcpu->kvm;
2836*4882a593Smuzhiyun
2837*4882a593Smuzhiyun return 0;
2838*4882a593Smuzhiyun }
2839*4882a593Smuzhiyun
sca_del_vcpu(struct kvm_vcpu * vcpu)2840*4882a593Smuzhiyun static void sca_del_vcpu(struct kvm_vcpu *vcpu)
2841*4882a593Smuzhiyun {
2842*4882a593Smuzhiyun if (!kvm_s390_use_sca_entries())
2843*4882a593Smuzhiyun return;
2844*4882a593Smuzhiyun read_lock(&vcpu->kvm->arch.sca_lock);
2845*4882a593Smuzhiyun if (vcpu->kvm->arch.use_esca) {
2846*4882a593Smuzhiyun struct esca_block *sca = vcpu->kvm->arch.sca;
2847*4882a593Smuzhiyun
2848*4882a593Smuzhiyun clear_bit_inv(vcpu->vcpu_id, (unsigned long *) sca->mcn);
2849*4882a593Smuzhiyun sca->cpu[vcpu->vcpu_id].sda = 0;
2850*4882a593Smuzhiyun } else {
2851*4882a593Smuzhiyun struct bsca_block *sca = vcpu->kvm->arch.sca;
2852*4882a593Smuzhiyun
2853*4882a593Smuzhiyun clear_bit_inv(vcpu->vcpu_id, (unsigned long *) &sca->mcn);
2854*4882a593Smuzhiyun sca->cpu[vcpu->vcpu_id].sda = 0;
2855*4882a593Smuzhiyun }
2856*4882a593Smuzhiyun read_unlock(&vcpu->kvm->arch.sca_lock);
2857*4882a593Smuzhiyun }
2858*4882a593Smuzhiyun
sca_add_vcpu(struct kvm_vcpu * vcpu)2859*4882a593Smuzhiyun static void sca_add_vcpu(struct kvm_vcpu *vcpu)
2860*4882a593Smuzhiyun {
2861*4882a593Smuzhiyun if (!kvm_s390_use_sca_entries()) {
2862*4882a593Smuzhiyun struct bsca_block *sca = vcpu->kvm->arch.sca;
2863*4882a593Smuzhiyun
2864*4882a593Smuzhiyun /* we still need the basic sca for the ipte control */
2865*4882a593Smuzhiyun vcpu->arch.sie_block->scaoh = (__u32)(((__u64)sca) >> 32);
2866*4882a593Smuzhiyun vcpu->arch.sie_block->scaol = (__u32)(__u64)sca;
2867*4882a593Smuzhiyun return;
2868*4882a593Smuzhiyun }
2869*4882a593Smuzhiyun read_lock(&vcpu->kvm->arch.sca_lock);
2870*4882a593Smuzhiyun if (vcpu->kvm->arch.use_esca) {
2871*4882a593Smuzhiyun struct esca_block *sca = vcpu->kvm->arch.sca;
2872*4882a593Smuzhiyun
2873*4882a593Smuzhiyun sca->cpu[vcpu->vcpu_id].sda = (__u64) vcpu->arch.sie_block;
2874*4882a593Smuzhiyun vcpu->arch.sie_block->scaoh = (__u32)(((__u64)sca) >> 32);
2875*4882a593Smuzhiyun vcpu->arch.sie_block->scaol = (__u32)(__u64)sca & ~0x3fU;
2876*4882a593Smuzhiyun vcpu->arch.sie_block->ecb2 |= ECB2_ESCA;
2877*4882a593Smuzhiyun set_bit_inv(vcpu->vcpu_id, (unsigned long *) sca->mcn);
2878*4882a593Smuzhiyun } else {
2879*4882a593Smuzhiyun struct bsca_block *sca = vcpu->kvm->arch.sca;
2880*4882a593Smuzhiyun
2881*4882a593Smuzhiyun sca->cpu[vcpu->vcpu_id].sda = (__u64) vcpu->arch.sie_block;
2882*4882a593Smuzhiyun vcpu->arch.sie_block->scaoh = (__u32)(((__u64)sca) >> 32);
2883*4882a593Smuzhiyun vcpu->arch.sie_block->scaol = (__u32)(__u64)sca;
2884*4882a593Smuzhiyun set_bit_inv(vcpu->vcpu_id, (unsigned long *) &sca->mcn);
2885*4882a593Smuzhiyun }
2886*4882a593Smuzhiyun read_unlock(&vcpu->kvm->arch.sca_lock);
2887*4882a593Smuzhiyun }
2888*4882a593Smuzhiyun
2889*4882a593Smuzhiyun /* Basic SCA to Extended SCA data copy routines */
sca_copy_entry(struct esca_entry * d,struct bsca_entry * s)2890*4882a593Smuzhiyun static inline void sca_copy_entry(struct esca_entry *d, struct bsca_entry *s)
2891*4882a593Smuzhiyun {
2892*4882a593Smuzhiyun d->sda = s->sda;
2893*4882a593Smuzhiyun d->sigp_ctrl.c = s->sigp_ctrl.c;
2894*4882a593Smuzhiyun d->sigp_ctrl.scn = s->sigp_ctrl.scn;
2895*4882a593Smuzhiyun }
2896*4882a593Smuzhiyun
sca_copy_b_to_e(struct esca_block * d,struct bsca_block * s)2897*4882a593Smuzhiyun static void sca_copy_b_to_e(struct esca_block *d, struct bsca_block *s)
2898*4882a593Smuzhiyun {
2899*4882a593Smuzhiyun int i;
2900*4882a593Smuzhiyun
2901*4882a593Smuzhiyun d->ipte_control = s->ipte_control;
2902*4882a593Smuzhiyun d->mcn[0] = s->mcn;
2903*4882a593Smuzhiyun for (i = 0; i < KVM_S390_BSCA_CPU_SLOTS; i++)
2904*4882a593Smuzhiyun sca_copy_entry(&d->cpu[i], &s->cpu[i]);
2905*4882a593Smuzhiyun }
2906*4882a593Smuzhiyun
sca_switch_to_extended(struct kvm * kvm)2907*4882a593Smuzhiyun static int sca_switch_to_extended(struct kvm *kvm)
2908*4882a593Smuzhiyun {
2909*4882a593Smuzhiyun struct bsca_block *old_sca = kvm->arch.sca;
2910*4882a593Smuzhiyun struct esca_block *new_sca;
2911*4882a593Smuzhiyun struct kvm_vcpu *vcpu;
2912*4882a593Smuzhiyun unsigned int vcpu_idx;
2913*4882a593Smuzhiyun u32 scaol, scaoh;
2914*4882a593Smuzhiyun
2915*4882a593Smuzhiyun if (kvm->arch.use_esca)
2916*4882a593Smuzhiyun return 0;
2917*4882a593Smuzhiyun
2918*4882a593Smuzhiyun new_sca = alloc_pages_exact(sizeof(*new_sca), GFP_KERNEL|__GFP_ZERO);
2919*4882a593Smuzhiyun if (!new_sca)
2920*4882a593Smuzhiyun return -ENOMEM;
2921*4882a593Smuzhiyun
2922*4882a593Smuzhiyun scaoh = (u32)((u64)(new_sca) >> 32);
2923*4882a593Smuzhiyun scaol = (u32)(u64)(new_sca) & ~0x3fU;
2924*4882a593Smuzhiyun
2925*4882a593Smuzhiyun kvm_s390_vcpu_block_all(kvm);
2926*4882a593Smuzhiyun write_lock(&kvm->arch.sca_lock);
2927*4882a593Smuzhiyun
2928*4882a593Smuzhiyun sca_copy_b_to_e(new_sca, old_sca);
2929*4882a593Smuzhiyun
2930*4882a593Smuzhiyun kvm_for_each_vcpu(vcpu_idx, vcpu, kvm) {
2931*4882a593Smuzhiyun vcpu->arch.sie_block->scaoh = scaoh;
2932*4882a593Smuzhiyun vcpu->arch.sie_block->scaol = scaol;
2933*4882a593Smuzhiyun vcpu->arch.sie_block->ecb2 |= ECB2_ESCA;
2934*4882a593Smuzhiyun }
2935*4882a593Smuzhiyun kvm->arch.sca = new_sca;
2936*4882a593Smuzhiyun kvm->arch.use_esca = 1;
2937*4882a593Smuzhiyun
2938*4882a593Smuzhiyun write_unlock(&kvm->arch.sca_lock);
2939*4882a593Smuzhiyun kvm_s390_vcpu_unblock_all(kvm);
2940*4882a593Smuzhiyun
2941*4882a593Smuzhiyun free_page((unsigned long)old_sca);
2942*4882a593Smuzhiyun
2943*4882a593Smuzhiyun VM_EVENT(kvm, 2, "Switched to ESCA (0x%pK -> 0x%pK)",
2944*4882a593Smuzhiyun old_sca, kvm->arch.sca);
2945*4882a593Smuzhiyun return 0;
2946*4882a593Smuzhiyun }
2947*4882a593Smuzhiyun
sca_can_add_vcpu(struct kvm * kvm,unsigned int id)2948*4882a593Smuzhiyun static int sca_can_add_vcpu(struct kvm *kvm, unsigned int id)
2949*4882a593Smuzhiyun {
2950*4882a593Smuzhiyun int rc;
2951*4882a593Smuzhiyun
2952*4882a593Smuzhiyun if (!kvm_s390_use_sca_entries()) {
2953*4882a593Smuzhiyun if (id < KVM_MAX_VCPUS)
2954*4882a593Smuzhiyun return true;
2955*4882a593Smuzhiyun return false;
2956*4882a593Smuzhiyun }
2957*4882a593Smuzhiyun if (id < KVM_S390_BSCA_CPU_SLOTS)
2958*4882a593Smuzhiyun return true;
2959*4882a593Smuzhiyun if (!sclp.has_esca || !sclp.has_64bscao)
2960*4882a593Smuzhiyun return false;
2961*4882a593Smuzhiyun
2962*4882a593Smuzhiyun mutex_lock(&kvm->lock);
2963*4882a593Smuzhiyun rc = kvm->arch.use_esca ? 0 : sca_switch_to_extended(kvm);
2964*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
2965*4882a593Smuzhiyun
2966*4882a593Smuzhiyun return rc == 0 && id < KVM_S390_ESCA_CPU_SLOTS;
2967*4882a593Smuzhiyun }
2968*4882a593Smuzhiyun
2969*4882a593Smuzhiyun /* needs disabled preemption to protect from TOD sync and vcpu_load/put */
__start_cpu_timer_accounting(struct kvm_vcpu * vcpu)2970*4882a593Smuzhiyun static void __start_cpu_timer_accounting(struct kvm_vcpu *vcpu)
2971*4882a593Smuzhiyun {
2972*4882a593Smuzhiyun WARN_ON_ONCE(vcpu->arch.cputm_start != 0);
2973*4882a593Smuzhiyun raw_write_seqcount_begin(&vcpu->arch.cputm_seqcount);
2974*4882a593Smuzhiyun vcpu->arch.cputm_start = get_tod_clock_fast();
2975*4882a593Smuzhiyun raw_write_seqcount_end(&vcpu->arch.cputm_seqcount);
2976*4882a593Smuzhiyun }
2977*4882a593Smuzhiyun
2978*4882a593Smuzhiyun /* needs disabled preemption to protect from TOD sync and vcpu_load/put */
__stop_cpu_timer_accounting(struct kvm_vcpu * vcpu)2979*4882a593Smuzhiyun static void __stop_cpu_timer_accounting(struct kvm_vcpu *vcpu)
2980*4882a593Smuzhiyun {
2981*4882a593Smuzhiyun WARN_ON_ONCE(vcpu->arch.cputm_start == 0);
2982*4882a593Smuzhiyun raw_write_seqcount_begin(&vcpu->arch.cputm_seqcount);
2983*4882a593Smuzhiyun vcpu->arch.sie_block->cputm -= get_tod_clock_fast() - vcpu->arch.cputm_start;
2984*4882a593Smuzhiyun vcpu->arch.cputm_start = 0;
2985*4882a593Smuzhiyun raw_write_seqcount_end(&vcpu->arch.cputm_seqcount);
2986*4882a593Smuzhiyun }
2987*4882a593Smuzhiyun
2988*4882a593Smuzhiyun /* needs disabled preemption to protect from TOD sync and vcpu_load/put */
__enable_cpu_timer_accounting(struct kvm_vcpu * vcpu)2989*4882a593Smuzhiyun static void __enable_cpu_timer_accounting(struct kvm_vcpu *vcpu)
2990*4882a593Smuzhiyun {
2991*4882a593Smuzhiyun WARN_ON_ONCE(vcpu->arch.cputm_enabled);
2992*4882a593Smuzhiyun vcpu->arch.cputm_enabled = true;
2993*4882a593Smuzhiyun __start_cpu_timer_accounting(vcpu);
2994*4882a593Smuzhiyun }
2995*4882a593Smuzhiyun
2996*4882a593Smuzhiyun /* needs disabled preemption to protect from TOD sync and vcpu_load/put */
__disable_cpu_timer_accounting(struct kvm_vcpu * vcpu)2997*4882a593Smuzhiyun static void __disable_cpu_timer_accounting(struct kvm_vcpu *vcpu)
2998*4882a593Smuzhiyun {
2999*4882a593Smuzhiyun WARN_ON_ONCE(!vcpu->arch.cputm_enabled);
3000*4882a593Smuzhiyun __stop_cpu_timer_accounting(vcpu);
3001*4882a593Smuzhiyun vcpu->arch.cputm_enabled = false;
3002*4882a593Smuzhiyun }
3003*4882a593Smuzhiyun
enable_cpu_timer_accounting(struct kvm_vcpu * vcpu)3004*4882a593Smuzhiyun static void enable_cpu_timer_accounting(struct kvm_vcpu *vcpu)
3005*4882a593Smuzhiyun {
3006*4882a593Smuzhiyun preempt_disable(); /* protect from TOD sync and vcpu_load/put */
3007*4882a593Smuzhiyun __enable_cpu_timer_accounting(vcpu);
3008*4882a593Smuzhiyun preempt_enable();
3009*4882a593Smuzhiyun }
3010*4882a593Smuzhiyun
disable_cpu_timer_accounting(struct kvm_vcpu * vcpu)3011*4882a593Smuzhiyun static void disable_cpu_timer_accounting(struct kvm_vcpu *vcpu)
3012*4882a593Smuzhiyun {
3013*4882a593Smuzhiyun preempt_disable(); /* protect from TOD sync and vcpu_load/put */
3014*4882a593Smuzhiyun __disable_cpu_timer_accounting(vcpu);
3015*4882a593Smuzhiyun preempt_enable();
3016*4882a593Smuzhiyun }
3017*4882a593Smuzhiyun
3018*4882a593Smuzhiyun /* set the cpu timer - may only be called from the VCPU thread itself */
kvm_s390_set_cpu_timer(struct kvm_vcpu * vcpu,__u64 cputm)3019*4882a593Smuzhiyun void kvm_s390_set_cpu_timer(struct kvm_vcpu *vcpu, __u64 cputm)
3020*4882a593Smuzhiyun {
3021*4882a593Smuzhiyun preempt_disable(); /* protect from TOD sync and vcpu_load/put */
3022*4882a593Smuzhiyun raw_write_seqcount_begin(&vcpu->arch.cputm_seqcount);
3023*4882a593Smuzhiyun if (vcpu->arch.cputm_enabled)
3024*4882a593Smuzhiyun vcpu->arch.cputm_start = get_tod_clock_fast();
3025*4882a593Smuzhiyun vcpu->arch.sie_block->cputm = cputm;
3026*4882a593Smuzhiyun raw_write_seqcount_end(&vcpu->arch.cputm_seqcount);
3027*4882a593Smuzhiyun preempt_enable();
3028*4882a593Smuzhiyun }
3029*4882a593Smuzhiyun
3030*4882a593Smuzhiyun /* update and get the cpu timer - can also be called from other VCPU threads */
kvm_s390_get_cpu_timer(struct kvm_vcpu * vcpu)3031*4882a593Smuzhiyun __u64 kvm_s390_get_cpu_timer(struct kvm_vcpu *vcpu)
3032*4882a593Smuzhiyun {
3033*4882a593Smuzhiyun unsigned int seq;
3034*4882a593Smuzhiyun __u64 value;
3035*4882a593Smuzhiyun
3036*4882a593Smuzhiyun if (unlikely(!vcpu->arch.cputm_enabled))
3037*4882a593Smuzhiyun return vcpu->arch.sie_block->cputm;
3038*4882a593Smuzhiyun
3039*4882a593Smuzhiyun preempt_disable(); /* protect from TOD sync and vcpu_load/put */
3040*4882a593Smuzhiyun do {
3041*4882a593Smuzhiyun seq = raw_read_seqcount(&vcpu->arch.cputm_seqcount);
3042*4882a593Smuzhiyun /*
3043*4882a593Smuzhiyun * If the writer would ever execute a read in the critical
3044*4882a593Smuzhiyun * section, e.g. in irq context, we have a deadlock.
3045*4882a593Smuzhiyun */
3046*4882a593Smuzhiyun WARN_ON_ONCE((seq & 1) && smp_processor_id() == vcpu->cpu);
3047*4882a593Smuzhiyun value = vcpu->arch.sie_block->cputm;
3048*4882a593Smuzhiyun /* if cputm_start is 0, accounting is being started/stopped */
3049*4882a593Smuzhiyun if (likely(vcpu->arch.cputm_start))
3050*4882a593Smuzhiyun value -= get_tod_clock_fast() - vcpu->arch.cputm_start;
3051*4882a593Smuzhiyun } while (read_seqcount_retry(&vcpu->arch.cputm_seqcount, seq & ~1));
3052*4882a593Smuzhiyun preempt_enable();
3053*4882a593Smuzhiyun return value;
3054*4882a593Smuzhiyun }
3055*4882a593Smuzhiyun
kvm_arch_vcpu_load(struct kvm_vcpu * vcpu,int cpu)3056*4882a593Smuzhiyun void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
3057*4882a593Smuzhiyun {
3058*4882a593Smuzhiyun
3059*4882a593Smuzhiyun gmap_enable(vcpu->arch.enabled_gmap);
3060*4882a593Smuzhiyun kvm_s390_set_cpuflags(vcpu, CPUSTAT_RUNNING);
3061*4882a593Smuzhiyun if (vcpu->arch.cputm_enabled && !is_vcpu_idle(vcpu))
3062*4882a593Smuzhiyun __start_cpu_timer_accounting(vcpu);
3063*4882a593Smuzhiyun vcpu->cpu = cpu;
3064*4882a593Smuzhiyun }
3065*4882a593Smuzhiyun
kvm_arch_vcpu_put(struct kvm_vcpu * vcpu)3066*4882a593Smuzhiyun void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
3067*4882a593Smuzhiyun {
3068*4882a593Smuzhiyun vcpu->cpu = -1;
3069*4882a593Smuzhiyun if (vcpu->arch.cputm_enabled && !is_vcpu_idle(vcpu))
3070*4882a593Smuzhiyun __stop_cpu_timer_accounting(vcpu);
3071*4882a593Smuzhiyun kvm_s390_clear_cpuflags(vcpu, CPUSTAT_RUNNING);
3072*4882a593Smuzhiyun vcpu->arch.enabled_gmap = gmap_get_enabled();
3073*4882a593Smuzhiyun gmap_disable(vcpu->arch.enabled_gmap);
3074*4882a593Smuzhiyun
3075*4882a593Smuzhiyun }
3076*4882a593Smuzhiyun
kvm_arch_vcpu_postcreate(struct kvm_vcpu * vcpu)3077*4882a593Smuzhiyun void kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu)
3078*4882a593Smuzhiyun {
3079*4882a593Smuzhiyun mutex_lock(&vcpu->kvm->lock);
3080*4882a593Smuzhiyun preempt_disable();
3081*4882a593Smuzhiyun vcpu->arch.sie_block->epoch = vcpu->kvm->arch.epoch;
3082*4882a593Smuzhiyun vcpu->arch.sie_block->epdx = vcpu->kvm->arch.epdx;
3083*4882a593Smuzhiyun preempt_enable();
3084*4882a593Smuzhiyun mutex_unlock(&vcpu->kvm->lock);
3085*4882a593Smuzhiyun if (!kvm_is_ucontrol(vcpu->kvm)) {
3086*4882a593Smuzhiyun vcpu->arch.gmap = vcpu->kvm->arch.gmap;
3087*4882a593Smuzhiyun sca_add_vcpu(vcpu);
3088*4882a593Smuzhiyun }
3089*4882a593Smuzhiyun if (test_kvm_facility(vcpu->kvm, 74) || vcpu->kvm->arch.user_instr0)
3090*4882a593Smuzhiyun vcpu->arch.sie_block->ictl |= ICTL_OPEREXC;
3091*4882a593Smuzhiyun /* make vcpu_load load the right gmap on the first trigger */
3092*4882a593Smuzhiyun vcpu->arch.enabled_gmap = vcpu->arch.gmap;
3093*4882a593Smuzhiyun }
3094*4882a593Smuzhiyun
kvm_has_pckmo_subfunc(struct kvm * kvm,unsigned long nr)3095*4882a593Smuzhiyun static bool kvm_has_pckmo_subfunc(struct kvm *kvm, unsigned long nr)
3096*4882a593Smuzhiyun {
3097*4882a593Smuzhiyun if (test_bit_inv(nr, (unsigned long *)&kvm->arch.model.subfuncs.pckmo) &&
3098*4882a593Smuzhiyun test_bit_inv(nr, (unsigned long *)&kvm_s390_available_subfunc.pckmo))
3099*4882a593Smuzhiyun return true;
3100*4882a593Smuzhiyun return false;
3101*4882a593Smuzhiyun }
3102*4882a593Smuzhiyun
kvm_has_pckmo_ecc(struct kvm * kvm)3103*4882a593Smuzhiyun static bool kvm_has_pckmo_ecc(struct kvm *kvm)
3104*4882a593Smuzhiyun {
3105*4882a593Smuzhiyun /* At least one ECC subfunction must be present */
3106*4882a593Smuzhiyun return kvm_has_pckmo_subfunc(kvm, 32) ||
3107*4882a593Smuzhiyun kvm_has_pckmo_subfunc(kvm, 33) ||
3108*4882a593Smuzhiyun kvm_has_pckmo_subfunc(kvm, 34) ||
3109*4882a593Smuzhiyun kvm_has_pckmo_subfunc(kvm, 40) ||
3110*4882a593Smuzhiyun kvm_has_pckmo_subfunc(kvm, 41);
3111*4882a593Smuzhiyun
3112*4882a593Smuzhiyun }
3113*4882a593Smuzhiyun
kvm_s390_vcpu_crypto_setup(struct kvm_vcpu * vcpu)3114*4882a593Smuzhiyun static void kvm_s390_vcpu_crypto_setup(struct kvm_vcpu *vcpu)
3115*4882a593Smuzhiyun {
3116*4882a593Smuzhiyun /*
3117*4882a593Smuzhiyun * If the AP instructions are not being interpreted and the MSAX3
3118*4882a593Smuzhiyun * facility is not configured for the guest, there is nothing to set up.
3119*4882a593Smuzhiyun */
3120*4882a593Smuzhiyun if (!vcpu->kvm->arch.crypto.apie && !test_kvm_facility(vcpu->kvm, 76))
3121*4882a593Smuzhiyun return;
3122*4882a593Smuzhiyun
3123*4882a593Smuzhiyun vcpu->arch.sie_block->crycbd = vcpu->kvm->arch.crypto.crycbd;
3124*4882a593Smuzhiyun vcpu->arch.sie_block->ecb3 &= ~(ECB3_AES | ECB3_DEA);
3125*4882a593Smuzhiyun vcpu->arch.sie_block->eca &= ~ECA_APIE;
3126*4882a593Smuzhiyun vcpu->arch.sie_block->ecd &= ~ECD_ECC;
3127*4882a593Smuzhiyun
3128*4882a593Smuzhiyun if (vcpu->kvm->arch.crypto.apie)
3129*4882a593Smuzhiyun vcpu->arch.sie_block->eca |= ECA_APIE;
3130*4882a593Smuzhiyun
3131*4882a593Smuzhiyun /* Set up protected key support */
3132*4882a593Smuzhiyun if (vcpu->kvm->arch.crypto.aes_kw) {
3133*4882a593Smuzhiyun vcpu->arch.sie_block->ecb3 |= ECB3_AES;
3134*4882a593Smuzhiyun /* ecc is also wrapped with AES key */
3135*4882a593Smuzhiyun if (kvm_has_pckmo_ecc(vcpu->kvm))
3136*4882a593Smuzhiyun vcpu->arch.sie_block->ecd |= ECD_ECC;
3137*4882a593Smuzhiyun }
3138*4882a593Smuzhiyun
3139*4882a593Smuzhiyun if (vcpu->kvm->arch.crypto.dea_kw)
3140*4882a593Smuzhiyun vcpu->arch.sie_block->ecb3 |= ECB3_DEA;
3141*4882a593Smuzhiyun }
3142*4882a593Smuzhiyun
kvm_s390_vcpu_unsetup_cmma(struct kvm_vcpu * vcpu)3143*4882a593Smuzhiyun void kvm_s390_vcpu_unsetup_cmma(struct kvm_vcpu *vcpu)
3144*4882a593Smuzhiyun {
3145*4882a593Smuzhiyun free_page(vcpu->arch.sie_block->cbrlo);
3146*4882a593Smuzhiyun vcpu->arch.sie_block->cbrlo = 0;
3147*4882a593Smuzhiyun }
3148*4882a593Smuzhiyun
kvm_s390_vcpu_setup_cmma(struct kvm_vcpu * vcpu)3149*4882a593Smuzhiyun int kvm_s390_vcpu_setup_cmma(struct kvm_vcpu *vcpu)
3150*4882a593Smuzhiyun {
3151*4882a593Smuzhiyun vcpu->arch.sie_block->cbrlo = get_zeroed_page(GFP_KERNEL);
3152*4882a593Smuzhiyun if (!vcpu->arch.sie_block->cbrlo)
3153*4882a593Smuzhiyun return -ENOMEM;
3154*4882a593Smuzhiyun return 0;
3155*4882a593Smuzhiyun }
3156*4882a593Smuzhiyun
kvm_s390_vcpu_setup_model(struct kvm_vcpu * vcpu)3157*4882a593Smuzhiyun static void kvm_s390_vcpu_setup_model(struct kvm_vcpu *vcpu)
3158*4882a593Smuzhiyun {
3159*4882a593Smuzhiyun struct kvm_s390_cpu_model *model = &vcpu->kvm->arch.model;
3160*4882a593Smuzhiyun
3161*4882a593Smuzhiyun vcpu->arch.sie_block->ibc = model->ibc;
3162*4882a593Smuzhiyun if (test_kvm_facility(vcpu->kvm, 7))
3163*4882a593Smuzhiyun vcpu->arch.sie_block->fac = (u32)(u64) model->fac_list;
3164*4882a593Smuzhiyun }
3165*4882a593Smuzhiyun
kvm_s390_vcpu_setup(struct kvm_vcpu * vcpu)3166*4882a593Smuzhiyun static int kvm_s390_vcpu_setup(struct kvm_vcpu *vcpu)
3167*4882a593Smuzhiyun {
3168*4882a593Smuzhiyun int rc = 0;
3169*4882a593Smuzhiyun u16 uvrc, uvrrc;
3170*4882a593Smuzhiyun
3171*4882a593Smuzhiyun atomic_set(&vcpu->arch.sie_block->cpuflags, CPUSTAT_ZARCH |
3172*4882a593Smuzhiyun CPUSTAT_SM |
3173*4882a593Smuzhiyun CPUSTAT_STOPPED);
3174*4882a593Smuzhiyun
3175*4882a593Smuzhiyun if (test_kvm_facility(vcpu->kvm, 78))
3176*4882a593Smuzhiyun kvm_s390_set_cpuflags(vcpu, CPUSTAT_GED2);
3177*4882a593Smuzhiyun else if (test_kvm_facility(vcpu->kvm, 8))
3178*4882a593Smuzhiyun kvm_s390_set_cpuflags(vcpu, CPUSTAT_GED);
3179*4882a593Smuzhiyun
3180*4882a593Smuzhiyun kvm_s390_vcpu_setup_model(vcpu);
3181*4882a593Smuzhiyun
3182*4882a593Smuzhiyun /* pgste_set_pte has special handling for !MACHINE_HAS_ESOP */
3183*4882a593Smuzhiyun if (MACHINE_HAS_ESOP)
3184*4882a593Smuzhiyun vcpu->arch.sie_block->ecb |= ECB_HOSTPROTINT;
3185*4882a593Smuzhiyun if (test_kvm_facility(vcpu->kvm, 9))
3186*4882a593Smuzhiyun vcpu->arch.sie_block->ecb |= ECB_SRSI;
3187*4882a593Smuzhiyun if (test_kvm_facility(vcpu->kvm, 73))
3188*4882a593Smuzhiyun vcpu->arch.sie_block->ecb |= ECB_TE;
3189*4882a593Smuzhiyun
3190*4882a593Smuzhiyun if (test_kvm_facility(vcpu->kvm, 8) && vcpu->kvm->arch.use_pfmfi)
3191*4882a593Smuzhiyun vcpu->arch.sie_block->ecb2 |= ECB2_PFMFI;
3192*4882a593Smuzhiyun if (test_kvm_facility(vcpu->kvm, 130))
3193*4882a593Smuzhiyun vcpu->arch.sie_block->ecb2 |= ECB2_IEP;
3194*4882a593Smuzhiyun vcpu->arch.sie_block->eca = ECA_MVPGI | ECA_PROTEXCI;
3195*4882a593Smuzhiyun if (sclp.has_cei)
3196*4882a593Smuzhiyun vcpu->arch.sie_block->eca |= ECA_CEI;
3197*4882a593Smuzhiyun if (sclp.has_ib)
3198*4882a593Smuzhiyun vcpu->arch.sie_block->eca |= ECA_IB;
3199*4882a593Smuzhiyun if (sclp.has_siif)
3200*4882a593Smuzhiyun vcpu->arch.sie_block->eca |= ECA_SII;
3201*4882a593Smuzhiyun if (sclp.has_sigpif)
3202*4882a593Smuzhiyun vcpu->arch.sie_block->eca |= ECA_SIGPI;
3203*4882a593Smuzhiyun if (test_kvm_facility(vcpu->kvm, 129)) {
3204*4882a593Smuzhiyun vcpu->arch.sie_block->eca |= ECA_VX;
3205*4882a593Smuzhiyun vcpu->arch.sie_block->ecd |= ECD_HOSTREGMGMT;
3206*4882a593Smuzhiyun }
3207*4882a593Smuzhiyun if (test_kvm_facility(vcpu->kvm, 139))
3208*4882a593Smuzhiyun vcpu->arch.sie_block->ecd |= ECD_MEF;
3209*4882a593Smuzhiyun if (test_kvm_facility(vcpu->kvm, 156))
3210*4882a593Smuzhiyun vcpu->arch.sie_block->ecd |= ECD_ETOKENF;
3211*4882a593Smuzhiyun if (vcpu->arch.sie_block->gd) {
3212*4882a593Smuzhiyun vcpu->arch.sie_block->eca |= ECA_AIV;
3213*4882a593Smuzhiyun VCPU_EVENT(vcpu, 3, "AIV gisa format-%u enabled for cpu %03u",
3214*4882a593Smuzhiyun vcpu->arch.sie_block->gd & 0x3, vcpu->vcpu_id);
3215*4882a593Smuzhiyun }
3216*4882a593Smuzhiyun vcpu->arch.sie_block->sdnxo = ((unsigned long) &vcpu->run->s.regs.sdnx)
3217*4882a593Smuzhiyun | SDNXC;
3218*4882a593Smuzhiyun vcpu->arch.sie_block->riccbd = (unsigned long) &vcpu->run->s.regs.riccb;
3219*4882a593Smuzhiyun
3220*4882a593Smuzhiyun if (sclp.has_kss)
3221*4882a593Smuzhiyun kvm_s390_set_cpuflags(vcpu, CPUSTAT_KSS);
3222*4882a593Smuzhiyun else
3223*4882a593Smuzhiyun vcpu->arch.sie_block->ictl |= ICTL_ISKE | ICTL_SSKE | ICTL_RRBE;
3224*4882a593Smuzhiyun
3225*4882a593Smuzhiyun if (vcpu->kvm->arch.use_cmma) {
3226*4882a593Smuzhiyun rc = kvm_s390_vcpu_setup_cmma(vcpu);
3227*4882a593Smuzhiyun if (rc)
3228*4882a593Smuzhiyun return rc;
3229*4882a593Smuzhiyun }
3230*4882a593Smuzhiyun hrtimer_init(&vcpu->arch.ckc_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
3231*4882a593Smuzhiyun vcpu->arch.ckc_timer.function = kvm_s390_idle_wakeup;
3232*4882a593Smuzhiyun
3233*4882a593Smuzhiyun vcpu->arch.sie_block->hpid = HPID_KVM;
3234*4882a593Smuzhiyun
3235*4882a593Smuzhiyun kvm_s390_vcpu_crypto_setup(vcpu);
3236*4882a593Smuzhiyun
3237*4882a593Smuzhiyun mutex_lock(&vcpu->kvm->lock);
3238*4882a593Smuzhiyun if (kvm_s390_pv_is_protected(vcpu->kvm)) {
3239*4882a593Smuzhiyun rc = kvm_s390_pv_create_cpu(vcpu, &uvrc, &uvrrc);
3240*4882a593Smuzhiyun if (rc)
3241*4882a593Smuzhiyun kvm_s390_vcpu_unsetup_cmma(vcpu);
3242*4882a593Smuzhiyun }
3243*4882a593Smuzhiyun mutex_unlock(&vcpu->kvm->lock);
3244*4882a593Smuzhiyun
3245*4882a593Smuzhiyun return rc;
3246*4882a593Smuzhiyun }
3247*4882a593Smuzhiyun
kvm_arch_vcpu_precreate(struct kvm * kvm,unsigned int id)3248*4882a593Smuzhiyun int kvm_arch_vcpu_precreate(struct kvm *kvm, unsigned int id)
3249*4882a593Smuzhiyun {
3250*4882a593Smuzhiyun if (!kvm_is_ucontrol(kvm) && !sca_can_add_vcpu(kvm, id))
3251*4882a593Smuzhiyun return -EINVAL;
3252*4882a593Smuzhiyun return 0;
3253*4882a593Smuzhiyun }
3254*4882a593Smuzhiyun
kvm_arch_vcpu_create(struct kvm_vcpu * vcpu)3255*4882a593Smuzhiyun int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu)
3256*4882a593Smuzhiyun {
3257*4882a593Smuzhiyun struct sie_page *sie_page;
3258*4882a593Smuzhiyun int rc;
3259*4882a593Smuzhiyun
3260*4882a593Smuzhiyun BUILD_BUG_ON(sizeof(struct sie_page) != 4096);
3261*4882a593Smuzhiyun sie_page = (struct sie_page *) get_zeroed_page(GFP_KERNEL);
3262*4882a593Smuzhiyun if (!sie_page)
3263*4882a593Smuzhiyun return -ENOMEM;
3264*4882a593Smuzhiyun
3265*4882a593Smuzhiyun vcpu->arch.sie_block = &sie_page->sie_block;
3266*4882a593Smuzhiyun vcpu->arch.sie_block->itdba = (unsigned long) &sie_page->itdb;
3267*4882a593Smuzhiyun
3268*4882a593Smuzhiyun /* the real guest size will always be smaller than msl */
3269*4882a593Smuzhiyun vcpu->arch.sie_block->mso = 0;
3270*4882a593Smuzhiyun vcpu->arch.sie_block->msl = sclp.hamax;
3271*4882a593Smuzhiyun
3272*4882a593Smuzhiyun vcpu->arch.sie_block->icpua = vcpu->vcpu_id;
3273*4882a593Smuzhiyun spin_lock_init(&vcpu->arch.local_int.lock);
3274*4882a593Smuzhiyun vcpu->arch.sie_block->gd = (u32)(u64)vcpu->kvm->arch.gisa_int.origin;
3275*4882a593Smuzhiyun if (vcpu->arch.sie_block->gd && sclp.has_gisaf)
3276*4882a593Smuzhiyun vcpu->arch.sie_block->gd |= GISA_FORMAT1;
3277*4882a593Smuzhiyun seqcount_init(&vcpu->arch.cputm_seqcount);
3278*4882a593Smuzhiyun
3279*4882a593Smuzhiyun vcpu->arch.pfault_token = KVM_S390_PFAULT_TOKEN_INVALID;
3280*4882a593Smuzhiyun kvm_clear_async_pf_completion_queue(vcpu);
3281*4882a593Smuzhiyun vcpu->run->kvm_valid_regs = KVM_SYNC_PREFIX |
3282*4882a593Smuzhiyun KVM_SYNC_GPRS |
3283*4882a593Smuzhiyun KVM_SYNC_ACRS |
3284*4882a593Smuzhiyun KVM_SYNC_CRS |
3285*4882a593Smuzhiyun KVM_SYNC_ARCH0 |
3286*4882a593Smuzhiyun KVM_SYNC_PFAULT |
3287*4882a593Smuzhiyun KVM_SYNC_DIAG318;
3288*4882a593Smuzhiyun kvm_s390_set_prefix(vcpu, 0);
3289*4882a593Smuzhiyun if (test_kvm_facility(vcpu->kvm, 64))
3290*4882a593Smuzhiyun vcpu->run->kvm_valid_regs |= KVM_SYNC_RICCB;
3291*4882a593Smuzhiyun if (test_kvm_facility(vcpu->kvm, 82))
3292*4882a593Smuzhiyun vcpu->run->kvm_valid_regs |= KVM_SYNC_BPBC;
3293*4882a593Smuzhiyun if (test_kvm_facility(vcpu->kvm, 133))
3294*4882a593Smuzhiyun vcpu->run->kvm_valid_regs |= KVM_SYNC_GSCB;
3295*4882a593Smuzhiyun if (test_kvm_facility(vcpu->kvm, 156))
3296*4882a593Smuzhiyun vcpu->run->kvm_valid_regs |= KVM_SYNC_ETOKEN;
3297*4882a593Smuzhiyun /* fprs can be synchronized via vrs, even if the guest has no vx. With
3298*4882a593Smuzhiyun * MACHINE_HAS_VX, (load|store)_fpu_regs() will work with vrs format.
3299*4882a593Smuzhiyun */
3300*4882a593Smuzhiyun if (MACHINE_HAS_VX)
3301*4882a593Smuzhiyun vcpu->run->kvm_valid_regs |= KVM_SYNC_VRS;
3302*4882a593Smuzhiyun else
3303*4882a593Smuzhiyun vcpu->run->kvm_valid_regs |= KVM_SYNC_FPRS;
3304*4882a593Smuzhiyun
3305*4882a593Smuzhiyun if (kvm_is_ucontrol(vcpu->kvm)) {
3306*4882a593Smuzhiyun rc = __kvm_ucontrol_vcpu_init(vcpu);
3307*4882a593Smuzhiyun if (rc)
3308*4882a593Smuzhiyun goto out_free_sie_block;
3309*4882a593Smuzhiyun }
3310*4882a593Smuzhiyun
3311*4882a593Smuzhiyun VM_EVENT(vcpu->kvm, 3, "create cpu %d at 0x%pK, sie block at 0x%pK",
3312*4882a593Smuzhiyun vcpu->vcpu_id, vcpu, vcpu->arch.sie_block);
3313*4882a593Smuzhiyun trace_kvm_s390_create_vcpu(vcpu->vcpu_id, vcpu, vcpu->arch.sie_block);
3314*4882a593Smuzhiyun
3315*4882a593Smuzhiyun rc = kvm_s390_vcpu_setup(vcpu);
3316*4882a593Smuzhiyun if (rc)
3317*4882a593Smuzhiyun goto out_ucontrol_uninit;
3318*4882a593Smuzhiyun return 0;
3319*4882a593Smuzhiyun
3320*4882a593Smuzhiyun out_ucontrol_uninit:
3321*4882a593Smuzhiyun if (kvm_is_ucontrol(vcpu->kvm))
3322*4882a593Smuzhiyun gmap_remove(vcpu->arch.gmap);
3323*4882a593Smuzhiyun out_free_sie_block:
3324*4882a593Smuzhiyun free_page((unsigned long)(vcpu->arch.sie_block));
3325*4882a593Smuzhiyun return rc;
3326*4882a593Smuzhiyun }
3327*4882a593Smuzhiyun
kvm_arch_vcpu_runnable(struct kvm_vcpu * vcpu)3328*4882a593Smuzhiyun int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu)
3329*4882a593Smuzhiyun {
3330*4882a593Smuzhiyun clear_bit(vcpu->vcpu_idx, vcpu->kvm->arch.gisa_int.kicked_mask);
3331*4882a593Smuzhiyun return kvm_s390_vcpu_has_irq(vcpu, 0);
3332*4882a593Smuzhiyun }
3333*4882a593Smuzhiyun
kvm_arch_vcpu_in_kernel(struct kvm_vcpu * vcpu)3334*4882a593Smuzhiyun bool kvm_arch_vcpu_in_kernel(struct kvm_vcpu *vcpu)
3335*4882a593Smuzhiyun {
3336*4882a593Smuzhiyun return !(vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE);
3337*4882a593Smuzhiyun }
3338*4882a593Smuzhiyun
kvm_s390_vcpu_block(struct kvm_vcpu * vcpu)3339*4882a593Smuzhiyun void kvm_s390_vcpu_block(struct kvm_vcpu *vcpu)
3340*4882a593Smuzhiyun {
3341*4882a593Smuzhiyun atomic_or(PROG_BLOCK_SIE, &vcpu->arch.sie_block->prog20);
3342*4882a593Smuzhiyun exit_sie(vcpu);
3343*4882a593Smuzhiyun }
3344*4882a593Smuzhiyun
kvm_s390_vcpu_unblock(struct kvm_vcpu * vcpu)3345*4882a593Smuzhiyun void kvm_s390_vcpu_unblock(struct kvm_vcpu *vcpu)
3346*4882a593Smuzhiyun {
3347*4882a593Smuzhiyun atomic_andnot(PROG_BLOCK_SIE, &vcpu->arch.sie_block->prog20);
3348*4882a593Smuzhiyun }
3349*4882a593Smuzhiyun
kvm_s390_vcpu_request(struct kvm_vcpu * vcpu)3350*4882a593Smuzhiyun static void kvm_s390_vcpu_request(struct kvm_vcpu *vcpu)
3351*4882a593Smuzhiyun {
3352*4882a593Smuzhiyun atomic_or(PROG_REQUEST, &vcpu->arch.sie_block->prog20);
3353*4882a593Smuzhiyun exit_sie(vcpu);
3354*4882a593Smuzhiyun }
3355*4882a593Smuzhiyun
kvm_s390_vcpu_sie_inhibited(struct kvm_vcpu * vcpu)3356*4882a593Smuzhiyun bool kvm_s390_vcpu_sie_inhibited(struct kvm_vcpu *vcpu)
3357*4882a593Smuzhiyun {
3358*4882a593Smuzhiyun return atomic_read(&vcpu->arch.sie_block->prog20) &
3359*4882a593Smuzhiyun (PROG_BLOCK_SIE | PROG_REQUEST);
3360*4882a593Smuzhiyun }
3361*4882a593Smuzhiyun
kvm_s390_vcpu_request_handled(struct kvm_vcpu * vcpu)3362*4882a593Smuzhiyun static void kvm_s390_vcpu_request_handled(struct kvm_vcpu *vcpu)
3363*4882a593Smuzhiyun {
3364*4882a593Smuzhiyun atomic_andnot(PROG_REQUEST, &vcpu->arch.sie_block->prog20);
3365*4882a593Smuzhiyun }
3366*4882a593Smuzhiyun
3367*4882a593Smuzhiyun /*
3368*4882a593Smuzhiyun * Kick a guest cpu out of (v)SIE and wait until (v)SIE is not running.
3369*4882a593Smuzhiyun * If the CPU is not running (e.g. waiting as idle) the function will
3370*4882a593Smuzhiyun * return immediately. */
exit_sie(struct kvm_vcpu * vcpu)3371*4882a593Smuzhiyun void exit_sie(struct kvm_vcpu *vcpu)
3372*4882a593Smuzhiyun {
3373*4882a593Smuzhiyun kvm_s390_set_cpuflags(vcpu, CPUSTAT_STOP_INT);
3374*4882a593Smuzhiyun kvm_s390_vsie_kick(vcpu);
3375*4882a593Smuzhiyun while (vcpu->arch.sie_block->prog0c & PROG_IN_SIE)
3376*4882a593Smuzhiyun cpu_relax();
3377*4882a593Smuzhiyun }
3378*4882a593Smuzhiyun
3379*4882a593Smuzhiyun /* Kick a guest cpu out of SIE to process a request synchronously */
kvm_s390_sync_request(int req,struct kvm_vcpu * vcpu)3380*4882a593Smuzhiyun void kvm_s390_sync_request(int req, struct kvm_vcpu *vcpu)
3381*4882a593Smuzhiyun {
3382*4882a593Smuzhiyun kvm_make_request(req, vcpu);
3383*4882a593Smuzhiyun kvm_s390_vcpu_request(vcpu);
3384*4882a593Smuzhiyun }
3385*4882a593Smuzhiyun
kvm_gmap_notifier(struct gmap * gmap,unsigned long start,unsigned long end)3386*4882a593Smuzhiyun static void kvm_gmap_notifier(struct gmap *gmap, unsigned long start,
3387*4882a593Smuzhiyun unsigned long end)
3388*4882a593Smuzhiyun {
3389*4882a593Smuzhiyun struct kvm *kvm = gmap->private;
3390*4882a593Smuzhiyun struct kvm_vcpu *vcpu;
3391*4882a593Smuzhiyun unsigned long prefix;
3392*4882a593Smuzhiyun int i;
3393*4882a593Smuzhiyun
3394*4882a593Smuzhiyun if (gmap_is_shadow(gmap))
3395*4882a593Smuzhiyun return;
3396*4882a593Smuzhiyun if (start >= 1UL << 31)
3397*4882a593Smuzhiyun /* We are only interested in prefix pages */
3398*4882a593Smuzhiyun return;
3399*4882a593Smuzhiyun kvm_for_each_vcpu(i, vcpu, kvm) {
3400*4882a593Smuzhiyun /* match against both prefix pages */
3401*4882a593Smuzhiyun prefix = kvm_s390_get_prefix(vcpu);
3402*4882a593Smuzhiyun if (prefix <= end && start <= prefix + 2*PAGE_SIZE - 1) {
3403*4882a593Smuzhiyun VCPU_EVENT(vcpu, 2, "gmap notifier for %lx-%lx",
3404*4882a593Smuzhiyun start, end);
3405*4882a593Smuzhiyun kvm_s390_sync_request(KVM_REQ_MMU_RELOAD, vcpu);
3406*4882a593Smuzhiyun }
3407*4882a593Smuzhiyun }
3408*4882a593Smuzhiyun }
3409*4882a593Smuzhiyun
kvm_arch_no_poll(struct kvm_vcpu * vcpu)3410*4882a593Smuzhiyun bool kvm_arch_no_poll(struct kvm_vcpu *vcpu)
3411*4882a593Smuzhiyun {
3412*4882a593Smuzhiyun /* do not poll with more than halt_poll_max_steal percent of steal time */
3413*4882a593Smuzhiyun if (S390_lowcore.avg_steal_timer * 100 / (TICK_USEC << 12) >=
3414*4882a593Smuzhiyun halt_poll_max_steal) {
3415*4882a593Smuzhiyun vcpu->stat.halt_no_poll_steal++;
3416*4882a593Smuzhiyun return true;
3417*4882a593Smuzhiyun }
3418*4882a593Smuzhiyun return false;
3419*4882a593Smuzhiyun }
3420*4882a593Smuzhiyun
kvm_arch_vcpu_should_kick(struct kvm_vcpu * vcpu)3421*4882a593Smuzhiyun int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu)
3422*4882a593Smuzhiyun {
3423*4882a593Smuzhiyun /* kvm common code refers to this, but never calls it */
3424*4882a593Smuzhiyun BUG();
3425*4882a593Smuzhiyun return 0;
3426*4882a593Smuzhiyun }
3427*4882a593Smuzhiyun
kvm_arch_vcpu_ioctl_get_one_reg(struct kvm_vcpu * vcpu,struct kvm_one_reg * reg)3428*4882a593Smuzhiyun static int kvm_arch_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu,
3429*4882a593Smuzhiyun struct kvm_one_reg *reg)
3430*4882a593Smuzhiyun {
3431*4882a593Smuzhiyun int r = -EINVAL;
3432*4882a593Smuzhiyun
3433*4882a593Smuzhiyun switch (reg->id) {
3434*4882a593Smuzhiyun case KVM_REG_S390_TODPR:
3435*4882a593Smuzhiyun r = put_user(vcpu->arch.sie_block->todpr,
3436*4882a593Smuzhiyun (u32 __user *)reg->addr);
3437*4882a593Smuzhiyun break;
3438*4882a593Smuzhiyun case KVM_REG_S390_EPOCHDIFF:
3439*4882a593Smuzhiyun r = put_user(vcpu->arch.sie_block->epoch,
3440*4882a593Smuzhiyun (u64 __user *)reg->addr);
3441*4882a593Smuzhiyun break;
3442*4882a593Smuzhiyun case KVM_REG_S390_CPU_TIMER:
3443*4882a593Smuzhiyun r = put_user(kvm_s390_get_cpu_timer(vcpu),
3444*4882a593Smuzhiyun (u64 __user *)reg->addr);
3445*4882a593Smuzhiyun break;
3446*4882a593Smuzhiyun case KVM_REG_S390_CLOCK_COMP:
3447*4882a593Smuzhiyun r = put_user(vcpu->arch.sie_block->ckc,
3448*4882a593Smuzhiyun (u64 __user *)reg->addr);
3449*4882a593Smuzhiyun break;
3450*4882a593Smuzhiyun case KVM_REG_S390_PFTOKEN:
3451*4882a593Smuzhiyun r = put_user(vcpu->arch.pfault_token,
3452*4882a593Smuzhiyun (u64 __user *)reg->addr);
3453*4882a593Smuzhiyun break;
3454*4882a593Smuzhiyun case KVM_REG_S390_PFCOMPARE:
3455*4882a593Smuzhiyun r = put_user(vcpu->arch.pfault_compare,
3456*4882a593Smuzhiyun (u64 __user *)reg->addr);
3457*4882a593Smuzhiyun break;
3458*4882a593Smuzhiyun case KVM_REG_S390_PFSELECT:
3459*4882a593Smuzhiyun r = put_user(vcpu->arch.pfault_select,
3460*4882a593Smuzhiyun (u64 __user *)reg->addr);
3461*4882a593Smuzhiyun break;
3462*4882a593Smuzhiyun case KVM_REG_S390_PP:
3463*4882a593Smuzhiyun r = put_user(vcpu->arch.sie_block->pp,
3464*4882a593Smuzhiyun (u64 __user *)reg->addr);
3465*4882a593Smuzhiyun break;
3466*4882a593Smuzhiyun case KVM_REG_S390_GBEA:
3467*4882a593Smuzhiyun r = put_user(vcpu->arch.sie_block->gbea,
3468*4882a593Smuzhiyun (u64 __user *)reg->addr);
3469*4882a593Smuzhiyun break;
3470*4882a593Smuzhiyun default:
3471*4882a593Smuzhiyun break;
3472*4882a593Smuzhiyun }
3473*4882a593Smuzhiyun
3474*4882a593Smuzhiyun return r;
3475*4882a593Smuzhiyun }
3476*4882a593Smuzhiyun
kvm_arch_vcpu_ioctl_set_one_reg(struct kvm_vcpu * vcpu,struct kvm_one_reg * reg)3477*4882a593Smuzhiyun static int kvm_arch_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu,
3478*4882a593Smuzhiyun struct kvm_one_reg *reg)
3479*4882a593Smuzhiyun {
3480*4882a593Smuzhiyun int r = -EINVAL;
3481*4882a593Smuzhiyun __u64 val;
3482*4882a593Smuzhiyun
3483*4882a593Smuzhiyun switch (reg->id) {
3484*4882a593Smuzhiyun case KVM_REG_S390_TODPR:
3485*4882a593Smuzhiyun r = get_user(vcpu->arch.sie_block->todpr,
3486*4882a593Smuzhiyun (u32 __user *)reg->addr);
3487*4882a593Smuzhiyun break;
3488*4882a593Smuzhiyun case KVM_REG_S390_EPOCHDIFF:
3489*4882a593Smuzhiyun r = get_user(vcpu->arch.sie_block->epoch,
3490*4882a593Smuzhiyun (u64 __user *)reg->addr);
3491*4882a593Smuzhiyun break;
3492*4882a593Smuzhiyun case KVM_REG_S390_CPU_TIMER:
3493*4882a593Smuzhiyun r = get_user(val, (u64 __user *)reg->addr);
3494*4882a593Smuzhiyun if (!r)
3495*4882a593Smuzhiyun kvm_s390_set_cpu_timer(vcpu, val);
3496*4882a593Smuzhiyun break;
3497*4882a593Smuzhiyun case KVM_REG_S390_CLOCK_COMP:
3498*4882a593Smuzhiyun r = get_user(vcpu->arch.sie_block->ckc,
3499*4882a593Smuzhiyun (u64 __user *)reg->addr);
3500*4882a593Smuzhiyun break;
3501*4882a593Smuzhiyun case KVM_REG_S390_PFTOKEN:
3502*4882a593Smuzhiyun r = get_user(vcpu->arch.pfault_token,
3503*4882a593Smuzhiyun (u64 __user *)reg->addr);
3504*4882a593Smuzhiyun if (vcpu->arch.pfault_token == KVM_S390_PFAULT_TOKEN_INVALID)
3505*4882a593Smuzhiyun kvm_clear_async_pf_completion_queue(vcpu);
3506*4882a593Smuzhiyun break;
3507*4882a593Smuzhiyun case KVM_REG_S390_PFCOMPARE:
3508*4882a593Smuzhiyun r = get_user(vcpu->arch.pfault_compare,
3509*4882a593Smuzhiyun (u64 __user *)reg->addr);
3510*4882a593Smuzhiyun break;
3511*4882a593Smuzhiyun case KVM_REG_S390_PFSELECT:
3512*4882a593Smuzhiyun r = get_user(vcpu->arch.pfault_select,
3513*4882a593Smuzhiyun (u64 __user *)reg->addr);
3514*4882a593Smuzhiyun break;
3515*4882a593Smuzhiyun case KVM_REG_S390_PP:
3516*4882a593Smuzhiyun r = get_user(vcpu->arch.sie_block->pp,
3517*4882a593Smuzhiyun (u64 __user *)reg->addr);
3518*4882a593Smuzhiyun break;
3519*4882a593Smuzhiyun case KVM_REG_S390_GBEA:
3520*4882a593Smuzhiyun r = get_user(vcpu->arch.sie_block->gbea,
3521*4882a593Smuzhiyun (u64 __user *)reg->addr);
3522*4882a593Smuzhiyun break;
3523*4882a593Smuzhiyun default:
3524*4882a593Smuzhiyun break;
3525*4882a593Smuzhiyun }
3526*4882a593Smuzhiyun
3527*4882a593Smuzhiyun return r;
3528*4882a593Smuzhiyun }
3529*4882a593Smuzhiyun
kvm_arch_vcpu_ioctl_normal_reset(struct kvm_vcpu * vcpu)3530*4882a593Smuzhiyun static void kvm_arch_vcpu_ioctl_normal_reset(struct kvm_vcpu *vcpu)
3531*4882a593Smuzhiyun {
3532*4882a593Smuzhiyun vcpu->arch.sie_block->gpsw.mask &= ~PSW_MASK_RI;
3533*4882a593Smuzhiyun vcpu->arch.pfault_token = KVM_S390_PFAULT_TOKEN_INVALID;
3534*4882a593Smuzhiyun memset(vcpu->run->s.regs.riccb, 0, sizeof(vcpu->run->s.regs.riccb));
3535*4882a593Smuzhiyun
3536*4882a593Smuzhiyun kvm_clear_async_pf_completion_queue(vcpu);
3537*4882a593Smuzhiyun if (!kvm_s390_user_cpu_state_ctrl(vcpu->kvm))
3538*4882a593Smuzhiyun kvm_s390_vcpu_stop(vcpu);
3539*4882a593Smuzhiyun kvm_s390_clear_local_irqs(vcpu);
3540*4882a593Smuzhiyun }
3541*4882a593Smuzhiyun
kvm_arch_vcpu_ioctl_initial_reset(struct kvm_vcpu * vcpu)3542*4882a593Smuzhiyun static void kvm_arch_vcpu_ioctl_initial_reset(struct kvm_vcpu *vcpu)
3543*4882a593Smuzhiyun {
3544*4882a593Smuzhiyun /* Initial reset is a superset of the normal reset */
3545*4882a593Smuzhiyun kvm_arch_vcpu_ioctl_normal_reset(vcpu);
3546*4882a593Smuzhiyun
3547*4882a593Smuzhiyun /*
3548*4882a593Smuzhiyun * This equals initial cpu reset in pop, but we don't switch to ESA.
3549*4882a593Smuzhiyun * We do not only reset the internal data, but also ...
3550*4882a593Smuzhiyun */
3551*4882a593Smuzhiyun vcpu->arch.sie_block->gpsw.mask = 0;
3552*4882a593Smuzhiyun vcpu->arch.sie_block->gpsw.addr = 0;
3553*4882a593Smuzhiyun kvm_s390_set_prefix(vcpu, 0);
3554*4882a593Smuzhiyun kvm_s390_set_cpu_timer(vcpu, 0);
3555*4882a593Smuzhiyun vcpu->arch.sie_block->ckc = 0;
3556*4882a593Smuzhiyun memset(vcpu->arch.sie_block->gcr, 0, sizeof(vcpu->arch.sie_block->gcr));
3557*4882a593Smuzhiyun vcpu->arch.sie_block->gcr[0] = CR0_INITIAL_MASK;
3558*4882a593Smuzhiyun vcpu->arch.sie_block->gcr[14] = CR14_INITIAL_MASK;
3559*4882a593Smuzhiyun
3560*4882a593Smuzhiyun /* ... the data in sync regs */
3561*4882a593Smuzhiyun memset(vcpu->run->s.regs.crs, 0, sizeof(vcpu->run->s.regs.crs));
3562*4882a593Smuzhiyun vcpu->run->s.regs.ckc = 0;
3563*4882a593Smuzhiyun vcpu->run->s.regs.crs[0] = CR0_INITIAL_MASK;
3564*4882a593Smuzhiyun vcpu->run->s.regs.crs[14] = CR14_INITIAL_MASK;
3565*4882a593Smuzhiyun vcpu->run->psw_addr = 0;
3566*4882a593Smuzhiyun vcpu->run->psw_mask = 0;
3567*4882a593Smuzhiyun vcpu->run->s.regs.todpr = 0;
3568*4882a593Smuzhiyun vcpu->run->s.regs.cputm = 0;
3569*4882a593Smuzhiyun vcpu->run->s.regs.ckc = 0;
3570*4882a593Smuzhiyun vcpu->run->s.regs.pp = 0;
3571*4882a593Smuzhiyun vcpu->run->s.regs.gbea = 1;
3572*4882a593Smuzhiyun vcpu->run->s.regs.fpc = 0;
3573*4882a593Smuzhiyun /*
3574*4882a593Smuzhiyun * Do not reset these registers in the protected case, as some of
3575*4882a593Smuzhiyun * them are overlayed and they are not accessible in this case
3576*4882a593Smuzhiyun * anyway.
3577*4882a593Smuzhiyun */
3578*4882a593Smuzhiyun if (!kvm_s390_pv_cpu_is_protected(vcpu)) {
3579*4882a593Smuzhiyun vcpu->arch.sie_block->gbea = 1;
3580*4882a593Smuzhiyun vcpu->arch.sie_block->pp = 0;
3581*4882a593Smuzhiyun vcpu->arch.sie_block->fpf &= ~FPF_BPBC;
3582*4882a593Smuzhiyun vcpu->arch.sie_block->todpr = 0;
3583*4882a593Smuzhiyun }
3584*4882a593Smuzhiyun }
3585*4882a593Smuzhiyun
kvm_arch_vcpu_ioctl_clear_reset(struct kvm_vcpu * vcpu)3586*4882a593Smuzhiyun static void kvm_arch_vcpu_ioctl_clear_reset(struct kvm_vcpu *vcpu)
3587*4882a593Smuzhiyun {
3588*4882a593Smuzhiyun struct kvm_sync_regs *regs = &vcpu->run->s.regs;
3589*4882a593Smuzhiyun
3590*4882a593Smuzhiyun /* Clear reset is a superset of the initial reset */
3591*4882a593Smuzhiyun kvm_arch_vcpu_ioctl_initial_reset(vcpu);
3592*4882a593Smuzhiyun
3593*4882a593Smuzhiyun memset(®s->gprs, 0, sizeof(regs->gprs));
3594*4882a593Smuzhiyun memset(®s->vrs, 0, sizeof(regs->vrs));
3595*4882a593Smuzhiyun memset(®s->acrs, 0, sizeof(regs->acrs));
3596*4882a593Smuzhiyun memset(®s->gscb, 0, sizeof(regs->gscb));
3597*4882a593Smuzhiyun
3598*4882a593Smuzhiyun regs->etoken = 0;
3599*4882a593Smuzhiyun regs->etoken_extension = 0;
3600*4882a593Smuzhiyun }
3601*4882a593Smuzhiyun
kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu * vcpu,struct kvm_regs * regs)3602*4882a593Smuzhiyun int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
3603*4882a593Smuzhiyun {
3604*4882a593Smuzhiyun vcpu_load(vcpu);
3605*4882a593Smuzhiyun memcpy(&vcpu->run->s.regs.gprs, ®s->gprs, sizeof(regs->gprs));
3606*4882a593Smuzhiyun vcpu_put(vcpu);
3607*4882a593Smuzhiyun return 0;
3608*4882a593Smuzhiyun }
3609*4882a593Smuzhiyun
kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu * vcpu,struct kvm_regs * regs)3610*4882a593Smuzhiyun int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
3611*4882a593Smuzhiyun {
3612*4882a593Smuzhiyun vcpu_load(vcpu);
3613*4882a593Smuzhiyun memcpy(®s->gprs, &vcpu->run->s.regs.gprs, sizeof(regs->gprs));
3614*4882a593Smuzhiyun vcpu_put(vcpu);
3615*4882a593Smuzhiyun return 0;
3616*4882a593Smuzhiyun }
3617*4882a593Smuzhiyun
kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu * vcpu,struct kvm_sregs * sregs)3618*4882a593Smuzhiyun int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
3619*4882a593Smuzhiyun struct kvm_sregs *sregs)
3620*4882a593Smuzhiyun {
3621*4882a593Smuzhiyun vcpu_load(vcpu);
3622*4882a593Smuzhiyun
3623*4882a593Smuzhiyun memcpy(&vcpu->run->s.regs.acrs, &sregs->acrs, sizeof(sregs->acrs));
3624*4882a593Smuzhiyun memcpy(&vcpu->arch.sie_block->gcr, &sregs->crs, sizeof(sregs->crs));
3625*4882a593Smuzhiyun
3626*4882a593Smuzhiyun vcpu_put(vcpu);
3627*4882a593Smuzhiyun return 0;
3628*4882a593Smuzhiyun }
3629*4882a593Smuzhiyun
kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu * vcpu,struct kvm_sregs * sregs)3630*4882a593Smuzhiyun int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,
3631*4882a593Smuzhiyun struct kvm_sregs *sregs)
3632*4882a593Smuzhiyun {
3633*4882a593Smuzhiyun vcpu_load(vcpu);
3634*4882a593Smuzhiyun
3635*4882a593Smuzhiyun memcpy(&sregs->acrs, &vcpu->run->s.regs.acrs, sizeof(sregs->acrs));
3636*4882a593Smuzhiyun memcpy(&sregs->crs, &vcpu->arch.sie_block->gcr, sizeof(sregs->crs));
3637*4882a593Smuzhiyun
3638*4882a593Smuzhiyun vcpu_put(vcpu);
3639*4882a593Smuzhiyun return 0;
3640*4882a593Smuzhiyun }
3641*4882a593Smuzhiyun
kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu * vcpu,struct kvm_fpu * fpu)3642*4882a593Smuzhiyun int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
3643*4882a593Smuzhiyun {
3644*4882a593Smuzhiyun int ret = 0;
3645*4882a593Smuzhiyun
3646*4882a593Smuzhiyun vcpu_load(vcpu);
3647*4882a593Smuzhiyun
3648*4882a593Smuzhiyun if (test_fp_ctl(fpu->fpc)) {
3649*4882a593Smuzhiyun ret = -EINVAL;
3650*4882a593Smuzhiyun goto out;
3651*4882a593Smuzhiyun }
3652*4882a593Smuzhiyun vcpu->run->s.regs.fpc = fpu->fpc;
3653*4882a593Smuzhiyun if (MACHINE_HAS_VX)
3654*4882a593Smuzhiyun convert_fp_to_vx((__vector128 *) vcpu->run->s.regs.vrs,
3655*4882a593Smuzhiyun (freg_t *) fpu->fprs);
3656*4882a593Smuzhiyun else
3657*4882a593Smuzhiyun memcpy(vcpu->run->s.regs.fprs, &fpu->fprs, sizeof(fpu->fprs));
3658*4882a593Smuzhiyun
3659*4882a593Smuzhiyun out:
3660*4882a593Smuzhiyun vcpu_put(vcpu);
3661*4882a593Smuzhiyun return ret;
3662*4882a593Smuzhiyun }
3663*4882a593Smuzhiyun
kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu * vcpu,struct kvm_fpu * fpu)3664*4882a593Smuzhiyun int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
3665*4882a593Smuzhiyun {
3666*4882a593Smuzhiyun vcpu_load(vcpu);
3667*4882a593Smuzhiyun
3668*4882a593Smuzhiyun /* make sure we have the latest values */
3669*4882a593Smuzhiyun save_fpu_regs();
3670*4882a593Smuzhiyun if (MACHINE_HAS_VX)
3671*4882a593Smuzhiyun convert_vx_to_fp((freg_t *) fpu->fprs,
3672*4882a593Smuzhiyun (__vector128 *) vcpu->run->s.regs.vrs);
3673*4882a593Smuzhiyun else
3674*4882a593Smuzhiyun memcpy(fpu->fprs, vcpu->run->s.regs.fprs, sizeof(fpu->fprs));
3675*4882a593Smuzhiyun fpu->fpc = vcpu->run->s.regs.fpc;
3676*4882a593Smuzhiyun
3677*4882a593Smuzhiyun vcpu_put(vcpu);
3678*4882a593Smuzhiyun return 0;
3679*4882a593Smuzhiyun }
3680*4882a593Smuzhiyun
kvm_arch_vcpu_ioctl_set_initial_psw(struct kvm_vcpu * vcpu,psw_t psw)3681*4882a593Smuzhiyun static int kvm_arch_vcpu_ioctl_set_initial_psw(struct kvm_vcpu *vcpu, psw_t psw)
3682*4882a593Smuzhiyun {
3683*4882a593Smuzhiyun int rc = 0;
3684*4882a593Smuzhiyun
3685*4882a593Smuzhiyun if (!is_vcpu_stopped(vcpu))
3686*4882a593Smuzhiyun rc = -EBUSY;
3687*4882a593Smuzhiyun else {
3688*4882a593Smuzhiyun vcpu->run->psw_mask = psw.mask;
3689*4882a593Smuzhiyun vcpu->run->psw_addr = psw.addr;
3690*4882a593Smuzhiyun }
3691*4882a593Smuzhiyun return rc;
3692*4882a593Smuzhiyun }
3693*4882a593Smuzhiyun
kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu * vcpu,struct kvm_translation * tr)3694*4882a593Smuzhiyun int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu,
3695*4882a593Smuzhiyun struct kvm_translation *tr)
3696*4882a593Smuzhiyun {
3697*4882a593Smuzhiyun return -EINVAL; /* not implemented yet */
3698*4882a593Smuzhiyun }
3699*4882a593Smuzhiyun
3700*4882a593Smuzhiyun #define VALID_GUESTDBG_FLAGS (KVM_GUESTDBG_SINGLESTEP | \
3701*4882a593Smuzhiyun KVM_GUESTDBG_USE_HW_BP | \
3702*4882a593Smuzhiyun KVM_GUESTDBG_ENABLE)
3703*4882a593Smuzhiyun
kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu * vcpu,struct kvm_guest_debug * dbg)3704*4882a593Smuzhiyun int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
3705*4882a593Smuzhiyun struct kvm_guest_debug *dbg)
3706*4882a593Smuzhiyun {
3707*4882a593Smuzhiyun int rc = 0;
3708*4882a593Smuzhiyun
3709*4882a593Smuzhiyun vcpu_load(vcpu);
3710*4882a593Smuzhiyun
3711*4882a593Smuzhiyun vcpu->guest_debug = 0;
3712*4882a593Smuzhiyun kvm_s390_clear_bp_data(vcpu);
3713*4882a593Smuzhiyun
3714*4882a593Smuzhiyun if (dbg->control & ~VALID_GUESTDBG_FLAGS) {
3715*4882a593Smuzhiyun rc = -EINVAL;
3716*4882a593Smuzhiyun goto out;
3717*4882a593Smuzhiyun }
3718*4882a593Smuzhiyun if (!sclp.has_gpere) {
3719*4882a593Smuzhiyun rc = -EINVAL;
3720*4882a593Smuzhiyun goto out;
3721*4882a593Smuzhiyun }
3722*4882a593Smuzhiyun
3723*4882a593Smuzhiyun if (dbg->control & KVM_GUESTDBG_ENABLE) {
3724*4882a593Smuzhiyun vcpu->guest_debug = dbg->control;
3725*4882a593Smuzhiyun /* enforce guest PER */
3726*4882a593Smuzhiyun kvm_s390_set_cpuflags(vcpu, CPUSTAT_P);
3727*4882a593Smuzhiyun
3728*4882a593Smuzhiyun if (dbg->control & KVM_GUESTDBG_USE_HW_BP)
3729*4882a593Smuzhiyun rc = kvm_s390_import_bp_data(vcpu, dbg);
3730*4882a593Smuzhiyun } else {
3731*4882a593Smuzhiyun kvm_s390_clear_cpuflags(vcpu, CPUSTAT_P);
3732*4882a593Smuzhiyun vcpu->arch.guestdbg.last_bp = 0;
3733*4882a593Smuzhiyun }
3734*4882a593Smuzhiyun
3735*4882a593Smuzhiyun if (rc) {
3736*4882a593Smuzhiyun vcpu->guest_debug = 0;
3737*4882a593Smuzhiyun kvm_s390_clear_bp_data(vcpu);
3738*4882a593Smuzhiyun kvm_s390_clear_cpuflags(vcpu, CPUSTAT_P);
3739*4882a593Smuzhiyun }
3740*4882a593Smuzhiyun
3741*4882a593Smuzhiyun out:
3742*4882a593Smuzhiyun vcpu_put(vcpu);
3743*4882a593Smuzhiyun return rc;
3744*4882a593Smuzhiyun }
3745*4882a593Smuzhiyun
kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu * vcpu,struct kvm_mp_state * mp_state)3746*4882a593Smuzhiyun int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu,
3747*4882a593Smuzhiyun struct kvm_mp_state *mp_state)
3748*4882a593Smuzhiyun {
3749*4882a593Smuzhiyun int ret;
3750*4882a593Smuzhiyun
3751*4882a593Smuzhiyun vcpu_load(vcpu);
3752*4882a593Smuzhiyun
3753*4882a593Smuzhiyun /* CHECK_STOP and LOAD are not supported yet */
3754*4882a593Smuzhiyun ret = is_vcpu_stopped(vcpu) ? KVM_MP_STATE_STOPPED :
3755*4882a593Smuzhiyun KVM_MP_STATE_OPERATING;
3756*4882a593Smuzhiyun
3757*4882a593Smuzhiyun vcpu_put(vcpu);
3758*4882a593Smuzhiyun return ret;
3759*4882a593Smuzhiyun }
3760*4882a593Smuzhiyun
kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu * vcpu,struct kvm_mp_state * mp_state)3761*4882a593Smuzhiyun int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,
3762*4882a593Smuzhiyun struct kvm_mp_state *mp_state)
3763*4882a593Smuzhiyun {
3764*4882a593Smuzhiyun int rc = 0;
3765*4882a593Smuzhiyun
3766*4882a593Smuzhiyun vcpu_load(vcpu);
3767*4882a593Smuzhiyun
3768*4882a593Smuzhiyun /* user space knows about this interface - let it control the state */
3769*4882a593Smuzhiyun vcpu->kvm->arch.user_cpu_state_ctrl = 1;
3770*4882a593Smuzhiyun
3771*4882a593Smuzhiyun switch (mp_state->mp_state) {
3772*4882a593Smuzhiyun case KVM_MP_STATE_STOPPED:
3773*4882a593Smuzhiyun rc = kvm_s390_vcpu_stop(vcpu);
3774*4882a593Smuzhiyun break;
3775*4882a593Smuzhiyun case KVM_MP_STATE_OPERATING:
3776*4882a593Smuzhiyun rc = kvm_s390_vcpu_start(vcpu);
3777*4882a593Smuzhiyun break;
3778*4882a593Smuzhiyun case KVM_MP_STATE_LOAD:
3779*4882a593Smuzhiyun if (!kvm_s390_pv_cpu_is_protected(vcpu)) {
3780*4882a593Smuzhiyun rc = -ENXIO;
3781*4882a593Smuzhiyun break;
3782*4882a593Smuzhiyun }
3783*4882a593Smuzhiyun rc = kvm_s390_pv_set_cpu_state(vcpu, PV_CPU_STATE_OPR_LOAD);
3784*4882a593Smuzhiyun break;
3785*4882a593Smuzhiyun case KVM_MP_STATE_CHECK_STOP:
3786*4882a593Smuzhiyun fallthrough; /* CHECK_STOP and LOAD are not supported yet */
3787*4882a593Smuzhiyun default:
3788*4882a593Smuzhiyun rc = -ENXIO;
3789*4882a593Smuzhiyun }
3790*4882a593Smuzhiyun
3791*4882a593Smuzhiyun vcpu_put(vcpu);
3792*4882a593Smuzhiyun return rc;
3793*4882a593Smuzhiyun }
3794*4882a593Smuzhiyun
ibs_enabled(struct kvm_vcpu * vcpu)3795*4882a593Smuzhiyun static bool ibs_enabled(struct kvm_vcpu *vcpu)
3796*4882a593Smuzhiyun {
3797*4882a593Smuzhiyun return kvm_s390_test_cpuflags(vcpu, CPUSTAT_IBS);
3798*4882a593Smuzhiyun }
3799*4882a593Smuzhiyun
kvm_s390_handle_requests(struct kvm_vcpu * vcpu)3800*4882a593Smuzhiyun static int kvm_s390_handle_requests(struct kvm_vcpu *vcpu)
3801*4882a593Smuzhiyun {
3802*4882a593Smuzhiyun retry:
3803*4882a593Smuzhiyun kvm_s390_vcpu_request_handled(vcpu);
3804*4882a593Smuzhiyun if (!kvm_request_pending(vcpu))
3805*4882a593Smuzhiyun return 0;
3806*4882a593Smuzhiyun /*
3807*4882a593Smuzhiyun * We use MMU_RELOAD just to re-arm the ipte notifier for the
3808*4882a593Smuzhiyun * guest prefix page. gmap_mprotect_notify will wait on the ptl lock.
3809*4882a593Smuzhiyun * This ensures that the ipte instruction for this request has
3810*4882a593Smuzhiyun * already finished. We might race against a second unmapper that
3811*4882a593Smuzhiyun * wants to set the blocking bit. Lets just retry the request loop.
3812*4882a593Smuzhiyun */
3813*4882a593Smuzhiyun if (kvm_check_request(KVM_REQ_MMU_RELOAD, vcpu)) {
3814*4882a593Smuzhiyun int rc;
3815*4882a593Smuzhiyun rc = gmap_mprotect_notify(vcpu->arch.gmap,
3816*4882a593Smuzhiyun kvm_s390_get_prefix(vcpu),
3817*4882a593Smuzhiyun PAGE_SIZE * 2, PROT_WRITE);
3818*4882a593Smuzhiyun if (rc) {
3819*4882a593Smuzhiyun kvm_make_request(KVM_REQ_MMU_RELOAD, vcpu);
3820*4882a593Smuzhiyun return rc;
3821*4882a593Smuzhiyun }
3822*4882a593Smuzhiyun goto retry;
3823*4882a593Smuzhiyun }
3824*4882a593Smuzhiyun
3825*4882a593Smuzhiyun if (kvm_check_request(KVM_REQ_TLB_FLUSH, vcpu)) {
3826*4882a593Smuzhiyun vcpu->arch.sie_block->ihcpu = 0xffff;
3827*4882a593Smuzhiyun goto retry;
3828*4882a593Smuzhiyun }
3829*4882a593Smuzhiyun
3830*4882a593Smuzhiyun if (kvm_check_request(KVM_REQ_ENABLE_IBS, vcpu)) {
3831*4882a593Smuzhiyun if (!ibs_enabled(vcpu)) {
3832*4882a593Smuzhiyun trace_kvm_s390_enable_disable_ibs(vcpu->vcpu_id, 1);
3833*4882a593Smuzhiyun kvm_s390_set_cpuflags(vcpu, CPUSTAT_IBS);
3834*4882a593Smuzhiyun }
3835*4882a593Smuzhiyun goto retry;
3836*4882a593Smuzhiyun }
3837*4882a593Smuzhiyun
3838*4882a593Smuzhiyun if (kvm_check_request(KVM_REQ_DISABLE_IBS, vcpu)) {
3839*4882a593Smuzhiyun if (ibs_enabled(vcpu)) {
3840*4882a593Smuzhiyun trace_kvm_s390_enable_disable_ibs(vcpu->vcpu_id, 0);
3841*4882a593Smuzhiyun kvm_s390_clear_cpuflags(vcpu, CPUSTAT_IBS);
3842*4882a593Smuzhiyun }
3843*4882a593Smuzhiyun goto retry;
3844*4882a593Smuzhiyun }
3845*4882a593Smuzhiyun
3846*4882a593Smuzhiyun if (kvm_check_request(KVM_REQ_ICPT_OPEREXC, vcpu)) {
3847*4882a593Smuzhiyun vcpu->arch.sie_block->ictl |= ICTL_OPEREXC;
3848*4882a593Smuzhiyun goto retry;
3849*4882a593Smuzhiyun }
3850*4882a593Smuzhiyun
3851*4882a593Smuzhiyun if (kvm_check_request(KVM_REQ_START_MIGRATION, vcpu)) {
3852*4882a593Smuzhiyun /*
3853*4882a593Smuzhiyun * Disable CMM virtualization; we will emulate the ESSA
3854*4882a593Smuzhiyun * instruction manually, in order to provide additional
3855*4882a593Smuzhiyun * functionalities needed for live migration.
3856*4882a593Smuzhiyun */
3857*4882a593Smuzhiyun vcpu->arch.sie_block->ecb2 &= ~ECB2_CMMA;
3858*4882a593Smuzhiyun goto retry;
3859*4882a593Smuzhiyun }
3860*4882a593Smuzhiyun
3861*4882a593Smuzhiyun if (kvm_check_request(KVM_REQ_STOP_MIGRATION, vcpu)) {
3862*4882a593Smuzhiyun /*
3863*4882a593Smuzhiyun * Re-enable CMM virtualization if CMMA is available and
3864*4882a593Smuzhiyun * CMM has been used.
3865*4882a593Smuzhiyun */
3866*4882a593Smuzhiyun if ((vcpu->kvm->arch.use_cmma) &&
3867*4882a593Smuzhiyun (vcpu->kvm->mm->context.uses_cmm))
3868*4882a593Smuzhiyun vcpu->arch.sie_block->ecb2 |= ECB2_CMMA;
3869*4882a593Smuzhiyun goto retry;
3870*4882a593Smuzhiyun }
3871*4882a593Smuzhiyun
3872*4882a593Smuzhiyun /* nothing to do, just clear the request */
3873*4882a593Smuzhiyun kvm_clear_request(KVM_REQ_UNHALT, vcpu);
3874*4882a593Smuzhiyun /* we left the vsie handler, nothing to do, just clear the request */
3875*4882a593Smuzhiyun kvm_clear_request(KVM_REQ_VSIE_RESTART, vcpu);
3876*4882a593Smuzhiyun
3877*4882a593Smuzhiyun return 0;
3878*4882a593Smuzhiyun }
3879*4882a593Smuzhiyun
__kvm_s390_set_tod_clock(struct kvm * kvm,const struct kvm_s390_vm_tod_clock * gtod)3880*4882a593Smuzhiyun static void __kvm_s390_set_tod_clock(struct kvm *kvm, const struct kvm_s390_vm_tod_clock *gtod)
3881*4882a593Smuzhiyun {
3882*4882a593Smuzhiyun struct kvm_vcpu *vcpu;
3883*4882a593Smuzhiyun struct kvm_s390_tod_clock_ext htod;
3884*4882a593Smuzhiyun int i;
3885*4882a593Smuzhiyun
3886*4882a593Smuzhiyun preempt_disable();
3887*4882a593Smuzhiyun
3888*4882a593Smuzhiyun get_tod_clock_ext((char *)&htod);
3889*4882a593Smuzhiyun
3890*4882a593Smuzhiyun kvm->arch.epoch = gtod->tod - htod.tod;
3891*4882a593Smuzhiyun kvm->arch.epdx = 0;
3892*4882a593Smuzhiyun if (test_kvm_facility(kvm, 139)) {
3893*4882a593Smuzhiyun kvm->arch.epdx = gtod->epoch_idx - htod.epoch_idx;
3894*4882a593Smuzhiyun if (kvm->arch.epoch > gtod->tod)
3895*4882a593Smuzhiyun kvm->arch.epdx -= 1;
3896*4882a593Smuzhiyun }
3897*4882a593Smuzhiyun
3898*4882a593Smuzhiyun kvm_s390_vcpu_block_all(kvm);
3899*4882a593Smuzhiyun kvm_for_each_vcpu(i, vcpu, kvm) {
3900*4882a593Smuzhiyun vcpu->arch.sie_block->epoch = kvm->arch.epoch;
3901*4882a593Smuzhiyun vcpu->arch.sie_block->epdx = kvm->arch.epdx;
3902*4882a593Smuzhiyun }
3903*4882a593Smuzhiyun
3904*4882a593Smuzhiyun kvm_s390_vcpu_unblock_all(kvm);
3905*4882a593Smuzhiyun preempt_enable();
3906*4882a593Smuzhiyun }
3907*4882a593Smuzhiyun
kvm_s390_try_set_tod_clock(struct kvm * kvm,const struct kvm_s390_vm_tod_clock * gtod)3908*4882a593Smuzhiyun int kvm_s390_try_set_tod_clock(struct kvm *kvm, const struct kvm_s390_vm_tod_clock *gtod)
3909*4882a593Smuzhiyun {
3910*4882a593Smuzhiyun if (!mutex_trylock(&kvm->lock))
3911*4882a593Smuzhiyun return 0;
3912*4882a593Smuzhiyun __kvm_s390_set_tod_clock(kvm, gtod);
3913*4882a593Smuzhiyun mutex_unlock(&kvm->lock);
3914*4882a593Smuzhiyun return 1;
3915*4882a593Smuzhiyun }
3916*4882a593Smuzhiyun
3917*4882a593Smuzhiyun /**
3918*4882a593Smuzhiyun * kvm_arch_fault_in_page - fault-in guest page if necessary
3919*4882a593Smuzhiyun * @vcpu: The corresponding virtual cpu
3920*4882a593Smuzhiyun * @gpa: Guest physical address
3921*4882a593Smuzhiyun * @writable: Whether the page should be writable or not
3922*4882a593Smuzhiyun *
3923*4882a593Smuzhiyun * Make sure that a guest page has been faulted-in on the host.
3924*4882a593Smuzhiyun *
3925*4882a593Smuzhiyun * Return: Zero on success, negative error code otherwise.
3926*4882a593Smuzhiyun */
kvm_arch_fault_in_page(struct kvm_vcpu * vcpu,gpa_t gpa,int writable)3927*4882a593Smuzhiyun long kvm_arch_fault_in_page(struct kvm_vcpu *vcpu, gpa_t gpa, int writable)
3928*4882a593Smuzhiyun {
3929*4882a593Smuzhiyun return gmap_fault(vcpu->arch.gmap, gpa,
3930*4882a593Smuzhiyun writable ? FAULT_FLAG_WRITE : 0);
3931*4882a593Smuzhiyun }
3932*4882a593Smuzhiyun
__kvm_inject_pfault_token(struct kvm_vcpu * vcpu,bool start_token,unsigned long token)3933*4882a593Smuzhiyun static void __kvm_inject_pfault_token(struct kvm_vcpu *vcpu, bool start_token,
3934*4882a593Smuzhiyun unsigned long token)
3935*4882a593Smuzhiyun {
3936*4882a593Smuzhiyun struct kvm_s390_interrupt inti;
3937*4882a593Smuzhiyun struct kvm_s390_irq irq;
3938*4882a593Smuzhiyun
3939*4882a593Smuzhiyun if (start_token) {
3940*4882a593Smuzhiyun irq.u.ext.ext_params2 = token;
3941*4882a593Smuzhiyun irq.type = KVM_S390_INT_PFAULT_INIT;
3942*4882a593Smuzhiyun WARN_ON_ONCE(kvm_s390_inject_vcpu(vcpu, &irq));
3943*4882a593Smuzhiyun } else {
3944*4882a593Smuzhiyun inti.type = KVM_S390_INT_PFAULT_DONE;
3945*4882a593Smuzhiyun inti.parm64 = token;
3946*4882a593Smuzhiyun WARN_ON_ONCE(kvm_s390_inject_vm(vcpu->kvm, &inti));
3947*4882a593Smuzhiyun }
3948*4882a593Smuzhiyun }
3949*4882a593Smuzhiyun
kvm_arch_async_page_not_present(struct kvm_vcpu * vcpu,struct kvm_async_pf * work)3950*4882a593Smuzhiyun bool kvm_arch_async_page_not_present(struct kvm_vcpu *vcpu,
3951*4882a593Smuzhiyun struct kvm_async_pf *work)
3952*4882a593Smuzhiyun {
3953*4882a593Smuzhiyun trace_kvm_s390_pfault_init(vcpu, work->arch.pfault_token);
3954*4882a593Smuzhiyun __kvm_inject_pfault_token(vcpu, true, work->arch.pfault_token);
3955*4882a593Smuzhiyun
3956*4882a593Smuzhiyun return true;
3957*4882a593Smuzhiyun }
3958*4882a593Smuzhiyun
kvm_arch_async_page_present(struct kvm_vcpu * vcpu,struct kvm_async_pf * work)3959*4882a593Smuzhiyun void kvm_arch_async_page_present(struct kvm_vcpu *vcpu,
3960*4882a593Smuzhiyun struct kvm_async_pf *work)
3961*4882a593Smuzhiyun {
3962*4882a593Smuzhiyun trace_kvm_s390_pfault_done(vcpu, work->arch.pfault_token);
3963*4882a593Smuzhiyun __kvm_inject_pfault_token(vcpu, false, work->arch.pfault_token);
3964*4882a593Smuzhiyun }
3965*4882a593Smuzhiyun
kvm_arch_async_page_ready(struct kvm_vcpu * vcpu,struct kvm_async_pf * work)3966*4882a593Smuzhiyun void kvm_arch_async_page_ready(struct kvm_vcpu *vcpu,
3967*4882a593Smuzhiyun struct kvm_async_pf *work)
3968*4882a593Smuzhiyun {
3969*4882a593Smuzhiyun /* s390 will always inject the page directly */
3970*4882a593Smuzhiyun }
3971*4882a593Smuzhiyun
kvm_arch_can_dequeue_async_page_present(struct kvm_vcpu * vcpu)3972*4882a593Smuzhiyun bool kvm_arch_can_dequeue_async_page_present(struct kvm_vcpu *vcpu)
3973*4882a593Smuzhiyun {
3974*4882a593Smuzhiyun /*
3975*4882a593Smuzhiyun * s390 will always inject the page directly,
3976*4882a593Smuzhiyun * but we still want check_async_completion to cleanup
3977*4882a593Smuzhiyun */
3978*4882a593Smuzhiyun return true;
3979*4882a593Smuzhiyun }
3980*4882a593Smuzhiyun
kvm_arch_setup_async_pf(struct kvm_vcpu * vcpu)3981*4882a593Smuzhiyun static bool kvm_arch_setup_async_pf(struct kvm_vcpu *vcpu)
3982*4882a593Smuzhiyun {
3983*4882a593Smuzhiyun hva_t hva;
3984*4882a593Smuzhiyun struct kvm_arch_async_pf arch;
3985*4882a593Smuzhiyun
3986*4882a593Smuzhiyun if (vcpu->arch.pfault_token == KVM_S390_PFAULT_TOKEN_INVALID)
3987*4882a593Smuzhiyun return false;
3988*4882a593Smuzhiyun if ((vcpu->arch.sie_block->gpsw.mask & vcpu->arch.pfault_select) !=
3989*4882a593Smuzhiyun vcpu->arch.pfault_compare)
3990*4882a593Smuzhiyun return false;
3991*4882a593Smuzhiyun if (psw_extint_disabled(vcpu))
3992*4882a593Smuzhiyun return false;
3993*4882a593Smuzhiyun if (kvm_s390_vcpu_has_irq(vcpu, 0))
3994*4882a593Smuzhiyun return false;
3995*4882a593Smuzhiyun if (!(vcpu->arch.sie_block->gcr[0] & CR0_SERVICE_SIGNAL_SUBMASK))
3996*4882a593Smuzhiyun return false;
3997*4882a593Smuzhiyun if (!vcpu->arch.gmap->pfault_enabled)
3998*4882a593Smuzhiyun return false;
3999*4882a593Smuzhiyun
4000*4882a593Smuzhiyun hva = gfn_to_hva(vcpu->kvm, gpa_to_gfn(current->thread.gmap_addr));
4001*4882a593Smuzhiyun hva += current->thread.gmap_addr & ~PAGE_MASK;
4002*4882a593Smuzhiyun if (read_guest_real(vcpu, vcpu->arch.pfault_token, &arch.pfault_token, 8))
4003*4882a593Smuzhiyun return false;
4004*4882a593Smuzhiyun
4005*4882a593Smuzhiyun return kvm_setup_async_pf(vcpu, current->thread.gmap_addr, hva, &arch);
4006*4882a593Smuzhiyun }
4007*4882a593Smuzhiyun
vcpu_pre_run(struct kvm_vcpu * vcpu)4008*4882a593Smuzhiyun static int vcpu_pre_run(struct kvm_vcpu *vcpu)
4009*4882a593Smuzhiyun {
4010*4882a593Smuzhiyun int rc, cpuflags;
4011*4882a593Smuzhiyun
4012*4882a593Smuzhiyun /*
4013*4882a593Smuzhiyun * On s390 notifications for arriving pages will be delivered directly
4014*4882a593Smuzhiyun * to the guest but the house keeping for completed pfaults is
4015*4882a593Smuzhiyun * handled outside the worker.
4016*4882a593Smuzhiyun */
4017*4882a593Smuzhiyun kvm_check_async_pf_completion(vcpu);
4018*4882a593Smuzhiyun
4019*4882a593Smuzhiyun vcpu->arch.sie_block->gg14 = vcpu->run->s.regs.gprs[14];
4020*4882a593Smuzhiyun vcpu->arch.sie_block->gg15 = vcpu->run->s.regs.gprs[15];
4021*4882a593Smuzhiyun
4022*4882a593Smuzhiyun if (need_resched())
4023*4882a593Smuzhiyun schedule();
4024*4882a593Smuzhiyun
4025*4882a593Smuzhiyun if (!kvm_is_ucontrol(vcpu->kvm)) {
4026*4882a593Smuzhiyun rc = kvm_s390_deliver_pending_interrupts(vcpu);
4027*4882a593Smuzhiyun if (rc)
4028*4882a593Smuzhiyun return rc;
4029*4882a593Smuzhiyun }
4030*4882a593Smuzhiyun
4031*4882a593Smuzhiyun rc = kvm_s390_handle_requests(vcpu);
4032*4882a593Smuzhiyun if (rc)
4033*4882a593Smuzhiyun return rc;
4034*4882a593Smuzhiyun
4035*4882a593Smuzhiyun if (guestdbg_enabled(vcpu)) {
4036*4882a593Smuzhiyun kvm_s390_backup_guest_per_regs(vcpu);
4037*4882a593Smuzhiyun kvm_s390_patch_guest_per_regs(vcpu);
4038*4882a593Smuzhiyun }
4039*4882a593Smuzhiyun
4040*4882a593Smuzhiyun clear_bit(kvm_vcpu_get_idx(vcpu), vcpu->kvm->arch.gisa_int.kicked_mask);
4041*4882a593Smuzhiyun
4042*4882a593Smuzhiyun vcpu->arch.sie_block->icptcode = 0;
4043*4882a593Smuzhiyun cpuflags = atomic_read(&vcpu->arch.sie_block->cpuflags);
4044*4882a593Smuzhiyun VCPU_EVENT(vcpu, 6, "entering sie flags %x", cpuflags);
4045*4882a593Smuzhiyun trace_kvm_s390_sie_enter(vcpu, cpuflags);
4046*4882a593Smuzhiyun
4047*4882a593Smuzhiyun return 0;
4048*4882a593Smuzhiyun }
4049*4882a593Smuzhiyun
vcpu_post_run_fault_in_sie(struct kvm_vcpu * vcpu)4050*4882a593Smuzhiyun static int vcpu_post_run_fault_in_sie(struct kvm_vcpu *vcpu)
4051*4882a593Smuzhiyun {
4052*4882a593Smuzhiyun struct kvm_s390_pgm_info pgm_info = {
4053*4882a593Smuzhiyun .code = PGM_ADDRESSING,
4054*4882a593Smuzhiyun };
4055*4882a593Smuzhiyun u8 opcode, ilen;
4056*4882a593Smuzhiyun int rc;
4057*4882a593Smuzhiyun
4058*4882a593Smuzhiyun VCPU_EVENT(vcpu, 3, "%s", "fault in sie instruction");
4059*4882a593Smuzhiyun trace_kvm_s390_sie_fault(vcpu);
4060*4882a593Smuzhiyun
4061*4882a593Smuzhiyun /*
4062*4882a593Smuzhiyun * We want to inject an addressing exception, which is defined as a
4063*4882a593Smuzhiyun * suppressing or terminating exception. However, since we came here
4064*4882a593Smuzhiyun * by a DAT access exception, the PSW still points to the faulting
4065*4882a593Smuzhiyun * instruction since DAT exceptions are nullifying. So we've got
4066*4882a593Smuzhiyun * to look up the current opcode to get the length of the instruction
4067*4882a593Smuzhiyun * to be able to forward the PSW.
4068*4882a593Smuzhiyun */
4069*4882a593Smuzhiyun rc = read_guest_instr(vcpu, vcpu->arch.sie_block->gpsw.addr, &opcode, 1);
4070*4882a593Smuzhiyun ilen = insn_length(opcode);
4071*4882a593Smuzhiyun if (rc < 0) {
4072*4882a593Smuzhiyun return rc;
4073*4882a593Smuzhiyun } else if (rc) {
4074*4882a593Smuzhiyun /* Instruction-Fetching Exceptions - we can't detect the ilen.
4075*4882a593Smuzhiyun * Forward by arbitrary ilc, injection will take care of
4076*4882a593Smuzhiyun * nullification if necessary.
4077*4882a593Smuzhiyun */
4078*4882a593Smuzhiyun pgm_info = vcpu->arch.pgm;
4079*4882a593Smuzhiyun ilen = 4;
4080*4882a593Smuzhiyun }
4081*4882a593Smuzhiyun pgm_info.flags = ilen | KVM_S390_PGM_FLAGS_ILC_VALID;
4082*4882a593Smuzhiyun kvm_s390_forward_psw(vcpu, ilen);
4083*4882a593Smuzhiyun return kvm_s390_inject_prog_irq(vcpu, &pgm_info);
4084*4882a593Smuzhiyun }
4085*4882a593Smuzhiyun
vcpu_post_run(struct kvm_vcpu * vcpu,int exit_reason)4086*4882a593Smuzhiyun static int vcpu_post_run(struct kvm_vcpu *vcpu, int exit_reason)
4087*4882a593Smuzhiyun {
4088*4882a593Smuzhiyun struct mcck_volatile_info *mcck_info;
4089*4882a593Smuzhiyun struct sie_page *sie_page;
4090*4882a593Smuzhiyun
4091*4882a593Smuzhiyun VCPU_EVENT(vcpu, 6, "exit sie icptcode %d",
4092*4882a593Smuzhiyun vcpu->arch.sie_block->icptcode);
4093*4882a593Smuzhiyun trace_kvm_s390_sie_exit(vcpu, vcpu->arch.sie_block->icptcode);
4094*4882a593Smuzhiyun
4095*4882a593Smuzhiyun if (guestdbg_enabled(vcpu))
4096*4882a593Smuzhiyun kvm_s390_restore_guest_per_regs(vcpu);
4097*4882a593Smuzhiyun
4098*4882a593Smuzhiyun vcpu->run->s.regs.gprs[14] = vcpu->arch.sie_block->gg14;
4099*4882a593Smuzhiyun vcpu->run->s.regs.gprs[15] = vcpu->arch.sie_block->gg15;
4100*4882a593Smuzhiyun
4101*4882a593Smuzhiyun if (exit_reason == -EINTR) {
4102*4882a593Smuzhiyun VCPU_EVENT(vcpu, 3, "%s", "machine check");
4103*4882a593Smuzhiyun sie_page = container_of(vcpu->arch.sie_block,
4104*4882a593Smuzhiyun struct sie_page, sie_block);
4105*4882a593Smuzhiyun mcck_info = &sie_page->mcck_info;
4106*4882a593Smuzhiyun kvm_s390_reinject_machine_check(vcpu, mcck_info);
4107*4882a593Smuzhiyun return 0;
4108*4882a593Smuzhiyun }
4109*4882a593Smuzhiyun
4110*4882a593Smuzhiyun if (vcpu->arch.sie_block->icptcode > 0) {
4111*4882a593Smuzhiyun int rc = kvm_handle_sie_intercept(vcpu);
4112*4882a593Smuzhiyun
4113*4882a593Smuzhiyun if (rc != -EOPNOTSUPP)
4114*4882a593Smuzhiyun return rc;
4115*4882a593Smuzhiyun vcpu->run->exit_reason = KVM_EXIT_S390_SIEIC;
4116*4882a593Smuzhiyun vcpu->run->s390_sieic.icptcode = vcpu->arch.sie_block->icptcode;
4117*4882a593Smuzhiyun vcpu->run->s390_sieic.ipa = vcpu->arch.sie_block->ipa;
4118*4882a593Smuzhiyun vcpu->run->s390_sieic.ipb = vcpu->arch.sie_block->ipb;
4119*4882a593Smuzhiyun return -EREMOTE;
4120*4882a593Smuzhiyun } else if (exit_reason != -EFAULT) {
4121*4882a593Smuzhiyun vcpu->stat.exit_null++;
4122*4882a593Smuzhiyun return 0;
4123*4882a593Smuzhiyun } else if (kvm_is_ucontrol(vcpu->kvm)) {
4124*4882a593Smuzhiyun vcpu->run->exit_reason = KVM_EXIT_S390_UCONTROL;
4125*4882a593Smuzhiyun vcpu->run->s390_ucontrol.trans_exc_code =
4126*4882a593Smuzhiyun current->thread.gmap_addr;
4127*4882a593Smuzhiyun vcpu->run->s390_ucontrol.pgm_code = 0x10;
4128*4882a593Smuzhiyun return -EREMOTE;
4129*4882a593Smuzhiyun } else if (current->thread.gmap_pfault) {
4130*4882a593Smuzhiyun trace_kvm_s390_major_guest_pfault(vcpu);
4131*4882a593Smuzhiyun current->thread.gmap_pfault = 0;
4132*4882a593Smuzhiyun if (kvm_arch_setup_async_pf(vcpu))
4133*4882a593Smuzhiyun return 0;
4134*4882a593Smuzhiyun return kvm_arch_fault_in_page(vcpu, current->thread.gmap_addr, 1);
4135*4882a593Smuzhiyun }
4136*4882a593Smuzhiyun return vcpu_post_run_fault_in_sie(vcpu);
4137*4882a593Smuzhiyun }
4138*4882a593Smuzhiyun
4139*4882a593Smuzhiyun #define PSW_INT_MASK (PSW_MASK_EXT | PSW_MASK_IO | PSW_MASK_MCHECK)
__vcpu_run(struct kvm_vcpu * vcpu)4140*4882a593Smuzhiyun static int __vcpu_run(struct kvm_vcpu *vcpu)
4141*4882a593Smuzhiyun {
4142*4882a593Smuzhiyun int rc, exit_reason;
4143*4882a593Smuzhiyun struct sie_page *sie_page = (struct sie_page *)vcpu->arch.sie_block;
4144*4882a593Smuzhiyun
4145*4882a593Smuzhiyun /*
4146*4882a593Smuzhiyun * We try to hold kvm->srcu during most of vcpu_run (except when run-
4147*4882a593Smuzhiyun * ning the guest), so that memslots (and other stuff) are protected
4148*4882a593Smuzhiyun */
4149*4882a593Smuzhiyun vcpu->srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
4150*4882a593Smuzhiyun
4151*4882a593Smuzhiyun do {
4152*4882a593Smuzhiyun rc = vcpu_pre_run(vcpu);
4153*4882a593Smuzhiyun if (rc)
4154*4882a593Smuzhiyun break;
4155*4882a593Smuzhiyun
4156*4882a593Smuzhiyun srcu_read_unlock(&vcpu->kvm->srcu, vcpu->srcu_idx);
4157*4882a593Smuzhiyun /*
4158*4882a593Smuzhiyun * As PF_VCPU will be used in fault handler, between
4159*4882a593Smuzhiyun * guest_enter and guest_exit should be no uaccess.
4160*4882a593Smuzhiyun */
4161*4882a593Smuzhiyun local_irq_disable();
4162*4882a593Smuzhiyun guest_enter_irqoff();
4163*4882a593Smuzhiyun __disable_cpu_timer_accounting(vcpu);
4164*4882a593Smuzhiyun local_irq_enable();
4165*4882a593Smuzhiyun if (kvm_s390_pv_cpu_is_protected(vcpu)) {
4166*4882a593Smuzhiyun memcpy(sie_page->pv_grregs,
4167*4882a593Smuzhiyun vcpu->run->s.regs.gprs,
4168*4882a593Smuzhiyun sizeof(sie_page->pv_grregs));
4169*4882a593Smuzhiyun }
4170*4882a593Smuzhiyun exit_reason = sie64a(vcpu->arch.sie_block,
4171*4882a593Smuzhiyun vcpu->run->s.regs.gprs);
4172*4882a593Smuzhiyun if (kvm_s390_pv_cpu_is_protected(vcpu)) {
4173*4882a593Smuzhiyun memcpy(vcpu->run->s.regs.gprs,
4174*4882a593Smuzhiyun sie_page->pv_grregs,
4175*4882a593Smuzhiyun sizeof(sie_page->pv_grregs));
4176*4882a593Smuzhiyun /*
4177*4882a593Smuzhiyun * We're not allowed to inject interrupts on intercepts
4178*4882a593Smuzhiyun * that leave the guest state in an "in-between" state
4179*4882a593Smuzhiyun * where the next SIE entry will do a continuation.
4180*4882a593Smuzhiyun * Fence interrupts in our "internal" PSW.
4181*4882a593Smuzhiyun */
4182*4882a593Smuzhiyun if (vcpu->arch.sie_block->icptcode == ICPT_PV_INSTR ||
4183*4882a593Smuzhiyun vcpu->arch.sie_block->icptcode == ICPT_PV_PREF) {
4184*4882a593Smuzhiyun vcpu->arch.sie_block->gpsw.mask &= ~PSW_INT_MASK;
4185*4882a593Smuzhiyun }
4186*4882a593Smuzhiyun }
4187*4882a593Smuzhiyun local_irq_disable();
4188*4882a593Smuzhiyun __enable_cpu_timer_accounting(vcpu);
4189*4882a593Smuzhiyun guest_exit_irqoff();
4190*4882a593Smuzhiyun local_irq_enable();
4191*4882a593Smuzhiyun vcpu->srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
4192*4882a593Smuzhiyun
4193*4882a593Smuzhiyun rc = vcpu_post_run(vcpu, exit_reason);
4194*4882a593Smuzhiyun } while (!signal_pending(current) && !guestdbg_exit_pending(vcpu) && !rc);
4195*4882a593Smuzhiyun
4196*4882a593Smuzhiyun srcu_read_unlock(&vcpu->kvm->srcu, vcpu->srcu_idx);
4197*4882a593Smuzhiyun return rc;
4198*4882a593Smuzhiyun }
4199*4882a593Smuzhiyun
sync_regs_fmt2(struct kvm_vcpu * vcpu)4200*4882a593Smuzhiyun static void sync_regs_fmt2(struct kvm_vcpu *vcpu)
4201*4882a593Smuzhiyun {
4202*4882a593Smuzhiyun struct kvm_run *kvm_run = vcpu->run;
4203*4882a593Smuzhiyun struct runtime_instr_cb *riccb;
4204*4882a593Smuzhiyun struct gs_cb *gscb;
4205*4882a593Smuzhiyun
4206*4882a593Smuzhiyun riccb = (struct runtime_instr_cb *) &kvm_run->s.regs.riccb;
4207*4882a593Smuzhiyun gscb = (struct gs_cb *) &kvm_run->s.regs.gscb;
4208*4882a593Smuzhiyun vcpu->arch.sie_block->gpsw.mask = kvm_run->psw_mask;
4209*4882a593Smuzhiyun vcpu->arch.sie_block->gpsw.addr = kvm_run->psw_addr;
4210*4882a593Smuzhiyun if (kvm_run->kvm_dirty_regs & KVM_SYNC_ARCH0) {
4211*4882a593Smuzhiyun vcpu->arch.sie_block->todpr = kvm_run->s.regs.todpr;
4212*4882a593Smuzhiyun vcpu->arch.sie_block->pp = kvm_run->s.regs.pp;
4213*4882a593Smuzhiyun vcpu->arch.sie_block->gbea = kvm_run->s.regs.gbea;
4214*4882a593Smuzhiyun }
4215*4882a593Smuzhiyun if (kvm_run->kvm_dirty_regs & KVM_SYNC_PFAULT) {
4216*4882a593Smuzhiyun vcpu->arch.pfault_token = kvm_run->s.regs.pft;
4217*4882a593Smuzhiyun vcpu->arch.pfault_select = kvm_run->s.regs.pfs;
4218*4882a593Smuzhiyun vcpu->arch.pfault_compare = kvm_run->s.regs.pfc;
4219*4882a593Smuzhiyun if (vcpu->arch.pfault_token == KVM_S390_PFAULT_TOKEN_INVALID)
4220*4882a593Smuzhiyun kvm_clear_async_pf_completion_queue(vcpu);
4221*4882a593Smuzhiyun }
4222*4882a593Smuzhiyun if (kvm_run->kvm_dirty_regs & KVM_SYNC_DIAG318) {
4223*4882a593Smuzhiyun vcpu->arch.diag318_info.val = kvm_run->s.regs.diag318;
4224*4882a593Smuzhiyun vcpu->arch.sie_block->cpnc = vcpu->arch.diag318_info.cpnc;
4225*4882a593Smuzhiyun }
4226*4882a593Smuzhiyun /*
4227*4882a593Smuzhiyun * If userspace sets the riccb (e.g. after migration) to a valid state,
4228*4882a593Smuzhiyun * we should enable RI here instead of doing the lazy enablement.
4229*4882a593Smuzhiyun */
4230*4882a593Smuzhiyun if ((kvm_run->kvm_dirty_regs & KVM_SYNC_RICCB) &&
4231*4882a593Smuzhiyun test_kvm_facility(vcpu->kvm, 64) &&
4232*4882a593Smuzhiyun riccb->v &&
4233*4882a593Smuzhiyun !(vcpu->arch.sie_block->ecb3 & ECB3_RI)) {
4234*4882a593Smuzhiyun VCPU_EVENT(vcpu, 3, "%s", "ENABLE: RI (sync_regs)");
4235*4882a593Smuzhiyun vcpu->arch.sie_block->ecb3 |= ECB3_RI;
4236*4882a593Smuzhiyun }
4237*4882a593Smuzhiyun /*
4238*4882a593Smuzhiyun * If userspace sets the gscb (e.g. after migration) to non-zero,
4239*4882a593Smuzhiyun * we should enable GS here instead of doing the lazy enablement.
4240*4882a593Smuzhiyun */
4241*4882a593Smuzhiyun if ((kvm_run->kvm_dirty_regs & KVM_SYNC_GSCB) &&
4242*4882a593Smuzhiyun test_kvm_facility(vcpu->kvm, 133) &&
4243*4882a593Smuzhiyun gscb->gssm &&
4244*4882a593Smuzhiyun !vcpu->arch.gs_enabled) {
4245*4882a593Smuzhiyun VCPU_EVENT(vcpu, 3, "%s", "ENABLE: GS (sync_regs)");
4246*4882a593Smuzhiyun vcpu->arch.sie_block->ecb |= ECB_GS;
4247*4882a593Smuzhiyun vcpu->arch.sie_block->ecd |= ECD_HOSTREGMGMT;
4248*4882a593Smuzhiyun vcpu->arch.gs_enabled = 1;
4249*4882a593Smuzhiyun }
4250*4882a593Smuzhiyun if ((kvm_run->kvm_dirty_regs & KVM_SYNC_BPBC) &&
4251*4882a593Smuzhiyun test_kvm_facility(vcpu->kvm, 82)) {
4252*4882a593Smuzhiyun vcpu->arch.sie_block->fpf &= ~FPF_BPBC;
4253*4882a593Smuzhiyun vcpu->arch.sie_block->fpf |= kvm_run->s.regs.bpbc ? FPF_BPBC : 0;
4254*4882a593Smuzhiyun }
4255*4882a593Smuzhiyun if (MACHINE_HAS_GS) {
4256*4882a593Smuzhiyun preempt_disable();
4257*4882a593Smuzhiyun __ctl_set_bit(2, 4);
4258*4882a593Smuzhiyun if (current->thread.gs_cb) {
4259*4882a593Smuzhiyun vcpu->arch.host_gscb = current->thread.gs_cb;
4260*4882a593Smuzhiyun save_gs_cb(vcpu->arch.host_gscb);
4261*4882a593Smuzhiyun }
4262*4882a593Smuzhiyun if (vcpu->arch.gs_enabled) {
4263*4882a593Smuzhiyun current->thread.gs_cb = (struct gs_cb *)
4264*4882a593Smuzhiyun &vcpu->run->s.regs.gscb;
4265*4882a593Smuzhiyun restore_gs_cb(current->thread.gs_cb);
4266*4882a593Smuzhiyun }
4267*4882a593Smuzhiyun preempt_enable();
4268*4882a593Smuzhiyun }
4269*4882a593Smuzhiyun /* SIE will load etoken directly from SDNX and therefore kvm_run */
4270*4882a593Smuzhiyun }
4271*4882a593Smuzhiyun
sync_regs(struct kvm_vcpu * vcpu)4272*4882a593Smuzhiyun static void sync_regs(struct kvm_vcpu *vcpu)
4273*4882a593Smuzhiyun {
4274*4882a593Smuzhiyun struct kvm_run *kvm_run = vcpu->run;
4275*4882a593Smuzhiyun
4276*4882a593Smuzhiyun if (kvm_run->kvm_dirty_regs & KVM_SYNC_PREFIX)
4277*4882a593Smuzhiyun kvm_s390_set_prefix(vcpu, kvm_run->s.regs.prefix);
4278*4882a593Smuzhiyun if (kvm_run->kvm_dirty_regs & KVM_SYNC_CRS) {
4279*4882a593Smuzhiyun memcpy(&vcpu->arch.sie_block->gcr, &kvm_run->s.regs.crs, 128);
4280*4882a593Smuzhiyun /* some control register changes require a tlb flush */
4281*4882a593Smuzhiyun kvm_make_request(KVM_REQ_TLB_FLUSH, vcpu);
4282*4882a593Smuzhiyun }
4283*4882a593Smuzhiyun if (kvm_run->kvm_dirty_regs & KVM_SYNC_ARCH0) {
4284*4882a593Smuzhiyun kvm_s390_set_cpu_timer(vcpu, kvm_run->s.regs.cputm);
4285*4882a593Smuzhiyun vcpu->arch.sie_block->ckc = kvm_run->s.regs.ckc;
4286*4882a593Smuzhiyun }
4287*4882a593Smuzhiyun save_access_regs(vcpu->arch.host_acrs);
4288*4882a593Smuzhiyun restore_access_regs(vcpu->run->s.regs.acrs);
4289*4882a593Smuzhiyun /* save host (userspace) fprs/vrs */
4290*4882a593Smuzhiyun save_fpu_regs();
4291*4882a593Smuzhiyun vcpu->arch.host_fpregs.fpc = current->thread.fpu.fpc;
4292*4882a593Smuzhiyun vcpu->arch.host_fpregs.regs = current->thread.fpu.regs;
4293*4882a593Smuzhiyun if (MACHINE_HAS_VX)
4294*4882a593Smuzhiyun current->thread.fpu.regs = vcpu->run->s.regs.vrs;
4295*4882a593Smuzhiyun else
4296*4882a593Smuzhiyun current->thread.fpu.regs = vcpu->run->s.regs.fprs;
4297*4882a593Smuzhiyun current->thread.fpu.fpc = vcpu->run->s.regs.fpc;
4298*4882a593Smuzhiyun if (test_fp_ctl(current->thread.fpu.fpc))
4299*4882a593Smuzhiyun /* User space provided an invalid FPC, let's clear it */
4300*4882a593Smuzhiyun current->thread.fpu.fpc = 0;
4301*4882a593Smuzhiyun
4302*4882a593Smuzhiyun /* Sync fmt2 only data */
4303*4882a593Smuzhiyun if (likely(!kvm_s390_pv_cpu_is_protected(vcpu))) {
4304*4882a593Smuzhiyun sync_regs_fmt2(vcpu);
4305*4882a593Smuzhiyun } else {
4306*4882a593Smuzhiyun /*
4307*4882a593Smuzhiyun * In several places we have to modify our internal view to
4308*4882a593Smuzhiyun * not do things that are disallowed by the ultravisor. For
4309*4882a593Smuzhiyun * example we must not inject interrupts after specific exits
4310*4882a593Smuzhiyun * (e.g. 112 prefix page not secure). We do this by turning
4311*4882a593Smuzhiyun * off the machine check, external and I/O interrupt bits
4312*4882a593Smuzhiyun * of our PSW copy. To avoid getting validity intercepts, we
4313*4882a593Smuzhiyun * do only accept the condition code from userspace.
4314*4882a593Smuzhiyun */
4315*4882a593Smuzhiyun vcpu->arch.sie_block->gpsw.mask &= ~PSW_MASK_CC;
4316*4882a593Smuzhiyun vcpu->arch.sie_block->gpsw.mask |= kvm_run->psw_mask &
4317*4882a593Smuzhiyun PSW_MASK_CC;
4318*4882a593Smuzhiyun }
4319*4882a593Smuzhiyun
4320*4882a593Smuzhiyun kvm_run->kvm_dirty_regs = 0;
4321*4882a593Smuzhiyun }
4322*4882a593Smuzhiyun
store_regs_fmt2(struct kvm_vcpu * vcpu)4323*4882a593Smuzhiyun static void store_regs_fmt2(struct kvm_vcpu *vcpu)
4324*4882a593Smuzhiyun {
4325*4882a593Smuzhiyun struct kvm_run *kvm_run = vcpu->run;
4326*4882a593Smuzhiyun
4327*4882a593Smuzhiyun kvm_run->s.regs.todpr = vcpu->arch.sie_block->todpr;
4328*4882a593Smuzhiyun kvm_run->s.regs.pp = vcpu->arch.sie_block->pp;
4329*4882a593Smuzhiyun kvm_run->s.regs.gbea = vcpu->arch.sie_block->gbea;
4330*4882a593Smuzhiyun kvm_run->s.regs.bpbc = (vcpu->arch.sie_block->fpf & FPF_BPBC) == FPF_BPBC;
4331*4882a593Smuzhiyun kvm_run->s.regs.diag318 = vcpu->arch.diag318_info.val;
4332*4882a593Smuzhiyun if (MACHINE_HAS_GS) {
4333*4882a593Smuzhiyun preempt_disable();
4334*4882a593Smuzhiyun __ctl_set_bit(2, 4);
4335*4882a593Smuzhiyun if (vcpu->arch.gs_enabled)
4336*4882a593Smuzhiyun save_gs_cb(current->thread.gs_cb);
4337*4882a593Smuzhiyun current->thread.gs_cb = vcpu->arch.host_gscb;
4338*4882a593Smuzhiyun restore_gs_cb(vcpu->arch.host_gscb);
4339*4882a593Smuzhiyun if (!vcpu->arch.host_gscb)
4340*4882a593Smuzhiyun __ctl_clear_bit(2, 4);
4341*4882a593Smuzhiyun vcpu->arch.host_gscb = NULL;
4342*4882a593Smuzhiyun preempt_enable();
4343*4882a593Smuzhiyun }
4344*4882a593Smuzhiyun /* SIE will save etoken directly into SDNX and therefore kvm_run */
4345*4882a593Smuzhiyun }
4346*4882a593Smuzhiyun
store_regs(struct kvm_vcpu * vcpu)4347*4882a593Smuzhiyun static void store_regs(struct kvm_vcpu *vcpu)
4348*4882a593Smuzhiyun {
4349*4882a593Smuzhiyun struct kvm_run *kvm_run = vcpu->run;
4350*4882a593Smuzhiyun
4351*4882a593Smuzhiyun kvm_run->psw_mask = vcpu->arch.sie_block->gpsw.mask;
4352*4882a593Smuzhiyun kvm_run->psw_addr = vcpu->arch.sie_block->gpsw.addr;
4353*4882a593Smuzhiyun kvm_run->s.regs.prefix = kvm_s390_get_prefix(vcpu);
4354*4882a593Smuzhiyun memcpy(&kvm_run->s.regs.crs, &vcpu->arch.sie_block->gcr, 128);
4355*4882a593Smuzhiyun kvm_run->s.regs.cputm = kvm_s390_get_cpu_timer(vcpu);
4356*4882a593Smuzhiyun kvm_run->s.regs.ckc = vcpu->arch.sie_block->ckc;
4357*4882a593Smuzhiyun kvm_run->s.regs.pft = vcpu->arch.pfault_token;
4358*4882a593Smuzhiyun kvm_run->s.regs.pfs = vcpu->arch.pfault_select;
4359*4882a593Smuzhiyun kvm_run->s.regs.pfc = vcpu->arch.pfault_compare;
4360*4882a593Smuzhiyun save_access_regs(vcpu->run->s.regs.acrs);
4361*4882a593Smuzhiyun restore_access_regs(vcpu->arch.host_acrs);
4362*4882a593Smuzhiyun /* Save guest register state */
4363*4882a593Smuzhiyun save_fpu_regs();
4364*4882a593Smuzhiyun vcpu->run->s.regs.fpc = current->thread.fpu.fpc;
4365*4882a593Smuzhiyun /* Restore will be done lazily at return */
4366*4882a593Smuzhiyun current->thread.fpu.fpc = vcpu->arch.host_fpregs.fpc;
4367*4882a593Smuzhiyun current->thread.fpu.regs = vcpu->arch.host_fpregs.regs;
4368*4882a593Smuzhiyun if (likely(!kvm_s390_pv_cpu_is_protected(vcpu)))
4369*4882a593Smuzhiyun store_regs_fmt2(vcpu);
4370*4882a593Smuzhiyun }
4371*4882a593Smuzhiyun
kvm_arch_vcpu_ioctl_run(struct kvm_vcpu * vcpu)4372*4882a593Smuzhiyun int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
4373*4882a593Smuzhiyun {
4374*4882a593Smuzhiyun struct kvm_run *kvm_run = vcpu->run;
4375*4882a593Smuzhiyun int rc;
4376*4882a593Smuzhiyun
4377*4882a593Smuzhiyun if (kvm_run->immediate_exit)
4378*4882a593Smuzhiyun return -EINTR;
4379*4882a593Smuzhiyun
4380*4882a593Smuzhiyun if (kvm_run->kvm_valid_regs & ~KVM_SYNC_S390_VALID_FIELDS ||
4381*4882a593Smuzhiyun kvm_run->kvm_dirty_regs & ~KVM_SYNC_S390_VALID_FIELDS)
4382*4882a593Smuzhiyun return -EINVAL;
4383*4882a593Smuzhiyun
4384*4882a593Smuzhiyun vcpu_load(vcpu);
4385*4882a593Smuzhiyun
4386*4882a593Smuzhiyun if (guestdbg_exit_pending(vcpu)) {
4387*4882a593Smuzhiyun kvm_s390_prepare_debug_exit(vcpu);
4388*4882a593Smuzhiyun rc = 0;
4389*4882a593Smuzhiyun goto out;
4390*4882a593Smuzhiyun }
4391*4882a593Smuzhiyun
4392*4882a593Smuzhiyun kvm_sigset_activate(vcpu);
4393*4882a593Smuzhiyun
4394*4882a593Smuzhiyun /*
4395*4882a593Smuzhiyun * no need to check the return value of vcpu_start as it can only have
4396*4882a593Smuzhiyun * an error for protvirt, but protvirt means user cpu state
4397*4882a593Smuzhiyun */
4398*4882a593Smuzhiyun if (!kvm_s390_user_cpu_state_ctrl(vcpu->kvm)) {
4399*4882a593Smuzhiyun kvm_s390_vcpu_start(vcpu);
4400*4882a593Smuzhiyun } else if (is_vcpu_stopped(vcpu)) {
4401*4882a593Smuzhiyun pr_err_ratelimited("can't run stopped vcpu %d\n",
4402*4882a593Smuzhiyun vcpu->vcpu_id);
4403*4882a593Smuzhiyun rc = -EINVAL;
4404*4882a593Smuzhiyun goto out;
4405*4882a593Smuzhiyun }
4406*4882a593Smuzhiyun
4407*4882a593Smuzhiyun sync_regs(vcpu);
4408*4882a593Smuzhiyun enable_cpu_timer_accounting(vcpu);
4409*4882a593Smuzhiyun
4410*4882a593Smuzhiyun might_fault();
4411*4882a593Smuzhiyun rc = __vcpu_run(vcpu);
4412*4882a593Smuzhiyun
4413*4882a593Smuzhiyun if (signal_pending(current) && !rc) {
4414*4882a593Smuzhiyun kvm_run->exit_reason = KVM_EXIT_INTR;
4415*4882a593Smuzhiyun rc = -EINTR;
4416*4882a593Smuzhiyun }
4417*4882a593Smuzhiyun
4418*4882a593Smuzhiyun if (guestdbg_exit_pending(vcpu) && !rc) {
4419*4882a593Smuzhiyun kvm_s390_prepare_debug_exit(vcpu);
4420*4882a593Smuzhiyun rc = 0;
4421*4882a593Smuzhiyun }
4422*4882a593Smuzhiyun
4423*4882a593Smuzhiyun if (rc == -EREMOTE) {
4424*4882a593Smuzhiyun /* userspace support is needed, kvm_run has been prepared */
4425*4882a593Smuzhiyun rc = 0;
4426*4882a593Smuzhiyun }
4427*4882a593Smuzhiyun
4428*4882a593Smuzhiyun disable_cpu_timer_accounting(vcpu);
4429*4882a593Smuzhiyun store_regs(vcpu);
4430*4882a593Smuzhiyun
4431*4882a593Smuzhiyun kvm_sigset_deactivate(vcpu);
4432*4882a593Smuzhiyun
4433*4882a593Smuzhiyun vcpu->stat.exit_userspace++;
4434*4882a593Smuzhiyun out:
4435*4882a593Smuzhiyun vcpu_put(vcpu);
4436*4882a593Smuzhiyun return rc;
4437*4882a593Smuzhiyun }
4438*4882a593Smuzhiyun
4439*4882a593Smuzhiyun /*
4440*4882a593Smuzhiyun * store status at address
4441*4882a593Smuzhiyun * we use have two special cases:
4442*4882a593Smuzhiyun * KVM_S390_STORE_STATUS_NOADDR: -> 0x1200 on 64 bit
4443*4882a593Smuzhiyun * KVM_S390_STORE_STATUS_PREFIXED: -> prefix
4444*4882a593Smuzhiyun */
kvm_s390_store_status_unloaded(struct kvm_vcpu * vcpu,unsigned long gpa)4445*4882a593Smuzhiyun int kvm_s390_store_status_unloaded(struct kvm_vcpu *vcpu, unsigned long gpa)
4446*4882a593Smuzhiyun {
4447*4882a593Smuzhiyun unsigned char archmode = 1;
4448*4882a593Smuzhiyun freg_t fprs[NUM_FPRS];
4449*4882a593Smuzhiyun unsigned int px;
4450*4882a593Smuzhiyun u64 clkcomp, cputm;
4451*4882a593Smuzhiyun int rc;
4452*4882a593Smuzhiyun
4453*4882a593Smuzhiyun px = kvm_s390_get_prefix(vcpu);
4454*4882a593Smuzhiyun if (gpa == KVM_S390_STORE_STATUS_NOADDR) {
4455*4882a593Smuzhiyun if (write_guest_abs(vcpu, 163, &archmode, 1))
4456*4882a593Smuzhiyun return -EFAULT;
4457*4882a593Smuzhiyun gpa = 0;
4458*4882a593Smuzhiyun } else if (gpa == KVM_S390_STORE_STATUS_PREFIXED) {
4459*4882a593Smuzhiyun if (write_guest_real(vcpu, 163, &archmode, 1))
4460*4882a593Smuzhiyun return -EFAULT;
4461*4882a593Smuzhiyun gpa = px;
4462*4882a593Smuzhiyun } else
4463*4882a593Smuzhiyun gpa -= __LC_FPREGS_SAVE_AREA;
4464*4882a593Smuzhiyun
4465*4882a593Smuzhiyun /* manually convert vector registers if necessary */
4466*4882a593Smuzhiyun if (MACHINE_HAS_VX) {
4467*4882a593Smuzhiyun convert_vx_to_fp(fprs, (__vector128 *) vcpu->run->s.regs.vrs);
4468*4882a593Smuzhiyun rc = write_guest_abs(vcpu, gpa + __LC_FPREGS_SAVE_AREA,
4469*4882a593Smuzhiyun fprs, 128);
4470*4882a593Smuzhiyun } else {
4471*4882a593Smuzhiyun rc = write_guest_abs(vcpu, gpa + __LC_FPREGS_SAVE_AREA,
4472*4882a593Smuzhiyun vcpu->run->s.regs.fprs, 128);
4473*4882a593Smuzhiyun }
4474*4882a593Smuzhiyun rc |= write_guest_abs(vcpu, gpa + __LC_GPREGS_SAVE_AREA,
4475*4882a593Smuzhiyun vcpu->run->s.regs.gprs, 128);
4476*4882a593Smuzhiyun rc |= write_guest_abs(vcpu, gpa + __LC_PSW_SAVE_AREA,
4477*4882a593Smuzhiyun &vcpu->arch.sie_block->gpsw, 16);
4478*4882a593Smuzhiyun rc |= write_guest_abs(vcpu, gpa + __LC_PREFIX_SAVE_AREA,
4479*4882a593Smuzhiyun &px, 4);
4480*4882a593Smuzhiyun rc |= write_guest_abs(vcpu, gpa + __LC_FP_CREG_SAVE_AREA,
4481*4882a593Smuzhiyun &vcpu->run->s.regs.fpc, 4);
4482*4882a593Smuzhiyun rc |= write_guest_abs(vcpu, gpa + __LC_TOD_PROGREG_SAVE_AREA,
4483*4882a593Smuzhiyun &vcpu->arch.sie_block->todpr, 4);
4484*4882a593Smuzhiyun cputm = kvm_s390_get_cpu_timer(vcpu);
4485*4882a593Smuzhiyun rc |= write_guest_abs(vcpu, gpa + __LC_CPU_TIMER_SAVE_AREA,
4486*4882a593Smuzhiyun &cputm, 8);
4487*4882a593Smuzhiyun clkcomp = vcpu->arch.sie_block->ckc >> 8;
4488*4882a593Smuzhiyun rc |= write_guest_abs(vcpu, gpa + __LC_CLOCK_COMP_SAVE_AREA,
4489*4882a593Smuzhiyun &clkcomp, 8);
4490*4882a593Smuzhiyun rc |= write_guest_abs(vcpu, gpa + __LC_AREGS_SAVE_AREA,
4491*4882a593Smuzhiyun &vcpu->run->s.regs.acrs, 64);
4492*4882a593Smuzhiyun rc |= write_guest_abs(vcpu, gpa + __LC_CREGS_SAVE_AREA,
4493*4882a593Smuzhiyun &vcpu->arch.sie_block->gcr, 128);
4494*4882a593Smuzhiyun return rc ? -EFAULT : 0;
4495*4882a593Smuzhiyun }
4496*4882a593Smuzhiyun
kvm_s390_vcpu_store_status(struct kvm_vcpu * vcpu,unsigned long addr)4497*4882a593Smuzhiyun int kvm_s390_vcpu_store_status(struct kvm_vcpu *vcpu, unsigned long addr)
4498*4882a593Smuzhiyun {
4499*4882a593Smuzhiyun /*
4500*4882a593Smuzhiyun * The guest FPRS and ACRS are in the host FPRS/ACRS due to the lazy
4501*4882a593Smuzhiyun * switch in the run ioctl. Let's update our copies before we save
4502*4882a593Smuzhiyun * it into the save area
4503*4882a593Smuzhiyun */
4504*4882a593Smuzhiyun save_fpu_regs();
4505*4882a593Smuzhiyun vcpu->run->s.regs.fpc = current->thread.fpu.fpc;
4506*4882a593Smuzhiyun save_access_regs(vcpu->run->s.regs.acrs);
4507*4882a593Smuzhiyun
4508*4882a593Smuzhiyun return kvm_s390_store_status_unloaded(vcpu, addr);
4509*4882a593Smuzhiyun }
4510*4882a593Smuzhiyun
__disable_ibs_on_vcpu(struct kvm_vcpu * vcpu)4511*4882a593Smuzhiyun static void __disable_ibs_on_vcpu(struct kvm_vcpu *vcpu)
4512*4882a593Smuzhiyun {
4513*4882a593Smuzhiyun kvm_check_request(KVM_REQ_ENABLE_IBS, vcpu);
4514*4882a593Smuzhiyun kvm_s390_sync_request(KVM_REQ_DISABLE_IBS, vcpu);
4515*4882a593Smuzhiyun }
4516*4882a593Smuzhiyun
__disable_ibs_on_all_vcpus(struct kvm * kvm)4517*4882a593Smuzhiyun static void __disable_ibs_on_all_vcpus(struct kvm *kvm)
4518*4882a593Smuzhiyun {
4519*4882a593Smuzhiyun unsigned int i;
4520*4882a593Smuzhiyun struct kvm_vcpu *vcpu;
4521*4882a593Smuzhiyun
4522*4882a593Smuzhiyun kvm_for_each_vcpu(i, vcpu, kvm) {
4523*4882a593Smuzhiyun __disable_ibs_on_vcpu(vcpu);
4524*4882a593Smuzhiyun }
4525*4882a593Smuzhiyun }
4526*4882a593Smuzhiyun
__enable_ibs_on_vcpu(struct kvm_vcpu * vcpu)4527*4882a593Smuzhiyun static void __enable_ibs_on_vcpu(struct kvm_vcpu *vcpu)
4528*4882a593Smuzhiyun {
4529*4882a593Smuzhiyun if (!sclp.has_ibs)
4530*4882a593Smuzhiyun return;
4531*4882a593Smuzhiyun kvm_check_request(KVM_REQ_DISABLE_IBS, vcpu);
4532*4882a593Smuzhiyun kvm_s390_sync_request(KVM_REQ_ENABLE_IBS, vcpu);
4533*4882a593Smuzhiyun }
4534*4882a593Smuzhiyun
kvm_s390_vcpu_start(struct kvm_vcpu * vcpu)4535*4882a593Smuzhiyun int kvm_s390_vcpu_start(struct kvm_vcpu *vcpu)
4536*4882a593Smuzhiyun {
4537*4882a593Smuzhiyun int i, online_vcpus, r = 0, started_vcpus = 0;
4538*4882a593Smuzhiyun
4539*4882a593Smuzhiyun if (!is_vcpu_stopped(vcpu))
4540*4882a593Smuzhiyun return 0;
4541*4882a593Smuzhiyun
4542*4882a593Smuzhiyun trace_kvm_s390_vcpu_start_stop(vcpu->vcpu_id, 1);
4543*4882a593Smuzhiyun /* Only one cpu at a time may enter/leave the STOPPED state. */
4544*4882a593Smuzhiyun spin_lock(&vcpu->kvm->arch.start_stop_lock);
4545*4882a593Smuzhiyun online_vcpus = atomic_read(&vcpu->kvm->online_vcpus);
4546*4882a593Smuzhiyun
4547*4882a593Smuzhiyun /* Let's tell the UV that we want to change into the operating state */
4548*4882a593Smuzhiyun if (kvm_s390_pv_cpu_is_protected(vcpu)) {
4549*4882a593Smuzhiyun r = kvm_s390_pv_set_cpu_state(vcpu, PV_CPU_STATE_OPR);
4550*4882a593Smuzhiyun if (r) {
4551*4882a593Smuzhiyun spin_unlock(&vcpu->kvm->arch.start_stop_lock);
4552*4882a593Smuzhiyun return r;
4553*4882a593Smuzhiyun }
4554*4882a593Smuzhiyun }
4555*4882a593Smuzhiyun
4556*4882a593Smuzhiyun for (i = 0; i < online_vcpus; i++) {
4557*4882a593Smuzhiyun if (!is_vcpu_stopped(vcpu->kvm->vcpus[i]))
4558*4882a593Smuzhiyun started_vcpus++;
4559*4882a593Smuzhiyun }
4560*4882a593Smuzhiyun
4561*4882a593Smuzhiyun if (started_vcpus == 0) {
4562*4882a593Smuzhiyun /* we're the only active VCPU -> speed it up */
4563*4882a593Smuzhiyun __enable_ibs_on_vcpu(vcpu);
4564*4882a593Smuzhiyun } else if (started_vcpus == 1) {
4565*4882a593Smuzhiyun /*
4566*4882a593Smuzhiyun * As we are starting a second VCPU, we have to disable
4567*4882a593Smuzhiyun * the IBS facility on all VCPUs to remove potentially
4568*4882a593Smuzhiyun * oustanding ENABLE requests.
4569*4882a593Smuzhiyun */
4570*4882a593Smuzhiyun __disable_ibs_on_all_vcpus(vcpu->kvm);
4571*4882a593Smuzhiyun }
4572*4882a593Smuzhiyun
4573*4882a593Smuzhiyun kvm_s390_clear_cpuflags(vcpu, CPUSTAT_STOPPED);
4574*4882a593Smuzhiyun /*
4575*4882a593Smuzhiyun * The real PSW might have changed due to a RESTART interpreted by the
4576*4882a593Smuzhiyun * ultravisor. We block all interrupts and let the next sie exit
4577*4882a593Smuzhiyun * refresh our view.
4578*4882a593Smuzhiyun */
4579*4882a593Smuzhiyun if (kvm_s390_pv_cpu_is_protected(vcpu))
4580*4882a593Smuzhiyun vcpu->arch.sie_block->gpsw.mask &= ~PSW_INT_MASK;
4581*4882a593Smuzhiyun /*
4582*4882a593Smuzhiyun * Another VCPU might have used IBS while we were offline.
4583*4882a593Smuzhiyun * Let's play safe and flush the VCPU at startup.
4584*4882a593Smuzhiyun */
4585*4882a593Smuzhiyun kvm_make_request(KVM_REQ_TLB_FLUSH, vcpu);
4586*4882a593Smuzhiyun spin_unlock(&vcpu->kvm->arch.start_stop_lock);
4587*4882a593Smuzhiyun return 0;
4588*4882a593Smuzhiyun }
4589*4882a593Smuzhiyun
kvm_s390_vcpu_stop(struct kvm_vcpu * vcpu)4590*4882a593Smuzhiyun int kvm_s390_vcpu_stop(struct kvm_vcpu *vcpu)
4591*4882a593Smuzhiyun {
4592*4882a593Smuzhiyun int i, online_vcpus, r = 0, started_vcpus = 0;
4593*4882a593Smuzhiyun struct kvm_vcpu *started_vcpu = NULL;
4594*4882a593Smuzhiyun
4595*4882a593Smuzhiyun if (is_vcpu_stopped(vcpu))
4596*4882a593Smuzhiyun return 0;
4597*4882a593Smuzhiyun
4598*4882a593Smuzhiyun trace_kvm_s390_vcpu_start_stop(vcpu->vcpu_id, 0);
4599*4882a593Smuzhiyun /* Only one cpu at a time may enter/leave the STOPPED state. */
4600*4882a593Smuzhiyun spin_lock(&vcpu->kvm->arch.start_stop_lock);
4601*4882a593Smuzhiyun online_vcpus = atomic_read(&vcpu->kvm->online_vcpus);
4602*4882a593Smuzhiyun
4603*4882a593Smuzhiyun /* Let's tell the UV that we want to change into the stopped state */
4604*4882a593Smuzhiyun if (kvm_s390_pv_cpu_is_protected(vcpu)) {
4605*4882a593Smuzhiyun r = kvm_s390_pv_set_cpu_state(vcpu, PV_CPU_STATE_STP);
4606*4882a593Smuzhiyun if (r) {
4607*4882a593Smuzhiyun spin_unlock(&vcpu->kvm->arch.start_stop_lock);
4608*4882a593Smuzhiyun return r;
4609*4882a593Smuzhiyun }
4610*4882a593Smuzhiyun }
4611*4882a593Smuzhiyun
4612*4882a593Smuzhiyun /*
4613*4882a593Smuzhiyun * Set the VCPU to STOPPED and THEN clear the interrupt flag,
4614*4882a593Smuzhiyun * now that the SIGP STOP and SIGP STOP AND STORE STATUS orders
4615*4882a593Smuzhiyun * have been fully processed. This will ensure that the VCPU
4616*4882a593Smuzhiyun * is kept BUSY if another VCPU is inquiring with SIGP SENSE.
4617*4882a593Smuzhiyun */
4618*4882a593Smuzhiyun kvm_s390_set_cpuflags(vcpu, CPUSTAT_STOPPED);
4619*4882a593Smuzhiyun kvm_s390_clear_stop_irq(vcpu);
4620*4882a593Smuzhiyun
4621*4882a593Smuzhiyun __disable_ibs_on_vcpu(vcpu);
4622*4882a593Smuzhiyun
4623*4882a593Smuzhiyun for (i = 0; i < online_vcpus; i++) {
4624*4882a593Smuzhiyun if (!is_vcpu_stopped(vcpu->kvm->vcpus[i])) {
4625*4882a593Smuzhiyun started_vcpus++;
4626*4882a593Smuzhiyun started_vcpu = vcpu->kvm->vcpus[i];
4627*4882a593Smuzhiyun }
4628*4882a593Smuzhiyun }
4629*4882a593Smuzhiyun
4630*4882a593Smuzhiyun if (started_vcpus == 1) {
4631*4882a593Smuzhiyun /*
4632*4882a593Smuzhiyun * As we only have one VCPU left, we want to enable the
4633*4882a593Smuzhiyun * IBS facility for that VCPU to speed it up.
4634*4882a593Smuzhiyun */
4635*4882a593Smuzhiyun __enable_ibs_on_vcpu(started_vcpu);
4636*4882a593Smuzhiyun }
4637*4882a593Smuzhiyun
4638*4882a593Smuzhiyun spin_unlock(&vcpu->kvm->arch.start_stop_lock);
4639*4882a593Smuzhiyun return 0;
4640*4882a593Smuzhiyun }
4641*4882a593Smuzhiyun
kvm_vcpu_ioctl_enable_cap(struct kvm_vcpu * vcpu,struct kvm_enable_cap * cap)4642*4882a593Smuzhiyun static int kvm_vcpu_ioctl_enable_cap(struct kvm_vcpu *vcpu,
4643*4882a593Smuzhiyun struct kvm_enable_cap *cap)
4644*4882a593Smuzhiyun {
4645*4882a593Smuzhiyun int r;
4646*4882a593Smuzhiyun
4647*4882a593Smuzhiyun if (cap->flags)
4648*4882a593Smuzhiyun return -EINVAL;
4649*4882a593Smuzhiyun
4650*4882a593Smuzhiyun switch (cap->cap) {
4651*4882a593Smuzhiyun case KVM_CAP_S390_CSS_SUPPORT:
4652*4882a593Smuzhiyun if (!vcpu->kvm->arch.css_support) {
4653*4882a593Smuzhiyun vcpu->kvm->arch.css_support = 1;
4654*4882a593Smuzhiyun VM_EVENT(vcpu->kvm, 3, "%s", "ENABLE: CSS support");
4655*4882a593Smuzhiyun trace_kvm_s390_enable_css(vcpu->kvm);
4656*4882a593Smuzhiyun }
4657*4882a593Smuzhiyun r = 0;
4658*4882a593Smuzhiyun break;
4659*4882a593Smuzhiyun default:
4660*4882a593Smuzhiyun r = -EINVAL;
4661*4882a593Smuzhiyun break;
4662*4882a593Smuzhiyun }
4663*4882a593Smuzhiyun return r;
4664*4882a593Smuzhiyun }
4665*4882a593Smuzhiyun
kvm_s390_guest_sida_op(struct kvm_vcpu * vcpu,struct kvm_s390_mem_op * mop)4666*4882a593Smuzhiyun static long kvm_s390_guest_sida_op(struct kvm_vcpu *vcpu,
4667*4882a593Smuzhiyun struct kvm_s390_mem_op *mop)
4668*4882a593Smuzhiyun {
4669*4882a593Smuzhiyun void __user *uaddr = (void __user *)mop->buf;
4670*4882a593Smuzhiyun int r = 0;
4671*4882a593Smuzhiyun
4672*4882a593Smuzhiyun if (mop->flags || !mop->size)
4673*4882a593Smuzhiyun return -EINVAL;
4674*4882a593Smuzhiyun if (mop->size + mop->sida_offset < mop->size)
4675*4882a593Smuzhiyun return -EINVAL;
4676*4882a593Smuzhiyun if (mop->size + mop->sida_offset > sida_size(vcpu->arch.sie_block))
4677*4882a593Smuzhiyun return -E2BIG;
4678*4882a593Smuzhiyun if (!kvm_s390_pv_cpu_is_protected(vcpu))
4679*4882a593Smuzhiyun return -EINVAL;
4680*4882a593Smuzhiyun
4681*4882a593Smuzhiyun switch (mop->op) {
4682*4882a593Smuzhiyun case KVM_S390_MEMOP_SIDA_READ:
4683*4882a593Smuzhiyun if (copy_to_user(uaddr, (void *)(sida_origin(vcpu->arch.sie_block) +
4684*4882a593Smuzhiyun mop->sida_offset), mop->size))
4685*4882a593Smuzhiyun r = -EFAULT;
4686*4882a593Smuzhiyun
4687*4882a593Smuzhiyun break;
4688*4882a593Smuzhiyun case KVM_S390_MEMOP_SIDA_WRITE:
4689*4882a593Smuzhiyun if (copy_from_user((void *)(sida_origin(vcpu->arch.sie_block) +
4690*4882a593Smuzhiyun mop->sida_offset), uaddr, mop->size))
4691*4882a593Smuzhiyun r = -EFAULT;
4692*4882a593Smuzhiyun break;
4693*4882a593Smuzhiyun }
4694*4882a593Smuzhiyun return r;
4695*4882a593Smuzhiyun }
kvm_s390_guest_mem_op(struct kvm_vcpu * vcpu,struct kvm_s390_mem_op * mop)4696*4882a593Smuzhiyun static long kvm_s390_guest_mem_op(struct kvm_vcpu *vcpu,
4697*4882a593Smuzhiyun struct kvm_s390_mem_op *mop)
4698*4882a593Smuzhiyun {
4699*4882a593Smuzhiyun void __user *uaddr = (void __user *)mop->buf;
4700*4882a593Smuzhiyun void *tmpbuf = NULL;
4701*4882a593Smuzhiyun int r = 0;
4702*4882a593Smuzhiyun const u64 supported_flags = KVM_S390_MEMOP_F_INJECT_EXCEPTION
4703*4882a593Smuzhiyun | KVM_S390_MEMOP_F_CHECK_ONLY;
4704*4882a593Smuzhiyun
4705*4882a593Smuzhiyun if (mop->flags & ~supported_flags || mop->ar >= NUM_ACRS || !mop->size)
4706*4882a593Smuzhiyun return -EINVAL;
4707*4882a593Smuzhiyun
4708*4882a593Smuzhiyun if (mop->size > MEM_OP_MAX_SIZE)
4709*4882a593Smuzhiyun return -E2BIG;
4710*4882a593Smuzhiyun
4711*4882a593Smuzhiyun if (kvm_s390_pv_cpu_is_protected(vcpu))
4712*4882a593Smuzhiyun return -EINVAL;
4713*4882a593Smuzhiyun
4714*4882a593Smuzhiyun if (!(mop->flags & KVM_S390_MEMOP_F_CHECK_ONLY)) {
4715*4882a593Smuzhiyun tmpbuf = vmalloc(mop->size);
4716*4882a593Smuzhiyun if (!tmpbuf)
4717*4882a593Smuzhiyun return -ENOMEM;
4718*4882a593Smuzhiyun }
4719*4882a593Smuzhiyun
4720*4882a593Smuzhiyun switch (mop->op) {
4721*4882a593Smuzhiyun case KVM_S390_MEMOP_LOGICAL_READ:
4722*4882a593Smuzhiyun if (mop->flags & KVM_S390_MEMOP_F_CHECK_ONLY) {
4723*4882a593Smuzhiyun r = check_gva_range(vcpu, mop->gaddr, mop->ar,
4724*4882a593Smuzhiyun mop->size, GACC_FETCH);
4725*4882a593Smuzhiyun break;
4726*4882a593Smuzhiyun }
4727*4882a593Smuzhiyun r = read_guest(vcpu, mop->gaddr, mop->ar, tmpbuf, mop->size);
4728*4882a593Smuzhiyun if (r == 0) {
4729*4882a593Smuzhiyun if (copy_to_user(uaddr, tmpbuf, mop->size))
4730*4882a593Smuzhiyun r = -EFAULT;
4731*4882a593Smuzhiyun }
4732*4882a593Smuzhiyun break;
4733*4882a593Smuzhiyun case KVM_S390_MEMOP_LOGICAL_WRITE:
4734*4882a593Smuzhiyun if (mop->flags & KVM_S390_MEMOP_F_CHECK_ONLY) {
4735*4882a593Smuzhiyun r = check_gva_range(vcpu, mop->gaddr, mop->ar,
4736*4882a593Smuzhiyun mop->size, GACC_STORE);
4737*4882a593Smuzhiyun break;
4738*4882a593Smuzhiyun }
4739*4882a593Smuzhiyun if (copy_from_user(tmpbuf, uaddr, mop->size)) {
4740*4882a593Smuzhiyun r = -EFAULT;
4741*4882a593Smuzhiyun break;
4742*4882a593Smuzhiyun }
4743*4882a593Smuzhiyun r = write_guest(vcpu, mop->gaddr, mop->ar, tmpbuf, mop->size);
4744*4882a593Smuzhiyun break;
4745*4882a593Smuzhiyun }
4746*4882a593Smuzhiyun
4747*4882a593Smuzhiyun if (r > 0 && (mop->flags & KVM_S390_MEMOP_F_INJECT_EXCEPTION) != 0)
4748*4882a593Smuzhiyun kvm_s390_inject_prog_irq(vcpu, &vcpu->arch.pgm);
4749*4882a593Smuzhiyun
4750*4882a593Smuzhiyun vfree(tmpbuf);
4751*4882a593Smuzhiyun return r;
4752*4882a593Smuzhiyun }
4753*4882a593Smuzhiyun
kvm_s390_guest_memsida_op(struct kvm_vcpu * vcpu,struct kvm_s390_mem_op * mop)4754*4882a593Smuzhiyun static long kvm_s390_guest_memsida_op(struct kvm_vcpu *vcpu,
4755*4882a593Smuzhiyun struct kvm_s390_mem_op *mop)
4756*4882a593Smuzhiyun {
4757*4882a593Smuzhiyun int r, srcu_idx;
4758*4882a593Smuzhiyun
4759*4882a593Smuzhiyun srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
4760*4882a593Smuzhiyun
4761*4882a593Smuzhiyun switch (mop->op) {
4762*4882a593Smuzhiyun case KVM_S390_MEMOP_LOGICAL_READ:
4763*4882a593Smuzhiyun case KVM_S390_MEMOP_LOGICAL_WRITE:
4764*4882a593Smuzhiyun r = kvm_s390_guest_mem_op(vcpu, mop);
4765*4882a593Smuzhiyun break;
4766*4882a593Smuzhiyun case KVM_S390_MEMOP_SIDA_READ:
4767*4882a593Smuzhiyun case KVM_S390_MEMOP_SIDA_WRITE:
4768*4882a593Smuzhiyun /* we are locked against sida going away by the vcpu->mutex */
4769*4882a593Smuzhiyun r = kvm_s390_guest_sida_op(vcpu, mop);
4770*4882a593Smuzhiyun break;
4771*4882a593Smuzhiyun default:
4772*4882a593Smuzhiyun r = -EINVAL;
4773*4882a593Smuzhiyun }
4774*4882a593Smuzhiyun
4775*4882a593Smuzhiyun srcu_read_unlock(&vcpu->kvm->srcu, srcu_idx);
4776*4882a593Smuzhiyun return r;
4777*4882a593Smuzhiyun }
4778*4882a593Smuzhiyun
kvm_arch_vcpu_async_ioctl(struct file * filp,unsigned int ioctl,unsigned long arg)4779*4882a593Smuzhiyun long kvm_arch_vcpu_async_ioctl(struct file *filp,
4780*4882a593Smuzhiyun unsigned int ioctl, unsigned long arg)
4781*4882a593Smuzhiyun {
4782*4882a593Smuzhiyun struct kvm_vcpu *vcpu = filp->private_data;
4783*4882a593Smuzhiyun void __user *argp = (void __user *)arg;
4784*4882a593Smuzhiyun
4785*4882a593Smuzhiyun switch (ioctl) {
4786*4882a593Smuzhiyun case KVM_S390_IRQ: {
4787*4882a593Smuzhiyun struct kvm_s390_irq s390irq;
4788*4882a593Smuzhiyun
4789*4882a593Smuzhiyun if (copy_from_user(&s390irq, argp, sizeof(s390irq)))
4790*4882a593Smuzhiyun return -EFAULT;
4791*4882a593Smuzhiyun return kvm_s390_inject_vcpu(vcpu, &s390irq);
4792*4882a593Smuzhiyun }
4793*4882a593Smuzhiyun case KVM_S390_INTERRUPT: {
4794*4882a593Smuzhiyun struct kvm_s390_interrupt s390int;
4795*4882a593Smuzhiyun struct kvm_s390_irq s390irq = {};
4796*4882a593Smuzhiyun
4797*4882a593Smuzhiyun if (copy_from_user(&s390int, argp, sizeof(s390int)))
4798*4882a593Smuzhiyun return -EFAULT;
4799*4882a593Smuzhiyun if (s390int_to_s390irq(&s390int, &s390irq))
4800*4882a593Smuzhiyun return -EINVAL;
4801*4882a593Smuzhiyun return kvm_s390_inject_vcpu(vcpu, &s390irq);
4802*4882a593Smuzhiyun }
4803*4882a593Smuzhiyun }
4804*4882a593Smuzhiyun return -ENOIOCTLCMD;
4805*4882a593Smuzhiyun }
4806*4882a593Smuzhiyun
kvm_arch_vcpu_ioctl(struct file * filp,unsigned int ioctl,unsigned long arg)4807*4882a593Smuzhiyun long kvm_arch_vcpu_ioctl(struct file *filp,
4808*4882a593Smuzhiyun unsigned int ioctl, unsigned long arg)
4809*4882a593Smuzhiyun {
4810*4882a593Smuzhiyun struct kvm_vcpu *vcpu = filp->private_data;
4811*4882a593Smuzhiyun void __user *argp = (void __user *)arg;
4812*4882a593Smuzhiyun int idx;
4813*4882a593Smuzhiyun long r;
4814*4882a593Smuzhiyun u16 rc, rrc;
4815*4882a593Smuzhiyun
4816*4882a593Smuzhiyun vcpu_load(vcpu);
4817*4882a593Smuzhiyun
4818*4882a593Smuzhiyun switch (ioctl) {
4819*4882a593Smuzhiyun case KVM_S390_STORE_STATUS:
4820*4882a593Smuzhiyun idx = srcu_read_lock(&vcpu->kvm->srcu);
4821*4882a593Smuzhiyun r = kvm_s390_store_status_unloaded(vcpu, arg);
4822*4882a593Smuzhiyun srcu_read_unlock(&vcpu->kvm->srcu, idx);
4823*4882a593Smuzhiyun break;
4824*4882a593Smuzhiyun case KVM_S390_SET_INITIAL_PSW: {
4825*4882a593Smuzhiyun psw_t psw;
4826*4882a593Smuzhiyun
4827*4882a593Smuzhiyun r = -EFAULT;
4828*4882a593Smuzhiyun if (copy_from_user(&psw, argp, sizeof(psw)))
4829*4882a593Smuzhiyun break;
4830*4882a593Smuzhiyun r = kvm_arch_vcpu_ioctl_set_initial_psw(vcpu, psw);
4831*4882a593Smuzhiyun break;
4832*4882a593Smuzhiyun }
4833*4882a593Smuzhiyun case KVM_S390_CLEAR_RESET:
4834*4882a593Smuzhiyun r = 0;
4835*4882a593Smuzhiyun kvm_arch_vcpu_ioctl_clear_reset(vcpu);
4836*4882a593Smuzhiyun if (kvm_s390_pv_cpu_is_protected(vcpu)) {
4837*4882a593Smuzhiyun r = uv_cmd_nodata(kvm_s390_pv_cpu_get_handle(vcpu),
4838*4882a593Smuzhiyun UVC_CMD_CPU_RESET_CLEAR, &rc, &rrc);
4839*4882a593Smuzhiyun VCPU_EVENT(vcpu, 3, "PROTVIRT RESET CLEAR VCPU: rc %x rrc %x",
4840*4882a593Smuzhiyun rc, rrc);
4841*4882a593Smuzhiyun }
4842*4882a593Smuzhiyun break;
4843*4882a593Smuzhiyun case KVM_S390_INITIAL_RESET:
4844*4882a593Smuzhiyun r = 0;
4845*4882a593Smuzhiyun kvm_arch_vcpu_ioctl_initial_reset(vcpu);
4846*4882a593Smuzhiyun if (kvm_s390_pv_cpu_is_protected(vcpu)) {
4847*4882a593Smuzhiyun r = uv_cmd_nodata(kvm_s390_pv_cpu_get_handle(vcpu),
4848*4882a593Smuzhiyun UVC_CMD_CPU_RESET_INITIAL,
4849*4882a593Smuzhiyun &rc, &rrc);
4850*4882a593Smuzhiyun VCPU_EVENT(vcpu, 3, "PROTVIRT RESET INITIAL VCPU: rc %x rrc %x",
4851*4882a593Smuzhiyun rc, rrc);
4852*4882a593Smuzhiyun }
4853*4882a593Smuzhiyun break;
4854*4882a593Smuzhiyun case KVM_S390_NORMAL_RESET:
4855*4882a593Smuzhiyun r = 0;
4856*4882a593Smuzhiyun kvm_arch_vcpu_ioctl_normal_reset(vcpu);
4857*4882a593Smuzhiyun if (kvm_s390_pv_cpu_is_protected(vcpu)) {
4858*4882a593Smuzhiyun r = uv_cmd_nodata(kvm_s390_pv_cpu_get_handle(vcpu),
4859*4882a593Smuzhiyun UVC_CMD_CPU_RESET, &rc, &rrc);
4860*4882a593Smuzhiyun VCPU_EVENT(vcpu, 3, "PROTVIRT RESET NORMAL VCPU: rc %x rrc %x",
4861*4882a593Smuzhiyun rc, rrc);
4862*4882a593Smuzhiyun }
4863*4882a593Smuzhiyun break;
4864*4882a593Smuzhiyun case KVM_SET_ONE_REG:
4865*4882a593Smuzhiyun case KVM_GET_ONE_REG: {
4866*4882a593Smuzhiyun struct kvm_one_reg reg;
4867*4882a593Smuzhiyun r = -EINVAL;
4868*4882a593Smuzhiyun if (kvm_s390_pv_cpu_is_protected(vcpu))
4869*4882a593Smuzhiyun break;
4870*4882a593Smuzhiyun r = -EFAULT;
4871*4882a593Smuzhiyun if (copy_from_user(®, argp, sizeof(reg)))
4872*4882a593Smuzhiyun break;
4873*4882a593Smuzhiyun if (ioctl == KVM_SET_ONE_REG)
4874*4882a593Smuzhiyun r = kvm_arch_vcpu_ioctl_set_one_reg(vcpu, ®);
4875*4882a593Smuzhiyun else
4876*4882a593Smuzhiyun r = kvm_arch_vcpu_ioctl_get_one_reg(vcpu, ®);
4877*4882a593Smuzhiyun break;
4878*4882a593Smuzhiyun }
4879*4882a593Smuzhiyun #ifdef CONFIG_KVM_S390_UCONTROL
4880*4882a593Smuzhiyun case KVM_S390_UCAS_MAP: {
4881*4882a593Smuzhiyun struct kvm_s390_ucas_mapping ucasmap;
4882*4882a593Smuzhiyun
4883*4882a593Smuzhiyun if (copy_from_user(&ucasmap, argp, sizeof(ucasmap))) {
4884*4882a593Smuzhiyun r = -EFAULT;
4885*4882a593Smuzhiyun break;
4886*4882a593Smuzhiyun }
4887*4882a593Smuzhiyun
4888*4882a593Smuzhiyun if (!kvm_is_ucontrol(vcpu->kvm)) {
4889*4882a593Smuzhiyun r = -EINVAL;
4890*4882a593Smuzhiyun break;
4891*4882a593Smuzhiyun }
4892*4882a593Smuzhiyun
4893*4882a593Smuzhiyun r = gmap_map_segment(vcpu->arch.gmap, ucasmap.user_addr,
4894*4882a593Smuzhiyun ucasmap.vcpu_addr, ucasmap.length);
4895*4882a593Smuzhiyun break;
4896*4882a593Smuzhiyun }
4897*4882a593Smuzhiyun case KVM_S390_UCAS_UNMAP: {
4898*4882a593Smuzhiyun struct kvm_s390_ucas_mapping ucasmap;
4899*4882a593Smuzhiyun
4900*4882a593Smuzhiyun if (copy_from_user(&ucasmap, argp, sizeof(ucasmap))) {
4901*4882a593Smuzhiyun r = -EFAULT;
4902*4882a593Smuzhiyun break;
4903*4882a593Smuzhiyun }
4904*4882a593Smuzhiyun
4905*4882a593Smuzhiyun if (!kvm_is_ucontrol(vcpu->kvm)) {
4906*4882a593Smuzhiyun r = -EINVAL;
4907*4882a593Smuzhiyun break;
4908*4882a593Smuzhiyun }
4909*4882a593Smuzhiyun
4910*4882a593Smuzhiyun r = gmap_unmap_segment(vcpu->arch.gmap, ucasmap.vcpu_addr,
4911*4882a593Smuzhiyun ucasmap.length);
4912*4882a593Smuzhiyun break;
4913*4882a593Smuzhiyun }
4914*4882a593Smuzhiyun #endif
4915*4882a593Smuzhiyun case KVM_S390_VCPU_FAULT: {
4916*4882a593Smuzhiyun r = gmap_fault(vcpu->arch.gmap, arg, 0);
4917*4882a593Smuzhiyun break;
4918*4882a593Smuzhiyun }
4919*4882a593Smuzhiyun case KVM_ENABLE_CAP:
4920*4882a593Smuzhiyun {
4921*4882a593Smuzhiyun struct kvm_enable_cap cap;
4922*4882a593Smuzhiyun r = -EFAULT;
4923*4882a593Smuzhiyun if (copy_from_user(&cap, argp, sizeof(cap)))
4924*4882a593Smuzhiyun break;
4925*4882a593Smuzhiyun r = kvm_vcpu_ioctl_enable_cap(vcpu, &cap);
4926*4882a593Smuzhiyun break;
4927*4882a593Smuzhiyun }
4928*4882a593Smuzhiyun case KVM_S390_MEM_OP: {
4929*4882a593Smuzhiyun struct kvm_s390_mem_op mem_op;
4930*4882a593Smuzhiyun
4931*4882a593Smuzhiyun if (copy_from_user(&mem_op, argp, sizeof(mem_op)) == 0)
4932*4882a593Smuzhiyun r = kvm_s390_guest_memsida_op(vcpu, &mem_op);
4933*4882a593Smuzhiyun else
4934*4882a593Smuzhiyun r = -EFAULT;
4935*4882a593Smuzhiyun break;
4936*4882a593Smuzhiyun }
4937*4882a593Smuzhiyun case KVM_S390_SET_IRQ_STATE: {
4938*4882a593Smuzhiyun struct kvm_s390_irq_state irq_state;
4939*4882a593Smuzhiyun
4940*4882a593Smuzhiyun r = -EFAULT;
4941*4882a593Smuzhiyun if (copy_from_user(&irq_state, argp, sizeof(irq_state)))
4942*4882a593Smuzhiyun break;
4943*4882a593Smuzhiyun if (irq_state.len > VCPU_IRQS_MAX_BUF ||
4944*4882a593Smuzhiyun irq_state.len == 0 ||
4945*4882a593Smuzhiyun irq_state.len % sizeof(struct kvm_s390_irq) > 0) {
4946*4882a593Smuzhiyun r = -EINVAL;
4947*4882a593Smuzhiyun break;
4948*4882a593Smuzhiyun }
4949*4882a593Smuzhiyun /* do not use irq_state.flags, it will break old QEMUs */
4950*4882a593Smuzhiyun r = kvm_s390_set_irq_state(vcpu,
4951*4882a593Smuzhiyun (void __user *) irq_state.buf,
4952*4882a593Smuzhiyun irq_state.len);
4953*4882a593Smuzhiyun break;
4954*4882a593Smuzhiyun }
4955*4882a593Smuzhiyun case KVM_S390_GET_IRQ_STATE: {
4956*4882a593Smuzhiyun struct kvm_s390_irq_state irq_state;
4957*4882a593Smuzhiyun
4958*4882a593Smuzhiyun r = -EFAULT;
4959*4882a593Smuzhiyun if (copy_from_user(&irq_state, argp, sizeof(irq_state)))
4960*4882a593Smuzhiyun break;
4961*4882a593Smuzhiyun if (irq_state.len == 0) {
4962*4882a593Smuzhiyun r = -EINVAL;
4963*4882a593Smuzhiyun break;
4964*4882a593Smuzhiyun }
4965*4882a593Smuzhiyun /* do not use irq_state.flags, it will break old QEMUs */
4966*4882a593Smuzhiyun r = kvm_s390_get_irq_state(vcpu,
4967*4882a593Smuzhiyun (__u8 __user *) irq_state.buf,
4968*4882a593Smuzhiyun irq_state.len);
4969*4882a593Smuzhiyun break;
4970*4882a593Smuzhiyun }
4971*4882a593Smuzhiyun default:
4972*4882a593Smuzhiyun r = -ENOTTY;
4973*4882a593Smuzhiyun }
4974*4882a593Smuzhiyun
4975*4882a593Smuzhiyun vcpu_put(vcpu);
4976*4882a593Smuzhiyun return r;
4977*4882a593Smuzhiyun }
4978*4882a593Smuzhiyun
kvm_arch_vcpu_fault(struct kvm_vcpu * vcpu,struct vm_fault * vmf)4979*4882a593Smuzhiyun vm_fault_t kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf)
4980*4882a593Smuzhiyun {
4981*4882a593Smuzhiyun #ifdef CONFIG_KVM_S390_UCONTROL
4982*4882a593Smuzhiyun if ((vmf->pgoff == KVM_S390_SIE_PAGE_OFFSET)
4983*4882a593Smuzhiyun && (kvm_is_ucontrol(vcpu->kvm))) {
4984*4882a593Smuzhiyun vmf->page = virt_to_page(vcpu->arch.sie_block);
4985*4882a593Smuzhiyun get_page(vmf->page);
4986*4882a593Smuzhiyun return 0;
4987*4882a593Smuzhiyun }
4988*4882a593Smuzhiyun #endif
4989*4882a593Smuzhiyun return VM_FAULT_SIGBUS;
4990*4882a593Smuzhiyun }
4991*4882a593Smuzhiyun
4992*4882a593Smuzhiyun /* Section: memory related */
kvm_arch_prepare_memory_region(struct kvm * kvm,struct kvm_memory_slot * memslot,const struct kvm_userspace_memory_region * mem,enum kvm_mr_change change)4993*4882a593Smuzhiyun int kvm_arch_prepare_memory_region(struct kvm *kvm,
4994*4882a593Smuzhiyun struct kvm_memory_slot *memslot,
4995*4882a593Smuzhiyun const struct kvm_userspace_memory_region *mem,
4996*4882a593Smuzhiyun enum kvm_mr_change change)
4997*4882a593Smuzhiyun {
4998*4882a593Smuzhiyun /* A few sanity checks. We can have memory slots which have to be
4999*4882a593Smuzhiyun located/ended at a segment boundary (1MB). The memory in userland is
5000*4882a593Smuzhiyun ok to be fragmented into various different vmas. It is okay to mmap()
5001*4882a593Smuzhiyun and munmap() stuff in this slot after doing this call at any time */
5002*4882a593Smuzhiyun
5003*4882a593Smuzhiyun if (mem->userspace_addr & 0xffffful)
5004*4882a593Smuzhiyun return -EINVAL;
5005*4882a593Smuzhiyun
5006*4882a593Smuzhiyun if (mem->memory_size & 0xffffful)
5007*4882a593Smuzhiyun return -EINVAL;
5008*4882a593Smuzhiyun
5009*4882a593Smuzhiyun if (mem->guest_phys_addr + mem->memory_size > kvm->arch.mem_limit)
5010*4882a593Smuzhiyun return -EINVAL;
5011*4882a593Smuzhiyun
5012*4882a593Smuzhiyun /* When we are protected, we should not change the memory slots */
5013*4882a593Smuzhiyun if (kvm_s390_pv_get_handle(kvm))
5014*4882a593Smuzhiyun return -EINVAL;
5015*4882a593Smuzhiyun return 0;
5016*4882a593Smuzhiyun }
5017*4882a593Smuzhiyun
kvm_arch_commit_memory_region(struct kvm * kvm,const struct kvm_userspace_memory_region * mem,struct kvm_memory_slot * old,const struct kvm_memory_slot * new,enum kvm_mr_change change)5018*4882a593Smuzhiyun void kvm_arch_commit_memory_region(struct kvm *kvm,
5019*4882a593Smuzhiyun const struct kvm_userspace_memory_region *mem,
5020*4882a593Smuzhiyun struct kvm_memory_slot *old,
5021*4882a593Smuzhiyun const struct kvm_memory_slot *new,
5022*4882a593Smuzhiyun enum kvm_mr_change change)
5023*4882a593Smuzhiyun {
5024*4882a593Smuzhiyun int rc = 0;
5025*4882a593Smuzhiyun
5026*4882a593Smuzhiyun switch (change) {
5027*4882a593Smuzhiyun case KVM_MR_DELETE:
5028*4882a593Smuzhiyun rc = gmap_unmap_segment(kvm->arch.gmap, old->base_gfn * PAGE_SIZE,
5029*4882a593Smuzhiyun old->npages * PAGE_SIZE);
5030*4882a593Smuzhiyun break;
5031*4882a593Smuzhiyun case KVM_MR_MOVE:
5032*4882a593Smuzhiyun rc = gmap_unmap_segment(kvm->arch.gmap, old->base_gfn * PAGE_SIZE,
5033*4882a593Smuzhiyun old->npages * PAGE_SIZE);
5034*4882a593Smuzhiyun if (rc)
5035*4882a593Smuzhiyun break;
5036*4882a593Smuzhiyun fallthrough;
5037*4882a593Smuzhiyun case KVM_MR_CREATE:
5038*4882a593Smuzhiyun rc = gmap_map_segment(kvm->arch.gmap, mem->userspace_addr,
5039*4882a593Smuzhiyun mem->guest_phys_addr, mem->memory_size);
5040*4882a593Smuzhiyun break;
5041*4882a593Smuzhiyun case KVM_MR_FLAGS_ONLY:
5042*4882a593Smuzhiyun break;
5043*4882a593Smuzhiyun default:
5044*4882a593Smuzhiyun WARN(1, "Unknown KVM MR CHANGE: %d\n", change);
5045*4882a593Smuzhiyun }
5046*4882a593Smuzhiyun if (rc)
5047*4882a593Smuzhiyun pr_warn("failed to commit memory region\n");
5048*4882a593Smuzhiyun return;
5049*4882a593Smuzhiyun }
5050*4882a593Smuzhiyun
nonhyp_mask(int i)5051*4882a593Smuzhiyun static inline unsigned long nonhyp_mask(int i)
5052*4882a593Smuzhiyun {
5053*4882a593Smuzhiyun unsigned int nonhyp_fai = (sclp.hmfai << i * 2) >> 30;
5054*4882a593Smuzhiyun
5055*4882a593Smuzhiyun return 0x0000ffffffffffffUL >> (nonhyp_fai << 4);
5056*4882a593Smuzhiyun }
5057*4882a593Smuzhiyun
kvm_arch_vcpu_block_finish(struct kvm_vcpu * vcpu)5058*4882a593Smuzhiyun void kvm_arch_vcpu_block_finish(struct kvm_vcpu *vcpu)
5059*4882a593Smuzhiyun {
5060*4882a593Smuzhiyun vcpu->valid_wakeup = false;
5061*4882a593Smuzhiyun }
5062*4882a593Smuzhiyun
kvm_s390_init(void)5063*4882a593Smuzhiyun static int __init kvm_s390_init(void)
5064*4882a593Smuzhiyun {
5065*4882a593Smuzhiyun int i;
5066*4882a593Smuzhiyun
5067*4882a593Smuzhiyun if (!sclp.has_sief2) {
5068*4882a593Smuzhiyun pr_info("SIE is not available\n");
5069*4882a593Smuzhiyun return -ENODEV;
5070*4882a593Smuzhiyun }
5071*4882a593Smuzhiyun
5072*4882a593Smuzhiyun if (nested && hpage) {
5073*4882a593Smuzhiyun pr_info("A KVM host that supports nesting cannot back its KVM guests with huge pages\n");
5074*4882a593Smuzhiyun return -EINVAL;
5075*4882a593Smuzhiyun }
5076*4882a593Smuzhiyun
5077*4882a593Smuzhiyun for (i = 0; i < 16; i++)
5078*4882a593Smuzhiyun kvm_s390_fac_base[i] |=
5079*4882a593Smuzhiyun S390_lowcore.stfle_fac_list[i] & nonhyp_mask(i);
5080*4882a593Smuzhiyun
5081*4882a593Smuzhiyun return kvm_init(NULL, sizeof(struct kvm_vcpu), 0, THIS_MODULE);
5082*4882a593Smuzhiyun }
5083*4882a593Smuzhiyun
kvm_s390_exit(void)5084*4882a593Smuzhiyun static void __exit kvm_s390_exit(void)
5085*4882a593Smuzhiyun {
5086*4882a593Smuzhiyun kvm_exit();
5087*4882a593Smuzhiyun }
5088*4882a593Smuzhiyun
5089*4882a593Smuzhiyun module_init(kvm_s390_init);
5090*4882a593Smuzhiyun module_exit(kvm_s390_exit);
5091*4882a593Smuzhiyun
5092*4882a593Smuzhiyun /*
5093*4882a593Smuzhiyun * Enable autoloading of the kvm module.
5094*4882a593Smuzhiyun * Note that we add the module alias here instead of virt/kvm/kvm_main.c
5095*4882a593Smuzhiyun * since x86 takes a different approach.
5096*4882a593Smuzhiyun */
5097*4882a593Smuzhiyun #include <linux/miscdevice.h>
5098*4882a593Smuzhiyun MODULE_ALIAS_MISCDEV(KVM_MINOR);
5099*4882a593Smuzhiyun MODULE_ALIAS("devname:kvm");
5100