priv.c 37.9 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0
2
/*
3
 * handling privileged instructions
4
 *
5
 * Copyright IBM Corp. 2008, 2018
6 7 8 9 10 11
 *
 *    Author(s): Carsten Otte <cotte@de.ibm.com>
 *               Christian Borntraeger <borntraeger@de.ibm.com>
 */

#include <linux/kvm.h>
12
#include <linux/gfp.h>
13
#include <linux/errno.h>
14
#include <linux/compat.h>
15 16
#include <linux/mm_types.h>

17
#include <asm/asm-offsets.h>
18
#include <asm/facility.h>
19 20 21 22
#include <asm/current.h>
#include <asm/debug.h>
#include <asm/ebcdic.h>
#include <asm/sysinfo.h>
23
#include <asm/pgtable.h>
24
#include <asm/page-states.h>
25
#include <asm/pgalloc.h>
26
#include <asm/gmap.h>
27
#include <asm/io.h>
28
#include <asm/ptrace.h>
29
#include <asm/sclp.h>
30 31
#include "gaccess.h"
#include "kvm-s390.h"
32
#include "trace.h"
33

F
Fan Zhang 已提交
34 35
static int handle_ri(struct kvm_vcpu *vcpu)
{
36 37
	vcpu->stat.instruction_ri++;

F
Fan Zhang 已提交
38
	if (test_kvm_facility(vcpu->kvm, 64)) {
39
		VCPU_EVENT(vcpu, 3, "%s", "ENABLE: RI (lazy)");
40
		vcpu->arch.sie_block->ecb3 |= ECB3_RI;
F
Fan Zhang 已提交
41 42 43 44 45 46 47 48 49 50 51 52 53 54
		kvm_s390_retry_instr(vcpu);
		return 0;
	} else
		return kvm_s390_inject_program_int(vcpu, PGM_OPERATION);
}

int kvm_s390_handle_aa(struct kvm_vcpu *vcpu)
{
	if ((vcpu->arch.sie_block->ipa & 0xf) <= 4)
		return handle_ri(vcpu);
	else
		return -EOPNOTSUPP;
}

F
Fan Zhang 已提交
55 56
static int handle_gs(struct kvm_vcpu *vcpu)
{
57 58
	vcpu->stat.instruction_gs++;

F
Fan Zhang 已提交
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
	if (test_kvm_facility(vcpu->kvm, 133)) {
		VCPU_EVENT(vcpu, 3, "%s", "ENABLE: GS (lazy)");
		preempt_disable();
		__ctl_set_bit(2, 4);
		current->thread.gs_cb = (struct gs_cb *)&vcpu->run->s.regs.gscb;
		restore_gs_cb(current->thread.gs_cb);
		preempt_enable();
		vcpu->arch.sie_block->ecb |= ECB_GS;
		vcpu->arch.sie_block->ecd |= ECD_HOSTREGMGMT;
		vcpu->arch.gs_enabled = 1;
		kvm_s390_retry_instr(vcpu);
		return 0;
	} else
		return kvm_s390_inject_program_int(vcpu, PGM_OPERATION);
}

int kvm_s390_handle_e3(struct kvm_vcpu *vcpu)
{
	int code = vcpu->arch.sie_block->ipb & 0xff;

	if (code == 0x49 || code == 0x4d)
		return handle_gs(vcpu);
	else
		return -EOPNOTSUPP;
}
84 85 86
/* Handle SCK (SET CLOCK) interception */
static int handle_set_clock(struct kvm_vcpu *vcpu)
{
87
	struct kvm_s390_vm_tod_clock gtod = { 0 };
88
	int rc;
89
	u8 ar;
90
	u64 op2;
91

92 93
	vcpu->stat.instruction_sck++;

94 95 96
	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);

97
	op2 = kvm_s390_get_base_disp_s(vcpu, &ar);
98 99
	if (op2 & 7)	/* Operand must be on a doubleword boundary */
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
100
	rc = read_guest(vcpu, op2, ar, &gtod.tod, sizeof(gtod.tod));
101 102
	if (rc)
		return kvm_s390_inject_prog_cond(vcpu, rc);
103

104 105
	VCPU_EVENT(vcpu, 3, "SCK: setting guest TOD to 0x%llx", gtod.tod);
	kvm_s390_set_tod_clock(vcpu->kvm, &gtod);
106 107 108 109 110

	kvm_s390_set_psw_cc(vcpu, 0);
	return 0;
}

111 112 113
static int handle_set_prefix(struct kvm_vcpu *vcpu)
{
	u64 operand2;
114 115
	u32 address;
	int rc;
116
	u8 ar;
117 118 119

	vcpu->stat.instruction_spx++;

120 121 122
	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);

123
	operand2 = kvm_s390_get_base_disp_s(vcpu, &ar);
124 125

	/* must be word boundary */
126 127
	if (operand2 & 3)
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
128 129

	/* get the value */
130
	rc = read_guest(vcpu, operand2, ar, &address, sizeof(address));
131 132 133 134 135 136 137 138 139 140 141
	if (rc)
		return kvm_s390_inject_prog_cond(vcpu, rc);

	address &= 0x7fffe000u;

	/*
	 * Make sure the new value is valid memory. We only need to check the
	 * first page, since address is 8k aligned and memory pieces are always
	 * at least 1MB aligned and have at least a size of 1MB.
	 */
	if (kvm_is_error_gpa(vcpu->kvm, address))
142
		return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
143

144
	kvm_s390_set_prefix(vcpu, address);
145
	trace_kvm_s390_handle_prefix(vcpu, 1, address);
146 147 148 149 150 151 152
	return 0;
}

static int handle_store_prefix(struct kvm_vcpu *vcpu)
{
	u64 operand2;
	u32 address;
153
	int rc;
154
	u8 ar;
155 156

	vcpu->stat.instruction_stpx++;
157

158 159 160
	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);

161
	operand2 = kvm_s390_get_base_disp_s(vcpu, &ar);
162 163

	/* must be word boundary */
164 165
	if (operand2 & 3)
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
166

167
	address = kvm_s390_get_prefix(vcpu);
168 169

	/* get the value */
170
	rc = write_guest(vcpu, operand2, ar, &address, sizeof(address));
171 172
	if (rc)
		return kvm_s390_inject_prog_cond(vcpu, rc);
173

174
	VCPU_EVENT(vcpu, 3, "STPX: storing prefix 0x%x into 0x%llx", address, operand2);
175
	trace_kvm_s390_handle_prefix(vcpu, 0, address);
176 177 178 179 180
	return 0;
}

static int handle_store_cpu_address(struct kvm_vcpu *vcpu)
{
181 182 183
	u16 vcpu_id = vcpu->vcpu_id;
	u64 ga;
	int rc;
184
	u8 ar;
185 186

	vcpu->stat.instruction_stap++;
187

188 189 190
	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);

191
	ga = kvm_s390_get_base_disp_s(vcpu, &ar);
192

193
	if (ga & 1)
194
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
195

196
	rc = write_guest(vcpu, ga, ar, &vcpu_id, sizeof(vcpu_id));
197 198
	if (rc)
		return kvm_s390_inject_prog_cond(vcpu, rc);
199

200
	VCPU_EVENT(vcpu, 3, "STAP: storing cpu address (%u) to 0x%llx", vcpu_id, ga);
