aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kvm/emulate.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/kvm/emulate.c')
-rw-r--r--arch/powerpc/kvm/emulate.c53
1 files changed, 35 insertions, 18 deletions
diff --git a/arch/powerpc/kvm/emulate.c b/arch/powerpc/kvm/emulate.c
index 4568ec386c2a..141dce3c6810 100644
--- a/arch/powerpc/kvm/emulate.c
+++ b/arch/powerpc/kvm/emulate.c
@@ -114,6 +114,12 @@ void kvmppc_emulate_dec(struct kvm_vcpu *vcpu)
114 } 114 }
115} 115}
116 116
117u32 kvmppc_get_dec(struct kvm_vcpu *vcpu, u64 tb)
118{
119 u64 jd = tb - vcpu->arch.dec_jiffies;
120 return vcpu->arch.dec - jd;
121}
122
117/* XXX to do: 123/* XXX to do:
118 * lhax 124 * lhax
119 * lhaux 125 * lhaux
@@ -145,7 +151,7 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu)
145 /* this default type might be overwritten by subcategories */ 151 /* this default type might be overwritten by subcategories */
146 kvmppc_set_exit_type(vcpu, EMULATED_INST_EXITS); 152 kvmppc_set_exit_type(vcpu, EMULATED_INST_EXITS);
147 153
148 pr_debug(KERN_INFO "Emulating opcode %d / %d\n", get_op(inst), get_xop(inst)); 154 pr_debug("Emulating opcode %d / %d\n", get_op(inst), get_xop(inst));
149 155
150 switch (get_op(inst)) { 156 switch (get_op(inst)) {
151 case OP_TRAP: 157 case OP_TRAP:
@@ -242,9 +248,11 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu)
242 248
243 switch (sprn) { 249 switch (sprn) {
244 case SPRN_SRR0: 250 case SPRN_SRR0:
245 kvmppc_set_gpr(vcpu, rt, vcpu->arch.srr0); break; 251 kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->srr0);
252 break;
246 case SPRN_SRR1: 253 case SPRN_SRR1:
247 kvmppc_set_gpr(vcpu, rt, vcpu->arch.srr1); break; 254 kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->srr1);
255 break;
248 case SPRN_PVR: 256 case SPRN_PVR:
249 kvmppc_set_gpr(vcpu, rt, vcpu->arch.pvr); break; 257 kvmppc_set_gpr(vcpu, rt, vcpu->arch.pvr); break;
250 case SPRN_PIR: 258 case SPRN_PIR:
@@ -261,23 +269,24 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu)
261 kvmppc_set_gpr(vcpu, rt, get_tb()); break; 269 kvmppc_set_gpr(vcpu, rt, get_tb()); break;
262 270
263 case SPRN_SPRG0: 271 case SPRN_SPRG0:
264 kvmppc_set_gpr(vcpu, rt, vcpu->arch.sprg0); break; 272 kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->sprg0);
273 break;
265 case SPRN_SPRG1: 274 case SPRN_SPRG1:
266 kvmppc_set_gpr(vcpu, rt, vcpu->arch.sprg1); break; 275 kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->sprg1);
276 break;
267 case SPRN_SPRG2: 277 case SPRN_SPRG2:
268 kvmppc_set_gpr(vcpu, rt, vcpu->arch.sprg2); break; 278 kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->sprg2);
279 break;
269 case SPRN_SPRG3: 280 case SPRN_SPRG3:
270 kvmppc_set_gpr(vcpu, rt, vcpu->arch.sprg3); break; 281 kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->sprg3);
282 break;
271 /* Note: SPRG4-7 are user-readable, so we don't get 283 /* Note: SPRG4-7 are user-readable, so we don't get
272 * a trap. */ 284 * a trap. */
273 285
274 case SPRN_DEC: 286 case SPRN_DEC:
275 { 287 {
276 u64 jd = get_tb() - vcpu->arch.dec_jiffies; 288 kvmppc_set_gpr(vcpu, rt,
277 kvmppc_set_gpr(vcpu, rt, vcpu->arch.dec - jd); 289 kvmppc_get_dec(vcpu, get_tb()));
278 pr_debug(KERN_INFO "mfDEC: %x - %llx = %lx\n",
279 vcpu->arch.dec, jd,
280 kvmppc_get_gpr(vcpu, rt));
281 break; 290 break;
282 } 291 }
283 default: 292 default:
@@ -288,6 +297,7 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu)
288 } 297 }
289 break; 298 break;
290 } 299 }
300 kvmppc_set_exit_type(vcpu, EMULATED_MFSPR_EXITS);
291 break; 301 break;
292 302
293 case OP_31_XOP_STHX: 303 case OP_31_XOP_STHX:
@@ -320,9 +330,11 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu)
320 rs = get_rs(inst); 330 rs = get_rs(inst);
321 switch (sprn) { 331 switch (sprn) {
322 case SPRN_SRR0: 332 case SPRN_SRR0:
323 vcpu->arch.srr0 = kvmppc_get_gpr(vcpu, rs); break; 333 vcpu->arch.shared->srr0 = kvmppc_get_gpr(vcpu, rs);
334 break;
324 case SPRN_SRR1: 335 case SPRN_SRR1:
325 vcpu->arch.srr1 = kvmppc_get_gpr(vcpu, rs); break; 336 vcpu->arch.shared->srr1 = kvmppc_get_gpr(vcpu, rs);
337 break;
326 338
327 /* XXX We need to context-switch the timebase for 339 /* XXX We need to context-switch the timebase for
328 * watchdog and FIT. */ 340 * watchdog and FIT. */
@@ -337,13 +349,17 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu)
337 break; 349 break;
338 350
339 case SPRN_SPRG0: 351 case SPRN_SPRG0:
340 vcpu->arch.sprg0 = kvmppc_get_gpr(vcpu, rs); break; 352 vcpu->arch.shared->sprg0 = kvmppc_get_gpr(vcpu, rs);
353 break;
341 case SPRN_SPRG1: 354 case SPRN_SPRG1:
342 vcpu->arch.sprg1 = kvmppc_get_gpr(vcpu, rs); break; 355 vcpu->arch.shared->sprg1 = kvmppc_get_gpr(vcpu, rs);
356 break;
343 case SPRN_SPRG2: 357 case SPRN_SPRG2:
344 vcpu->arch.sprg2 = kvmppc_get_gpr(vcpu, rs); break; 358 vcpu->arch.shared->sprg2 = kvmppc_get_gpr(vcpu, rs);
359 break;
345 case SPRN_SPRG3: 360 case SPRN_SPRG3:
346 vcpu->arch.sprg3 = kvmppc_get_gpr(vcpu, rs); break; 361 vcpu->arch.shared->sprg3 = kvmppc_get_gpr(vcpu, rs);
362 break;
347 363
348 default: 364 default:
349 emulated = kvmppc_core_emulate_mtspr(vcpu, sprn, rs); 365 emulated = kvmppc_core_emulate_mtspr(vcpu, sprn, rs);
@@ -351,6 +367,7 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu)
351 printk("mtspr: unknown spr %x\n", sprn); 367 printk("mtspr: unknown spr %x\n", sprn);
352 break; 368 break;
353 } 369 }
370 kvmppc_set_exit_type(vcpu, EMULATED_MTSPR_EXITS);
354 break; 371 break;
355 372
356 case OP_31_XOP_DCBI: 373 case OP_31_XOP_DCBI: