On 23 June 2016 at 15:25, Laszlo Ersek <[email protected]> wrote: > On 06/22/16 16:32, Ard Biesheuvel wrote: >> Reassign all interrupts to non-secure Group-1 if the GIC has its DS >> (Disable Security) bit set. In this case, it is safe to assume that we >> own the GIC, and that no other firmware has performed any configuration >> yet, which means it is up to us to reconfigure the interrupts so they >> can be taken by the non-secure firmware. >> >> Contributed-under: TianoCore Contribution Agreement 1.0 >> Signed-off-by: Ard Biesheuvel <[email protected]> >> --- >> >> This is the EDK2 counterpart of Peter's patch against the Linux kernel >> >> 7c9b973061b0 ("irqchip/gic-v3: Configure all interrupts as non-secure >> Group-1") >> >> which tweaks the GICv3 driver so that it works with the GICv3 emulation in >> QEMU, which only emulates a single GIC security state when running without >> the security extensions. >> >> ArmPkg/Drivers/ArmGic/GicV3/ArmGicV3Dxe.c | 16 ++++++++++++++++ >> ArmPkg/Include/Library/ArmGicLib.h | 5 +++-- >> 2 files changed, 19 insertions(+), 2 deletions(-) >> >> diff --git a/ArmPkg/Drivers/ArmGic/GicV3/ArmGicV3Dxe.c >> b/ArmPkg/Drivers/ArmGic/GicV3/ArmGicV3Dxe.c >> index 50fa56262eaf..106c669fcb87 100644 >> --- a/ArmPkg/Drivers/ArmGic/GicV3/ArmGicV3Dxe.c >> +++ b/ArmPkg/Drivers/ArmGic/GicV3/ArmGicV3Dxe.c >> @@ -297,6 +297,22 @@ GicV3DxeInitialize ( >> MpId = ArmReadMpidr (); >> CpuTarget = MpId & (ARM_CORE_AFF0 | ARM_CORE_AFF1 | ARM_CORE_AFF2 | >> ARM_CORE_AFF3); >> >> + if ((MmioRead32 (mGicDistributorBase + ARM_GIC_ICDDCR) & >> ARM_GIC_ICDDCR_DS) != 0) { >> + // >> + // If the Disable Security (DS) control bit is set, we are dealing >> with a >> + // GIC that has only one security state. In this case, let's assume >> we are >> + // executing in non-secure state (which is appropriate for DXE >> modules) >> + // and that no other firmware has performed any configuration on the >> GIC. >> + // This means we need to reconfigure all interrupts to non-secure >> Group 1 >> + // first. >> + // >> + MmioWrite32 (mGicRedistributorsBase + ARM_GICR_CTLR_FRAME_SIZE + >> ARM_GIC_ICDISR, 0xffffffff); >> + >> + for (Index = 32; Index < mGicNumInterrupts; Index += 32) { >> + MmioWrite32 (mGicDistributorBase + ARM_GIC_ICDISR + Index / 8, >> 0xffffffff); >> + } >> + } >> + >> // Route the SPIs to the primary CPU. SPIs start at the INTID 32 >> for (Index = 0; Index < (mGicNumInterrupts - 32); Index++) { >> MmioWrite32 (mGicDistributorBase + ARM_GICD_IROUTER + (Index * 8), >> CpuTarget | ARM_GICD_IROUTER_IRM); >> diff --git a/ArmPkg/Include/Library/ArmGicLib.h >> b/ArmPkg/Include/Library/ArmGicLib.h >> index 10c4a9d72eb2..4364f3ffef46 100644 >> --- a/ArmPkg/Include/Library/ArmGicLib.h >> +++ b/ArmPkg/Include/Library/ArmGicLib.h >> @@ -47,8 +47,9 @@ >> // GICv3 specific registers >> #define ARM_GICD_IROUTER 0x6100 // Interrupt Routing Registers >> >> -// the Affinity Routing Enable (ARE) bit in GICD_CTLR >> -#define ARM_GIC_ICDDCR_ARE (1 << 4) >> +// GICD_CTLR bits >> +#define ARM_GIC_ICDDCR_ARE (1 << 4) // Affinity Routing Enable (ARE) >> +#define ARM_GIC_ICDDCR_DS (1 << 6) // Disable Security (DS) >> >> // >> // GIC Redistributor >> > > Drew tested this patch; the result is positive: > > http://thread.gmane.org/gmane.comp.emulators.qemu/418780/focus=421731 > > Based on that, I'm synthetizing: > > Tested-by: Drew Jones <[email protected]> >
Thanks! @Leif: any concerns? _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