201
	trace_kvm_s390_handle_stap(vcpu, ga);
202 203 204
	return 0;
}

205
int kvm_s390_skey_check_enable(struct kvm_vcpu *vcpu)
206
{
207
	int rc;
208 209

	trace_kvm_s390_skey_related_inst(vcpu);
210
	/* Already enabled? */
211
	if (vcpu->arch.skey_enabled)
212
		return 0;
213

214
	rc = s390_enable_skey();
215
	VCPU_EVENT(vcpu, 3, "enabling storage keys for guest: %d", rc);
216 217 218 219 220 221
	if (rc)
		return rc;

	if (kvm_s390_test_cpuflags(vcpu, CPUSTAT_KSS))
		kvm_s390_clear_cpuflags(vcpu, CPUSTAT_KSS);
	if (!vcpu->kvm->arch.use_skf)
222
		vcpu->arch.sie_block->ictl |= ICTL_ISKE | ICTL_SSKE | ICTL_RRBE;
223
	else
224 225
		vcpu->arch.sie_block->ictl &= ~(ICTL_ISKE | ICTL_SSKE | ICTL_RRBE);
	vcpu->arch.skey_enabled = true;
226
	return 0;
227 228
}

229
static int try_handle_skey(struct kvm_vcpu *vcpu)
230
{
231
	int rc;
232

233
	rc = kvm_s390_skey_check_enable(vcpu);
234 235
	if (rc)
		return rc;
236
	if (vcpu->kvm->arch.use_skf) {
237 238 239 240 241 242 243
		/* with storage-key facility, SIE interprets it for us */
		kvm_s390_retry_instr(vcpu);
		VCPU_EVENT(vcpu, 4, "%s", "retrying storage key operation");
		return -EAGAIN;
	}
	return 0;
}
244

245 246
static int handle_iske(struct kvm_vcpu *vcpu)
{
247
	unsigned long gaddr, vmaddr;
248 249
	unsigned char key;
	int reg1, reg2;
250
	bool unlocked;
251 252
	int rc;

253 254
	vcpu->stat.instruction_iske++;

255 256 257
	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);

258 259 260 261 262 263
	rc = try_handle_skey(vcpu);
	if (rc)
		return rc != -EAGAIN ? rc : 0;

	kvm_s390_get_regs_rre(vcpu, &reg1, &reg2);

264 265 266 267 268
	gaddr = vcpu->run->s.regs.gprs[reg2] & PAGE_MASK;
	gaddr = kvm_s390_logical_to_effective(vcpu, gaddr);
	gaddr = kvm_s390_real_to_abs(vcpu, gaddr);
	vmaddr = gfn_to_hva(vcpu->kvm, gpa_to_gfn(gaddr));
	if (kvm_is_error_hva(vmaddr))
269
		return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
270 271
retry:
	unlocked = false;
272
	down_read(&current->mm->mmap_sem);
273 274 275 276 277 278 279 280 281 282 283
	rc = get_guest_storage_key(current->mm, vmaddr, &key);

	if (rc) {
		rc = fixup_user_fault(current, current->mm, vmaddr,
				      FAULT_FLAG_WRITE, &unlocked);
		if (!rc) {
			up_read(&current->mm->mmap_sem);
			goto retry;
		}
	}
	up_read(&current->mm->mmap_sem);
284 285 286 287
	if (rc == -EFAULT)
		return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
	if (rc < 0)
		return rc;
288 289 290 291 292 293 294
	vcpu->run->s.regs.gprs[reg1] &= ~0xff;
	vcpu->run->s.regs.gprs[reg1] |= key;
	return 0;
}

static int handle_rrbe(struct kvm_vcpu *vcpu)
{
295
	unsigned long vmaddr, gaddr;
296
	int reg1, reg2;
297
	bool unlocked;
298 299
	int rc;

300 301
	vcpu->stat.instruction_rrbe++;

302 303 304
	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);

305 306 307 308 309 310
	rc = try_handle_skey(vcpu);
	if (rc)
		return rc != -EAGAIN ? rc : 0;

	kvm_s390_get_regs_rre(vcpu, &reg1, &reg2);

311 312 313 314 315
	gaddr = vcpu->run->s.regs.gprs[reg2] & PAGE_MASK;
	gaddr = kvm_s390_logical_to_effective(vcpu, gaddr);
	gaddr = kvm_s390_real_to_abs(vcpu, gaddr);
	vmaddr = gfn_to_hva(vcpu->kvm, gpa_to_gfn(gaddr));
	if (kvm_is_error_hva(vmaddr))
316
		return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
317 318
retry:
	unlocked = false;
319
	down_read(&current->mm->mmap_sem);
320 321 322 323 324 325 326 327 328 329
	rc = reset_guest_reference_bit(current->mm, vmaddr);
	if (rc < 0) {
		rc = fixup_user_fault(current, current->mm, vmaddr,
				      FAULT_FLAG_WRITE, &unlocked);
		if (!rc) {
			up_read(&current->mm->mmap_sem);
			goto retry;
		}
	}
	up_read(&current->mm->mmap_sem);
330 331 332 333
	if (rc == -EFAULT)
		return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
	if (rc < 0)
		return rc;
334 335 336 337 338 339 340 341 342 343 344 345 346 347
	kvm_s390_set_psw_cc(vcpu, rc);
	return 0;
}

#define SSKE_NQ 0x8
#define SSKE_MR 0x4
#define SSKE_MC 0x2
#define SSKE_MB 0x1
static int handle_sske(struct kvm_vcpu *vcpu)
{
	unsigned char m3 = vcpu->arch.sie_block->ipb >> 28;
	unsigned long start, end;
	unsigned char key, oldkey;
	int reg1, reg2;
348
	bool unlocked;
349 350
	int rc;

351 352
	vcpu->stat.instruction_sske++;

353 354 355
	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);

356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373
	rc = try_handle_skey(vcpu);
	if (rc)
		return rc != -EAGAIN ? rc : 0;

	if (!test_kvm_facility(vcpu->kvm, 8))
		m3 &= ~SSKE_MB;
	if (!test_kvm_facility(vcpu->kvm, 10))
		m3 &= ~(SSKE_MC | SSKE_MR);
	if (!test_kvm_facility(vcpu->kvm, 14))
		m3 &= ~SSKE_NQ;

	kvm_s390_get_regs_rre(vcpu, &reg1, &reg2);

	key = vcpu->run->s.regs.gprs[reg1] & 0xfe;
	start = vcpu->run->s.regs.gprs[reg2] & PAGE_MASK;
	start = kvm_s390_logical_to_effective(vcpu, start);
	if (m3 & SSKE_MB) {
		/* start already designates an absolute address */
374
		end = (start + _SEGMENT_SIZE) & ~(_SEGMENT_SIZE - 1);
375 376 377 378 379 380
	} else {
		start = kvm_s390_real_to_abs(vcpu, start);
		end = start + PAGE_SIZE;
	}

	while (start != end) {
381 382
		unsigned long vmaddr = gfn_to_hva(vcpu->kvm, gpa_to_gfn(start));
		unlocked = false;
383

384
		if (kvm_is_error_hva(vmaddr))
385 386 387
			return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);

		down_read(&current->mm->mmap_sem);
388
		rc = cond_set_guest_storage_key(current->mm, vmaddr, key, &oldkey,
389 390
						m3 & SSKE_NQ, m3 & SSKE_MR,
						m3 & SSKE_MC);
