booke_emulate.c 11.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License, version 2, as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 *
 * Copyright IBM Corp. 2008
16
 * Copyright 2011 Freescale Semiconductor, Inc.
17 18 19 20 21 22 23 24 25 26
 *
 * Authors: Hollis Blanchard <hollisb@us.ibm.com>
 */

#include <linux/kvm_host.h>
#include <asm/disassemble.h>

#include "booke.h"

#define OP_19_XOP_RFI     50
27
#define OP_19_XOP_RFCI    51
28
#define OP_19_XOP_RFDI    39
29 30 31 32 33 34 35 36

#define OP_31_XOP_MFMSR   83
#define OP_31_XOP_WRTEE   131
#define OP_31_XOP_MTMSR   146
#define OP_31_XOP_WRTEEI  163

static void kvmppc_emul_rfi(struct kvm_vcpu *vcpu)
{
37 38
	vcpu->arch.pc = vcpu->arch.shared->srr0;
	kvmppc_set_msr(vcpu, vcpu->arch.shared->srr1);
39 40
}

41 42 43 44 45 46
static void kvmppc_emul_rfdi(struct kvm_vcpu *vcpu)
{
	vcpu->arch.pc = vcpu->arch.dsrr0;
	kvmppc_set_msr(vcpu, vcpu->arch.dsrr1);
}

47 48 49 50 51 52
static void kvmppc_emul_rfci(struct kvm_vcpu *vcpu)
{
	vcpu->arch.pc = vcpu->arch.csrr0;
	kvmppc_set_msr(vcpu, vcpu->arch.csrr1);
}

53 54 55 56
int kvmppc_booke_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
                            unsigned int inst, int *advance)
{
	int emulated = EMULATE_DONE;
57 58
	int rs = get_rs(inst);
	int rt = get_rt(inst);
59 60 61 62 63 64 65 66 67 68

	switch (get_op(inst)) {
	case 19:
		switch (get_xop(inst)) {
		case OP_19_XOP_RFI:
			kvmppc_emul_rfi(vcpu);
			kvmppc_set_exit_type(vcpu, EMULATED_RFI_EXITS);
			*advance = 0;
			break;

69 70 71 72 73 74
		case OP_19_XOP_RFCI:
			kvmppc_emul_rfci(vcpu);
			kvmppc_set_exit_type(vcpu, EMULATED_RFCI_EXITS);
			*advance = 0;
			break;

75 76 77 78 79 80
		case OP_19_XOP_RFDI:
			kvmppc_emul_rfdi(vcpu);
			kvmppc_set_exit_type(vcpu, EMULATED_RFDI_EXITS);
			*advance = 0;
			break;

81 82 83 84 85 86 87 88 89 90
		default:
			emulated = EMULATE_FAIL;
			break;
		}
		break;

	case 31:
		switch (get_xop(inst)) {

		case OP_31_XOP_MFMSR:
91
			kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->msr);
92 93 94 95 96
			kvmppc_set_exit_type(vcpu, EMULATED_MFMSR_EXITS);
			break;

		case OP_31_XOP_MTMSR:
			kvmppc_set_exit_type(vcpu, EMULATED_MTMSR_EXITS);
97
			kvmppc_set_msr(vcpu, kvmppc_get_gpr(vcpu, rs));
98 99 100
			break;

		case OP_31_XOP_WRTEE:
101
			vcpu->arch.shared->msr = (vcpu->arch.shared->msr & ~MSR_EE)
102
					| (kvmppc_get_gpr(vcpu, rs) & MSR_EE);
103 104 105 106
			kvmppc_set_exit_type(vcpu, EMULATED_WRTEE_EXITS);
			break;

		case OP_31_XOP_WRTEEI:
107
			vcpu->arch.shared->msr = (vcpu->arch.shared->msr & ~MSR_EE)
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
							 | (inst & MSR_EE);
			kvmppc_set_exit_type(vcpu, EMULATED_WRTEE_EXITS);
			break;

		default:
			emulated = EMULATE_FAIL;
		}

		break;

	default:
		emulated = EMULATE_FAIL;
	}

	return emulated;
}

125 126 127 128 129 130
/*
 * NOTE: some of these registers are not emulated on BOOKE_HV (GS-mode).
 * Their backing store is in real registers, and these functions
 * will return the wrong result if called for them in another context
 * (such as debugging).
 */
