arm/arm64: KVM: vgic: move reset initialization into vgic_init_maps()
authorPeter Maydell <peter.maydell@linaro.org>
Thu, 4 Dec 2014 15:02:24 +0000 (15:02 +0000)
committerChristoffer Dall <christoffer.dall@linaro.org>
Sat, 13 Dec 2014 13:15:52 +0000 (14:15 +0100)
commit6d3cfbe21bef5b66530b50ad16c88fdc71a04c35
treeb5f375258f0273acdab23d900ac9b06c642a8e5f
parent957db105c99792ae8ef61ffc9ae77d910f6471da
arm/arm64: KVM: vgic: move reset initialization into vgic_init_maps()

VGIC initialization currently happens in three phases:
 (1) kvm_vgic_create() (triggered by userspace GIC creation)
 (2) vgic_init_maps() (triggered by userspace GIC register read/write
     requests, or from kvm_vgic_init() if not already run)
 (3) kvm_vgic_init() (triggered by first VM run)

We were doing initialization of some state to correspond with the
state of a freshly-reset GIC in kvm_vgic_init(); this is too late,
since it will overwrite changes made by userspace using the
register access APIs before the VM is run. Move this initialization
earlier, into the vgic_init_maps() phase.

This fixes a bug where QEMU could successfully restore a saved
VM state snapshot into a VM that had already been run, but could
not restore it "from cold" using the -loadvm command line option
(the symptoms being that the restored VM would run but interrupts
were ignored).

Finally rename vgic_init_maps to vgic_init and renamed kvm_vgic_init to
kvm_vgic_map_resources.

  [ This patch is originally written by Peter Maydell, but I have
    modified it somewhat heavily, renaming various bits and moving code
    around.  If something is broken, I am to be blamed. - Christoffer ]

Acked-by: Marc Zyngier <marc.zyngier@arm.com>
Reviewed-by: Eric Auger <eric.auger@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
arch/arm/kvm/arm.c
include/kvm/arm_vgic.h
virt/kvm/arm/vgic.c