diff options
Diffstat (limited to 'virt')
-rw-r--r-- | virt/kvm/arm/vgic-v2.c | 16 | ||||
-rw-r--r-- | virt/kvm/arm/vgic.c | 4 |
2 files changed, 18 insertions, 2 deletions
diff --git a/virt/kvm/arm/vgic-v2.c b/virt/kvm/arm/vgic-v2.c index d6c9c142f813..01124ef3690a 100644 --- a/virt/kvm/arm/vgic-v2.c +++ b/virt/kvm/arm/vgic-v2.c @@ -231,6 +231,22 @@ int vgic_v2_probe(struct device_node *vgic_node, ret = -ENXIO; goto out_unmap; } + + if (!PAGE_ALIGNED(vcpu_res.start)) { + kvm_err("GICV physical address 0x%llx not page aligned\n", + (unsigned long long)vcpu_res.start); + ret = -ENXIO; + goto out_unmap; + } + + if (!PAGE_ALIGNED(resource_size(&vcpu_res))) { + kvm_err("GICV size 0x%llx not a multiple of page size 0x%lx\n", + (unsigned long long)resource_size(&vcpu_res), + PAGE_SIZE); + ret = -ENXIO; + goto out_unmap; + } + vgic->vcpu_base = vcpu_res.start; kvm_info("%s@%llx IRQ%d\n", vgic_node->name, diff --git a/virt/kvm/arm/vgic.c b/virt/kvm/arm/vgic.c index ede8f6466c95..73eba793b17f 100644 --- a/virt/kvm/arm/vgic.c +++ b/virt/kvm/arm/vgic.c @@ -1587,11 +1587,11 @@ int kvm_vgic_hyp_init(void) goto out_free_irq; } - on_each_cpu(vgic_init_maintenance_interrupt, NULL, 1); - /* Callback into for arch code for setup */ vgic_arch_setup(vgic); + on_each_cpu(vgic_init_maintenance_interrupt, NULL, 1); + return 0; out_free_irq: |