391 392 393 394 395 396

		if (rc < 0) {
			rc = fixup_user_fault(current, current->mm, vmaddr,
					      FAULT_FLAG_WRITE, &unlocked);
			rc = !rc ? -EAGAIN : rc;
		}
397
		up_read(&current->mm->mmap_sem);
398
		if (rc == -EFAULT)
399
			return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
400 401 402
		if (rc < 0)
			return rc;
		start += PAGE_SIZE;
403
	}
404 405 406 407 408 409 410 411 412 413 414 415

	if (m3 & (SSKE_MC | SSKE_MR)) {
		if (m3 & SSKE_MB) {
			/* skey in reg1 is unpredictable */
			kvm_s390_set_psw_cc(vcpu, 3);
		} else {
			kvm_s390_set_psw_cc(vcpu, rc);
			vcpu->run->s.regs.gprs[reg1] &= ~0xff00UL;
			vcpu->run->s.regs.gprs[reg1] |= (u64) oldkey << 8;
		}
	}
	if (m3 & SSKE_MB) {
H
Heiko Carstens 已提交
416
		if (psw_bits(vcpu->arch.sie_block->gpsw).eaba == PSW_BITS_AMODE_64BIT)
417 418 419 420 421 422
			vcpu->run->s.regs.gprs[reg2] &= ~PAGE_MASK;
		else
			vcpu->run->s.regs.gprs[reg2] &= ~0xfffff000UL;
		end = kvm_s390_logical_to_effective(vcpu, end);
		vcpu->run->s.regs.gprs[reg2] |= end;
	}
423 424 425
	return 0;
}

426 427 428
static int handle_ipte_interlock(struct kvm_vcpu *vcpu)
{
	vcpu->stat.instruction_ipte_interlock++;
429
	if (psw_bits(vcpu->arch.sie_block->gpsw).pstate)
430 431
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);
	wait_event(vcpu->kvm->arch.ipte_wq, !ipte_lock_held(vcpu));
432
	kvm_s390_retry_instr(vcpu);
433 434 435 436
	VCPU_EVENT(vcpu, 4, "%s", "retrying ipte interlock operation");
	return 0;
}

T
Thomas Huth 已提交
437 438 439 440 441
static int handle_test_block(struct kvm_vcpu *vcpu)
{
	gpa_t addr;
	int reg2;

442 443
	vcpu->stat.instruction_tb++;

T
Thomas Huth 已提交
444 445 446 447 448
	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);

	kvm_s390_get_regs_rre(vcpu, NULL, &reg2);
	addr = vcpu->run->s.regs.gprs[reg2] & PAGE_MASK;
449
	addr = kvm_s390_logical_to_effective(vcpu, addr);
450
	if (kvm_s390_check_low_addr_prot_real(vcpu, addr))
451
		return kvm_s390_inject_prog_irq(vcpu, &vcpu->arch.pgm);
T
Thomas Huth 已提交
452 453
	addr = kvm_s390_real_to_abs(vcpu, addr);

454
	if (kvm_is_error_gpa(vcpu->kvm, addr))
T
Thomas Huth 已提交
455 456 457 458 459
		return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
	/*
	 * We don't expect errors on modern systems, and do not care
	 * about storage keys (yet), so let's just clear the page.
	 */
460
	if (kvm_clear_guest(vcpu->kvm, addr, PAGE_SIZE))
T
Thomas Huth 已提交
461 462 463 464 465 466
		return -EFAULT;
	kvm_s390_set_psw_cc(vcpu, 0);
	vcpu->run->s.regs.gprs[0] = 0;
	return 0;
}

467
static int handle_tpi(struct kvm_vcpu *vcpu)
468
{
469
	struct kvm_s390_interrupt_info *inti;
H
Heiko Carstens 已提交
470 471
	unsigned long len;
	u32 tpi_data[3];
472
	int rc;
473
	u64 addr;
474
	u8 ar;
475

476 477
	vcpu->stat.instruction_tpi++;

478
	addr = kvm_s390_get_base_disp_s(vcpu, &ar);
479 480
	if (addr & 3)
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
481

482
	inti = kvm_s390_get_io_int(vcpu->kvm, vcpu->arch.sie_block->gcr[6], 0);
483 484 485 486 487
	if (!inti) {
		kvm_s390_set_psw_cc(vcpu, 0);
		return 0;
	}

H
Heiko Carstens 已提交
488 489 490
	tpi_data[0] = inti->io.subchannel_id << 16 | inti->io.subchannel_nr;
	tpi_data[1] = inti->io.io_int_parm;
	tpi_data[2] = inti->io.io_int_word;
491 492 493 494 495
	if (addr) {
		/*
		 * Store the two-word I/O interruption code into the
		 * provided area.
		 */
H
Heiko Carstens 已提交
496
		len = sizeof(tpi_data) - 4;
497
		rc = write_guest(vcpu, addr, ar, &tpi_data, len);
498 499 500 501
		if (rc) {
			rc = kvm_s390_inject_prog_cond(vcpu, rc);
			goto reinject_interrupt;
		}
502 503 504 505 506
	} else {
		/*
		 * Store the three-word I/O interruption code into
		 * the appropriate lowcore area.
		 */
H
Heiko Carstens 已提交
507
		len = sizeof(tpi_data);
508 509
		if (write_guest_lc(vcpu, __LC_SUBCHANNEL_ID, &tpi_data, len)) {
			/* failed writes to the low core are not recoverable */
H
Heiko Carstens 已提交
510
			rc = -EFAULT;
511 512
			goto reinject_interrupt;
		}
513
	}
514 515 516 517 518 519

	/* irq was successfully handed to the guest */
	kfree(inti);
	kvm_s390_set_psw_cc(vcpu, 1);
	return 0;
reinject_interrupt:
520 521 522 523 524
	/*
	 * If we encounter a problem storing the interruption code, the
	 * instruction is suppressed from the guest's view: reinject the
	 * interrupt.
	 */
525 526 527 528
	if (kvm_s390_reinject_io_int(vcpu->kvm, inti)) {
		kfree(inti);
		rc = -EFAULT;
	}
529
	/* don't set the cc, a pgm irq was injected or we drop to user space */
H
Heiko Carstens 已提交
530
	return rc ? -EFAULT : 0;
531 532
}

533 534
static int handle_tsch(struct kvm_vcpu *vcpu)
{
535 536
	struct kvm_s390_interrupt_info *inti = NULL;
	const u64 isc_mask = 0xffUL << 24; /* all iscs set */
537

538 539
	vcpu->stat.instruction_tsch++;

540 541 542 543
	/* a valid schid has at least one bit set */
	if (vcpu->run->s.regs.gprs[1])
		inti = kvm_s390_get_io_int(vcpu->kvm, isc_mask,
					   vcpu->run->s.regs.gprs[1]);
544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569

	/*
	 * Prepare exit to userspace.
	 * We indicate whether we dequeued a pending I/O interrupt
	 * so that userspace can re-inject it if the instruction gets
	 * a program check. While this may re-order the pending I/O
	 * interrupts, this is no problem since the priority is kept
	 * intact.
	 */
	vcpu->run->exit_reason = KVM_EXIT_S390_TSCH;
	vcpu->run->s390_tsch.dequeued = !!inti;
	if (inti) {
		vcpu->run->s390_tsch.subchannel_id = inti->io.subchannel_id;
		vcpu->run->s390_tsch.subchannel_nr = inti->io.subchannel_nr;
		vcpu->run->s390_tsch.io_int_parm = inti->io.io_int_parm;
		vcpu->run->s390_tsch.io_int_word = inti->io.io_int_word;
	}
	vcpu->run->s390_tsch.ipb = vcpu->arch.sie_block->ipb;
	kfree(inti);
	return -EREMOTE;
}

