aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kvm
diff options
context:
space:
mode:
authorChristoffer Dall <christoffer.dall@linaro.org>2016-04-27 05:28:00 -0400
committerChristoffer Dall <christoffer.dall@linaro.org>2016-05-20 09:39:43 -0400
commitb13216cf6010ef482e69875e00711de7f9573c80 (patch)
tree7d3742fbf51175f95f6853f5fb396187b73837db /arch/arm/kvm
parent2defaff48aaf16072a6eac4cf8234917197dfa72 (diff)
KVM: arm/arm64: Provide functionality to pause and resume a guest
For some rare corner cases in our VGIC emulation later we have to stop the guest to make sure the VGIC state is consistent. Provide the necessary framework to pause and resume a guest. Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org> Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Diffstat (limited to 'arch/arm/kvm')
-rw-r--r--arch/arm/kvm/arm.c25
1 files changed, 13 insertions, 12 deletions
diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
index ceb9345bcf07..e89329d22c18 100644
--- a/arch/arm/kvm/arm.c
+++ b/arch/arm/kvm/arm.c
@@ -492,30 +492,31 @@ bool kvm_arch_intc_initialized(struct kvm *kvm)
492 return vgic_initialized(kvm); 492 return vgic_initialized(kvm);
493} 493}
494 494
495static void kvm_arm_halt_guest(struct kvm *kvm) __maybe_unused; 495void kvm_arm_halt_guest(struct kvm *kvm)
496static void kvm_arm_resume_guest(struct kvm *kvm) __maybe_unused;
497
498static void kvm_arm_halt_guest(struct kvm *kvm)
499{ 496{
500 int i; 497 int i;
501 struct kvm_vcpu *vcpu; 498 struct kvm_vcpu *vcpu;
502 499
503 kvm_for_each_vcpu(i, vcpu, kvm) 500 kvm_for_each_vcpu(i, vcpu, kvm)
504 vcpu->arch.pause = true; 501 vcpu->arch.pause = true;
505 force_vm_exit(cpu_all_mask); 502 kvm_make_all_cpus_request(kvm, KVM_REQ_VCPU_EXIT);
503}
504
505static void kvm_arm_resume_vcpu(struct kvm_vcpu *vcpu)
506{
507 struct swait_queue_head *wq = kvm_arch_vcpu_wq(vcpu);
508
509 vcpu->arch.pause = false;
510 swake_up(wq);
506} 511}
507 512
508static void kvm_arm_resume_guest(struct kvm *kvm) 513void kvm_arm_resume_guest(struct kvm *kvm)
509{ 514{
510 int i; 515 int i;
511 struct kvm_vcpu *vcpu; 516 struct kvm_vcpu *vcpu;
512 517
513 kvm_for_each_vcpu(i, vcpu, kvm) { 518 kvm_for_each_vcpu(i, vcpu, kvm)
514 struct swait_queue_head *wq = kvm_arch_vcpu_wq(vcpu); 519 kvm_arm_resume_vcpu(vcpu);
515
516 vcpu->arch.pause = false;
517 swake_up(wq);
518 }
519} 520}
520 521
521static void vcpu_sleep(struct kvm_vcpu *vcpu) 522static void vcpu_sleep(struct kvm_vcpu *vcpu)