diff mbox

[21/23] hw/intc/arm_gicv3: Work around Linux assuming interrupts are group 1

Message ID 1462814989-24360-22-git-send-email-peter.maydell@linaro.org (mailing list archive)
State New, archived
Headers show

Commit Message

Peter Maydell May 9, 2016, 5:29 p.m. UTC
The Linux kernel's GICv3 driver assumes that all interrupts are in
group 1. This is correct if the system supports the Security extensions,
because in that case the kernel cannot configure the interrupts and
it must have been done already by firmware. However if the system does
not support the Security extensions then the kernel is perfectly capable
of configuring them into group 1 itself if it wants them there; it
just doesn't.

Work around this by having the GICv3 emulation put all the interrupts
into group 1 if we're directly booting a Linux kernel, whether the
Security extensions are supported or not.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
 hw/intc/arm_gicv3_common.c | 7 +++++++
 1 file changed, 7 insertions(+)
diff mbox

Patch

diff --git a/hw/intc/arm_gicv3_common.c b/hw/intc/arm_gicv3_common.c
index 901ec60..73d3c6d 100644
--- a/hw/intc/arm_gicv3_common.c
+++ b/hw/intc/arm_gicv3_common.c
@@ -288,6 +288,13 @@  static void arm_gic_common_linux_init(ARMLinuxBootIf *obj,
          * equivalent).
          */
         s->irq_reset_nonsecure = true;
+    } else {
+        /* This is purely a workaround for broken Linux kernel behaviour
+         * on non-TrustZone systems. It assumes that interrupts have been
+         * set to group 1 even though it could do that itself for a non-secure
+         * GIC.
+         */
+        s->irq_reset_nonsecure = true;
     }
 }