static int handle_io_inst(struct kvm_vcpu *vcpu)
{
	VCPU_EVENT(vcpu, 4, "%s", "I/O instruction");

570 571 572
	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);

573 574 575 576 577 578 579 580 581 582
	if (vcpu->kvm->arch.css_support) {
		/*
		 * Most I/O instructions will be handled by userspace.
		 * Exceptions are tpi and the interrupt portion of tsch.
		 */
		if (vcpu->arch.sie_block->ipa == 0xb236)
			return handle_tpi(vcpu);
		if (vcpu->arch.sie_block->ipa == 0xb235)
			return handle_tsch(vcpu);
		/* Handle in userspace. */
583
		vcpu->stat.instruction_io_other++;
584 585 586
		return -EOPNOTSUPP;
	} else {
		/*
587
		 * Set condition code 3 to stop the guest from issuing channel
588 589
		 * I/O instructions.
		 */
590
		kvm_s390_set_psw_cc(vcpu, 3);
591 592 593 594
		return 0;
	}
}

595 596 597
static int handle_stfl(struct kvm_vcpu *vcpu)
{
	int rc;
598
	unsigned int fac;
599 600

	vcpu->stat.instruction_stfl++;
601 602 603 604

	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);

605 606 607 608
	/*
	 * We need to shift the lower 32 facility bits (bit 0-31) from a u64
	 * into a u32 memory representation. They will remain bits 0-31.
	 */
609
	fac = *vcpu->kvm->arch.model.fac_list >> 32;
610
	rc = write_guest_lc(vcpu, offsetof(struct lowcore, stfl_fac_list),
611
			    &fac, sizeof(fac));
612
	if (rc)
613
		return rc;
614
	VCPU_EVENT(vcpu, 3, "STFL: store facility list 0x%x", fac);
615
	trace_kvm_s390_handle_stfl(vcpu, fac);
616 617 618
	return 0;
}

619 620
#define PSW_MASK_ADDR_MODE (PSW_MASK_EA | PSW_MASK_BA)
#define PSW_MASK_UNASSIGNED 0xb80800fe7fffffffUL
621
#define PSW_ADDR_24 0x0000000000ffffffUL
622 623
#define PSW_ADDR_31 0x000000007fffffffUL

T
Thomas Huth 已提交
624 625
int is_valid_psw(psw_t *psw)
{
626 627 628 629 630 631 632 633 634 635
	if (psw->mask & PSW_MASK_UNASSIGNED)
		return 0;
	if ((psw->mask & PSW_MASK_ADDR_MODE) == PSW_MASK_BA) {
		if (psw->addr & ~PSW_ADDR_31)
			return 0;
	}
	if (!(psw->mask & PSW_MASK_ADDR_MODE) && (psw->addr & ~PSW_ADDR_24))
		return 0;
	if ((psw->mask & PSW_MASK_ADDR_MODE) ==  PSW_MASK_EA)
		return 0;
T
Thomas Huth 已提交
636 637
	if (psw->addr & 1)
		return 0;
638 639 640
	return 1;
}

641 642
int kvm_s390_handle_lpsw(struct kvm_vcpu *vcpu)
{
643
	psw_t *gpsw = &vcpu->arch.sie_block->gpsw;
644
	psw_compat_t new_psw;
645
	u64 addr;
646
	int rc;
647
	u8 ar;
648

649 650
	vcpu->stat.instruction_lpsw++;

651
	if (gpsw->mask & PSW_MASK_PSTATE)
652 653
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);

654
	addr = kvm_s390_get_base_disp_s(vcpu, &ar);
655 656
	if (addr & 7)
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
657

658
	rc = read_guest(vcpu, addr, ar, &new_psw, sizeof(new_psw));
659 660
	if (rc)
		return kvm_s390_inject_prog_cond(vcpu, rc);
661 662
	if (!(new_psw.mask & PSW32_MASK_BASE))
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
663 664 665 666
	gpsw->mask = (new_psw.mask & ~PSW32_MASK_BASE) << 32;
	gpsw->mask |= new_psw.addr & PSW32_ADDR_AMODE;
	gpsw->addr = new_psw.addr & ~PSW32_ADDR_AMODE;
	if (!is_valid_psw(gpsw))
667
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
668 669 670 671 672 673
	return 0;
}

static int handle_lpswe(struct kvm_vcpu *vcpu)
{
	psw_t new_psw;
674
	u64 addr;
675
	int rc;
676
	u8 ar;
677

678 679
	vcpu->stat.instruction_lpswe++;

680 681 682
	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);

683
	addr = kvm_s390_get_base_disp_s(vcpu, &ar);
684 685
	if (addr & 7)
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
686
	rc = read_guest(vcpu, addr, ar, &new_psw, sizeof(new_psw));
687 688
	if (rc)
		return kvm_s390_inject_prog_cond(vcpu, rc);
689 690
	vcpu->arch.sie_block->gpsw = new_psw;
	if (!is_valid_psw(&vcpu->arch.sie_block->gpsw))
691
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
692 693 694
	return 0;
}

695 696
static int handle_stidp(struct kvm_vcpu *vcpu)
{
697
	u64 stidp_data = vcpu->kvm->arch.model.cpuid;
698
	u64 operand2;
699
	int rc;
700
	u8 ar;
701 702

	vcpu->stat.instruction_stidp++;
703

704 705 706
	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);

707
	operand2 = kvm_s390_get_base_disp_s(vcpu, &ar);
708

709 710
	if (operand2 & 7)
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
711

712
	rc = write_guest(vcpu, operand2, ar, &stidp_data, sizeof(stidp_data));
713 714
	if (rc)
		return kvm_s390_inject_prog_cond(vcpu, rc);
715

716
	VCPU_EVENT(vcpu, 3, "STIDP: store cpu id 0x%llx", stidp_data);
717 718 719 720 721 722 723 724
	return 0;
}

static void handle_stsi_3_2_2(struct kvm_vcpu *vcpu, struct sysinfo_3_2_2 *mem)
{
	int cpus = 0;
	int n;

725
	cpus = atomic_read(&vcpu->kvm->online_vcpus);
726 727

	/* deal with other level 3 hypervisors */
728
	if (stsi(mem, 3, 2, 2))
729 730 731 732 733 734
		mem->count = 0;
	if (mem->count < 8)
		mem->count++;
	for (n = mem->count - 1; n > 0 ; n--)
		memcpy(&mem->vm[n], &mem->vm[n - 1], sizeof(mem->vm[0]));

735
	memset(&mem->vm[0], 0, sizeof(mem->vm[0]));
736 737 738 739 740 741 742 743 744 745 746
	mem->vm[0].cpus_total = cpus;
	mem->vm[0].cpus_configured = cpus;
	mem->vm[0].cpus_standby = 0;
	mem->vm[0].cpus_reserved = 0;
	mem->vm[0].caf = 1000;
	memcpy(mem->vm[0].name, "KVMguest", 8);
	ASCEBC(mem->vm[0].name, 8);
	memcpy(mem->vm[0].cpi, "KVM/Linux       ", 16);
	ASCEBC(mem->vm[0].cpi, 16);
}

