• Peter Maydell's avatar
    arm/arm64: KVM: vgic: move reset initialization into vgic_init_maps() · 6d3cfbe2
    Peter Maydell authored
    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: default avatarMarc Zyngier <marc.zyngier@arm.com>
    Reviewed-by: default avatarEric Auger <eric.auger@linaro.org>
    Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
    Signed-off-by: default avatarChristoffer Dall <christoffer.dall@linaro.org>
    6d3cfbe2
vgic.c 60.9 KB