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 <ard.biesheu...@linaro.org>
> ---
> 
> 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 <drjo...@redhat.com>

Thanks
Laszlo
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to