747
static void insert_stsi_usr_data(struct kvm_vcpu *vcpu, u64 addr, u8 ar,
748 749 750 751 752 753 754 755 756 757
				 u8 fc, u8 sel1, u16 sel2)
{
	vcpu->run->exit_reason = KVM_EXIT_S390_STSI;
	vcpu->run->s390_stsi.addr = addr;
	vcpu->run->s390_stsi.ar = ar;
	vcpu->run->s390_stsi.fc = fc;
	vcpu->run->s390_stsi.sel1 = sel1;
	vcpu->run->s390_stsi.sel2 = sel2;
}

758 759
static int handle_stsi(struct kvm_vcpu *vcpu)
{
760 761 762
	int fc = (vcpu->run->s.regs.gprs[0] & 0xf0000000) >> 28;
	int sel1 = vcpu->run->s.regs.gprs[0] & 0xff;
	int sel2 = vcpu->run->s.regs.gprs[1] & 0xffff;
763
	unsigned long mem = 0;
764
	u64 operand2;
765
	int rc = 0;
766
	u8 ar;
767 768

	vcpu->stat.instruction_stsi++;
769
	VCPU_EVENT(vcpu, 3, "STSI: fc: %u sel1: %u sel2: %u", fc, sel1, sel2);
770

771 772 773
	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);

774
	if (fc > 3) {
775
		kvm_s390_set_psw_cc(vcpu, 3);
776 777
		return 0;
	}
778

779 780
	if (vcpu->run->s.regs.gprs[0] & 0x0fffff00
	    || vcpu->run->s.regs.gprs[1] & 0xffff0000)
781 782
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);

783
	if (fc == 0) {
784
		vcpu->run->s.regs.gprs[0] = 3 << 28;
785
		kvm_s390_set_psw_cc(vcpu, 0);
786
		return 0;
787 788
	}

789
	operand2 = kvm_s390_get_base_disp_s(vcpu, &ar);
790 791 792 793 794

	if (operand2 & 0xfff)
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);

	switch (fc) {
795 796 797 798
	case 1: /* same handling for 1 and 2 */
	case 2:
		mem = get_zeroed_page(GFP_KERNEL);
		if (!mem)
799
			goto out_no_data;
800
		if (stsi((void *) mem, fc, sel1, sel2))
801
			goto out_no_data;
802 803 804
		break;
	case 3:
		if (sel1 != 2 || sel2 != 2)
805
			goto out_no_data;
806 807
		mem = get_zeroed_page(GFP_KERNEL);
		if (!mem)
808
			goto out_no_data;
809 810 811 812
		handle_stsi_3_2_2(vcpu, (void *) mem);
		break;
	}

813
	rc = write_guest(vcpu, operand2, ar, (void *)mem, PAGE_SIZE);
814 815 816
	if (rc) {
		rc = kvm_s390_inject_prog_cond(vcpu, rc);
		goto out;
817
	}
818 819 820 821
	if (vcpu->kvm->arch.user_stsi) {
		insert_stsi_usr_data(vcpu, operand2, ar, fc, sel1, sel2);
		rc = -EREMOTE;
	}
822
	trace_kvm_s390_handle_stsi(vcpu, fc, sel1, sel2, operand2);
823
	free_page(mem);
824
	kvm_s390_set_psw_cc(vcpu, 0);
825
	vcpu->run->s.regs.gprs[0] = 0;
826
	return rc;
827
out_no_data:
828
	kvm_s390_set_psw_cc(vcpu, 3);
829
out:
830
	free_page(mem);
831
	return rc;
832 833
}

834
int kvm_s390_handle_b2(struct kvm_vcpu *vcpu)
835
{
836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887
	switch (vcpu->arch.sie_block->ipa & 0x00ff) {
	case 0x02:
		return handle_stidp(vcpu);
	case 0x04:
		return handle_set_clock(vcpu);
	case 0x10:
		return handle_set_prefix(vcpu);
	case 0x11:
		return handle_store_prefix(vcpu);
	case 0x12:
		return handle_store_cpu_address(vcpu);
	case 0x14:
		return kvm_s390_handle_vsie(vcpu);
	case 0x21:
	case 0x50:
		return handle_ipte_interlock(vcpu);
	case 0x29:
		return handle_iske(vcpu);
	case 0x2a:
		return handle_rrbe(vcpu);
	case 0x2b:
		return handle_sske(vcpu);
	case 0x2c:
		return handle_test_block(vcpu);
	case 0x30:
	case 0x31:
	case 0x32:
	case 0x33:
	case 0x34:
	case 0x35:
	case 0x36:
	case 0x37:
	case 0x38:
	case 0x39:
	case 0x3a:
	case 0x3b:
	case 0x3c:
	case 0x5f:
	case 0x74:
	case 0x76:
		return handle_io_inst(vcpu);
	case 0x56:
		return handle_sthyi(vcpu);
	case 0x7d:
		return handle_stsi(vcpu);
	case 0xb1:
		return handle_stfl(vcpu);
	case 0xb2:
		return handle_lpswe(vcpu);
	default:
		return -EOPNOTSUPP;
	}
888
}
889

890 891 892 893
static int handle_epsw(struct kvm_vcpu *vcpu)
{
	int reg1, reg2;

894 895
	vcpu->stat.instruction_epsw++;

896
	kvm_s390_get_regs_rre(vcpu, &reg1, &reg2);
897 898

	/* This basically extracts the mask half of the psw. */
899
	vcpu->run->s.regs.gprs[reg1] &= 0xffffffff00000000UL;
900 901
	vcpu->run->s.regs.gprs[reg1] |= vcpu->arch.sie_block->gpsw.mask >> 32;
	if (reg2) {
902
		vcpu->run->s.regs.gprs[reg2] &= 0xffffffff00000000UL;
903
		vcpu->run->s.regs.gprs[reg2] |=
904
			vcpu->arch.sie_block->gpsw.mask & 0x00000000ffffffffUL;
905 906 907 908
	}
	return 0;
}

909 910 911 912 913 914 915 916 917 918 919 920
#define PFMF_RESERVED   0xfffc0101UL
#define PFMF_SK         0x00020000UL
#define PFMF_CF         0x00010000UL
#define PFMF_UI         0x00008000UL
#define PFMF_FSC        0x00007000UL
#define PFMF_NQ         0x00000800UL
#define PFMF_MR         0x00000400UL
#define PFMF_MC         0x00000200UL
#define PFMF_KEY        0x000000feUL

static int handle_pfmf(struct kvm_vcpu *vcpu)
{
921
	bool mr = false, mc = false, nq;
922 923
	int reg1, reg2;
	unsigned long start, end;
924
	unsigned char key;
925 926 927 928 929

	vcpu->stat.instruction_pfmf++;

	kvm_s390_get_regs_rre(vcpu, &reg1, &reg2);

930
	if (!test_kvm_facility(vcpu->kvm, 8))
931 932 933
		return kvm_s390_inject_program_int(vcpu, PGM_OPERATION);

	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
934
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);
935 936 937 938

	if (vcpu->run->s.regs.gprs[reg1] & PFMF_RESERVED)
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);

