diff options
Diffstat (limited to 'arch/powerpc/kvm/emulate.c')
-rw-r--r-- | arch/powerpc/kvm/emulate.c | 53 |
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 | ||
117 | u32 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: |