cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

book3s_emulate.c (25213B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 *
      4 * Copyright SUSE Linux Products GmbH 2009
      5 *
      6 * Authors: Alexander Graf <agraf@suse.de>
      7 */
      8
      9#include <asm/kvm_ppc.h>
     10#include <asm/disassemble.h>
     11#include <asm/kvm_book3s.h>
     12#include <asm/reg.h>
     13#include <asm/switch_to.h>
     14#include <asm/time.h>
     15#include <asm/tm.h>
     16#include "book3s.h"
     17#include <asm/asm-prototypes.h>
     18
     19#define OP_19_XOP_RFID		18
     20#define OP_19_XOP_RFI		50
     21
     22#define OP_31_XOP_MFMSR		83
     23#define OP_31_XOP_MTMSR		146
     24#define OP_31_XOP_MTMSRD	178
     25#define OP_31_XOP_MTSR		210
     26#define OP_31_XOP_MTSRIN	242
     27#define OP_31_XOP_TLBIEL	274
     28/* Opcode is officially reserved, reuse it as sc 1 when sc 1 doesn't trap */
     29#define OP_31_XOP_FAKE_SC1	308
     30#define OP_31_XOP_SLBMTE	402
     31#define OP_31_XOP_SLBIE		434
     32#define OP_31_XOP_SLBIA		498
     33#define OP_31_XOP_MFSR		595
     34#define OP_31_XOP_MFSRIN	659
     35#define OP_31_XOP_DCBA		758
     36#define OP_31_XOP_SLBMFEV	851
     37#define OP_31_XOP_EIOIO		854
     38#define OP_31_XOP_SLBMFEE	915
     39#define OP_31_XOP_SLBFEE	979
     40
     41#define OP_31_XOP_TBEGIN	654
     42#define OP_31_XOP_TABORT	910
     43
     44#define OP_31_XOP_TRECLAIM	942
     45#define OP_31_XOP_TRCHKPT	1006
     46
     47/* DCBZ is actually 1014, but we patch it to 1010 so we get a trap */
     48#define OP_31_XOP_DCBZ		1010
     49
     50#define OP_LFS			48
     51#define OP_LFD			50
     52#define OP_STFS			52
     53#define OP_STFD			54
     54
     55#define SPRN_GQR0		912
     56#define SPRN_GQR1		913
     57#define SPRN_GQR2		914
     58#define SPRN_GQR3		915
     59#define SPRN_GQR4		916
     60#define SPRN_GQR5		917
     61#define SPRN_GQR6		918
     62#define SPRN_GQR7		919
     63
     64enum priv_level {
     65	PRIV_PROBLEM = 0,
     66	PRIV_SUPER = 1,
     67	PRIV_HYPER = 2,
     68};
     69
     70static bool spr_allowed(struct kvm_vcpu *vcpu, enum priv_level level)
     71{
     72	/* PAPR VMs only access supervisor SPRs */
     73	if (vcpu->arch.papr_enabled && (level > PRIV_SUPER))
     74		return false;
     75
     76	/* Limit user space to its own small SPR set */
     77	if ((kvmppc_get_msr(vcpu) & MSR_PR) && level > PRIV_PROBLEM)
     78		return false;
     79
     80	return true;
     81}
     82
     83#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
     84static inline void kvmppc_copyto_vcpu_tm(struct kvm_vcpu *vcpu)
     85{
     86	memcpy(&vcpu->arch.gpr_tm[0], &vcpu->arch.regs.gpr[0],
     87			sizeof(vcpu->arch.gpr_tm));
     88	memcpy(&vcpu->arch.fp_tm, &vcpu->arch.fp,
     89			sizeof(struct thread_fp_state));
     90	memcpy(&vcpu->arch.vr_tm, &vcpu->arch.vr,
     91			sizeof(struct thread_vr_state));
     92	vcpu->arch.ppr_tm = vcpu->arch.ppr;
     93	vcpu->arch.dscr_tm = vcpu->arch.dscr;
     94	vcpu->arch.amr_tm = vcpu->arch.amr;
     95	vcpu->arch.ctr_tm = vcpu->arch.regs.ctr;
     96	vcpu->arch.tar_tm = vcpu->arch.tar;
     97	vcpu->arch.lr_tm = vcpu->arch.regs.link;
     98	vcpu->arch.cr_tm = vcpu->arch.regs.ccr;
     99	vcpu->arch.xer_tm = vcpu->arch.regs.xer;
    100	vcpu->arch.vrsave_tm = vcpu->arch.vrsave;
    101}
    102
    103static inline void kvmppc_copyfrom_vcpu_tm(struct kvm_vcpu *vcpu)
    104{
    105	memcpy(&vcpu->arch.regs.gpr[0], &vcpu->arch.gpr_tm[0],
    106			sizeof(vcpu->arch.regs.gpr));
    107	memcpy(&vcpu->arch.fp, &vcpu->arch.fp_tm,
    108			sizeof(struct thread_fp_state));
    109	memcpy(&vcpu->arch.vr, &vcpu->arch.vr_tm,
    110			sizeof(struct thread_vr_state));
    111	vcpu->arch.ppr = vcpu->arch.ppr_tm;
    112	vcpu->arch.dscr = vcpu->arch.dscr_tm;
    113	vcpu->arch.amr = vcpu->arch.amr_tm;
    114	vcpu->arch.regs.ctr = vcpu->arch.ctr_tm;
    115	vcpu->arch.tar = vcpu->arch.tar_tm;
    116	vcpu->arch.regs.link = vcpu->arch.lr_tm;
    117	vcpu->arch.regs.ccr = vcpu->arch.cr_tm;
    118	vcpu->arch.regs.xer = vcpu->arch.xer_tm;
    119	vcpu->arch.vrsave = vcpu->arch.vrsave_tm;
    120}
    121
    122static void kvmppc_emulate_treclaim(struct kvm_vcpu *vcpu, int ra_val)
    123{
    124	unsigned long guest_msr = kvmppc_get_msr(vcpu);
    125	int fc_val = ra_val ? ra_val : 1;
    126	uint64_t texasr;
    127
    128	/* CR0 = 0 | MSR[TS] | 0 */
    129	vcpu->arch.regs.ccr = (vcpu->arch.regs.ccr & ~(CR0_MASK << CR0_SHIFT)) |
    130		(((guest_msr & MSR_TS_MASK) >> (MSR_TS_S_LG - 1))
    131		 << CR0_SHIFT);
    132
    133	preempt_disable();
    134	tm_enable();
    135	texasr = mfspr(SPRN_TEXASR);
    136	kvmppc_save_tm_pr(vcpu);
    137	kvmppc_copyfrom_vcpu_tm(vcpu);
    138
    139	/* failure recording depends on Failure Summary bit */
    140	if (!(texasr & TEXASR_FS)) {
    141		texasr &= ~TEXASR_FC;
    142		texasr |= ((u64)fc_val << TEXASR_FC_LG) | TEXASR_FS;
    143
    144		texasr &= ~(TEXASR_PR | TEXASR_HV);
    145		if (kvmppc_get_msr(vcpu) & MSR_PR)
    146			texasr |= TEXASR_PR;
    147
    148		if (kvmppc_get_msr(vcpu) & MSR_HV)
    149			texasr |= TEXASR_HV;
    150
    151		vcpu->arch.texasr = texasr;
    152		vcpu->arch.tfiar = kvmppc_get_pc(vcpu);
    153		mtspr(SPRN_TEXASR, texasr);
    154		mtspr(SPRN_TFIAR, vcpu->arch.tfiar);
    155	}
    156	tm_disable();
    157	/*
    158	 * treclaim need quit to non-transactional state.
    159	 */
    160	guest_msr &= ~(MSR_TS_MASK);
    161	kvmppc_set_msr(vcpu, guest_msr);
    162	preempt_enable();
    163
    164	if (vcpu->arch.shadow_fscr & FSCR_TAR)
    165		mtspr(SPRN_TAR, vcpu->arch.tar);
    166}
    167
    168static void kvmppc_emulate_trchkpt(struct kvm_vcpu *vcpu)
    169{
    170	unsigned long guest_msr = kvmppc_get_msr(vcpu);
    171
    172	preempt_disable();
    173	/*
    174	 * need flush FP/VEC/VSX to vcpu save area before
    175	 * copy.
    176	 */
    177	kvmppc_giveup_ext(vcpu, MSR_VSX);
    178	kvmppc_giveup_fac(vcpu, FSCR_TAR_LG);
    179	kvmppc_copyto_vcpu_tm(vcpu);
    180	kvmppc_save_tm_sprs(vcpu);
    181
    182	/*
    183	 * as a result of trecheckpoint. set TS to suspended.
    184	 */
    185	guest_msr &= ~(MSR_TS_MASK);
    186	guest_msr |= MSR_TS_S;
    187	kvmppc_set_msr(vcpu, guest_msr);
    188	kvmppc_restore_tm_pr(vcpu);
    189	preempt_enable();
    190}
    191
    192/* emulate tabort. at guest privilege state */
    193void kvmppc_emulate_tabort(struct kvm_vcpu *vcpu, int ra_val)
    194{
    195	/* currently we only emulate tabort. but no emulation of other
    196	 * tabort variants since there is no kernel usage of them at
    197	 * present.
    198	 */
    199	unsigned long guest_msr = kvmppc_get_msr(vcpu);
    200	uint64_t org_texasr;
    201
    202	preempt_disable();
    203	tm_enable();
    204	org_texasr = mfspr(SPRN_TEXASR);
    205	tm_abort(ra_val);
    206
    207	/* CR0 = 0 | MSR[TS] | 0 */
    208	vcpu->arch.regs.ccr = (vcpu->arch.regs.ccr & ~(CR0_MASK << CR0_SHIFT)) |
    209		(((guest_msr & MSR_TS_MASK) >> (MSR_TS_S_LG - 1))
    210		 << CR0_SHIFT);
    211
    212	vcpu->arch.texasr = mfspr(SPRN_TEXASR);
    213	/* failure recording depends on Failure Summary bit,
    214	 * and tabort will be treated as nops in non-transactional
    215	 * state.
    216	 */
    217	if (!(org_texasr & TEXASR_FS) &&
    218			MSR_TM_ACTIVE(guest_msr)) {
    219		vcpu->arch.texasr &= ~(TEXASR_PR | TEXASR_HV);
    220		if (guest_msr & MSR_PR)
    221			vcpu->arch.texasr |= TEXASR_PR;
    222
    223		if (guest_msr & MSR_HV)
    224			vcpu->arch.texasr |= TEXASR_HV;
    225
    226		vcpu->arch.tfiar = kvmppc_get_pc(vcpu);
    227	}
    228	tm_disable();
    229	preempt_enable();
    230}
    231
    232#endif
    233
    234int kvmppc_core_emulate_op_pr(struct kvm_vcpu *vcpu,
    235			      unsigned int inst, int *advance)
    236{
    237	int emulated = EMULATE_DONE;
    238	int rt = get_rt(inst);
    239	int rs = get_rs(inst);
    240	int ra = get_ra(inst);
    241	int rb = get_rb(inst);
    242	u32 inst_sc = 0x44000002;
    243
    244	switch (get_op(inst)) {
    245	case 0:
    246		emulated = EMULATE_FAIL;
    247		if ((kvmppc_get_msr(vcpu) & MSR_LE) &&
    248		    (inst == swab32(inst_sc))) {
    249			/*
    250			 * This is the byte reversed syscall instruction of our
    251			 * hypercall handler. Early versions of LE Linux didn't
    252			 * swap the instructions correctly and ended up in
    253			 * illegal instructions.
    254			 * Just always fail hypercalls on these broken systems.
    255			 */
    256			kvmppc_set_gpr(vcpu, 3, EV_UNIMPLEMENTED);
    257			kvmppc_set_pc(vcpu, kvmppc_get_pc(vcpu) + 4);
    258			emulated = EMULATE_DONE;
    259		}
    260		break;
    261	case 19:
    262		switch (get_xop(inst)) {
    263		case OP_19_XOP_RFID:
    264		case OP_19_XOP_RFI: {
    265			unsigned long srr1 = kvmppc_get_srr1(vcpu);
    266#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
    267			unsigned long cur_msr = kvmppc_get_msr(vcpu);
    268
    269			/*
    270			 * add rules to fit in ISA specification regarding TM
    271			 * state transition in TM disable/Suspended state,
    272			 * and target TM state is TM inactive(00) state. (the
    273			 * change should be suppressed).
    274			 */
    275			if (((cur_msr & MSR_TM) == 0) &&
    276				((srr1 & MSR_TM) == 0) &&
    277				MSR_TM_SUSPENDED(cur_msr) &&
    278				!MSR_TM_ACTIVE(srr1))
    279				srr1 |= MSR_TS_S;
    280#endif
    281			kvmppc_set_pc(vcpu, kvmppc_get_srr0(vcpu));
    282			kvmppc_set_msr(vcpu, srr1);
    283			*advance = 0;
    284			break;
    285		}
    286
    287		default:
    288			emulated = EMULATE_FAIL;
    289			break;
    290		}
    291		break;
    292	case 31:
    293		switch (get_xop(inst)) {
    294		case OP_31_XOP_MFMSR:
    295			kvmppc_set_gpr(vcpu, rt, kvmppc_get_msr(vcpu));
    296			break;
    297		case OP_31_XOP_MTMSRD:
    298		{
    299			ulong rs_val = kvmppc_get_gpr(vcpu, rs);
    300			if (inst & 0x10000) {
    301				ulong new_msr = kvmppc_get_msr(vcpu);
    302				new_msr &= ~(MSR_RI | MSR_EE);
    303				new_msr |= rs_val & (MSR_RI | MSR_EE);
    304				kvmppc_set_msr_fast(vcpu, new_msr);
    305			} else
    306				kvmppc_set_msr(vcpu, rs_val);
    307			break;
    308		}
    309		case OP_31_XOP_MTMSR:
    310			kvmppc_set_msr(vcpu, kvmppc_get_gpr(vcpu, rs));
    311			break;
    312		case OP_31_XOP_MFSR:
    313		{
    314			int srnum;
    315
    316			srnum = kvmppc_get_field(inst, 12 + 32, 15 + 32);
    317			if (vcpu->arch.mmu.mfsrin) {
    318				u32 sr;
    319				sr = vcpu->arch.mmu.mfsrin(vcpu, srnum);
    320				kvmppc_set_gpr(vcpu, rt, sr);
    321			}
    322			break;
    323		}
    324		case OP_31_XOP_MFSRIN:
    325		{
    326			int srnum;
    327
    328			srnum = (kvmppc_get_gpr(vcpu, rb) >> 28) & 0xf;
    329			if (vcpu->arch.mmu.mfsrin) {
    330				u32 sr;
    331				sr = vcpu->arch.mmu.mfsrin(vcpu, srnum);
    332				kvmppc_set_gpr(vcpu, rt, sr);
    333			}
    334			break;
    335		}
    336		case OP_31_XOP_MTSR:
    337			vcpu->arch.mmu.mtsrin(vcpu,
    338				(inst >> 16) & 0xf,
    339				kvmppc_get_gpr(vcpu, rs));
    340			break;
    341		case OP_31_XOP_MTSRIN:
    342			vcpu->arch.mmu.mtsrin(vcpu,
    343				(kvmppc_get_gpr(vcpu, rb) >> 28) & 0xf,
    344				kvmppc_get_gpr(vcpu, rs));
    345			break;
    346		case OP_31_XOP_TLBIE:
    347		case OP_31_XOP_TLBIEL:
    348		{
    349			bool large = (inst & 0x00200000) ? true : false;
    350			ulong addr = kvmppc_get_gpr(vcpu, rb);
    351			vcpu->arch.mmu.tlbie(vcpu, addr, large);
    352			break;
    353		}
    354#ifdef CONFIG_PPC_BOOK3S_64
    355		case OP_31_XOP_FAKE_SC1:
    356		{
    357			/* SC 1 papr hypercalls */
    358			ulong cmd = kvmppc_get_gpr(vcpu, 3);
    359			int i;
    360
    361		        if ((kvmppc_get_msr(vcpu) & MSR_PR) ||
    362			    !vcpu->arch.papr_enabled) {
    363				emulated = EMULATE_FAIL;
    364				break;
    365			}
    366
    367			if (kvmppc_h_pr(vcpu, cmd) == EMULATE_DONE)
    368				break;
    369
    370			vcpu->run->papr_hcall.nr = cmd;
    371			for (i = 0; i < 9; ++i) {
    372				ulong gpr = kvmppc_get_gpr(vcpu, 4 + i);
    373				vcpu->run->papr_hcall.args[i] = gpr;
    374			}
    375
    376			vcpu->run->exit_reason = KVM_EXIT_PAPR_HCALL;
    377			vcpu->arch.hcall_needed = 1;
    378			emulated = EMULATE_EXIT_USER;
    379			break;
    380		}
    381#endif
    382		case OP_31_XOP_EIOIO:
    383			break;
    384		case OP_31_XOP_SLBMTE:
    385			if (!vcpu->arch.mmu.slbmte)
    386				return EMULATE_FAIL;
    387
    388			vcpu->arch.mmu.slbmte(vcpu,
    389					kvmppc_get_gpr(vcpu, rs),
    390					kvmppc_get_gpr(vcpu, rb));
    391			break;
    392		case OP_31_XOP_SLBIE:
    393			if (!vcpu->arch.mmu.slbie)
    394				return EMULATE_FAIL;
    395
    396			vcpu->arch.mmu.slbie(vcpu,
    397					kvmppc_get_gpr(vcpu, rb));
    398			break;
    399		case OP_31_XOP_SLBIA:
    400			if (!vcpu->arch.mmu.slbia)
    401				return EMULATE_FAIL;
    402
    403			vcpu->arch.mmu.slbia(vcpu);
    404			break;
    405		case OP_31_XOP_SLBFEE:
    406			if (!(inst & 1) || !vcpu->arch.mmu.slbfee) {
    407				return EMULATE_FAIL;
    408			} else {
    409				ulong b, t;
    410				ulong cr = kvmppc_get_cr(vcpu) & ~CR0_MASK;
    411
    412				b = kvmppc_get_gpr(vcpu, rb);
    413				if (!vcpu->arch.mmu.slbfee(vcpu, b, &t))
    414					cr |= 2 << CR0_SHIFT;
    415				kvmppc_set_gpr(vcpu, rt, t);
    416				/* copy XER[SO] bit to CR0[SO] */
    417				cr |= (vcpu->arch.regs.xer & 0x80000000) >>
    418					(31 - CR0_SHIFT);
    419				kvmppc_set_cr(vcpu, cr);
    420			}
    421			break;
    422		case OP_31_XOP_SLBMFEE:
    423			if (!vcpu->arch.mmu.slbmfee) {
    424				emulated = EMULATE_FAIL;
    425			} else {
    426				ulong t, rb_val;
    427
    428				rb_val = kvmppc_get_gpr(vcpu, rb);
    429				t = vcpu->arch.mmu.slbmfee(vcpu, rb_val);
    430				kvmppc_set_gpr(vcpu, rt, t);
    431			}
    432			break;
    433		case OP_31_XOP_SLBMFEV:
    434			if (!vcpu->arch.mmu.slbmfev) {
    435				emulated = EMULATE_FAIL;
    436			} else {
    437				ulong t, rb_val;
    438
    439				rb_val = kvmppc_get_gpr(vcpu, rb);
    440				t = vcpu->arch.mmu.slbmfev(vcpu, rb_val);
    441				kvmppc_set_gpr(vcpu, rt, t);
    442			}
    443			break;
    444		case OP_31_XOP_DCBA:
    445			/* Gets treated as NOP */
    446			break;
    447		case OP_31_XOP_DCBZ:
    448		{
    449			ulong rb_val = kvmppc_get_gpr(vcpu, rb);
    450			ulong ra_val = 0;
    451			ulong addr, vaddr;
    452			u32 zeros[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
    453			u32 dsisr;
    454			int r;
    455
    456			if (ra)
    457				ra_val = kvmppc_get_gpr(vcpu, ra);
    458
    459			addr = (ra_val + rb_val) & ~31ULL;
    460			if (!(kvmppc_get_msr(vcpu) & MSR_SF))
    461				addr &= 0xffffffff;
    462			vaddr = addr;
    463
    464			r = kvmppc_st(vcpu, &addr, 32, zeros, true);
    465			if ((r == -ENOENT) || (r == -EPERM)) {
    466				*advance = 0;
    467				kvmppc_set_dar(vcpu, vaddr);
    468				vcpu->arch.fault_dar = vaddr;
    469
    470				dsisr = DSISR_ISSTORE;
    471				if (r == -ENOENT)
    472					dsisr |= DSISR_NOHPTE;
    473				else if (r == -EPERM)
    474					dsisr |= DSISR_PROTFAULT;
    475
    476				kvmppc_set_dsisr(vcpu, dsisr);
    477				vcpu->arch.fault_dsisr = dsisr;
    478
    479				kvmppc_book3s_queue_irqprio(vcpu,
    480					BOOK3S_INTERRUPT_DATA_STORAGE);
    481			}
    482
    483			break;
    484		}
    485#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
    486		case OP_31_XOP_TBEGIN:
    487		{
    488			if (!cpu_has_feature(CPU_FTR_TM))
    489				break;
    490
    491			if (!(kvmppc_get_msr(vcpu) & MSR_TM)) {
    492				kvmppc_trigger_fac_interrupt(vcpu, FSCR_TM_LG);
    493				emulated = EMULATE_AGAIN;
    494				break;
    495			}
    496
    497			if (!(kvmppc_get_msr(vcpu) & MSR_PR)) {
    498				preempt_disable();
    499				vcpu->arch.regs.ccr = (CR0_TBEGIN_FAILURE |
    500				  (vcpu->arch.regs.ccr & ~(CR0_MASK << CR0_SHIFT)));
    501
    502				vcpu->arch.texasr = (TEXASR_FS | TEXASR_EXACT |
    503					(((u64)(TM_CAUSE_EMULATE | TM_CAUSE_PERSISTENT))
    504						 << TEXASR_FC_LG));
    505
    506				if ((inst >> 21) & 0x1)
    507					vcpu->arch.texasr |= TEXASR_ROT;
    508
    509				if (kvmppc_get_msr(vcpu) & MSR_HV)
    510					vcpu->arch.texasr |= TEXASR_HV;
    511
    512				vcpu->arch.tfhar = kvmppc_get_pc(vcpu) + 4;
    513				vcpu->arch.tfiar = kvmppc_get_pc(vcpu);
    514
    515				kvmppc_restore_tm_sprs(vcpu);
    516				preempt_enable();
    517			} else
    518				emulated = EMULATE_FAIL;
    519			break;
    520		}
    521		case OP_31_XOP_TABORT:
    522		{
    523			ulong guest_msr = kvmppc_get_msr(vcpu);
    524			unsigned long ra_val = 0;
    525
    526			if (!cpu_has_feature(CPU_FTR_TM))
    527				break;
    528
    529			if (!(kvmppc_get_msr(vcpu) & MSR_TM)) {
    530				kvmppc_trigger_fac_interrupt(vcpu, FSCR_TM_LG);
    531				emulated = EMULATE_AGAIN;
    532				break;
    533			}
    534
    535			/* only emulate for privilege guest, since problem state
    536			 * guest can run with TM enabled and we don't expect to
    537			 * trap at here for that case.
    538			 */
    539			WARN_ON(guest_msr & MSR_PR);
    540
    541			if (ra)
    542				ra_val = kvmppc_get_gpr(vcpu, ra);
    543
    544			kvmppc_emulate_tabort(vcpu, ra_val);
    545			break;
    546		}
    547		case OP_31_XOP_TRECLAIM:
    548		{
    549			ulong guest_msr = kvmppc_get_msr(vcpu);
    550			unsigned long ra_val = 0;
    551
    552			if (!cpu_has_feature(CPU_FTR_TM))
    553				break;
    554
    555			if (!(kvmppc_get_msr(vcpu) & MSR_TM)) {
    556				kvmppc_trigger_fac_interrupt(vcpu, FSCR_TM_LG);
    557				emulated = EMULATE_AGAIN;
    558				break;
    559			}
    560
    561			/* generate interrupts based on priorities */
    562			if (guest_msr & MSR_PR) {
    563				/* Privileged Instruction type Program Interrupt */
    564				kvmppc_core_queue_program(vcpu, SRR1_PROGPRIV);
    565				emulated = EMULATE_AGAIN;
    566				break;
    567			}
    568
    569			if (!MSR_TM_ACTIVE(guest_msr)) {
    570				/* TM bad thing interrupt */
    571				kvmppc_core_queue_program(vcpu, SRR1_PROGTM);
    572				emulated = EMULATE_AGAIN;
    573				break;
    574			}
    575
    576			if (ra)
    577				ra_val = kvmppc_get_gpr(vcpu, ra);
    578			kvmppc_emulate_treclaim(vcpu, ra_val);
    579			break;
    580		}
    581		case OP_31_XOP_TRCHKPT:
    582		{
    583			ulong guest_msr = kvmppc_get_msr(vcpu);
    584			unsigned long texasr;
    585
    586			if (!cpu_has_feature(CPU_FTR_TM))
    587				break;
    588
    589			if (!(kvmppc_get_msr(vcpu) & MSR_TM)) {
    590				kvmppc_trigger_fac_interrupt(vcpu, FSCR_TM_LG);
    591				emulated = EMULATE_AGAIN;
    592				break;
    593			}
    594
    595			/* generate interrupt based on priorities */
    596			if (guest_msr & MSR_PR) {
    597				/* Privileged Instruction type Program Intr */
    598				kvmppc_core_queue_program(vcpu, SRR1_PROGPRIV);
    599				emulated = EMULATE_AGAIN;
    600				break;
    601			}
    602
    603			tm_enable();
    604			texasr = mfspr(SPRN_TEXASR);
    605			tm_disable();
    606
    607			if (MSR_TM_ACTIVE(guest_msr) ||
    608				!(texasr & (TEXASR_FS))) {
    609				/* TM bad thing interrupt */
    610				kvmppc_core_queue_program(vcpu, SRR1_PROGTM);
    611				emulated = EMULATE_AGAIN;
    612				break;
    613			}
    614
    615			kvmppc_emulate_trchkpt(vcpu);
    616			break;
    617		}
    618#endif
    619		default:
    620			emulated = EMULATE_FAIL;
    621		}
    622		break;
    623	default:
    624		emulated = EMULATE_FAIL;
    625	}
    626
    627	if (emulated == EMULATE_FAIL)
    628		emulated = kvmppc_emulate_paired_single(vcpu);
    629
    630	return emulated;
    631}
    632
    633void kvmppc_set_bat(struct kvm_vcpu *vcpu, struct kvmppc_bat *bat, bool upper,
    634                    u32 val)
    635{
    636	if (upper) {
    637		/* Upper BAT */
    638		u32 bl = (val >> 2) & 0x7ff;
    639		bat->bepi_mask = (~bl << 17);
    640		bat->bepi = val & 0xfffe0000;
    641		bat->vs = (val & 2) ? 1 : 0;
    642		bat->vp = (val & 1) ? 1 : 0;
    643		bat->raw = (bat->raw & 0xffffffff00000000ULL) | val;
    644	} else {
    645		/* Lower BAT */
    646		bat->brpn = val & 0xfffe0000;
    647		bat->wimg = (val >> 3) & 0xf;
    648		bat->pp = val & 3;
    649		bat->raw = (bat->raw & 0x00000000ffffffffULL) | ((u64)val << 32);
    650	}
    651}
    652
    653static struct kvmppc_bat *kvmppc_find_bat(struct kvm_vcpu *vcpu, int sprn)
    654{
    655	struct kvmppc_vcpu_book3s *vcpu_book3s = to_book3s(vcpu);
    656	struct kvmppc_bat *bat;
    657
    658	switch (sprn) {
    659	case SPRN_IBAT0U ... SPRN_IBAT3L:
    660		bat = &vcpu_book3s->ibat[(sprn - SPRN_IBAT0U) / 2];
    661		break;
    662	case SPRN_IBAT4U ... SPRN_IBAT7L:
    663		bat = &vcpu_book3s->ibat[4 + ((sprn - SPRN_IBAT4U) / 2)];
    664		break;
    665	case SPRN_DBAT0U ... SPRN_DBAT3L:
    666		bat = &vcpu_book3s->dbat[(sprn - SPRN_DBAT0U) / 2];
    667		break;
    668	case SPRN_DBAT4U ... SPRN_DBAT7L:
    669		bat = &vcpu_book3s->dbat[4 + ((sprn - SPRN_DBAT4U) / 2)];
    670		break;
    671	default:
    672		BUG();
    673	}
    674
    675	return bat;
    676}
    677
    678int kvmppc_core_emulate_mtspr_pr(struct kvm_vcpu *vcpu, int sprn, ulong spr_val)
    679{
    680	int emulated = EMULATE_DONE;
    681
    682	switch (sprn) {
    683	case SPRN_SDR1:
    684		if (!spr_allowed(vcpu, PRIV_HYPER))
    685			goto unprivileged;
    686		to_book3s(vcpu)->sdr1 = spr_val;
    687		break;
    688	case SPRN_DSISR:
    689		kvmppc_set_dsisr(vcpu, spr_val);
    690		break;
    691	case SPRN_DAR:
    692		kvmppc_set_dar(vcpu, spr_val);
    693		break;
    694	case SPRN_HIOR:
    695		to_book3s(vcpu)->hior = spr_val;
    696		break;
    697	case SPRN_IBAT0U ... SPRN_IBAT3L:
    698	case SPRN_IBAT4U ... SPRN_IBAT7L:
    699	case SPRN_DBAT0U ... SPRN_DBAT3L:
    700	case SPRN_DBAT4U ... SPRN_DBAT7L:
    701	{
    702		struct kvmppc_bat *bat = kvmppc_find_bat(vcpu, sprn);
    703
    704		kvmppc_set_bat(vcpu, bat, !(sprn % 2), (u32)spr_val);
    705		/* BAT writes happen so rarely that we're ok to flush
    706		 * everything here */
    707		kvmppc_mmu_pte_flush(vcpu, 0, 0);
    708		kvmppc_mmu_flush_segments(vcpu);
    709		break;
    710	}
    711	case SPRN_HID0:
    712		to_book3s(vcpu)->hid[0] = spr_val;
    713		break;
    714	case SPRN_HID1:
    715		to_book3s(vcpu)->hid[1] = spr_val;
    716		break;
    717	case SPRN_HID2:
    718		to_book3s(vcpu)->hid[2] = spr_val;
    719		break;
    720	case SPRN_HID2_GEKKO:
    721		to_book3s(vcpu)->hid[2] = spr_val;
    722		/* HID2.PSE controls paired single on gekko */
    723		switch (vcpu->arch.pvr) {
    724		case 0x00080200:	/* lonestar 2.0 */
    725		case 0x00088202:	/* lonestar 2.2 */
    726		case 0x70000100:	/* gekko 1.0 */
    727		case 0x00080100:	/* gekko 2.0 */
    728		case 0x00083203:	/* gekko 2.3a */
    729		case 0x00083213:	/* gekko 2.3b */
    730		case 0x00083204:	/* gekko 2.4 */
    731		case 0x00083214:	/* gekko 2.4e (8SE) - retail HW2 */
    732		case 0x00087200:	/* broadway */
    733			if (vcpu->arch.hflags & BOOK3S_HFLAG_NATIVE_PS) {
    734				/* Native paired singles */
    735			} else if (spr_val & (1 << 29)) { /* HID2.PSE */
    736				vcpu->arch.hflags |= BOOK3S_HFLAG_PAIRED_SINGLE;
    737				kvmppc_giveup_ext(vcpu, MSR_FP);
    738			} else {
    739				vcpu->arch.hflags &= ~BOOK3S_HFLAG_PAIRED_SINGLE;
    740			}
    741			break;
    742		}
    743		break;
    744	case SPRN_HID4:
    745	case SPRN_HID4_GEKKO:
    746		to_book3s(vcpu)->hid[4] = spr_val;
    747		break;
    748	case SPRN_HID5:
    749		to_book3s(vcpu)->hid[5] = spr_val;
    750		/* guest HID5 set can change is_dcbz32 */
    751		if (vcpu->arch.mmu.is_dcbz32(vcpu) &&
    752		    (mfmsr() & MSR_HV))
    753			vcpu->arch.hflags |= BOOK3S_HFLAG_DCBZ32;
    754		break;
    755	case SPRN_GQR0:
    756	case SPRN_GQR1:
    757	case SPRN_GQR2:
    758	case SPRN_GQR3:
    759	case SPRN_GQR4:
    760	case SPRN_GQR5:
    761	case SPRN_GQR6:
    762	case SPRN_GQR7:
    763		to_book3s(vcpu)->gqr[sprn - SPRN_GQR0] = spr_val;
    764		break;
    765#ifdef CONFIG_PPC_BOOK3S_64
    766	case SPRN_FSCR:
    767		kvmppc_set_fscr(vcpu, spr_val);
    768		break;
    769	case SPRN_BESCR:
    770		vcpu->arch.bescr = spr_val;
    771		break;
    772	case SPRN_EBBHR:
    773		vcpu->arch.ebbhr = spr_val;
    774		break;
    775	case SPRN_EBBRR:
    776		vcpu->arch.ebbrr = spr_val;
    777		break;
    778#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
    779	case SPRN_TFHAR:
    780	case SPRN_TEXASR:
    781	case SPRN_TFIAR:
    782		if (!cpu_has_feature(CPU_FTR_TM))
    783			break;
    784
    785		if (!(kvmppc_get_msr(vcpu) & MSR_TM)) {
    786			kvmppc_trigger_fac_interrupt(vcpu, FSCR_TM_LG);
    787			emulated = EMULATE_AGAIN;
    788			break;
    789		}
    790
    791		if (MSR_TM_ACTIVE(kvmppc_get_msr(vcpu)) &&
    792			!((MSR_TM_SUSPENDED(kvmppc_get_msr(vcpu))) &&
    793					(sprn == SPRN_TFHAR))) {
    794			/* it is illegal to mtspr() TM regs in
    795			 * other than non-transactional state, with
    796			 * the exception of TFHAR in suspend state.
    797			 */
    798			kvmppc_core_queue_program(vcpu, SRR1_PROGTM);
    799			emulated = EMULATE_AGAIN;
    800			break;
    801		}
    802
    803		tm_enable();
    804		if (sprn == SPRN_TFHAR)
    805			mtspr(SPRN_TFHAR, spr_val);
    806		else if (sprn == SPRN_TEXASR)
    807			mtspr(SPRN_TEXASR, spr_val);
    808		else
    809			mtspr(SPRN_TFIAR, spr_val);
    810		tm_disable();
    811
    812		break;
    813#endif
    814#endif
    815	case SPRN_ICTC:
    816	case SPRN_THRM1:
    817	case SPRN_THRM2:
    818	case SPRN_THRM3:
    819	case SPRN_CTRLF:
    820	case SPRN_CTRLT:
    821	case SPRN_L2CR:
    822	case SPRN_DSCR:
    823	case SPRN_MMCR0_GEKKO:
    824	case SPRN_MMCR1_GEKKO:
    825	case SPRN_PMC1_GEKKO:
    826	case SPRN_PMC2_GEKKO:
    827	case SPRN_PMC3_GEKKO:
    828	case SPRN_PMC4_GEKKO:
    829	case SPRN_WPAR_GEKKO:
    830	case SPRN_MSSSR0:
    831	case SPRN_DABR:
    832#ifdef CONFIG_PPC_BOOK3S_64
    833	case SPRN_MMCRS:
    834	case SPRN_MMCRA:
    835	case SPRN_MMCR0:
    836	case SPRN_MMCR1:
    837	case SPRN_MMCR2:
    838	case SPRN_UMMCR2:
    839	case SPRN_UAMOR:
    840	case SPRN_IAMR:
    841	case SPRN_AMR:
    842#endif
    843		break;
    844unprivileged:
    845	default:
    846		pr_info_ratelimited("KVM: invalid SPR write: %d\n", sprn);
    847		if (sprn & 0x10) {
    848			if (kvmppc_get_msr(vcpu) & MSR_PR) {
    849				kvmppc_core_queue_program(vcpu, SRR1_PROGPRIV);
    850				emulated = EMULATE_AGAIN;
    851			}
    852		} else {
    853			if ((kvmppc_get_msr(vcpu) & MSR_PR) || sprn == 0) {
    854				kvmppc_core_queue_program(vcpu, SRR1_PROGILL);
    855				emulated = EMULATE_AGAIN;
    856			}
    857		}
    858		break;
    859	}
    860
    861	return emulated;
    862}
    863
    864int kvmppc_core_emulate_mfspr_pr(struct kvm_vcpu *vcpu, int sprn, ulong *spr_val)
    865{
    866	int emulated = EMULATE_DONE;
    867
    868	switch (sprn) {
    869	case SPRN_IBAT0U ... SPRN_IBAT3L:
    870	case SPRN_IBAT4U ... SPRN_IBAT7L:
    871	case SPRN_DBAT0U ... SPRN_DBAT3L:
    872	case SPRN_DBAT4U ... SPRN_DBAT7L:
    873	{
    874		struct kvmppc_bat *bat = kvmppc_find_bat(vcpu, sprn);
    875
    876		if (sprn % 2)
    877			*spr_val = bat->raw >> 32;
    878		else
    879			*spr_val = bat->raw;
    880
    881		break;
    882	}
    883	case SPRN_SDR1:
    884		if (!spr_allowed(vcpu, PRIV_HYPER))
    885			goto unprivileged;
    886		*spr_val = to_book3s(vcpu)->sdr1;
    887		break;
    888	case SPRN_DSISR:
    889		*spr_val = kvmppc_get_dsisr(vcpu);
    890		break;
    891	case SPRN_DAR:
    892		*spr_val = kvmppc_get_dar(vcpu);
    893		break;
    894	case SPRN_HIOR:
    895		*spr_val = to_book3s(vcpu)->hior;
    896		break;
    897	case SPRN_HID0:
    898		*spr_val = to_book3s(vcpu)->hid[0];
    899		break;
    900	case SPRN_HID1:
    901		*spr_val = to_book3s(vcpu)->hid[1];
    902		break;
    903	case SPRN_HID2:
    904	case SPRN_HID2_GEKKO:
    905		*spr_val = to_book3s(vcpu)->hid[2];
    906		break;
    907	case SPRN_HID4:
    908	case SPRN_HID4_GEKKO:
    909		*spr_val = to_book3s(vcpu)->hid[4];
    910		break;
    911	case SPRN_HID5:
    912		*spr_val = to_book3s(vcpu)->hid[5];
    913		break;
    914	case SPRN_CFAR:
    915	case SPRN_DSCR:
    916		*spr_val = 0;
    917		break;
    918	case SPRN_PURR:
    919		/*
    920		 * On exit we would have updated purr
    921		 */
    922		*spr_val = vcpu->arch.purr;
    923		break;
    924	case SPRN_SPURR:
    925		/*
    926		 * On exit we would have updated spurr
    927		 */
    928		*spr_val = vcpu->arch.spurr;
    929		break;
    930	case SPRN_VTB:
    931		*spr_val = to_book3s(vcpu)->vtb;
    932		break;
    933	case SPRN_IC:
    934		*spr_val = vcpu->arch.ic;
    935		break;
    936	case SPRN_GQR0:
    937	case SPRN_GQR1:
    938	case SPRN_GQR2:
    939	case SPRN_GQR3:
    940	case SPRN_GQR4:
    941	case SPRN_GQR5:
    942	case SPRN_GQR6:
    943	case SPRN_GQR7:
    944		*spr_val = to_book3s(vcpu)->gqr[sprn - SPRN_GQR0];
    945		break;
    946#ifdef CONFIG_PPC_BOOK3S_64
    947	case SPRN_FSCR:
    948		*spr_val = vcpu->arch.fscr;
    949		break;
    950	case SPRN_BESCR:
    951		*spr_val = vcpu->arch.bescr;
    952		break;
    953	case SPRN_EBBHR:
    954		*spr_val = vcpu->arch.ebbhr;
    955		break;
    956	case SPRN_EBBRR:
    957		*spr_val = vcpu->arch.ebbrr;
    958		break;
    959#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
    960	case SPRN_TFHAR:
    961	case SPRN_TEXASR:
    962	case SPRN_TFIAR:
    963		if (!cpu_has_feature(CPU_FTR_TM))
    964			break;
    965
    966		if (!(kvmppc_get_msr(vcpu) & MSR_TM)) {
    967			kvmppc_trigger_fac_interrupt(vcpu, FSCR_TM_LG);
    968			emulated = EMULATE_AGAIN;
    969			break;
    970		}
    971
    972		tm_enable();
    973		if (sprn == SPRN_TFHAR)
    974			*spr_val = mfspr(SPRN_TFHAR);
    975		else if (sprn == SPRN_TEXASR)
    976			*spr_val = mfspr(SPRN_TEXASR);
    977		else if (sprn == SPRN_TFIAR)
    978			*spr_val = mfspr(SPRN_TFIAR);
    979		tm_disable();
    980		break;
    981#endif
    982#endif
    983	case SPRN_THRM1:
    984	case SPRN_THRM2:
    985	case SPRN_THRM3:
    986	case SPRN_CTRLF:
    987	case SPRN_CTRLT:
    988	case SPRN_L2CR:
    989	case SPRN_MMCR0_GEKKO:
    990	case SPRN_MMCR1_GEKKO:
    991	case SPRN_PMC1_GEKKO:
    992	case SPRN_PMC2_GEKKO:
    993	case SPRN_PMC3_GEKKO:
    994	case SPRN_PMC4_GEKKO:
    995	case SPRN_WPAR_GEKKO:
    996	case SPRN_MSSSR0:
    997	case SPRN_DABR:
    998#ifdef CONFIG_PPC_BOOK3S_64
    999	case SPRN_MMCRS:
   1000	case SPRN_MMCRA:
   1001	case SPRN_MMCR0:
   1002	case SPRN_MMCR1:
   1003	case SPRN_MMCR2:
   1004	case SPRN_UMMCR2:
   1005	case SPRN_TIR:
   1006	case SPRN_UAMOR:
   1007	case SPRN_IAMR:
   1008	case SPRN_AMR:
   1009#endif
   1010		*spr_val = 0;
   1011		break;
   1012	default:
   1013unprivileged:
   1014		pr_info_ratelimited("KVM: invalid SPR read: %d\n", sprn);
   1015		if (sprn & 0x10) {
   1016			if (kvmppc_get_msr(vcpu) & MSR_PR) {
   1017				kvmppc_core_queue_program(vcpu, SRR1_PROGPRIV);
   1018				emulated = EMULATE_AGAIN;
   1019			}
   1020		} else {
   1021			if ((kvmppc_get_msr(vcpu) & MSR_PR) || sprn == 0 ||
   1022			    sprn == 4 || sprn == 5 || sprn == 6) {
   1023				kvmppc_core_queue_program(vcpu, SRR1_PROGILL);
   1024				emulated = EMULATE_AGAIN;
   1025			}
   1026		}
   1027
   1028		break;
   1029	}
   1030
   1031	return emulated;
   1032}
   1033
   1034u32 kvmppc_alignment_dsisr(struct kvm_vcpu *vcpu, unsigned int inst)
   1035{
   1036	return make_dsisr(inst);
   1037}
   1038
   1039ulong kvmppc_alignment_dar(struct kvm_vcpu *vcpu, unsigned int inst)
   1040{
   1041#ifdef CONFIG_PPC_BOOK3S_64
   1042	/*
   1043	 * Linux's fix_alignment() assumes that DAR is valid, so can we
   1044	 */
   1045	return vcpu->arch.fault_dar;
   1046#else
   1047	ulong dar = 0;
   1048	ulong ra = get_ra(inst);
   1049	ulong rb = get_rb(inst);
   1050
   1051	switch (get_op(inst)) {
   1052	case OP_LFS:
   1053	case OP_LFD:
   1054	case OP_STFD:
   1055	case OP_STFS:
   1056		if (ra)
   1057			dar = kvmppc_get_gpr(vcpu, ra);
   1058		dar += (s32)((s16)inst);
   1059		break;
   1060	case 31:
   1061		if (ra)
   1062			dar = kvmppc_get_gpr(vcpu, ra);
   1063		dar += kvmppc_get_gpr(vcpu, rb);
   1064		break;
   1065	default:
   1066		printk(KERN_INFO "KVM: Unaligned instruction 0x%x\n", inst);
   1067		break;
   1068	}
   1069
   1070	return dar;
   1071#endif
   1072}