939 940 941
	/* Only provide non-quiescing support if enabled for the guest */
	if (vcpu->run->s.regs.gprs[reg1] & PFMF_NQ &&
	    !test_kvm_facility(vcpu->kvm, 14))
942 943
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);

944 945 946 947 948 949 950 951 952
	/* Only provide conditional-SSKE support if enabled for the guest */
	if (vcpu->run->s.regs.gprs[reg1] & PFMF_SK &&
	    test_kvm_facility(vcpu->kvm, 10)) {
		mr = vcpu->run->s.regs.gprs[reg1] & PFMF_MR;
		mc = vcpu->run->s.regs.gprs[reg1] & PFMF_MC;
	}

	nq = vcpu->run->s.regs.gprs[reg1] & PFMF_NQ;
	key = vcpu->run->s.regs.gprs[reg1] & PFMF_KEY;
953
	start = vcpu->run->s.regs.gprs[reg2] & PAGE_MASK;
954
	start = kvm_s390_logical_to_effective(vcpu, start);
T
Thomas Huth 已提交
955

956 957 958 959 960
	if (vcpu->run->s.regs.gprs[reg1] & PFMF_CF) {
		if (kvm_s390_check_low_addr_prot_real(vcpu, start))
			return kvm_s390_inject_prog_irq(vcpu, &vcpu->arch.pgm);
	}

961 962
	switch (vcpu->run->s.regs.gprs[reg1] & PFMF_FSC) {
	case 0x00000000:
963 964
		/* only 4k frames specify a real address */
		start = kvm_s390_real_to_abs(vcpu, start);
965
		end = (start + PAGE_SIZE) & ~(PAGE_SIZE - 1);
966 967
		break;
	case 0x00001000:
968
		end = (start + _SEGMENT_SIZE) & ~(_SEGMENT_SIZE - 1);
969 970
		break;
	case 0x00002000:
971 972 973
		/* only support 2G frame size if EDAT2 is available and we are
		   not in 24-bit addressing mode */
		if (!test_kvm_facility(vcpu->kvm, 78) ||
H
Heiko Carstens 已提交
974
		    psw_bits(vcpu->arch.sie_block->gpsw).eaba == PSW_BITS_AMODE_24BIT)
975
			return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
976
		end = (start + _REGION3_SIZE) & ~(_REGION3_SIZE - 1);
977
		break;
978 979 980
	default:
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
	}
981

982
	while (start != end) {
983 984
		unsigned long vmaddr;
		bool unlocked = false;
T
Thomas Huth 已提交
985 986

		/* Translate guest address to host address */
987 988
		vmaddr = gfn_to_hva(vcpu->kvm, gpa_to_gfn(start));
		if (kvm_is_error_hva(vmaddr))
989 990 991
			return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);

		if (vcpu->run->s.regs.gprs[reg1] & PFMF_CF) {
992
			if (kvm_clear_guest(vcpu->kvm, start, PAGE_SIZE))
993 994 995 996
				return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
		}

		if (vcpu->run->s.regs.gprs[reg1] & PFMF_SK) {
997
			int rc = kvm_s390_skey_check_enable(vcpu);
998 999 1000

			if (rc)
				return rc;
1001
			down_read(&current->mm->mmap_sem);
1002
			rc = cond_set_guest_storage_key(current->mm, vmaddr,
1003
							key, NULL, nq, mr, mc);
1004 1005 1006 1007 1008
			if (rc < 0) {
				rc = fixup_user_fault(current, current->mm, vmaddr,
						      FAULT_FLAG_WRITE, &unlocked);
				rc = !rc ? -EAGAIN : rc;
			}
1009
			up_read(&current->mm->mmap_sem);
1010
			if (rc == -EFAULT)
1011
				return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
1012 1013 1014 1015
			if (rc == -EAGAIN)
				continue;
			if (rc < 0)
				return rc;
1016
		}
1017
		start += PAGE_SIZE;
1018
	}
1019
	if (vcpu->run->s.regs.gprs[reg1] & PFMF_FSC) {
H
Heiko Carstens 已提交
1020
		if (psw_bits(vcpu->arch.sie_block->gpsw).eaba == PSW_BITS_AMODE_64BIT) {
1021 1022 1023 1024 1025 1026 1027
			vcpu->run->s.regs.gprs[reg2] = end;
		} else {
			vcpu->run->s.regs.gprs[reg2] &= ~0xffffffffUL;
			end = kvm_s390_logical_to_effective(vcpu, end);
			vcpu->run->s.regs.gprs[reg2] |= end;
		}
	}
1028 1029 1030
	return 0;
}

1031 1032 1033 1034
/*
 * Must be called with relevant read locks held (kvm->mm->mmap_sem, kvm->srcu)
 */
static inline int __do_essa(struct kvm_vcpu *vcpu, const int orc)
1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070
{
	int r1, r2, nappended, entries;
	unsigned long gfn, hva, res, pgstev, ptev;
	unsigned long *cbrlo;

	/*
	 * We don't need to set SD.FPF.SK to 1 here, because if we have a
	 * machine check here we either handle it or crash
	 */

	kvm_s390_get_regs_rre(vcpu, &r1, &r2);
	gfn = vcpu->run->s.regs.gprs[r2] >> PAGE_SHIFT;
	hva = gfn_to_hva(vcpu->kvm, gfn);
	entries = (vcpu->arch.sie_block->cbrlo & ~PAGE_MASK) >> 3;

	if (kvm_is_error_hva(hva))
		return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);

	nappended = pgste_perform_essa(vcpu->kvm->mm, hva, orc, &ptev, &pgstev);
	if (nappended < 0) {
		res = orc ? 0x10 : 0;
		vcpu->run->s.regs.gprs[r1] = res; /* Exception Indication */
		return 0;
	}
	res = (pgstev & _PGSTE_GPS_USAGE_MASK) >> 22;
	/*
	 * Set the block-content state part of the result. 0 means resident, so
	 * nothing to do if the page is valid. 2 is for preserved pages
	 * (non-present and non-zero), and 3 for zero pages (non-present and
	 * zero).
	 */
	if (ptev & _PAGE_INVALID) {
		res |= 2;
		if (pgstev & _PGSTE_GPS_ZERO)
			res |= 1;
	}
1071 1072
	if (pgstev & _PGSTE_GPS_NODAT)
		res |= 0x20;
1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084
	vcpu->run->s.regs.gprs[r1] = res;
	/*
	 * It is possible that all the normal 511 slots were full, in which case
	 * we will now write in the 512th slot, which is reserved for host use.
	 * In both cases we let the normal essa handling code process all the
	 * slots, including the reserved one, if needed.
	 */
	if (nappended > 0) {
		cbrlo = phys_to_virt(vcpu->arch.sie_block->cbrlo & PAGE_MASK);
		cbrlo[entries] = gfn << PAGE_SHIFT;
	}

1085 1086 1087 1088 1089 1090
	if (orc) {
		struct kvm_memory_slot *ms = gfn_to_memslot(vcpu->kvm, gfn);

		/* Increment only if we are really flipping the bit */
		if (ms && !test_and_set_bit(gfn - ms->base_gfn, kvm_second_dirty_bitmap(ms)))
			atomic64_inc(&vcpu->kvm->arch.cmma_dirty_pages);
1091 1092 1093 1094 1095
	}

	return nappended;
}

