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

booke_emulate.c (11297B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 *
      4 * Copyright IBM Corp. 2008
      5 * Copyright 2011 Freescale Semiconductor, Inc.
      6 *
      7 * Authors: Hollis Blanchard <hollisb@us.ibm.com>
      8 */
      9
     10#include <linux/kvm_host.h>
     11#include <asm/disassemble.h>
     12
     13#include "booke.h"
     14
     15#define OP_19_XOP_RFI     50
     16#define OP_19_XOP_RFCI    51
     17#define OP_19_XOP_RFDI    39
     18
     19#define OP_31_XOP_MFMSR   83
     20#define OP_31_XOP_WRTEE   131
     21#define OP_31_XOP_MTMSR   146
     22#define OP_31_XOP_WRTEEI  163
     23
     24static void kvmppc_emul_rfi(struct kvm_vcpu *vcpu)
     25{
     26	vcpu->arch.regs.nip = vcpu->arch.shared->srr0;
     27	kvmppc_set_msr(vcpu, vcpu->arch.shared->srr1);
     28}
     29
     30static void kvmppc_emul_rfdi(struct kvm_vcpu *vcpu)
     31{
     32	vcpu->arch.regs.nip = vcpu->arch.dsrr0;
     33	kvmppc_set_msr(vcpu, vcpu->arch.dsrr1);
     34}
     35
     36static void kvmppc_emul_rfci(struct kvm_vcpu *vcpu)
     37{
     38	vcpu->arch.regs.nip = vcpu->arch.csrr0;
     39	kvmppc_set_msr(vcpu, vcpu->arch.csrr1);
     40}
     41
     42int kvmppc_booke_emulate_op(struct kvm_vcpu *vcpu,
     43                            unsigned int inst, int *advance)
     44{
     45	int emulated = EMULATE_DONE;
     46	int rs = get_rs(inst);
     47	int rt = get_rt(inst);
     48
     49	switch (get_op(inst)) {
     50	case 19:
     51		switch (get_xop(inst)) {
     52		case OP_19_XOP_RFI:
     53			kvmppc_emul_rfi(vcpu);
     54			kvmppc_set_exit_type(vcpu, EMULATED_RFI_EXITS);
     55			*advance = 0;
     56			break;
     57
     58		case OP_19_XOP_RFCI:
     59			kvmppc_emul_rfci(vcpu);
     60			kvmppc_set_exit_type(vcpu, EMULATED_RFCI_EXITS);
     61			*advance = 0;
     62			break;
     63
     64		case OP_19_XOP_RFDI:
     65			kvmppc_emul_rfdi(vcpu);
     66			kvmppc_set_exit_type(vcpu, EMULATED_RFDI_EXITS);
     67			*advance = 0;
     68			break;
     69
     70		default:
     71			emulated = EMULATE_FAIL;
     72			break;
     73		}
     74		break;
     75
     76	case 31:
     77		switch (get_xop(inst)) {
     78
     79		case OP_31_XOP_MFMSR:
     80			kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->msr);
     81			kvmppc_set_exit_type(vcpu, EMULATED_MFMSR_EXITS);
     82			break;
     83
     84		case OP_31_XOP_MTMSR:
     85			kvmppc_set_exit_type(vcpu, EMULATED_MTMSR_EXITS);
     86			kvmppc_set_msr(vcpu, kvmppc_get_gpr(vcpu, rs));
     87			break;
     88
     89		case OP_31_XOP_WRTEE:
     90			vcpu->arch.shared->msr = (vcpu->arch.shared->msr & ~MSR_EE)
     91					| (kvmppc_get_gpr(vcpu, rs) & MSR_EE);
     92			kvmppc_set_exit_type(vcpu, EMULATED_WRTEE_EXITS);
     93			break;
     94
     95		case OP_31_XOP_WRTEEI:
     96			vcpu->arch.shared->msr = (vcpu->arch.shared->msr & ~MSR_EE)
     97							 | (inst & MSR_EE);
     98			kvmppc_set_exit_type(vcpu, EMULATED_WRTEE_EXITS);
     99			break;
    100
    101		default:
    102			emulated = EMULATE_FAIL;
    103		}
    104
    105		break;
    106
    107	default:
    108		emulated = EMULATE_FAIL;
    109	}
    110
    111	return emulated;
    112}
    113
    114/*
    115 * NOTE: some of these registers are not emulated on BOOKE_HV (GS-mode).
    116 * Their backing store is in real registers, and these functions
    117 * will return the wrong result if called for them in another context
    118 * (such as debugging).
    119 */
    120int kvmppc_booke_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, ulong spr_val)
    121{
    122	int emulated = EMULATE_DONE;
    123	bool debug_inst = false;
    124
    125	switch (sprn) {
    126	case SPRN_DEAR:
    127		vcpu->arch.shared->dar = spr_val;
    128		break;
    129	case SPRN_ESR:
    130		vcpu->arch.shared->esr = spr_val;
    131		break;
    132	case SPRN_CSRR0:
    133		vcpu->arch.csrr0 = spr_val;
    134		break;
    135	case SPRN_CSRR1:
    136		vcpu->arch.csrr1 = spr_val;
    137		break;
    138	case SPRN_DSRR0:
    139		vcpu->arch.dsrr0 = spr_val;
    140		break;
    141	case SPRN_DSRR1:
    142		vcpu->arch.dsrr1 = spr_val;
    143		break;
    144	case SPRN_IAC1:
    145		/*
    146		 * If userspace is debugging guest then guest
    147		 * can not access debug registers.
    148		 */
    149		if (vcpu->guest_debug)
    150			break;
    151
    152		debug_inst = true;
    153		vcpu->arch.dbg_reg.iac1 = spr_val;
    154		break;
    155	case SPRN_IAC2:
    156		/*
    157		 * If userspace is debugging guest then guest
    158		 * can not access debug registers.
    159		 */
    160		if (vcpu->guest_debug)
    161			break;
    162
    163		debug_inst = true;
    164		vcpu->arch.dbg_reg.iac2 = spr_val;
    165		break;
    166#if CONFIG_PPC_ADV_DEBUG_IACS > 2
    167	case SPRN_IAC3:
    168		/*
    169		 * If userspace is debugging guest then guest
    170		 * can not access debug registers.
    171		 */
    172		if (vcpu->guest_debug)
    173			break;
    174
    175		debug_inst = true;
    176		vcpu->arch.dbg_reg.iac3 = spr_val;
    177		break;
    178	case SPRN_IAC4:
    179		/*
    180		 * If userspace is debugging guest then guest
    181		 * can not access debug registers.
    182		 */
    183		if (vcpu->guest_debug)
    184			break;
    185
    186		debug_inst = true;
    187		vcpu->arch.dbg_reg.iac4 = spr_val;
    188		break;
    189#endif
    190	case SPRN_DAC1:
    191		/*
    192		 * If userspace is debugging guest then guest
    193		 * can not access debug registers.
    194		 */
    195		if (vcpu->guest_debug)
    196			break;
    197
    198		debug_inst = true;
    199		vcpu->arch.dbg_reg.dac1 = spr_val;
    200		break;
    201	case SPRN_DAC2:
    202		/*
    203		 * If userspace is debugging guest then guest
    204		 * can not access debug registers.
    205		 */
    206		if (vcpu->guest_debug)
    207			break;
    208
    209		debug_inst = true;
    210		vcpu->arch.dbg_reg.dac2 = spr_val;
    211		break;
    212	case SPRN_DBCR0:
    213		/*
    214		 * If userspace is debugging guest then guest
    215		 * can not access debug registers.
    216		 */
    217		if (vcpu->guest_debug)
    218			break;
    219
    220		debug_inst = true;
    221		spr_val &= (DBCR0_IDM | DBCR0_IC | DBCR0_BT | DBCR0_TIE |
    222			DBCR0_IAC1 | DBCR0_IAC2 | DBCR0_IAC3 | DBCR0_IAC4  |
    223			DBCR0_DAC1R | DBCR0_DAC1W | DBCR0_DAC2R | DBCR0_DAC2W);
    224
    225		vcpu->arch.dbg_reg.dbcr0 = spr_val;
    226		break;
    227	case SPRN_DBCR1:
    228		/*
    229		 * If userspace is debugging guest then guest
    230		 * can not access debug registers.
    231		 */
    232		if (vcpu->guest_debug)
    233			break;
    234
    235		debug_inst = true;
    236		vcpu->arch.dbg_reg.dbcr1 = spr_val;
    237		break;
    238	case SPRN_DBCR2:
    239		/*
    240		 * If userspace is debugging guest then guest
    241		 * can not access debug registers.
    242		 */
    243		if (vcpu->guest_debug)
    244			break;
    245
    246		debug_inst = true;
    247		vcpu->arch.dbg_reg.dbcr2 = spr_val;
    248		break;
    249	case SPRN_DBSR:
    250		/*
    251		 * If userspace is debugging guest then guest
    252		 * can not access debug registers.
    253		 */
    254		if (vcpu->guest_debug)
    255			break;
    256
    257		vcpu->arch.dbsr &= ~spr_val;
    258		if (!(vcpu->arch.dbsr & ~DBSR_IDE))
    259			kvmppc_core_dequeue_debug(vcpu);
    260		break;
    261	case SPRN_TSR:
    262		kvmppc_clr_tsr_bits(vcpu, spr_val);
    263		break;
    264	case SPRN_TCR:
    265		/*
    266		 * WRC is a 2-bit field that is supposed to preserve its
    267		 * value once written to non-zero.
    268		 */
    269		if (vcpu->arch.tcr & TCR_WRC_MASK) {
    270			spr_val &= ~TCR_WRC_MASK;
    271			spr_val |= vcpu->arch.tcr & TCR_WRC_MASK;
    272		}
    273		kvmppc_set_tcr(vcpu, spr_val);
    274		break;
    275
    276	case SPRN_DECAR:
    277		vcpu->arch.decar = spr_val;
    278		break;
    279	/*
    280	 * Note: SPRG4-7 are user-readable.
    281	 * These values are loaded into the real SPRGs when resuming the
    282	 * guest (PR-mode only).
    283	 */
    284	case SPRN_SPRG4:
    285		kvmppc_set_sprg4(vcpu, spr_val);
    286		break;
    287	case SPRN_SPRG5:
    288		kvmppc_set_sprg5(vcpu, spr_val);
    289		break;
    290	case SPRN_SPRG6:
    291		kvmppc_set_sprg6(vcpu, spr_val);
    292		break;
    293	case SPRN_SPRG7:
    294		kvmppc_set_sprg7(vcpu, spr_val);
    295		break;
    296
    297	case SPRN_IVPR:
    298		vcpu->arch.ivpr = spr_val;
    299#ifdef CONFIG_KVM_BOOKE_HV
    300		mtspr(SPRN_GIVPR, spr_val);
    301#endif
    302		break;
    303	case SPRN_IVOR0:
    304		vcpu->arch.ivor[BOOKE_IRQPRIO_CRITICAL] = spr_val;
    305		break;
    306	case SPRN_IVOR1:
    307		vcpu->arch.ivor[BOOKE_IRQPRIO_MACHINE_CHECK] = spr_val;
    308		break;
    309	case SPRN_IVOR2:
    310		vcpu->arch.ivor[BOOKE_IRQPRIO_DATA_STORAGE] = spr_val;
    311#ifdef CONFIG_KVM_BOOKE_HV
    312		mtspr(SPRN_GIVOR2, spr_val);
    313#endif
    314		break;
    315	case SPRN_IVOR3:
    316		vcpu->arch.ivor[BOOKE_IRQPRIO_INST_STORAGE] = spr_val;
    317		break;
    318	case SPRN_IVOR4:
    319		vcpu->arch.ivor[BOOKE_IRQPRIO_EXTERNAL] = spr_val;
    320		break;
    321	case SPRN_IVOR5:
    322		vcpu->arch.ivor[BOOKE_IRQPRIO_ALIGNMENT] = spr_val;
    323		break;
    324	case SPRN_IVOR6:
    325		vcpu->arch.ivor[BOOKE_IRQPRIO_PROGRAM] = spr_val;
    326		break;
    327	case SPRN_IVOR7:
    328		vcpu->arch.ivor[BOOKE_IRQPRIO_FP_UNAVAIL] = spr_val;
    329		break;
    330	case SPRN_IVOR8:
    331		vcpu->arch.ivor[BOOKE_IRQPRIO_SYSCALL] = spr_val;
    332#ifdef CONFIG_KVM_BOOKE_HV
    333		mtspr(SPRN_GIVOR8, spr_val);
    334#endif
    335		break;
    336	case SPRN_IVOR9:
    337		vcpu->arch.ivor[BOOKE_IRQPRIO_AP_UNAVAIL] = spr_val;
    338		break;
    339	case SPRN_IVOR10:
    340		vcpu->arch.ivor[BOOKE_IRQPRIO_DECREMENTER] = spr_val;
    341		break;
    342	case SPRN_IVOR11:
    343		vcpu->arch.ivor[BOOKE_IRQPRIO_FIT] = spr_val;
    344		break;
    345	case SPRN_IVOR12:
    346		vcpu->arch.ivor[BOOKE_IRQPRIO_WATCHDOG] = spr_val;
    347		break;
    348	case SPRN_IVOR13:
    349		vcpu->arch.ivor[BOOKE_IRQPRIO_DTLB_MISS] = spr_val;
    350		break;
    351	case SPRN_IVOR14:
    352		vcpu->arch.ivor[BOOKE_IRQPRIO_ITLB_MISS] = spr_val;
    353		break;
    354	case SPRN_IVOR15:
    355		vcpu->arch.ivor[BOOKE_IRQPRIO_DEBUG] = spr_val;
    356		break;
    357	case SPRN_MCSR:
    358		vcpu->arch.mcsr &= ~spr_val;
    359		break;
    360#if defined(CONFIG_64BIT)
    361	case SPRN_EPCR:
    362		kvmppc_set_epcr(vcpu, spr_val);
    363#ifdef CONFIG_KVM_BOOKE_HV
    364		mtspr(SPRN_EPCR, vcpu->arch.shadow_epcr);
    365#endif
    366		break;
    367#endif
    368	default:
    369		emulated = EMULATE_FAIL;
    370	}
    371
    372	if (debug_inst) {
    373		current->thread.debug = vcpu->arch.dbg_reg;
    374		switch_booke_debug_regs(&vcpu->arch.dbg_reg);
    375	}
    376	return emulated;
    377}
    378
    379int kvmppc_booke_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, ulong *spr_val)
    380{
    381	int emulated = EMULATE_DONE;
    382
    383	switch (sprn) {
    384	case SPRN_IVPR:
    385		*spr_val = vcpu->arch.ivpr;
    386		break;
    387	case SPRN_DEAR:
    388		*spr_val = vcpu->arch.shared->dar;
    389		break;
    390	case SPRN_ESR:
    391		*spr_val = vcpu->arch.shared->esr;
    392		break;
    393	case SPRN_EPR:
    394		*spr_val = vcpu->arch.epr;
    395		break;
    396	case SPRN_CSRR0:
    397		*spr_val = vcpu->arch.csrr0;
    398		break;
    399	case SPRN_CSRR1:
    400		*spr_val = vcpu->arch.csrr1;
    401		break;
    402	case SPRN_DSRR0:
    403		*spr_val = vcpu->arch.dsrr0;
    404		break;
    405	case SPRN_DSRR1:
    406		*spr_val = vcpu->arch.dsrr1;
    407		break;
    408	case SPRN_IAC1:
    409		*spr_val = vcpu->arch.dbg_reg.iac1;
    410		break;
    411	case SPRN_IAC2:
    412		*spr_val = vcpu->arch.dbg_reg.iac2;
    413		break;
    414#if CONFIG_PPC_ADV_DEBUG_IACS > 2
    415	case SPRN_IAC3:
    416		*spr_val = vcpu->arch.dbg_reg.iac3;
    417		break;
    418	case SPRN_IAC4:
    419		*spr_val = vcpu->arch.dbg_reg.iac4;
    420		break;
    421#endif
    422	case SPRN_DAC1:
    423		*spr_val = vcpu->arch.dbg_reg.dac1;
    424		break;
    425	case SPRN_DAC2:
    426		*spr_val = vcpu->arch.dbg_reg.dac2;
    427		break;
    428	case SPRN_DBCR0:
    429		*spr_val = vcpu->arch.dbg_reg.dbcr0;
    430		if (vcpu->guest_debug)
    431			*spr_val = *spr_val | DBCR0_EDM;
    432		break;
    433	case SPRN_DBCR1:
    434		*spr_val = vcpu->arch.dbg_reg.dbcr1;
    435		break;
    436	case SPRN_DBCR2:
    437		*spr_val = vcpu->arch.dbg_reg.dbcr2;
    438		break;
    439	case SPRN_DBSR:
    440		*spr_val = vcpu->arch.dbsr;
    441		break;
    442	case SPRN_TSR:
    443		*spr_val = vcpu->arch.tsr;
    444		break;
    445	case SPRN_TCR:
    446		*spr_val = vcpu->arch.tcr;
    447		break;
    448
    449	case SPRN_IVOR0:
    450		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_CRITICAL];
    451		break;
    452	case SPRN_IVOR1:
    453		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_MACHINE_CHECK];
    454		break;
    455	case SPRN_IVOR2:
    456		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_DATA_STORAGE];
    457		break;
    458	case SPRN_IVOR3:
    459		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_INST_STORAGE];
    460		break;
    461	case SPRN_IVOR4:
    462		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_EXTERNAL];
    463		break;
    464	case SPRN_IVOR5:
    465		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_ALIGNMENT];
    466		break;
    467	case SPRN_IVOR6:
    468		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_PROGRAM];
    469		break;
    470	case SPRN_IVOR7:
    471		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_FP_UNAVAIL];
    472		break;
    473	case SPRN_IVOR8:
    474		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_SYSCALL];
    475		break;
    476	case SPRN_IVOR9:
    477		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_AP_UNAVAIL];
    478		break;
    479	case SPRN_IVOR10:
    480		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_DECREMENTER];
    481		break;
    482	case SPRN_IVOR11:
    483		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_FIT];
    484		break;
    485	case SPRN_IVOR12:
    486		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_WATCHDOG];
    487		break;
    488	case SPRN_IVOR13:
    489		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_DTLB_MISS];
    490		break;
    491	case SPRN_IVOR14:
    492		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_ITLB_MISS];
    493		break;
    494	case SPRN_IVOR15:
    495		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_DEBUG];
    496		break;
    497	case SPRN_MCSR:
    498		*spr_val = vcpu->arch.mcsr;
    499		break;
    500#if defined(CONFIG_64BIT)
    501	case SPRN_EPCR:
    502		*spr_val = vcpu->arch.epcr;
    503		break;
    504#endif
    505
    506	default:
    507		emulated = EMULATE_FAIL;
    508	}
    509
    510	return emulated;
    511}