Hi Sami, That patch provides the same solution. I'll be sure to check the mailing list before sending the next time. Any benefit on marking this as duplicate? If so, how could I do it? Thank you, Adrián. On Mon, 26 Apr 2021 at 08:56, Sami Mujawar wrote: > Hi Adrian, > > > > I believe there is already a similar patch on the mailing list at > https://edk2.groups.io/g/devel/message/72596. This patch is pending > review and tested-by. > > Can you check if this patch covers the problems you describe, please? > > > > Regards, > > > > Sami Mujawar > > > > *From: *devel@edk2.groups.io on behalf of Adrián > Herrera via groups.io > *Date: *Saturday, 24 April 2021 at 03:57 > *To: *devel@edk2.groups.io > *Cc: *Adrián Herrera > *Subject: *[edk2-devel] [PATCH] ArmPkg/ArmGicLib: fix maximum interrupts > supported > > The maximum number of interrupts supported is determined as > 32 * (GICD_TYPER.ITLinesNumber + 1). > > When GICD_TYPER.ITLinesNumber = 0b11111, the maximum number of > interrupts supported is 1024. However, both GICv2 and GICv3 reserve > INTIDs 1020-1023 for special purposes. > > This results in runtime crashes because: > (1) ArmGicLib functions do not guard against special interrupts. > (2) ArmGicGetMaxNumInterrupts number includes special interrupts. > (2) ArmGicV*Dxe relies on ArmGicGetMaxNumInterrupts, and thus > programs special interrupts through ArmGicLib. > > ArmGicGetMaxNumInterrupts now does not include special interrupts, that > is, it reports 1020 instead of 1024 when GICD_TYPER.ITLinesNumber = > 0b11111. > This avoids the overhead of guarding ArmGicLib functions while not > requiring to modify the drivers code. > > Signed-off-by: Adrián Herrera > --- > ArmPkg/Drivers/ArmGic/ArmGicLib.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/ArmPkg/Drivers/ArmGic/ArmGicLib.c > b/ArmPkg/Drivers/ArmGic/ArmGicLib.c > index 6b01c88206..dff1401e9c 100644 > --- a/ArmPkg/Drivers/ArmGic/ArmGicLib.c > +++ b/ArmPkg/Drivers/ArmGic/ArmGicLib.c > @@ -120,7 +120,10 @@ ArmGicGetMaxNumInterrupts ( > IN INTN GicDistributorBase > > > ) > > > { > > > - return 32 * ((MmioRead32 (GicDistributorBase + ARM_GIC_ICDICTR) & 0x1F) > + 1); > > > + UINT32 ITLinesNumber; > > > + > > > + ITLinesNumber = MmioRead32 (GicDistributorBase + ARM_GIC_ICDICTR) & > 0x1F; > > > + return MIN (32 * (ITLinesNumber+ 1), 1020); > > > } > > > > > > VOID > > > -- > 2.30.0 > > > > > >