131
int kvmppc_booke_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, ulong spr_val)
132 133
{
	int emulated = EMULATE_DONE;
134
	bool debug_inst = false;
135 136 137

	switch (sprn) {
	case SPRN_DEAR:
138 139
		vcpu->arch.shared->dar = spr_val;
		break;
140
	case SPRN_ESR:
141 142
		vcpu->arch.shared->esr = spr_val;
		break;
143 144 145 146 147 148
	case SPRN_CSRR0:
		vcpu->arch.csrr0 = spr_val;
		break;
	case SPRN_CSRR1:
		vcpu->arch.csrr1 = spr_val;
		break;
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
	case SPRN_DSRR0:
		vcpu->arch.dsrr0 = spr_val;
		break;
	case SPRN_DSRR1:
		vcpu->arch.dsrr1 = spr_val;
		break;
	case SPRN_IAC1:
		/*
		 * If userspace is debugging guest then guest
		 * can not access debug registers.
		 */
		if (vcpu->guest_debug)
			break;

		debug_inst = true;
		vcpu->arch.dbg_reg.iac1 = spr_val;
		break;
	case SPRN_IAC2:
		/*
		 * If userspace is debugging guest then guest
		 * can not access debug registers.
		 */
		if (vcpu->guest_debug)
			break;

		debug_inst = true;
		vcpu->arch.dbg_reg.iac2 = spr_val;
		break;
#if CONFIG_PPC_ADV_DEBUG_IACS > 2
	case SPRN_IAC3:
		/*
		 * If userspace is debugging guest then guest
		 * can not access debug registers.
		 */
		if (vcpu->guest_debug)
			break;

		debug_inst = true;
		vcpu->arch.dbg_reg.iac3 = spr_val;
		break;
	case SPRN_IAC4:
		/*
		 * If userspace is debugging guest then guest
		 * can not access debug registers.
		 */
		if (vcpu->guest_debug)
			break;

		debug_inst = true;
		vcpu->arch.dbg_reg.iac4 = spr_val;
		break;
#endif
	case SPRN_DAC1:
		/*
		 * If userspace is debugging guest then guest
		 * can not access debug registers.
		 */
		if (vcpu->guest_debug)
			break;

		debug_inst = true;
		vcpu->arch.dbg_reg.dac1 = spr_val;
		break;
	case SPRN_DAC2:
		/*
		 * If userspace is debugging guest then guest
		 * can not access debug registers.
		 */
		if (vcpu->guest_debug)
			break;

		debug_inst = true;
		vcpu->arch.dbg_reg.dac2 = spr_val;
		break;
223
	case SPRN_DBCR0:
224 225 226 227 228 229 230 231 232 233 234 235
		/*
		 * If userspace is debugging guest then guest
		 * can not access debug registers.
		 */
		if (vcpu->guest_debug)
			break;

		debug_inst = true;
		spr_val &= (DBCR0_IDM | DBCR0_IC | DBCR0_BT | DBCR0_TIE |
			DBCR0_IAC1 | DBCR0_IAC2 | DBCR0_IAC3 | DBCR0_IAC4  |
			DBCR0_DAC1R | DBCR0_DAC1W | DBCR0_DAC2R | DBCR0_DAC2W);

236
		vcpu->arch.dbg_reg.dbcr0 = spr_val;
237
		break;
238
	case SPRN_DBCR1:
239 240 241 242 243 244 245 246
		/*
		 * If userspace is debugging guest then guest
		 * can not access debug registers.
		 */
		if (vcpu->guest_debug)
			break;

		debug_inst = true;
247
		vcpu->arch.dbg_reg.dbcr1 = spr_val;
248
		break;
249 250 251 252 253 254 255 256 257 258 259
	case SPRN_DBCR2:
		/*
		 * If userspace is debugging guest then guest
		 * can not access debug registers.
		 */
		if (vcpu->guest_debug)
			break;

		debug_inst = true;
		vcpu->arch.dbg_reg.dbcr2 = spr_val;
		break;
260
	case SPRN_DBSR:
261 262 263 264 265 266 267
		/*
		 * If userspace is debugging guest then guest
		 * can not access debug registers.
		 */
		if (vcpu->guest_debug)
			break;

268
		vcpu->arch.dbsr &= ~spr_val;
269 270
		if (!(vcpu->arch.dbsr & ~DBSR_IDE))
			kvmppc_core_dequeue_debug(vcpu);
271
		break;
272
	case SPRN_TSR:
273 274
		kvmppc_clr_tsr_bits(vcpu, spr_val);
		break;
275
	case SPRN_TCR:
276 277 278 279 280 281 282 283
		/*
		 * WRC is a 2-bit field that is supposed to preserve its
		 * value once written to non-zero.
		 */
		if (vcpu->arch.tcr & TCR_WRC_MASK) {
			spr_val &= ~TCR_WRC_MASK;
			spr_val |= vcpu->arch.tcr & TCR_WRC_MASK;
		}
284
		kvmppc_set_tcr(vcpu, spr_val);
285 286
		break;

287 288 289
	case SPRN_DECAR:
		vcpu->arch.decar = spr_val;
		break;
290 291 292 293 294
	/*
	 * Note: SPRG4-7 are user-readable.
	 * These values are loaded into the real SPRGs when resuming the
	 * guest (PR-mode only).
	 */
295
	case SPRN_SPRG4:
296
		kvmppc_set_sprg4(vcpu, spr_val);
297
		break;
298
	case SPRN_SPRG5:
299
		kvmppc_set_sprg5(vcpu, spr_val);
300
		break;
301
	case SPRN_SPRG6:
302
		kvmppc_set_sprg6(vcpu, spr_val);
303
		break;
304
	case SPRN_SPRG7:
305
		kvmppc_set_sprg7(vcpu, spr_val);
306
		break;
307 308

	case SPRN_IVPR:
309
		vcpu->arch.ivpr = spr_val;
310 311 312
#ifdef CONFIG_KVM_BOOKE_HV
		mtspr(SPRN_GIVPR, spr_val);
#endif
313 314
		break;
	case SPRN_IVOR0:
315
		vcpu->arch.ivor[BOOKE_IRQPRIO_CRITICAL] = spr_val;
316 317
		break;
	case SPRN_IVOR1:
318
		vcpu->arch.ivor[BOOKE_IRQPRIO_MACHINE_CHECK] = spr_val;
319 320
		break;
	case SPRN_IVOR2:
321
		vcpu->arch.ivor[BOOKE_IRQPRIO_DATA_STORAGE] = spr_val;
322 323 324
#ifdef CONFIG_KVM_BOOKE_HV
		mtspr(SPRN_GIVOR2, spr_val);
#endif
325 326
		break;
	case SPRN_IVOR3:
327
		vcpu->arch.ivor[BOOKE_IRQPRIO_INST_STORAGE] = spr_val;
328 329
		break;
	case SPRN_IVOR4:
330
		vcpu->arch.ivor[BOOKE_IRQPRIO_EXTERNAL] = spr_val;
331 332
		break;
	case SPRN_IVOR5:
333
		vcpu->arch.ivor[BOOKE_IRQPRIO_ALIGNMENT] = spr_val;
334 335
		break;
	case SPRN_IVOR6:
336
		vcpu->arch.ivor[BOOKE_IRQPRIO_PROGRAM] = spr_val;
337 338
		break;
	case SPRN_IVOR7:
339
		vcpu->arch.ivor[BOOKE_IRQPRIO_FP_UNAVAIL] = spr_val;
340 341
		break;
	case SPRN_IVOR8:
342
		vcpu->arch.ivor[BOOKE_IRQPRIO_SYSCALL] = spr_val;
343 344 345
#ifdef CONFIG_KVM_BOOKE_HV
		mtspr(SPRN_GIVOR8, spr_val);
#endif
346 347
		break;
	case SPRN_IVOR9:
348
		vcpu->arch.ivor[BOOKE_IRQPRIO_AP_UNAVAIL] = spr_val;
349 350
		break;
	case SPRN_IVOR10:
351
		vcpu->arch.ivor[BOOKE_IRQPRIO_DECREMENTER] = spr_val;
352 353
		break;
	case SPRN_IVOR11:
354
		vcpu->arch.ivor[BOOKE_IRQPRIO_FIT] = spr_val;
355 356
		break;
	case SPRN_IVOR12:
357
		vcpu->arch.ivor[BOOKE_IRQPRIO_WATCHDOG] = spr_val;
358 359
		break;
	case SPRN_IVOR13:
360
		vcpu->arch.ivor[BOOKE_IRQPRIO_DTLB_MISS] = spr_val;
361 362
		break;
	case SPRN_IVOR14:
363
		vcpu->arch.ivor[BOOKE_IRQPRIO_ITLB_MISS] = spr_val;
364 365
		break;
	case SPRN_IVOR15:
366
		vcpu->arch.ivor[BOOKE_IRQPRIO_DEBUG] = spr_val;
367
		break;
368 369 370
	case SPRN_MCSR:
		vcpu->arch.mcsr &= ~spr_val;
		break;
371 372 373 374 375 376 377 378
#if defined(CONFIG_64BIT)
	case SPRN_EPCR:
		kvmppc_set_epcr(vcpu, spr_val);
#ifdef CONFIG_KVM_BOOKE_HV
		mtspr(SPRN_EPCR, vcpu->arch.shadow_epcr);
#endif
		break;
#endif
379 380 381 382
	default:
		emulated = EMULATE_FAIL;
	}

383 384 385 386
	if (debug_inst) {
		current->thread.debug = vcpu->arch.dbg_reg;
		switch_booke_debug_regs(&vcpu->arch.dbg_reg);
	}
387 388 389
	return emulated;
}

390
int kvmppc_booke_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, ulong *spr_val)
391 392 393 394 395
{
	int emulated = EMULATE_DONE;

	switch (sprn) {
	case SPRN_IVPR:
396 397
		*spr_val = vcpu->arch.ivpr;
		break;
398
	case SPRN_DEAR:
399 400
		*spr_val = vcpu->arch.shared->dar;
		break;
401
	case SPRN_ESR:
402 403
		*spr_val = vcpu->arch.shared->esr;
		break;
404 405 406
	case SPRN_EPR:
		*spr_val = vcpu->arch.epr;
		break;
407 408 409 410 411 412
	case SPRN_CSRR0:
		*spr_val = vcpu->arch.csrr0;
		break;
	case SPRN_CSRR1:
		*spr_val = vcpu->arch.csrr1;
		break;
413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438
	case SPRN_DSRR0:
		*spr_val = vcpu->arch.dsrr0;
		break;
	case SPRN_DSRR1:
		*spr_val = vcpu->arch.dsrr1;
		break;
	case SPRN_IAC1:
		*spr_val = vcpu->arch.dbg_reg.iac1;
		break;
	case SPRN_IAC2:
		*spr_val = vcpu->arch.dbg_reg.iac2;
		break;
#if CONFIG_PPC_ADV_DEBUG_IACS > 2
	case SPRN_IAC3:
		*spr_val = vcpu->arch.dbg_reg.iac3;
		break;
	case SPRN_IAC4:
		*spr_val = vcpu->arch.dbg_reg.iac4;
		break;
#endif
	case SPRN_DAC1:
		*spr_val = vcpu->arch.dbg_reg.dac1;
		break;
	case SPRN_DAC2:
		*spr_val = vcpu->arch.dbg_reg.dac2;
		break;
439
	case SPRN_DBCR0:
440
		*spr_val = vcpu->arch.dbg_reg.dbcr0;
441 442
		if (vcpu->guest_debug)
			*spr_val = *spr_val | DBCR0_EDM;
443
		break;
444
	case SPRN_DBCR1:
445
		*spr_val = vcpu->arch.dbg_reg.dbcr1;
446
		break;
447 448 449
	case SPRN_DBCR2:
		*spr_val = vcpu->arch.dbg_reg.dbcr2;
		break;
450
	case SPRN_DBSR:
451 452
		*spr_val = vcpu->arch.dbsr;
		break;
453
	case SPRN_TSR:
454 455
		*spr_val = vcpu->arch.tsr;
		break;
456
	case SPRN_TCR:
457 458
		*spr_val = vcpu->arch.tcr;
		break;
459 460

	case SPRN_IVOR0:
461
		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_CRITICAL];
462 463
		break;
	case SPRN_IVOR1:
464
		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_MACHINE_CHECK];
465 466
		break;
	case SPRN_IVOR2:
467
		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_DATA_STORAGE];
468 469
		break;
	case SPRN_IVOR3:
470
		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_INST_STORAGE];
471 472
		break;
	case SPRN_IVOR4:
473
		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_EXTERNAL];
474 475
		break;
	case SPRN_IVOR5:
476
		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_ALIGNMENT];
477 478
		break;
	case SPRN_IVOR6:
479
		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_PROGRAM];
480 481
		break;
	case SPRN_IVOR7:
482
		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_FP_UNAVAIL];
483 484
		break;
	case SPRN_IVOR8:
485
		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_SYSCALL];
486 487
		break;
	case SPRN_IVOR9:
488
		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_AP_UNAVAIL];
489 490
		break;
	case SPRN_IVOR10:
491
		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_DECREMENTER];
492 493
		break;
	case SPRN_IVOR11:
494
		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_FIT];
495 496
		break;
	case SPRN_IVOR12:
497
		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_WATCHDOG];
498 499
		break;
	case SPRN_IVOR13:
500
		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_DTLB_MISS];
501 502
		break;
	case SPRN_IVOR14:
503
		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_ITLB_MISS];
504 505
		break;
	case SPRN_IVOR15:
506
		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_DEBUG];
507
		break;
508 509 510
	case SPRN_MCSR:
		*spr_val = vcpu->arch.mcsr;
		break;
511 512 513 514 515
#if defined(CONFIG_64BIT)
	case SPRN_EPCR:
		*spr_val = vcpu->arch.epcr;
		break;
#endif
516 517 518 519 520 521 522

	default:
		emulated = EMULATE_FAIL;
	}

	return emulated;
}