|
@@ -1526,17 +1526,33 @@ int kvm_vgic_hyp_init(void)
|
|
|
goto out_unmap;
|
|
|
}
|
|
|
|
|
|
- kvm_info("%s@%llx IRQ%d\n", vgic_node->name,
|
|
|
- vctrl_res.start, vgic_maint_irq);
|
|
|
- on_each_cpu(vgic_init_maintenance_interrupt, NULL, 1);
|
|
|
-
|
|
|
if (of_address_to_resource(vgic_node, 3, &vcpu_res)) {
|
|
|
kvm_err("Cannot obtain VCPU resource\n");
|
|
|
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,
|
|
|
+ vctrl_res.start, vgic_maint_irq);
|
|
|
+ on_each_cpu(vgic_init_maintenance_interrupt, NULL, 1);
|
|
|
+
|
|
|
goto out;
|
|
|
|
|
|
out_unmap:
|