priv.c 27.6 KB
Newer Older
1
/*
2
 * handling privileged instructions
3
 *
4
 * Copyright IBM Corp. 2008, 2013
5 6 7 8 9 10 11 12 13 14
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License (version 2 only)
 * as published by the Free Software Foundation.
 *
 *    Author(s): Carsten Otte <cotte@de.ibm.com>
 *               Christian Borntraeger <borntraeger@de.ibm.com>
 */

#include <linux/kvm.h>
15
#include <linux/gfp.h>
16
#include <linux/errno.h>
17
#include <linux/compat.h>
18
#include <asm/asm-offsets.h>
19
#include <asm/facility.h>
20 21 22 23
#include <asm/current.h>
#include <asm/debug.h>
#include <asm/ebcdic.h>
#include <asm/sysinfo.h>
24 25 26
#include <asm/pgtable.h>
#include <asm/pgalloc.h>
#include <asm/io.h>
27 28
#include <asm/ptrace.h>
#include <asm/compat.h>
29 30
#include "gaccess.h"
#include "kvm-s390.h"
31
#include "trace.h"
32

33 34 35 36 37
/* Handle SCK (SET CLOCK) interception */
static int handle_set_clock(struct kvm_vcpu *vcpu)
{
	struct kvm_vcpu *cpup;
	s64 hostclk, val;
38
	int i, rc;
39
	ar_t ar;
40 41 42 43 44
	u64 op2;

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

45
	op2 = kvm_s390_get_base_disp_s(vcpu, &ar);
46 47
	if (op2 & 7)	/* Operand must be on a doubleword boundary */
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
48
	rc = read_guest(vcpu, op2, ar, &val, sizeof(val));
49 50
	if (rc)
		return kvm_s390_inject_prog_cond(vcpu, rc);
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66

	if (store_tod_clock(&hostclk)) {
		kvm_s390_set_psw_cc(vcpu, 3);
		return 0;
	}
	val = (val - hostclk) & ~0x3fUL;

	mutex_lock(&vcpu->kvm->lock);
	kvm_for_each_vcpu(i, cpup, vcpu->kvm)
		cpup->arch.sie_block->epoch = val;
	mutex_unlock(&vcpu->kvm->lock);

	kvm_s390_set_psw_cc(vcpu, 0);
	return 0;
}

67 68 69
static int handle_set_prefix(struct kvm_vcpu *vcpu)
{
	u64 operand2;
70 71
	u32 address;
	int rc;
72
	ar_t ar;
73 74 75

	vcpu->stat.instruction_spx++;

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

79
	operand2 = kvm_s390_get_base_disp_s(vcpu, &ar);
80 81

	/* must be word boundary */
82 83
	if (operand2 & 3)
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
84 85

	/* get the value */
86
	rc = read_guest(vcpu, operand2, ar, &address, sizeof(address));
87 88 89 90 91 92 93 94 95 96 97
	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))
98
		return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
99

100
	kvm_s390_set_prefix(vcpu, address);
101 102

	VCPU_EVENT(vcpu, 5, "setting prefix to %x", address);
103
	trace_kvm_s390_handle_prefix(vcpu, 1, address);
104 105 106 107 108 109 110
	return 0;
}

static int handle_store_prefix(struct kvm_vcpu *vcpu)
{
	u64 operand2;
	u32 address;
111
	int rc;
112
	ar_t ar;
113 114

	vcpu->stat.instruction_stpx++;
115

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

119
	operand2 = kvm_s390_get_base_disp_s(vcpu, &ar);
120 121

	/* must be word boundary */
122 123
	if (operand2 & 3)
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
124

125
	address = kvm_s390_get_prefix(vcpu);
126 127

	/* get the value */
128
	rc = write_guest(vcpu, operand2, ar, &address, sizeof(address));
129 130
	if (rc)
		return kvm_s390_inject_prog_cond(vcpu, rc);
131 132

	VCPU_EVENT(vcpu, 5, "storing prefix to %x", address);
133
	trace_kvm_s390_handle_prefix(vcpu, 0, address);
134 135 136 137 138
	return 0;
}

