On 8 August 2016 at 12:56, Alexei Fedorov <[email protected]> wrote: > I quoted: > > "The HARDWARE_INTERRUPT_HANDLER is responsible for clearing interrupt sources > from individual devices". > Are reading this as " spec clearly states that it is the GIC driver that > should be doing it"? > > TimerInterruptHandler() is HARDWARE_INTERRUPT_HANDLER and it clears its > interrupt by calling gInterrupt->EndOfInterrupt(). >
No, I mean the other sentence: >>>> ...The driver implementing >>>> this protocol is responsible for clearing the pending interrupt in the >>>> interrupt routing hardware. The GIC driver is responsible for calling EndOfInterrupt(), not the handler. -- Ard. > -----Original Message----- > From: Ard Biesheuvel [mailto:[email protected]] > Sent: 08 August 2016 11:49 > To: Alexei Fedorov > Cc: Evan Lloyd; Cohen, Eugene; [email protected]; Heyi Guo; Leif > Lindholm > Subject: Re: [edk2] [PATCH] ArmPkg: Fix double GIC EIOR write per interrupt > > On 8 August 2016 at 12:48, Alexei Fedorov <[email protected]> wrote: >> Please provide the link to the spec which "clearly states that it is the GIC >> driver that should be doing it." >> > > it is not in the spec, but in the comment that you quoted yourself: > >>>> Looks like it does not: >>>> From edk2\EmbeddedPkg\Include\Protocol\HardwareInterrupt.h: >>>> >>>> " Abstraction for hardware based interrupt routine >>>> >>>> ...The driver implementing >>>> this protocol is responsible for clearing the pending interrupt in the >>>> interrupt routing hardware. The HARDWARE_INTERRUPT_HANDLER is responsible >>>> for clearing interrupt sources from individual devices." > > -- > Ard. > > > >> -----Original Message----- >> From: Ard Biesheuvel [mailto:[email protected]] >> Sent: 08 August 2016 11:45 >> To: Alexei Fedorov >> Cc: Evan Lloyd; Cohen, Eugene; [email protected]; Heyi Guo; Leif >> Lindholm >> Subject: Re: [edk2] [PATCH] ArmPkg: Fix double GIC EIOR write per interrupt >> >> On 8 August 2016 at 12:40, Alexei Fedorov <[email protected]> wrote: >>> The interrupt is cleared in TimerInterruptHandler() >>> (ArmPkg\Drivers\TimerDxe\TimerDxe.c) which is HARDWARE_INTERRUPT_HANDLER >>> parameter passed to gInterrupt->RegisterInterruptSource(). >> >> Indeed. So now, the HARDWARE_INTERRUPT_HANDLER is clearing the interrupt in >> the interrupt routing hardware, while the spec clearly states that it is the >> GIC driver that should be doing it. >> >> >>> Spurious interrupts which don't have registered interrupt handlers are >>> cleared in GicV(2|3)IrqInterruptHandler(). >>> >> >> Yes, that is correct according to the text you quoted. >> >> -- >> Ard. >> >>> >>> -----Original Message----- >>> From: Ard Biesheuvel [mailto:[email protected]] >>> Sent: 08 August 2016 11:32 >>> To: Alexei Fedorov >>> Cc: Evan Lloyd; Cohen, Eugene; [email protected]; Heyi Guo; Leif >>> Lindholm >>> Subject: Re: [edk2] [PATCH] ArmPkg: Fix double GIC EIOR write per >>> interrupt >>> >>> On 8 August 2016 at 12:25, Alexei Fedorov <[email protected]> wrote: >>>> >>>>> it does change the contract we have with registered interrupt >>>>> handlers >>>> >>>> Looks like it does not: >>>> From edk2\EmbeddedPkg\Include\Protocol\HardwareInterrupt.h: >>>> >>>> " Abstraction for hardware based interrupt routine >>>> >>>> ...The driver implementing >>>> this protocol is responsible for clearing the pending interrupt in the >>>> interrupt routing hardware. The HARDWARE_INTERRUPT_HANDLER is responsible >>>> for clearing interrupt sources from individual devices." >>>> >>> >>> Thanks for digging that up! >>> >>> So after this change, the driver implementing the hardware interrupt >>> protocol no longer clears the pending interrupt in the interrupt routing >>> hardware. This means that we are not only changing the existing contract, >>> we are also violating the spec. >>> >>> >>>> >>>> -----Original Message----- >>>> From: edk2-devel [mailto:[email protected]] On Behalf >>>> Of Ard Biesheuvel >>>> Sent: 06 August 2016 09:25 >>>> To: Evan Lloyd; Cohen, Eugene >>>> Cc: [email protected]; Heyi Guo; Leif Lindholm >>>> Subject: Re: [edk2] [PATCH] ArmPkg: Fix double GIC EIOR write per >>>> interrupt >>>> >>>> (+ Eugene) >>>> >>>> On 5 August 2016 at 18:59, <[email protected]> wrote: >>>>> From: Alexei <[email protected]> >>>>> >>>>> This commit fixes a bug in the GIC v2 and v3 drivers where the >>>>> GICC_EOIR (End Of Interrupt Register) is written twice for a single >>>>> interrupt. >>>>> GicV(2|3)IrqInterruptHandler() calls the Interrupt Handler and then >>>>> GicV(2|3)EndOfInterrupt() on exit: >>>>> >>>>> InterruptHandler = gRegisteredInterruptHandlers[GicInterrupt]; >>>>> if (InterruptHandler != NULL) { >>>>> // Call the registered interrupt handler. >>>>> InterruptHandler (GicInterrupt, SystemContext); } else { >>>>> DEBUG ((EFI_D_ERROR, "Spurious GIC interrupt: 0x%x\n", >>>>> GicInterrupt)); } >>>>> >>>>> GicV2EndOfInterrupt (&gHardwareInterruptV2Protocol, GicInterrupt); >>>>> >>>>> , although gInterrupt->EndOfInterrupt() has already been called by >>>>> InterruptHandler(). >>>>> >>>>> The fix moves the EndOfInterrupt() call inside the else case for >>>>> unregistered/spurious interrupts. This removes a potential race >>>>> condition that might have lost interrupts. >>>>> >>>> >>>> I understand that this solves the problem, but it does change the contract >>>> we have with registered interrupt handlers, and we don't know how this may >>>> be used out of tree. I know UEFI only supports polling for drivers, but >>>> are there any other cases (debug?) where we may break other people's code >>>> by doing this? >>>> >>>> >>>>> Contributed-under: TianoCore Contribution Agreement 1.0 >>>>> Signed-off-by: Alexei Fedorov <[email protected]> >>>>> Signed-off-by: Evan Lloyd <[email protected]> >>>>> --- >>>>> >>>>> Code is available at: >>>>> https://github.com/EvanLloyd/tianocore/tree/EOIR_v1 >>>>> >>>>> ArmPkg/Drivers/ArmGic/GicV2/ArmGicV2Dxe.c | 5 ++--- >>>>> ArmPkg/Drivers/ArmGic/GicV3/ArmGicV3Dxe.c | 5 ++--- >>>>> 2 files changed, 4 insertions(+), 6 deletions(-) >>>>> >>>>> diff --git a/ArmPkg/Drivers/ArmGic/GicV2/ArmGicV2Dxe.c >>>>> b/ArmPkg/Drivers/ArmGic/GicV2/ArmGicV2Dxe.c >>>>> index >>>>> 036eb5cd6bf6845dd2b03b62c933c1dedaef7251..34d4be3867647e0fdad7356c94 >>>>> 9 >>>>> a >>>>> f8cd3ede7164 100644 >>>>> --- a/ArmPkg/Drivers/ArmGic/GicV2/ArmGicV2Dxe.c >>>>> +++ b/ArmPkg/Drivers/ArmGic/GicV2/ArmGicV2Dxe.c >>>>> @@ -2,7 +2,7 @@ >>>>> >>>>> Copyright (c) 2009, Hewlett-Packard Company. All rights >>>>> reserved.<BR> Portions copyright (c) 2010, Apple Inc. All rights >>>>> reserved.<BR> -Portions copyright (c) 2011-2015, ARM Ltd. All rights >>>>> reserved.<BR> >>>>> +Portions copyright (c) 2011-2016, ARM Ltd. All rights reserved.<BR> >>>>> >>>>> This program and the accompanying materials are licensed and made >>>>> available under the terms and conditions of the BSD License @@ >>>>> -178,9 >>>>> +178,8 @@ GicV2IrqInterruptHandler ( >>>>> InterruptHandler (GicInterrupt, SystemContext); >>>>> } else { >>>>> DEBUG ((EFI_D_ERROR, "Spurious GIC interrupt: 0x%x\n", >>>>> GicInterrupt)); >>>>> + GicV2EndOfInterrupt (&gHardwareInterruptV2Protocol, >>>>> + GicInterrupt); >>>>> } >>>>> - >>>>> - GicV2EndOfInterrupt (&gHardwareInterruptV2Protocol, >>>>> GicInterrupt); } >>>>> >>>>> // >>>>> diff --git a/ArmPkg/Drivers/ArmGic/GicV3/ArmGicV3Dxe.c >>>>> b/ArmPkg/Drivers/ArmGic/GicV3/ArmGicV3Dxe.c >>>>> index >>>>> 106c669fcb8777dfaad609c0ce9f5b572727a3ff..983936f3738a74bb5d5e08e012 >>>>> 9 >>>>> 7 >>>>> 3df240958a8b 100644 >>>>> --- a/ArmPkg/Drivers/ArmGic/GicV3/ArmGicV3Dxe.c >>>>> +++ b/ArmPkg/Drivers/ArmGic/GicV3/ArmGicV3Dxe.c >>>>> @@ -1,6 +1,6 @@ >>>>> /** @file >>>>> * >>>>> -* Copyright (c) 2011-2015, ARM Limited. All rights reserved. >>>>> +* Copyright (c) 2011-2016, ARM Limited. All rights reserved. >>>>> * >>>>> * This program and the accompanying materials >>>>> * are licensed and made available under the terms and conditions >>>>> of the BSD License @@ -169,9 +169,8 @@ GicV3IrqInterruptHandler ( >>>>> InterruptHandler (GicInterrupt, SystemContext); >>>>> } else { >>>>> DEBUG ((EFI_D_ERROR, "Spurious GIC interrupt: 0x%x\n", >>>>> GicInterrupt)); >>>>> + GicV3EndOfInterrupt (&gHardwareInterruptV3Protocol, >>>>> + GicInterrupt); >>>>> } >>>>> - >>>>> - GicV3EndOfInterrupt (&gHardwareInterruptV3Protocol, >>>>> GicInterrupt); } >>>>> >>>>> // >>>>> -- >>>>> Guid("CE165669-3EF3-493F-B85D-6190EE5B9759") >>>>> >>>> _______________________________________________ >>>> edk2-devel mailing list >>>> [email protected] >>>> https://lists.01.org/mailman/listinfo/edk2-devel >>>> >>>> IMPORTANT NOTICE: The contents of this email and any attachments are >>>> confidential and may also be privileged. If you are not the intended >>>> recipient, please notify the sender immediately and do not disclose the >>>> contents to any other person, use it for any purpose, or store or copy the >>>> information in any medium. Thank you. >>>> >>> >>> IMPORTANT NOTICE: The contents of this email and any attachments are >>> confidential and may also be privileged. If you are not the intended >>> recipient, please notify the sender immediately and do not disclose the >>> contents to any other person, use it for any purpose, or store or copy the >>> information in any medium. Thank you. >> >> IMPORTANT NOTICE: The contents of this email and any attachments are >> confidential and may also be privileged. If you are not the intended >> recipient, please notify the sender immediately and do not disclose the >> contents to any other person, use it for any purpose, or store or copy the >> information in any medium. Thank you. > > IMPORTANT NOTICE: The contents of this email and any attachments are > confidential and may also be privileged. If you are not the intended > recipient, please notify the sender immediately and do not disclose the > contents to any other person, use it for any purpose, or store or copy the > information in any medium. Thank you. _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