1096 1097 1098 1099
static int handle_essa(struct kvm_vcpu *vcpu)
{
	/* entries expected to be 1FF */
	int entries = (vcpu->arch.sie_block->cbrlo & ~PAGE_MASK) >> 3;
1100
	unsigned long *cbrlo;
1101
	struct gmap *gmap;
1102
	int i, orc;
1103

1104
	VCPU_EVENT(vcpu, 4, "ESSA: release %d pages", entries);
1105 1106
	gmap = vcpu->arch.gmap;
	vcpu->stat.instruction_essa++;
1107
	if (!vcpu->kvm->arch.use_cmma)
1108 1109 1110 1111
		return kvm_s390_inject_program_int(vcpu, PGM_OPERATION);

	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);
1112 1113
	/* Check for invalid operation request code */
	orc = (vcpu->arch.sie_block->ipb & 0xf0000000) >> 28;
1114 1115 1116
	/* ORCs 0-6 are always valid */
	if (orc > (test_kvm_facility(vcpu->kvm, 147) ? ESSA_SET_STABLE_NODAT
						: ESSA_SET_STABLE_IF_RESIDENT))
1117 1118
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);

1119
	if (!vcpu->kvm->arch.migration_mode) {
1120 1121 1122 1123 1124 1125 1126 1127 1128
		/*
		 * CMMA is enabled in the KVM settings, but is disabled in
		 * the SIE block and in the mm_context, and we are not doing
		 * a migration. Enable CMMA in the mm_context.
		 * Since we need to take a write lock to write to the context
		 * to avoid races with storage keys handling, we check if the
		 * value really needs to be written to; if the value is
		 * already correct, we do nothing and avoid the lock.
		 */
1129
		if (vcpu->kvm->mm->context.uses_cmm == 0) {
1130
			down_write(&vcpu->kvm->mm->mmap_sem);
1131
			vcpu->kvm->mm->context.uses_cmm = 1;
1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146
			up_write(&vcpu->kvm->mm->mmap_sem);
		}
		/*
		 * If we are here, we are supposed to have CMMA enabled in
		 * the SIE block. Enabling CMMA works on a per-CPU basis,
		 * while the context use_cmma flag is per process.
		 * It's possible that the context flag is enabled and the
		 * SIE flag is not, so we set the flag always; if it was
		 * already set, nothing changes, otherwise we enable it
		 * on this CPU too.
		 */
		vcpu->arch.sie_block->ecb2 |= ECB2_CMMA;
		/* Retry the ESSA instruction */
		kvm_s390_retry_instr(vcpu);
	} else {
1147 1148 1149 1150 1151 1152 1153
		int srcu_idx;

		down_read(&vcpu->kvm->mm->mmap_sem);
		srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
		i = __do_essa(vcpu, orc);
		srcu_read_unlock(&vcpu->kvm->srcu, srcu_idx);
		up_read(&vcpu->kvm->mm->mmap_sem);
1154 1155
		if (i < 0)
			return i;
1156
		/* Account for the possible extra cbrl entry */
1157 1158
		entries += i;
	}
1159 1160 1161
	vcpu->arch.sie_block->cbrlo &= PAGE_MASK;	/* reset nceo */
	cbrlo = phys_to_virt(vcpu->arch.sie_block->cbrlo);
	down_read(&gmap->mm->mmap_sem);
1162 1163
	for (i = 0; i < entries; ++i)
		__gmap_zap(gmap, cbrlo[i]);
1164 1165 1166 1167
	up_read(&gmap->mm->mmap_sem);
	return 0;
}

1168 1169
int kvm_s390_handle_b9(struct kvm_vcpu *vcpu)
{
1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183
	switch (vcpu->arch.sie_block->ipa & 0x00ff) {
	case 0x8a:
	case 0x8e:
	case 0x8f:
		return handle_ipte_interlock(vcpu);
	case 0x8d:
		return handle_epsw(vcpu);
	case 0xab:
		return handle_essa(vcpu);
	case 0xaf:
		return handle_pfmf(vcpu);
	default:
		return -EOPNOTSUPP;
	}
1184 1185
}

1186 1187 1188 1189
int kvm_s390_handle_lctl(struct kvm_vcpu *vcpu)
{
	int reg1 = (vcpu->arch.sie_block->ipa & 0x00f0) >> 4;
	int reg3 = vcpu->arch.sie_block->ipa & 0x000f;
1190 1191
	int reg, rc, nr_regs;
	u32 ctl_array[16];
1192
	u64 ga;
1193
	u8 ar;
1194 1195 1196 1197 1198 1199

	vcpu->stat.instruction_lctl++;

	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);

1200
	ga = kvm_s390_get_base_disp_rs(vcpu, &ar);
1201

1202
	if (ga & 3)
1203 1204
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);

1205
	VCPU_EVENT(vcpu, 4, "LCTL: r1:%d, r3:%d, addr: 0x%llx", reg1, reg3, ga);
1206
	trace_kvm_s390_handle_lctl(vcpu, 0, reg1, reg3, ga);
1207

1208
	nr_regs = ((reg3 - reg1) & 0xf) + 1;
1209
	rc = read_guest(vcpu, ga, ar, ctl_array, nr_regs * sizeof(u32));
1210 1211
	if (rc)
		return kvm_s390_inject_prog_cond(vcpu, rc);
1212
	reg = reg1;
1213
	nr_regs = 0;
1214 1215
	do {
		vcpu->arch.sie_block->gcr[reg] &= 0xffffffff00000000ul;
1216
		vcpu->arch.sie_block->gcr[reg] |= ctl_array[nr_regs++];
1217 1218 1219 1220
		if (reg == reg3)
			break;
		reg = (reg + 1) % 16;
	} while (1);
1221
	kvm_make_request(KVM_REQ_TLB_FLUSH, vcpu);
1222 1223 1224
	return 0;
}

1225 1226 1227 1228
int kvm_s390_handle_stctl(struct kvm_vcpu *vcpu)
{
	int reg1 = (vcpu->arch.sie_block->ipa & 0x00f0) >> 4;
	int reg3 = vcpu->arch.sie_block->ipa & 0x000f;
1229 1230
	int reg, rc, nr_regs;
	u32 ctl_array[16];
1231
	u64 ga;
1232
	u8 ar;
1233 1234 1235 1236 1237 1238

	vcpu->stat.instruction_stctl++;

	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);

1239
	ga = kvm_s390_get_base_disp_rs(vcpu, &ar);
1240 1241 1242 1243

	if (ga & 3)
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);

1244
	VCPU_EVENT(vcpu, 4, "STCTL r1:%d, r3:%d, addr: 0x%llx", reg1, reg3, ga);
1245 1246 1247
	trace_kvm_s390_handle_stctl(vcpu, 0, reg1, reg3, ga);

	reg = reg1;
1248
	nr_regs = 0;
1249
	do {
1250
		ctl_array[nr_regs++] = vcpu->arch.sie_block->gcr[reg];
1251 1252 1253 1254
		if (reg == reg3)
			break;
		reg = (reg + 1) % 16;
	} while (1);
1255
	rc = write_guest(vcpu, ga, ar, ctl_array, nr_regs * sizeof(u32));