static int handle_store_cpu_address(struct kvm_vcpu *vcpu)
{
139 140 141
	u16 vcpu_id = vcpu->vcpu_id;
	u64 ga;
	int rc;
142
	ar_t ar;
143 144

	vcpu->stat.instruction_stap++;
145

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

149
	ga = kvm_s390_get_base_disp_s(vcpu, &ar);
150

151
	if (ga & 1)
152
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
153

154
	rc = write_guest(vcpu, ga, ar, &vcpu_id, sizeof(vcpu_id));
155 156
	if (rc)
		return kvm_s390_inject_prog_cond(vcpu, rc);
157

158 159
	VCPU_EVENT(vcpu, 5, "storing cpu address to %llx", ga);
	trace_kvm_s390_handle_stap(vcpu, ga);
160 161 162
	return 0;
}

163
static int __skey_check_enable(struct kvm_vcpu *vcpu)
164
{
165
	int rc = 0;
166
	if (!(vcpu->arch.sie_block->ictl & (ICTL_ISKE | ICTL_SSKE | ICTL_RRBE)))
167
		return rc;
168

169
	rc = s390_enable_skey();
170 171
	trace_kvm_s390_skey_related_inst(vcpu);
	vcpu->arch.sie_block->ictl &= ~(ICTL_ISKE | ICTL_SSKE | ICTL_RRBE);
172
	return rc;
173 174 175
}


176 177
static int handle_skey(struct kvm_vcpu *vcpu)
{
178
	int rc = __skey_check_enable(vcpu);
179

180 181
	if (rc)
		return rc;
182
	vcpu->stat.instruction_storage_key++;
183 184 185 186

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

187
	kvm_s390_rewind_psw(vcpu, 4);
188 189 190 191
	VCPU_EVENT(vcpu, 4, "%s", "retrying storage key operation");
	return 0;
}

192 193 194
static int handle_ipte_interlock(struct kvm_vcpu *vcpu)
{
	vcpu->stat.instruction_ipte_interlock++;
195
	if (psw_bits(vcpu->arch.sie_block->gpsw).p)
196 197
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);
	wait_event(vcpu->kvm->arch.ipte_wq, !ipte_lock_held(vcpu));
198
	kvm_s390_rewind_psw(vcpu, 4);
199 200 201 202
	VCPU_EVENT(vcpu, 4, "%s", "retrying ipte interlock operation");
	return 0;
}

T
Thomas Huth 已提交
203 204 205 206 207 208 209 210 211 212
static int handle_test_block(struct kvm_vcpu *vcpu)
{
	gpa_t addr;
	int reg2;

	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;
213
	addr = kvm_s390_logical_to_effective(vcpu, addr);
214
	if (kvm_s390_check_low_addr_prot_real(vcpu, addr))
215
		return kvm_s390_inject_prog_irq(vcpu, &vcpu->arch.pgm);
T
Thomas Huth 已提交
216 217
	addr = kvm_s390_real_to_abs(vcpu, addr);

218
	if (kvm_is_error_gpa(vcpu->kvm, addr))
T
Thomas Huth 已提交
219 220 221 222 223
		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.
	 */
224
	if (kvm_clear_guest(vcpu->kvm, addr, PAGE_SIZE))
T
Thomas Huth 已提交
225 226 227 228 229 230
		return -EFAULT;
	kvm_s390_set_psw_cc(vcpu, 0);
	vcpu->run->s.regs.gprs[0] = 0;
	return 0;
}

231
static int handle_tpi(struct kvm_vcpu *vcpu)
232
{
233
	struct kvm_s390_interrupt_info *inti;
H
Heiko Carstens 已提交
234 235
	unsigned long len;
	u32 tpi_data[3];
236
	int rc;
237
	u64 addr;
238
	ar_t ar;
239

240
	addr = kvm_s390_get_base_disp_s(vcpu, &ar);
241 242
	if (addr & 3)
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
243

244
	inti = kvm_s390_get_io_int(vcpu->kvm, vcpu->arch.sie_block->gcr[6], 0);
245 246 247 248 249
	if (!inti) {
		kvm_s390_set_psw_cc(vcpu, 0);
		return 0;
	}

H
Heiko Carstens 已提交
250 251 252
	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;
253 254 255 256 257
	if (addr) {
		/*
		 * Store the two-word I/O interruption code into the
		 * provided area.
		 */
H
Heiko Carstens 已提交
258
		len = sizeof(tpi_data) - 4;
259
		rc = write_guest(vcpu, addr, ar, &tpi_data, len);
260 261 262 263
		if (rc) {
			rc = kvm_s390_inject_prog_cond(vcpu, rc);
			goto reinject_interrupt;
		}
264 265 266 267 268
	} else {
		/*
		 * Store the three-word I/O interruption code into
		 * the appropriate lowcore area.
		 */
H
Heiko Carstens 已提交
269
		len = sizeof(tpi_data);
270 271
		if (write_guest_lc(vcpu, __LC_SUBCHANNEL_ID, &tpi_data, len)) {
			/* failed writes to the low core are not recoverable */
H
Heiko Carstens 已提交
272
			rc = -EFAULT;
273 274
			goto reinject_interrupt;
		}
275
	}
276 277 278 279 280 281

	/* irq was successfully handed to the guest */
	kfree(inti);
	kvm_s390_set_psw_cc(vcpu, 1);
	return 0;
reinject_interrupt:
282 283 284 285 286
	/*
	 * If we encounter a problem storing the interruption code, the
	 * instruction is suppressed from the guest's view: reinject the
	 * interrupt.
	 */
287 288 289 290
	if (kvm_s390_reinject_io_int(vcpu->kvm, inti)) {
		kfree(inti);
		rc = -EFAULT;
	}
291
	/* don't set the cc, a pgm irq was injected or we drop to user space */
H
Heiko Carstens 已提交
292
	return rc ? -EFAULT : 0;
293 294
}

295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326
static int handle_tsch(struct kvm_vcpu *vcpu)
{
	struct kvm_s390_interrupt_info *inti;

	inti = kvm_s390_get_io_int(vcpu->kvm, 0,
				   vcpu->run->s.regs.gprs[1]);

	/*
	 * 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");

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

330 331 332 333 334 335 336 337 338 339 340 341 342
	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. */
		return -EOPNOTSUPP;
	} else {
		/*
343
		 * Set condition code 3 to stop the guest from issuing channel
344 345
		 * I/O instructions.
		 */
346
		kvm_s390_set_psw_cc(vcpu, 3);
347 348 349 350
		return 0;
	}
}

351 352 353
static int handle_stfl(struct kvm_vcpu *vcpu)
{
	int rc;
354
	unsigned int fac;
355 356

	vcpu->stat.instruction_stfl++;
357 358 359 360

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

361 362 363 364
	/*
	 * 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.
	 */
365
	fac = *vcpu->kvm->arch.model.fac->list >> 32;
366
	rc = write_guest_lc(vcpu, offsetof(struct _lowcore, stfl_fac_list),
367
			    &fac, sizeof(fac));
368
	if (rc)
369
		return rc;
370 371
	VCPU_EVENT(vcpu, 5, "store facility list value %x", fac);
	trace_kvm_s390_handle_stfl(vcpu, fac);
372 373 374
	return 0;
}

375 376
#define PSW_MASK_ADDR_MODE (PSW_MASK_EA | PSW_MASK_BA)
#define PSW_MASK_UNASSIGNED 0xb80800fe7fffffffUL
377
#define PSW_ADDR_24 0x0000000000ffffffUL
378 379
#define PSW_ADDR_31 0x000000007fffffffUL

T
Thomas Huth 已提交
380 381
int is_valid_psw(psw_t *psw)
{
382 383 384 385 386 387 388 389 390 391
	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 已提交
392 393
	if (psw->addr & 1)
		return 0;
394 395 396
	return 1;
}

397 398
int kvm_s390_handle_lpsw(struct kvm_vcpu *vcpu)
{
399
	psw_t *gpsw = &vcpu->arch.sie_block->gpsw;
400
	psw_compat_t new_psw;
401
	u64 addr;
402
	int rc;
403
	ar_t ar;
404

405
	if (gpsw->mask & PSW_MASK_PSTATE)
406 407
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);

408
	addr = kvm_s390_get_base_disp_s(vcpu, &ar);
409 410
	if (addr & 7)
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
411

412
	rc = read_guest(vcpu, addr, ar, &new_psw, sizeof(new_psw));
413 414
	if (rc)
		return kvm_s390_inject_prog_cond(vcpu, rc);
415 416
	if (!(new_psw.mask & PSW32_MASK_BASE))
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
417 418 419 420
	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))
421
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
422 423 424 425 426 427
	return 0;
}

static int handle_lpswe(struct kvm_vcpu *vcpu)
{
	psw_t new_psw;
428
	u64 addr;
429
	int rc;
430
	ar_t ar;
431

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

435
	addr = kvm_s390_get_base_disp_s(vcpu, &ar);
436 437
	if (addr & 7)
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
438
	rc = read_guest(vcpu, addr, ar, &new_psw, sizeof(new_psw));
439 440
	if (rc)
		return kvm_s390_inject_prog_cond(vcpu, rc);
441 442
	vcpu->arch.sie_block->gpsw = new_psw;
	if (!is_valid_psw(&vcpu->arch.sie_block->gpsw))
443
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
444 445 446
	return 0;
}

447 448
static int handle_stidp(struct kvm_vcpu *vcpu)
{
449
	u64 stidp_data = vcpu->arch.stidp_data;
450
	u64 operand2;
451
	int rc;
452
	ar_t ar;
453 454

	vcpu->stat.instruction_stidp++;
455

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

459
	operand2 = kvm_s390_get_base_disp_s(vcpu, &ar);
460

461 462
	if (operand2 & 7)
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
463

464
	rc = write_guest(vcpu, operand2, ar, &stidp_data, sizeof(stidp_data));
465 466
	if (rc)
		return kvm_s390_inject_prog_cond(vcpu, rc);
467 468 469 470 471 472 473 474 475 476

	VCPU_EVENT(vcpu, 5, "%s", "store cpu id");
	return 0;
}

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

477
	cpus = atomic_read(&vcpu->kvm->online_vcpus);
478 479

	/* deal with other level 3 hypervisors */
480
	if (stsi(mem, 3, 2, 2))
481 482 483 484 485 486
		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]));

487
	memset(&mem->vm[0], 0, sizeof(mem->vm[0]));
488 489 490 491 492 493 494 495 496 497 498
	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);
}

499 500 501 502 503 504 505 506 507 508 509
static void insert_stsi_usr_data(struct kvm_vcpu *vcpu, u64 addr, ar_t ar,
				 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;
}

510 511
static int handle_stsi(struct kvm_vcpu *vcpu)
{
512 513 514
	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;
515
	unsigned long mem = 0;
516
	u64 operand2;
517
	int rc = 0;
518
	ar_t ar;
519 520 521 522

	vcpu->stat.instruction_stsi++;
	VCPU_EVENT(vcpu, 4, "stsi: fc: %x sel1: %x sel2: %x", fc, sel1, sel2);

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

526
	if (fc > 3) {
527
		kvm_s390_set_psw_cc(vcpu, 3);
528 529
		return 0;
	}
530

531 532
	if (vcpu->run->s.regs.gprs[0] & 0x0fffff00
	    || vcpu->run->s.regs.gprs[1] & 0xffff0000)
533 534
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);

535
	if (fc == 0) {
536
		vcpu->run->s.regs.gprs[0] = 3 << 28;
537
		kvm_s390_set_psw_cc(vcpu, 0);
538
		return 0;
539 540
	}

541
	operand2 = kvm_s390_get_base_disp_s(vcpu, &ar);
542 543 544 545 546

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

	switch (fc) {
547 548 549 550
	case 1: /* same handling for 1 and 2 */
	case 2:
		mem = get_zeroed_page(GFP_KERNEL);
		if (!mem)
551
			goto out_no_data;
552
		if (stsi((void *) mem, fc, sel1, sel2))
553
			goto out_no_data;
554 555 556
		break;
	case 3:
		if (sel1 != 2 || sel2 != 2)
557
			goto out_no_data;
558 559
		mem = get_zeroed_page(GFP_KERNEL);
		if (!mem)
560
			goto out_no_data;
561 562 563 564
		handle_stsi_3_2_2(vcpu, (void *) mem);
		break;
	}

565
	rc = write_guest(vcpu, operand2, ar, (void *)mem, PAGE_SIZE);
566 567 568
	if (rc) {
		rc = kvm_s390_inject_prog_cond(vcpu, rc);
		goto out;
569
	}
570 571 572 573
	if (vcpu->kvm->arch.user_stsi) {
		insert_stsi_usr_data(vcpu, operand2, ar, fc, sel1, sel2);
		rc = -EREMOTE;
	}
574
	trace_kvm_s390_handle_stsi(vcpu, fc, sel1, sel2, operand2);
575
	free_page(mem);
576
	kvm_s390_set_psw_cc(vcpu, 0);
577
	vcpu->run->s.regs.gprs[0] = 0;
578
	return rc;
579
out_no_data:
580
	kvm_s390_set_psw_cc(vcpu, 3);
581
out:
582
	free_page(mem);
583
	return rc;
584 585
}

586
static const intercept_handler_t b2_handlers[256] = {
587
	[0x02] = handle_stidp,
588
	[0x04] = handle_set_clock,
589 590 591
	[0x10] = handle_set_prefix,
	[0x11] = handle_store_prefix,
	[0x12] = handle_store_cpu_address,
592
	[0x21] = handle_ipte_interlock,
593 594 595
	[0x29] = handle_skey,
	[0x2a] = handle_skey,
	[0x2b] = handle_skey,
T
Thomas Huth 已提交
596
	[0x2c] = handle_test_block,
597 598 599 600 601 602 603 604 605 606 607 608 609
	[0x30] = handle_io_inst,
	[0x31] = handle_io_inst,
	[0x32] = handle_io_inst,
	[0x33] = handle_io_inst,
	[0x34] = handle_io_inst,
	[0x35] = handle_io_inst,
	[0x36] = handle_io_inst,
	[0x37] = handle_io_inst,
	[0x38] = handle_io_inst,
	[0x39] = handle_io_inst,
	[0x3a] = handle_io_inst,
	[0x3b] = handle_io_inst,
	[0x3c] = handle_io_inst,
610
	[0x50] = handle_ipte_interlock,
611 612 613
	[0x5f] = handle_io_inst,
	[0x74] = handle_io_inst,
	[0x76] = handle_io_inst,
614 615
	[0x7d] = handle_stsi,
	[0xb1] = handle_stfl,
616
	[0xb2] = handle_lpswe,
617 618
};

619
int kvm_s390_handle_b2(struct kvm_vcpu *vcpu)
620 621 622
{
	intercept_handler_t handler;

623
	/*
624 625 626 627
	 * A lot of B2 instructions are priviledged. Here we check for
	 * the privileged ones, that we can handle in the kernel.
	 * Anything else goes to userspace.
	 */
628
	handler = b2_handlers[vcpu->arch.sie_block->ipa & 0x00ff];
629 630 631
	if (handler)
		return handler(vcpu);

632
	return -EOPNOTSUPP;
633
}
634

635 636 637 638
static int handle_epsw(struct kvm_vcpu *vcpu)
{
	int reg1, reg2;

639
	kvm_s390_get_regs_rre(vcpu, &reg1, &reg2);
640 641

	/* This basically extracts the mask half of the psw. */
642
	vcpu->run->s.regs.gprs[reg1] &= 0xffffffff00000000UL;
643 644
	vcpu->run->s.regs.gprs[reg1] |= vcpu->arch.sie_block->gpsw.mask >> 32;
	if (reg2) {
645
		vcpu->run->s.regs.gprs[reg2] &= 0xffffffff00000000UL;
646
		vcpu->run->s.regs.gprs[reg2] |=
647
			vcpu->arch.sie_block->gpsw.mask & 0x00000000ffffffffUL;
648 649 650 651
	}
	return 0;
}

652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674
#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)
{
	int reg1, reg2;
	unsigned long start, end;

	vcpu->stat.instruction_pfmf++;

	kvm_s390_get_regs_rre(vcpu, &reg1, &reg2);

	if (!MACHINE_HAS_PFMF)
		return kvm_s390_inject_program_int(vcpu, PGM_OPERATION);

	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
675
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);
676 677 678 679 680

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

	/* Only provide non-quiescing support if the host supports it */
