diff options
Diffstat (limited to 'arch/powerpc/kvm/book3s.c')
-rw-r--r-- | arch/powerpc/kvm/book3s.c | 57 |
1 files changed, 13 insertions, 44 deletions
diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c index e41ac6f7dcf1..7d54f4ed6d96 100644 --- a/arch/powerpc/kvm/book3s.c +++ b/arch/powerpc/kvm/book3s.c | |||
@@ -258,7 +258,7 @@ static bool clear_irqprio(struct kvm_vcpu *vcpu, unsigned int priority) | |||
258 | return true; | 258 | return true; |
259 | } | 259 | } |
260 | 260 | ||
261 | void kvmppc_core_deliver_interrupts(struct kvm_vcpu *vcpu) | 261 | void kvmppc_core_prepare_to_enter(struct kvm_vcpu *vcpu) |
262 | { | 262 | { |
263 | unsigned long *pending = &vcpu->arch.pending_exceptions; | 263 | unsigned long *pending = &vcpu->arch.pending_exceptions; |
264 | unsigned long old_pending = vcpu->arch.pending_exceptions; | 264 | unsigned long old_pending = vcpu->arch.pending_exceptions; |
@@ -423,10 +423,10 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) | |||
423 | regs->sprg1 = vcpu->arch.shared->sprg1; | 423 | regs->sprg1 = vcpu->arch.shared->sprg1; |
424 | regs->sprg2 = vcpu->arch.shared->sprg2; | 424 | regs->sprg2 = vcpu->arch.shared->sprg2; |
425 | regs->sprg3 = vcpu->arch.shared->sprg3; | 425 | regs->sprg3 = vcpu->arch.shared->sprg3; |
426 | regs->sprg4 = vcpu->arch.sprg4; | 426 | regs->sprg4 = vcpu->arch.shared->sprg4; |
427 | regs->sprg5 = vcpu->arch.sprg5; | 427 | regs->sprg5 = vcpu->arch.shared->sprg5; |
428 | regs->sprg6 = vcpu->arch.sprg6; | 428 | regs->sprg6 = vcpu->arch.shared->sprg6; |
429 | regs->sprg7 = vcpu->arch.sprg7; | 429 | regs->sprg7 = vcpu->arch.shared->sprg7; |
430 | 430 | ||
431 | for (i = 0; i < ARRAY_SIZE(regs->gpr); i++) | 431 | for (i = 0; i < ARRAY_SIZE(regs->gpr); i++) |
432 | regs->gpr[i] = kvmppc_get_gpr(vcpu, i); | 432 | regs->gpr[i] = kvmppc_get_gpr(vcpu, i); |
@@ -450,10 +450,10 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) | |||
450 | vcpu->arch.shared->sprg1 = regs->sprg1; | 450 | vcpu->arch.shared->sprg1 = regs->sprg1; |
451 | vcpu->arch.shared->sprg2 = regs->sprg2; | 451 | vcpu->arch.shared->sprg2 = regs->sprg2; |
452 | vcpu->arch.shared->sprg3 = regs->sprg3; | 452 | vcpu->arch.shared->sprg3 = regs->sprg3; |
453 | vcpu->arch.sprg4 = regs->sprg4; | 453 | vcpu->arch.shared->sprg4 = regs->sprg4; |
454 | vcpu->arch.sprg5 = regs->sprg5; | 454 | vcpu->arch.shared->sprg5 = regs->sprg5; |
455 | vcpu->arch.sprg6 = regs->sprg6; | 455 | vcpu->arch.shared->sprg6 = regs->sprg6; |
456 | vcpu->arch.sprg7 = regs->sprg7; | 456 | vcpu->arch.shared->sprg7 = regs->sprg7; |
457 | 457 | ||
458 | for (i = 0; i < ARRAY_SIZE(regs->gpr); i++) | 458 | for (i = 0; i < ARRAY_SIZE(regs->gpr); i++) |
459 | kvmppc_set_gpr(vcpu, i, regs->gpr[i]); | 459 | kvmppc_set_gpr(vcpu, i, regs->gpr[i]); |
@@ -477,41 +477,10 @@ int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu, | |||
477 | return 0; | 477 | return 0; |
478 | } | 478 | } |
479 | 479 | ||
480 | /* | 480 | void kvmppc_decrementer_func(unsigned long data) |
481 | * Get (and clear) the dirty memory log for a memory slot. | ||
482 | */ | ||
483 | int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, | ||
484 | struct kvm_dirty_log *log) | ||
485 | { | 481 | { |
486 | struct kvm_memory_slot *memslot; | 482 | struct kvm_vcpu *vcpu = (struct kvm_vcpu *)data; |
487 | struct kvm_vcpu *vcpu; | ||
488 | ulong ga, ga_end; | ||
489 | int is_dirty = 0; | ||
490 | int r; | ||
491 | unsigned long n; | ||
492 | |||
493 | mutex_lock(&kvm->slots_lock); | ||
494 | |||
495 | r = kvm_get_dirty_log(kvm, log, &is_dirty); | ||
496 | if (r) | ||
497 | goto out; | ||
498 | |||
499 | /* If nothing is dirty, don't bother messing with page tables. */ | ||
500 | if (is_dirty) { | ||
501 | memslot = id_to_memslot(kvm->memslots, log->slot); | ||
502 | 483 | ||
503 | ga = memslot->base_gfn << PAGE_SHIFT; | 484 | kvmppc_core_queue_dec(vcpu); |
504 | ga_end = ga + (memslot->npages << PAGE_SHIFT); | 485 | kvm_vcpu_kick(vcpu); |
505 | |||
506 | kvm_for_each_vcpu(n, vcpu, kvm) | ||
507 | kvmppc_mmu_pte_pflush(vcpu, ga, ga_end); | ||
508 | |||
509 | n = kvm_dirty_bitmap_bytes(memslot); | ||
510 | memset(memslot->dirty_bitmap, 0, n); | ||
511 | } | ||
512 | |||
513 | r = 0; | ||
514 | out: | ||
515 | mutex_unlock(&kvm->slots_lock); | ||
516 | return r; | ||
517 | } | 486 | } |