1256
	return rc ? kvm_s390_inject_prog_cond(vcpu, rc) : 0;
1257 1258
}

1259 1260 1261 1262
static int handle_lctlg(struct kvm_vcpu *vcpu)
{
	int reg1 = (vcpu->arch.sie_block->ipa & 0x00f0) >> 4;
	int reg3 = vcpu->arch.sie_block->ipa & 0x000f;
1263 1264 1265
	int reg, rc, nr_regs;
	u64 ctl_array[16];
	u64 ga;
1266
	u8 ar;
1267 1268 1269 1270 1271 1272

	vcpu->stat.instruction_lctlg++;

	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);

1273
	ga = kvm_s390_get_base_disp_rsy(vcpu, &ar);
1274

1275
	if (ga & 7)
1276 1277
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);

1278
	VCPU_EVENT(vcpu, 4, "LCTLG: r1:%d, r3:%d, addr: 0x%llx", reg1, reg3, ga);
1279
	trace_kvm_s390_handle_lctl(vcpu, 1, reg1, reg3, ga);
1280

1281
	nr_regs = ((reg3 - reg1) & 0xf) + 1;
1282
	rc = read_guest(vcpu, ga, ar, ctl_array, nr_regs * sizeof(u64));
1283 1284 1285 1286
	if (rc)
		return kvm_s390_inject_prog_cond(vcpu, rc);
	reg = reg1;
	nr_regs = 0;
1287
	do {
1288
		vcpu->arch.sie_block->gcr[reg] = ctl_array[nr_regs++];
1289 1290 1291 1292
		if (reg == reg3)
			break;
		reg = (reg + 1) % 16;
	} while (1);
1293
	kvm_make_request(KVM_REQ_TLB_FLUSH, vcpu);
1294 1295 1296
	return 0;
}

1297 1298 1299 1300
static int handle_stctg(struct kvm_vcpu *vcpu)
{
	int reg1 = (vcpu->arch.sie_block->ipa & 0x00f0) >> 4;
	int reg3 = vcpu->arch.sie_block->ipa & 0x000f;
1301 1302 1303
	int reg, rc, nr_regs;
	u64 ctl_array[16];
	u64 ga;
1304
	u8 ar;
1305 1306 1307 1308 1309 1310

	vcpu->stat.instruction_stctg++;

	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);

1311
	ga = kvm_s390_get_base_disp_rsy(vcpu, &ar);
1312 1313 1314 1315

	if (ga & 7)
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);

1316
	VCPU_EVENT(vcpu, 4, "STCTG r1:%d, r3:%d, addr: 0x%llx", reg1, reg3, ga);
1317 1318
	trace_kvm_s390_handle_stctl(vcpu, 1, reg1, reg3, ga);

1319 1320
	reg = reg1;
	nr_regs = 0;
1321
	do {
1322
		ctl_array[nr_regs++] = vcpu->arch.sie_block->gcr[reg];
1323 1324 1325 1326
		if (reg == reg3)
			break;
		reg = (reg + 1) % 16;
	} while (1);
1327
	rc = write_guest(vcpu, ga, ar, ctl_array, nr_regs * sizeof(u64));
1328
	return rc ? kvm_s390_inject_prog_cond(vcpu, rc) : 0;
1329 1330
}

1331
int kvm_s390_handle_eb(struct kvm_vcpu *vcpu)
1332
{
1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344
	switch (vcpu->arch.sie_block->ipb & 0x000000ff) {
	case 0x25:
		return handle_stctg(vcpu);
	case 0x2f:
		return handle_lctlg(vcpu);
	case 0x60:
	case 0x61:
	case 0x62:
		return handle_ri(vcpu);
	default:
		return -EOPNOTSUPP;
	}
1345 1346
}

1347 1348
static int handle_tprot(struct kvm_vcpu *vcpu)
{
1349
	u64 address1, address2;
1350 1351 1352
	unsigned long hva, gpa;
	int ret = 0, cc = 0;
	bool writable;
1353
	u8 ar;
1354 1355 1356

	vcpu->stat.instruction_tprot++;

1357 1358 1359
	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);

1360
	kvm_s390_get_base_disp_sse(vcpu, &address1, &address2, &ar, NULL);
1361

1362 1363 1364 1365 1366 1367
	/* we only handle the Linux memory detection case:
	 * access key == 0
	 * everything else goes to userspace. */
	if (address2 & 0xf0)
		return -EOPNOTSUPP;
	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_DAT)
1368
		ipte_lock(vcpu);
1369
	ret = guest_translate_address(vcpu, address1, ar, &gpa, GACC_STORE);
1370 1371 1372
	if (ret == PGM_PROTECTION) {
		/* Write protected? Try again with read-only... */
		cc = 1;
1373 1374
		ret = guest_translate_address(vcpu, address1, ar, &gpa,
					      GACC_FETCH);
1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385
	}
	if (ret) {
		if (ret == PGM_ADDRESSING || ret == PGM_TRANSLATION_SPEC) {
			ret = kvm_s390_inject_program_int(vcpu, ret);
		} else if (ret > 0) {
			/* Translation not available */
			kvm_s390_set_psw_cc(vcpu, 3);
			ret = 0;
		}
		goto out_unlock;
	}
1386

1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399
	hva = gfn_to_hva_prot(vcpu->kvm, gpa_to_gfn(gpa), &writable);
	if (kvm_is_error_hva(hva)) {
		ret = kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
	} else {
		if (!writable)
			cc = 1;		/* Write not permitted ==> read-only */
		kvm_s390_set_psw_cc(vcpu, cc);
		/* Note: CC2 only occurs for storage keys (not supported yet) */
	}
out_unlock:
	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_DAT)
		ipte_unlock(vcpu);
	return ret;
1400 1401 1402 1403
}

int kvm_s390_handle_e5(struct kvm_vcpu *vcpu)
{
1404 1405
	switch (vcpu->arch.sie_block->ipa & 0x00ff) {
	case 0x01:
1406
		return handle_tprot(vcpu);
1407 1408 1409
	default:
		return -EOPNOTSUPP;
	}
1410 1411
}

1412 1413 1414 1415
static int handle_sckpf(struct kvm_vcpu *vcpu)
{
	u32 value;

1416 1417
	vcpu->stat.instruction_sckpf++;

1418
	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
1419
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);
1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430

	if (vcpu->run->s.regs.gprs[0] & 0x00000000ffff0000)
		return kvm_s390_inject_program_int(vcpu,
						   PGM_SPECIFICATION);

	value = vcpu->run->s.regs.gprs[0] & 0x000000000000ffff;
	vcpu->arch.sie_block->todpr = value;

	return 0;
}

1431 1432
static int handle_ptff(struct kvm_vcpu *vcpu)
{
1433 1434
	vcpu->stat.instruction_ptff++;

1435 1436 1437 1438 1439
	/* we don't emulate any control instructions yet */
	kvm_s390_set_psw_cc(vcpu, 3);
	return 0;
}

1440 1441
int kvm_s390_handle_01(struct kvm_vcpu *vcpu)
{
1442 1443 1444 1445 1446 1447 1448 1449
	switch (vcpu->arch.sie_block->ipa & 0x00ff) {
	case 0x04:
		return handle_ptff(vcpu);
	case 0x07:
		return handle_sckpf(vcpu);
	default:
		return -EOPNOTSUPP;
	}
1450
}