681
	if (vcpu->run->s.regs.gprs[reg1] & PFMF_NQ && !test_facility(14))
682 683 684 685 686 687 688
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);

	/* No support for conditional-SSKE */
	if (vcpu->run->s.regs.gprs[reg1] & (PFMF_MR | PFMF_MC))
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);

	start = vcpu->run->s.regs.gprs[reg2] & PAGE_MASK;
689
	start = kvm_s390_logical_to_effective(vcpu, start);
T
Thomas Huth 已提交
690

691 692 693 694 695 696 697 698 699 700 701 702 703 704
	switch (vcpu->run->s.regs.gprs[reg1] & PFMF_FSC) {
	case 0x00000000:
		end = (start + (1UL << 12)) & ~((1UL << 12) - 1);
		break;
	case 0x00001000:
		end = (start + (1UL << 20)) & ~((1UL << 20) - 1);
		break;
	/* We dont support EDAT2
	case 0x00002000:
		end = (start + (1UL << 31)) & ~((1UL << 31) - 1);
		break;*/
	default:
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
	}
705 706

	if (vcpu->run->s.regs.gprs[reg1] & PFMF_CF) {
707
		if (kvm_s390_check_low_addr_prot_real(vcpu, start))
708 709 710
			return kvm_s390_inject_prog_irq(vcpu, &vcpu->arch.pgm);
	}

711
	while (start < end) {
T
Thomas Huth 已提交
712 713 714 715 716 717 718 719 720
		unsigned long useraddr, abs_addr;

		/* Translate guest address to host address */
		if ((vcpu->run->s.regs.gprs[reg1] & PFMF_FSC) == 0)
			abs_addr = kvm_s390_real_to_abs(vcpu, start);
		else
			abs_addr = start;
		useraddr = gfn_to_hva(vcpu->kvm, gpa_to_gfn(abs_addr));
		if (kvm_is_error_hva(useraddr))
721 722 723 724 725 726 727 728
			return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);

		if (vcpu->run->s.regs.gprs[reg1] & PFMF_CF) {
			if (clear_user((void __user *)useraddr, PAGE_SIZE))
				return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
		}

		if (vcpu->run->s.regs.gprs[reg1] & PFMF_SK) {
729 730 731 732
			int rc = __skey_check_enable(vcpu);

			if (rc)
				return rc;
733 734 735 736 737 738 739 740 741 742 743 744 745
			if (set_guest_storage_key(current->mm, useraddr,
					vcpu->run->s.regs.gprs[reg1] & PFMF_KEY,
					vcpu->run->s.regs.gprs[reg1] & PFMF_NQ))
				return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
		}

		start += PAGE_SIZE;
	}
	if (vcpu->run->s.regs.gprs[reg1] & PFMF_FSC)
		vcpu->run->s.regs.gprs[reg2] = end;
	return 0;
}

746 747 748 749 750 751 752 753 754 755 756
static int handle_essa(struct kvm_vcpu *vcpu)
{
	/* entries expected to be 1FF */
	int entries = (vcpu->arch.sie_block->cbrlo & ~PAGE_MASK) >> 3;
	unsigned long *cbrlo, cbrle;
	struct gmap *gmap;
	int i;

	VCPU_EVENT(vcpu, 5, "cmma release %d pages", entries);
	gmap = vcpu->arch.gmap;
	vcpu->stat.instruction_essa++;
757
	if (!kvm_s390_cmma_enabled(vcpu->kvm))
758 759 760 761 762 763 764 765 766
		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);

	if (((vcpu->arch.sie_block->ipb & 0xf0000000) >> 28) > 6)
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);

	/* Rewind PSW to repeat the ESSA instruction */
767
	kvm_s390_rewind_psw(vcpu, 4);
768 769 770 771 772 773 774 775 776
	vcpu->arch.sie_block->cbrlo &= PAGE_MASK;	/* reset nceo */
	cbrlo = phys_to_virt(vcpu->arch.sie_block->cbrlo);
	down_read(&gmap->mm->mmap_sem);
	for (i = 0; i < entries; ++i) {
		cbrle = cbrlo[i];
		if (unlikely(cbrle & ~PAGE_MASK || cbrle < 2 * PAGE_SIZE))
			/* invalid entry */
			break;
		/* try to free backing */
777
		__gmap_zap(gmap, cbrle);
778 779 780 781 782 783 784
	}
	up_read(&gmap->mm->mmap_sem);
	if (i < entries)
		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
	return 0;
}

785
static const intercept_handler_t b9_handlers[256] = {
786
	[0x8a] = handle_ipte_interlock,
787
	[0x8d] = handle_epsw,
788 789
	[0x8e] = handle_ipte_interlock,
	[0x8f] = handle_ipte_interlock,
790
	[0xab] = handle_essa,
791
	[0xaf] = handle_pfmf,
792 793 794 795 796 797 798 799
};

int kvm_s390_handle_b9(struct kvm_vcpu *vcpu)
{
	intercept_handler_t handler;

	/* This is handled just as for the B2 instructions. */
	handler = b9_handlers[vcpu->arch.sie_block->ipa & 0x00ff];
800 801 802
	if (handler)
		return handler(vcpu);

803 804 805
	return -EOPNOTSUPP;
}

806 807 808 809
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;
810 811
	int reg, rc, nr_regs;
	u32 ctl_array[16];
812
	u64 ga;
813
	ar_t ar;
814 815 816 817 818 819

	vcpu->stat.instruction_lctl++;

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

820
	ga = kvm_s390_get_base_disp_rs(vcpu, &ar);
821

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

825 826
	VCPU_EVENT(vcpu, 5, "lctl r1:%x, r3:%x, addr:%llx", reg1, reg3, ga);
	trace_kvm_s390_handle_lctl(vcpu, 0, reg1, reg3, ga);
827

828
	nr_regs = ((reg3 - reg1) & 0xf) + 1;
829
	rc = read_guest(vcpu, ga, ar, ctl_array, nr_regs * sizeof(u32));
830 831
	if (rc)
		return kvm_s390_inject_prog_cond(vcpu, rc);
832
	reg = reg1;
833
	nr_regs = 0;
834 835
	do {
		vcpu->arch.sie_block->gcr[reg] &= 0xffffffff00000000ul;
836
		vcpu->arch.sie_block->gcr[reg] |= ctl_array[nr_regs++];
837 838 839 840
		if (reg == reg3)
			break;
		reg = (reg + 1) % 16;
	} while (1);
841
	kvm_make_request(KVM_REQ_TLB_FLUSH, vcpu);
842 843 844
	return 0;
}

845 846 847 848
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;
849 850
	int reg, rc, nr_regs;
	u32 ctl_array[16];
851
	u64 ga;
852
	ar_t ar;
853 854 855 856 857 858

	vcpu->stat.instruction_stctl++;

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

859
	ga = kvm_s390_get_base_disp_rs(vcpu, &ar);
860 861 862 863 864 865 866 867

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

	VCPU_EVENT(vcpu, 5, "stctl r1:%x, r3:%x, addr:%llx", reg1, reg3, ga);
	trace_kvm_s390_handle_stctl(vcpu, 0, reg1, reg3, ga);

	reg = reg1;
868
	nr_regs = 0;
869
	do {
870
		ctl_array[nr_regs++] = vcpu->arch.sie_block->gcr[reg];
871 872 873 874
		if (reg == reg3)
			break;
		reg = (reg + 1) % 16;
	} while (1);
875
	rc = write_guest(vcpu, ga, ar, ctl_array, nr_regs * sizeof(u32));
876
	return rc ? kvm_s390_inject_prog_cond(vcpu, rc) : 0;
877 878
}

879 880 881 882
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;
883 884 885
	int reg, rc, nr_regs;
	u64 ctl_array[16];
	u64 ga;
886
	ar_t ar;
887 888 889 890 891 892

	vcpu->stat.instruction_lctlg++;

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

893
	ga = kvm_s390_get_base_disp_rsy(vcpu, &ar);
894

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

898 899
	VCPU_EVENT(vcpu, 5, "lctlg r1:%x, r3:%x, addr:%llx", reg1, reg3, ga);
	trace_kvm_s390_handle_lctl(vcpu, 1, reg1, reg3, ga);
900

