RE: [PATCH 1/2] ArmGicLib: cache GIC arch revision in global variable

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I forgot to say your line endings are not correct. You have to use CRLF -
sorry that's the coding convention.

> -----Original Message-----
> From: Olivier Martin [mailto:olivier.martin@xxxxxxx]
> Sent: 12 November 2014 19:43
> To: 'Ard Biesheuvel'; edk2-devel@xxxxxxxxxxxxxxxxxxxxx
> Cc: Marc Zyngier; leif.lindholm@xxxxxxxxxx;
> christoffer.dall@xxxxxxxxxx; kvmarm@xxxxxxxxxxxxxxxxxxxxx;
> lersek@xxxxxxxxxx
> Subject: RE: [PATCH 1/2] ArmGicLib: cache GIC arch revision in global
> variable
> 
> I also thought using a global variable in my initial implementation.
> But it does not work when the library is called from XIP phases. In
> this case the global variables live in Read-Only memory and it would
> crash as soon as you try to write to it.
> This change is only safe when this library is called from these
> following module types: DXE_DRIVER, DXE_RUNTIME_DRIVER, UEFI_DRIVER, or
> UEFI_APPLICATION.
> 
> The way to fix it is to introduce a new
> ArmPkg/Drivers/ArmGic/ArmGicDxeLib.inf (limited to the above
> MODULE_TYPEs) and to enable your change in this file.
> You would also need to move out the functions from
> ArmPkg/Drivers/ArmGic/ArmGicLib.c that use this change (ie: using
> either the global variable mGicArchRevision or calling
> ArmGicGetSupportedArchRevision()).
> 
> 
> > -----Original Message-----
> > From: Ard Biesheuvel [mailto:ard.biesheuvel@xxxxxxxxxx]
> > Sent: 12 November 2014 11:47
> > To: Olivier Martin; edk2-devel@xxxxxxxxxxxxxxxxxxxxx
> > Cc: Marc Zyngier; leif.lindholm@xxxxxxxxxx;
> > christoffer.dall@xxxxxxxxxx; kvmarm@xxxxxxxxxxxxxxxxxxxxx;
> > lersek@xxxxxxxxxx; Ard Biesheuvel
> > Subject: [PATCH 1/2] ArmGicLib: cache GIC arch revision in global
> > variable
> >
> > Before extending the GIC arch revision check to support an emulated
> > GICv2 on GICv3 capable hardware in the next patch, add a constructor
> > to ArmGicLib that caches the result of the check so we don't have to
> > go through it on every call into ArmGicLib.
> >
> > Contributed-under: TianoCore Contribution Agreement 1.0
> > Signed-off-by: Ard Biesheuvel <ard.biesheuvel@xxxxxxxxxx>
> > ---
> >  ArmPkg/Drivers/ArmGic/ArmGicLib.c   | 42 +++++++++++++++++++--------
> --
> > --------
> >  ArmPkg/Drivers/ArmGic/ArmGicLib.inf |  1 +
> >  2 files changed, 23 insertions(+), 20 deletions(-)
> >
> > diff --git a/ArmPkg/Drivers/ArmGic/ArmGicLib.c
> > b/ArmPkg/Drivers/ArmGic/ArmGicLib.c
> > index 1e5924f5a49f..c48b97e3eb4d 100644
> > --- a/ArmPkg/Drivers/ArmGic/ArmGicLib.c
> > +++ b/ArmPkg/Drivers/ArmGic/ArmGicLib.c
> > @@ -20,6 +20,8 @@
> >  #include "GicV2/ArmGicV2Lib.h"
> >  #include "GicV3/ArmGicV3Lib.h"
> >
> > +STATIC ARM_GIC_ARCH_REVISION    mGicArchRevision;
> > +
> >  UINTN
> >  EFIAPI
> >  ArmGicGetInterfaceIdentification (
> > @@ -72,10 +74,7 @@ ArmGicAcknowledgeInterrupt (
> >    )
> >  {
> >    UINTN Value;
> > -  ARM_GIC_ARCH_REVISION Revision;
> > -
> > -  Revision = ArmGicGetSupportedArchRevision ();
> > -  if (Revision == ARM_GIC_ARCH_REVISION_2) {
> > +  if (mGicArchRevision == ARM_GIC_ARCH_REVISION_2) {
> >      Value = ArmGicV2AcknowledgeInterrupt
> (GicInterruptInterfaceBase);
> >      // InterruptId is required for the caller to know if a valid or
> > spurious
> >      // interrupt has been read
> > @@ -83,7 +82,7 @@ ArmGicAcknowledgeInterrupt (
> >      if (InterruptId != NULL) {
> >        *InterruptId = Value & ARM_GIC_ICCIAR_ACKINTID;
> >      }
> > -  } else if (Revision == ARM_GIC_ARCH_REVISION_3) {
> > +  } else if (mGicArchRevision == ARM_GIC_ARCH_REVISION_3) {
> >      Value = ArmGicV3AcknowledgeInterrupt ();
> >    } else {
> >      ASSERT_EFI_ERROR (EFI_UNSUPPORTED);
> > @@ -102,12 +101,9 @@ ArmGicEndOfInterrupt (
> >    IN UINTN                  Source
> >    )
> >  {
> > -  ARM_GIC_ARCH_REVISION Revision;
> > -
> > -  Revision = ArmGicGetSupportedArchRevision ();
> > -  if (Revision == ARM_GIC_ARCH_REVISION_2) {
> > +  if (mGicArchRevision == ARM_GIC_ARCH_REVISION_2) {
> >      ArmGicV2EndOfInterrupt (GicInterruptInterfaceBase, Source);
> > -  } else if (Revision == ARM_GIC_ARCH_REVISION_3) {
> > +  } else if (mGicArchRevision == ARM_GIC_ARCH_REVISION_3) {
> >      ArmGicV3EndOfInterrupt (Source);
> >    } else {
> >      ASSERT_EFI_ERROR (EFI_UNSUPPORTED);
> > @@ -183,12 +179,9 @@ ArmGicEnableInterruptInterface (
> >    IN  INTN          GicInterruptInterfaceBase
> >    )
> >  {
> > -  ARM_GIC_ARCH_REVISION Revision;
> > -
> > -  Revision = ArmGicGetSupportedArchRevision ();
> > -  if (Revision == ARM_GIC_ARCH_REVISION_2) {
> > +  if (mGicArchRevision == ARM_GIC_ARCH_REVISION_2) {
> >      ArmGicV2EnableInterruptInterface (GicInterruptInterfaceBase);
> > -  } else if (Revision == ARM_GIC_ARCH_REVISION_3) {
> > +  } else if (mGicArchRevision == ARM_GIC_ARCH_REVISION_3) {
> >      ArmGicV3EnableInterruptInterface ();
> >    } else {
> >      ASSERT_EFI_ERROR (EFI_UNSUPPORTED);
> > @@ -201,14 +194,23 @@ ArmGicDisableInterruptInterface (
> >    IN  INTN          GicInterruptInterfaceBase
> >    )
> >  {
> > -  ARM_GIC_ARCH_REVISION Revision;
> > -
> > -  Revision = ArmGicGetSupportedArchRevision ();
> > -  if (Revision == ARM_GIC_ARCH_REVISION_2) {
> > +  if (mGicArchRevision == ARM_GIC_ARCH_REVISION_2) {
> >      ArmGicV2DisableInterruptInterface (GicInterruptInterfaceBase);
> > -  } else if (Revision == ARM_GIC_ARCH_REVISION_3) {
> > +  } else if (mGicArchRevision == ARM_GIC_ARCH_REVISION_3) {
> >      ArmGicV3DisableInterruptInterface ();
> >    } else {
> >      ASSERT_EFI_ERROR (EFI_UNSUPPORTED);
> >    }
> >  }
> > +
> > +
> > +RETURN_STATUS
> > +EFIAPI
> > +ArmGicLibInitialize (
> > +  VOID
> > +  )
> > +{
> > +  mGicArchRevision = ArmGicGetSupportedArchRevision ();
> > +
> > +  return RETURN_SUCCESS;
> > +}
> > diff --git a/ArmPkg/Drivers/ArmGic/ArmGicLib.inf
> > b/ArmPkg/Drivers/ArmGic/ArmGicLib.inf
> > index 81282b9b8299..ceeb95c53e98 100644
> > --- a/ArmPkg/Drivers/ArmGic/ArmGicLib.inf
> > +++ b/ArmPkg/Drivers/ArmGic/ArmGicLib.inf
> > @@ -18,6 +18,7 @@
> >    MODULE_TYPE                    = SEC
> >    VERSION_STRING                 = 1.0
> >    LIBRARY_CLASS                  = ArmGicLib
> > +  CONSTRUCTOR                    = ArmGicLibInitialize
> >
> >  [Sources]
> >    ArmGicLib.c
> > --
> > 1.8.3.2
> >




_______________________________________________
kvmarm mailing list
kvmarm@xxxxxxxxxxxxxxxxxxxxx
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm




[Index of Archives]     [Linux KVM]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux