|
@@ -1995,6 +1995,15 @@ static int vgic_its_save_itt(struct vgic_its *its, struct its_device *device)
|
|
list_for_each_entry(ite, &device->itt_head, ite_list) {
|
|
list_for_each_entry(ite, &device->itt_head, ite_list) {
|
|
gpa_t gpa = base + ite->event_id * ite_esz;
|
|
gpa_t gpa = base + ite->event_id * ite_esz;
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * If an LPI carries the HW bit, this means that this
|
|
|
|
+ * interrupt is controlled by GICv4, and we do not
|
|
|
|
+ * have direct access to that state. Let's simply fail
|
|
|
|
+ * the save operation...
|
|
|
|
+ */
|
|
|
|
+ if (ite->irq->hw)
|
|
|
|
+ return -EACCES;
|
|
|
|
+
|
|
ret = vgic_its_save_ite(its, device, ite, gpa, ite_esz);
|
|
ret = vgic_its_save_ite(its, device, ite, gpa, ite_esz);
|
|
if (ret)
|
|
if (ret)
|
|
return ret;
|
|
return ret;
|