901
	nr_regs = ((reg3 - reg1) & 0xf) + 1;
902
	rc = read_guest(vcpu, ga, ar, ctl_array, nr_regs * sizeof(u64));
903 904 905 906
	if (rc)
		return kvm_s390_inject_prog_cond(vcpu, rc);
	reg = reg1;
	nr_regs = 0;
907
	do {
908
		vcpu->arch.sie_block->gcr[reg] = ctl_array[nr_regs++];
909 910 911 912
		if (reg == reg3)
			break;
		reg = (reg + 1) % 16;
	} while (1);
913
	kvm_make_request(KVM_REQ_TLB_FLUSH, vcpu);
914 915 916
	return 0;
}

917 918 919 920
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;
921 922 923
	int reg, rc, nr_regs;
	u64 ctl_array[16];
	u64 ga;
924
	ar_t ar;
925 926 927 928 929 930

	vcpu->stat.instruction_stctg++;

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

931
	ga = kvm_s390_get_base_disp_rsy(vcpu, &ar);
932 933 934 935 936 937 938

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

	VCPU_EVENT(vcpu, 5, "stctg r1:%x, r3:%x, addr:%llx", reg1, reg3, ga);
	trace_kvm_s390_handle_stctl(vcpu, 1, reg1, reg3, ga);

939 940
	reg = reg1;
	nr_regs = 0;
941
	do {
942
		ctl_array[nr_regs++] = vcpu->arch.sie_block->gcr[reg];
943 944 945 946
		if (reg == reg3)
			break;
		reg = (reg + 1) % 16;
	} while (1);
947
	rc = write_guest(vcpu, ga, ar, ctl_array, nr_regs * sizeof(u64));
948
	return rc ? kvm_s390_inject_prog_cond(vcpu, rc) : 0;
949 950
}

951
static const intercept_handler_t eb_handlers[256] = {
952
	[0x2f] = handle_lctlg,
953
	[0x25] = handle_stctg,
954 955
};

956
int kvm_s390_handle_eb(struct kvm_vcpu *vcpu)
957 958 959 960 961 962 963 964 965
{
	intercept_handler_t handler;

	handler = eb_handlers[vcpu->arch.sie_block->ipb & 0xff];
	if (handler)
		return handler(vcpu);
	return -EOPNOTSUPP;
}

966 967
static int handle_tprot(struct kvm_vcpu *vcpu)
{
968
	u64 address1, address2;
969 970 971
	unsigned long hva, gpa;
	int ret = 0, cc = 0;
	bool writable;
972
	ar_t ar;
973 974 975

	vcpu->stat.instruction_tprot++;

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

979
	kvm_s390_get_base_disp_sse(vcpu, &address1, &address2, &ar, NULL);
980

981 982 983 984 985 986
	/* 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)
987
		ipte_lock(vcpu);
988
	ret = guest_translate_address(vcpu, address1, ar, &gpa, 1);
989 990 991
	if (ret == PGM_PROTECTION) {
		/* Write protected? Try again with read-only... */
		cc = 1;
992
		ret = guest_translate_address(vcpu, address1, ar, &gpa, 0);
993 994 995 996 997 998 999 1000 1001 1002 1003
	}
	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;
	}
1004

1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017
	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;
1018 1019 1020 1021 1022 1023 1024 1025 1026 1027
}

int kvm_s390_handle_e5(struct kvm_vcpu *vcpu)
{
	/* For e5xx... instructions we only handle TPROT */
	if ((vcpu->arch.sie_block->ipa & 0x00ff) == 0x01)
		return handle_tprot(vcpu);
	return -EOPNOTSUPP;
}

1028 1029 1030 1031 1032
static int handle_sckpf(struct kvm_vcpu *vcpu)
{
	u32 value;

	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
1033
		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);
1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044

	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;
}

1045
static const intercept_handler_t x01_handlers[256] = {
1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057
	[0x07] = handle_sckpf,
};

int kvm_s390_handle_01(struct kvm_vcpu *vcpu)
{
	intercept_handler_t handler;

	handler = x01_handlers[vcpu->arch.sie_block->ipa & 0x00ff];
	if (handler)
		return handler(vcpu);
	return -EOPNOTSUPP;
}