xref: /openbmc/linux/arch/powerpc/kvm/booke_emulate.c (revision 275876e2)
1 /*
2  * This program is free software; you can redistribute it and/or modify
3  * it under the terms of the GNU General Public License, version 2, as
4  * published by the Free Software Foundation.
5  *
6  * This program is distributed in the hope that it will be useful,
7  * but WITHOUT ANY WARRANTY; without even the implied warranty of
8  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
9  * GNU General Public License for more details.
10  *
11  * You should have received a copy of the GNU General Public License
12  * along with this program; if not, write to the Free Software
13  * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
14  *
15  * Copyright IBM Corp. 2008
16  * Copyright 2011 Freescale Semiconductor, Inc.
17  *
18  * Authors: Hollis Blanchard <hollisb@us.ibm.com>
19  */
20 
21 #include <linux/kvm_host.h>
22 #include <asm/disassemble.h>
23 
24 #include "booke.h"
25 
26 #define OP_19_XOP_RFI     50
27 #define OP_19_XOP_RFCI    51
28 
29 #define OP_31_XOP_MFMSR   83
30 #define OP_31_XOP_WRTEE   131
31 #define OP_31_XOP_MTMSR   146
32 #define OP_31_XOP_WRTEEI  163
33 
34 static void kvmppc_emul_rfi(struct kvm_vcpu *vcpu)
35 {
36 	vcpu->arch.pc = vcpu->arch.shared->srr0;
37 	kvmppc_set_msr(vcpu, vcpu->arch.shared->srr1);
38 }
39 
40 static void kvmppc_emul_rfci(struct kvm_vcpu *vcpu)
41 {
42 	vcpu->arch.pc = vcpu->arch.csrr0;
43 	kvmppc_set_msr(vcpu, vcpu->arch.csrr1);
44 }
45 
46 int kvmppc_booke_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
47                             unsigned int inst, int *advance)
48 {
49 	int emulated = EMULATE_DONE;
50 	int rs = get_rs(inst);
51 	int rt = get_rt(inst);
52 
53 	switch (get_op(inst)) {
54 	case 19:
55 		switch (get_xop(inst)) {
56 		case OP_19_XOP_RFI:
57 			kvmppc_emul_rfi(vcpu);
58 			kvmppc_set_exit_type(vcpu, EMULATED_RFI_EXITS);
59 			*advance = 0;
60 			break;
61 
62 		case OP_19_XOP_RFCI:
63 			kvmppc_emul_rfci(vcpu);
64 			kvmppc_set_exit_type(vcpu, EMULATED_RFCI_EXITS);
65 			*advance = 0;
66 			break;
67 
68 		default:
69 			emulated = EMULATE_FAIL;
70 			break;
71 		}
72 		break;
73 
74 	case 31:
75 		switch (get_xop(inst)) {
76 
77 		case OP_31_XOP_MFMSR:
78 			kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->msr);
79 			kvmppc_set_exit_type(vcpu, EMULATED_MFMSR_EXITS);
80 			break;
81 
82 		case OP_31_XOP_MTMSR:
83 			kvmppc_set_exit_type(vcpu, EMULATED_MTMSR_EXITS);
84 			kvmppc_set_msr(vcpu, kvmppc_get_gpr(vcpu, rs));
85 			break;
86 
87 		case OP_31_XOP_WRTEE:
88 			vcpu->arch.shared->msr = (vcpu->arch.shared->msr & ~MSR_EE)
89 					| (kvmppc_get_gpr(vcpu, rs) & MSR_EE);
90 			kvmppc_set_exit_type(vcpu, EMULATED_WRTEE_EXITS);
91 			break;
92 
93 		case OP_31_XOP_WRTEEI:
94 			vcpu->arch.shared->msr = (vcpu->arch.shared->msr & ~MSR_EE)
95 							 | (inst & MSR_EE);
96 			kvmppc_set_exit_type(vcpu, EMULATED_WRTEE_EXITS);
97 			break;
98 
99 		default:
100 			emulated = EMULATE_FAIL;
101 		}
102 
103 		break;
104 
105 	default:
106 		emulated = EMULATE_FAIL;
107 	}
108 
109 	return emulated;
110 }
111 
112 /*
113  * NOTE: some of these registers are not emulated on BOOKE_HV (GS-mode).
114  * Their backing store is in real registers, and these functions
115  * will return the wrong result if called for them in another context
116  * (such as debugging).
117  */
118 int kvmppc_booke_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, ulong spr_val)
119 {
120 	int emulated = EMULATE_DONE;
121 
122 	switch (sprn) {
123 	case SPRN_DEAR:
124 		vcpu->arch.shared->dar = spr_val;
125 		break;
126 	case SPRN_ESR:
127 		vcpu->arch.shared->esr = spr_val;
128 		break;
129 	case SPRN_CSRR0:
130 		vcpu->arch.csrr0 = spr_val;
131 		break;
132 	case SPRN_CSRR1:
133 		vcpu->arch.csrr1 = spr_val;
134 		break;
135 	case SPRN_DBCR0:
136 		vcpu->arch.dbg_reg.dbcr0 = spr_val;
137 		break;
138 	case SPRN_DBCR1:
139 		vcpu->arch.dbg_reg.dbcr1 = spr_val;
140 		break;
141 	case SPRN_DBSR:
142 		vcpu->arch.dbsr &= ~spr_val;
143 		break;
144 	case SPRN_TSR:
145 		kvmppc_clr_tsr_bits(vcpu, spr_val);
146 		break;
147 	case SPRN_TCR:
148 		/*
149 		 * WRC is a 2-bit field that is supposed to preserve its
150 		 * value once written to non-zero.
151 		 */
152 		if (vcpu->arch.tcr & TCR_WRC_MASK) {
153 			spr_val &= ~TCR_WRC_MASK;
154 			spr_val |= vcpu->arch.tcr & TCR_WRC_MASK;
155 		}
156 		kvmppc_set_tcr(vcpu, spr_val);
157 		break;
158 
159 	case SPRN_DECAR:
160 		vcpu->arch.decar = spr_val;
161 		break;
162 	/*
163 	 * Note: SPRG4-7 are user-readable.
164 	 * These values are loaded into the real SPRGs when resuming the
165 	 * guest (PR-mode only).
166 	 */
167 	case SPRN_SPRG4:
168 		kvmppc_set_sprg4(vcpu, spr_val);
169 		break;
170 	case SPRN_SPRG5:
171 		kvmppc_set_sprg5(vcpu, spr_val);
172 		break;
173 	case SPRN_SPRG6:
174 		kvmppc_set_sprg6(vcpu, spr_val);
175 		break;
176 	case SPRN_SPRG7:
177 		kvmppc_set_sprg7(vcpu, spr_val);
178 		break;
179 
180 	case SPRN_IVPR:
181 		vcpu->arch.ivpr = spr_val;
182 #ifdef CONFIG_KVM_BOOKE_HV
183 		mtspr(SPRN_GIVPR, spr_val);
184 #endif
185 		break;
186 	case SPRN_IVOR0:
187 		vcpu->arch.ivor[BOOKE_IRQPRIO_CRITICAL] = spr_val;
188 		break;
189 	case SPRN_IVOR1:
190 		vcpu->arch.ivor[BOOKE_IRQPRIO_MACHINE_CHECK] = spr_val;
191 		break;
192 	case SPRN_IVOR2:
193 		vcpu->arch.ivor[BOOKE_IRQPRIO_DATA_STORAGE] = spr_val;
194 #ifdef CONFIG_KVM_BOOKE_HV
195 		mtspr(SPRN_GIVOR2, spr_val);
196 #endif
197 		break;
198 	case SPRN_IVOR3:
199 		vcpu->arch.ivor[BOOKE_IRQPRIO_INST_STORAGE] = spr_val;
200 		break;
201 	case SPRN_IVOR4:
202 		vcpu->arch.ivor[BOOKE_IRQPRIO_EXTERNAL] = spr_val;
203 		break;
204 	case SPRN_IVOR5:
205 		vcpu->arch.ivor[BOOKE_IRQPRIO_ALIGNMENT] = spr_val;
206 		break;
207 	case SPRN_IVOR6:
208 		vcpu->arch.ivor[BOOKE_IRQPRIO_PROGRAM] = spr_val;
209 		break;
210 	case SPRN_IVOR7:
211 		vcpu->arch.ivor[BOOKE_IRQPRIO_FP_UNAVAIL] = spr_val;
212 		break;
213 	case SPRN_IVOR8:
214 		vcpu->arch.ivor[BOOKE_IRQPRIO_SYSCALL] = spr_val;
215 #ifdef CONFIG_KVM_BOOKE_HV
216 		mtspr(SPRN_GIVOR8, spr_val);
217 #endif
218 		break;
219 	case SPRN_IVOR9:
220 		vcpu->arch.ivor[BOOKE_IRQPRIO_AP_UNAVAIL] = spr_val;
221 		break;
222 	case SPRN_IVOR10:
223 		vcpu->arch.ivor[BOOKE_IRQPRIO_DECREMENTER] = spr_val;
224 		break;
225 	case SPRN_IVOR11:
226 		vcpu->arch.ivor[BOOKE_IRQPRIO_FIT] = spr_val;
227 		break;
228 	case SPRN_IVOR12:
229 		vcpu->arch.ivor[BOOKE_IRQPRIO_WATCHDOG] = spr_val;
230 		break;
231 	case SPRN_IVOR13:
232 		vcpu->arch.ivor[BOOKE_IRQPRIO_DTLB_MISS] = spr_val;
233 		break;
234 	case SPRN_IVOR14:
235 		vcpu->arch.ivor[BOOKE_IRQPRIO_ITLB_MISS] = spr_val;
236 		break;
237 	case SPRN_IVOR15:
238 		vcpu->arch.ivor[BOOKE_IRQPRIO_DEBUG] = spr_val;
239 		break;
240 	case SPRN_MCSR:
241 		vcpu->arch.mcsr &= ~spr_val;
242 		break;
243 #if defined(CONFIG_64BIT)
244 	case SPRN_EPCR:
245 		kvmppc_set_epcr(vcpu, spr_val);
246 #ifdef CONFIG_KVM_BOOKE_HV
247 		mtspr(SPRN_EPCR, vcpu->arch.shadow_epcr);
248 #endif
249 		break;
250 #endif
251 	default:
252 		emulated = EMULATE_FAIL;
253 	}
254 
255 	return emulated;
256 }
257 
258 int kvmppc_booke_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, ulong *spr_val)
259 {
260 	int emulated = EMULATE_DONE;
261 
262 	switch (sprn) {
263 	case SPRN_IVPR:
264 		*spr_val = vcpu->arch.ivpr;
265 		break;
266 	case SPRN_DEAR:
267 		*spr_val = vcpu->arch.shared->dar;
268 		break;
269 	case SPRN_ESR:
270 		*spr_val = vcpu->arch.shared->esr;
271 		break;
272 	case SPRN_EPR:
273 		*spr_val = vcpu->arch.epr;
274 		break;
275 	case SPRN_CSRR0:
276 		*spr_val = vcpu->arch.csrr0;
277 		break;
278 	case SPRN_CSRR1:
279 		*spr_val = vcpu->arch.csrr1;
280 		break;
281 	case SPRN_DBCR0:
282 		*spr_val = vcpu->arch.dbg_reg.dbcr0;
283 		break;
284 	case SPRN_DBCR1:
285 		*spr_val = vcpu->arch.dbg_reg.dbcr1;
286 		break;
287 	case SPRN_DBSR:
288 		*spr_val = vcpu->arch.dbsr;
289 		break;
290 	case SPRN_TSR:
291 		*spr_val = vcpu->arch.tsr;
292 		break;
293 	case SPRN_TCR:
294 		*spr_val = vcpu->arch.tcr;
295 		break;
296 
297 	case SPRN_IVOR0:
298 		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_CRITICAL];
299 		break;
300 	case SPRN_IVOR1:
301 		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_MACHINE_CHECK];
302 		break;
303 	case SPRN_IVOR2:
304 		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_DATA_STORAGE];
305 		break;
306 	case SPRN_IVOR3:
307 		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_INST_STORAGE];
308 		break;
309 	case SPRN_IVOR4:
310 		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_EXTERNAL];
311 		break;
312 	case SPRN_IVOR5:
313 		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_ALIGNMENT];
314 		break;
315 	case SPRN_IVOR6:
316 		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_PROGRAM];
317 		break;
318 	case SPRN_IVOR7:
319 		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_FP_UNAVAIL];
320 		break;
321 	case SPRN_IVOR8:
322 		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_SYSCALL];
323 		break;
324 	case SPRN_IVOR9:
325 		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_AP_UNAVAIL];
326 		break;
327 	case SPRN_IVOR10:
328 		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_DECREMENTER];
329 		break;
330 	case SPRN_IVOR11:
331 		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_FIT];
332 		break;
333 	case SPRN_IVOR12:
334 		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_WATCHDOG];
335 		break;
336 	case SPRN_IVOR13:
337 		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_DTLB_MISS];
338 		break;
339 	case SPRN_IVOR14:
340 		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_ITLB_MISS];
341 		break;
342 	case SPRN_IVOR15:
343 		*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_DEBUG];
344 		break;
345 	case SPRN_MCSR:
346 		*spr_val = vcpu->arch.mcsr;
347 		break;
348 #if defined(CONFIG_64BIT)
349 	case SPRN_EPCR:
350 		*spr_val = vcpu->arch.epcr;
351 		break;
352 #endif
353 
354 	default:
355 		emulated = EMULATE_FAIL;
356 	}
357 
358 	return emulated;
359 }
360