Reviewed-by: Liming Gao <liming....@intel.com> > -----Original Message----- > From: Fan, Jeff > Sent: Tuesday, March 22, 2016 3:40 PM > To: edk2-devel@lists.01.org > Cc: Kinney, Michael D; Gao, Liming > Subject: [Patch v2] MdePkg/BaseSynchronizationLib: Add spin lock alignment > for IA32/x64 > > From Intel(R) 64 and IA-32 Architectures Software Developer's Manual, one > lock > or semaphore is suggested to be present within a cache line. If the > processors > are based on Intel NetBurst microarchitecture, two cache lines are suggested. > This could minimize the bus traffic required to service locks. > > Cc: Michael Kinney <michael.d.kin...@intel.com> > Cc: Liming Gao <liming....@intel.com> > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Jeff Fan <jeff....@intel.com> > --- > .../BaseSynchronizationLib.inf | 8 ++- > .../BaseSynchronizationLibInternals.h | 14 ++++- > .../Ia32/InternalGetSpinLockProperties.c | 60 > ++++++++++++++++++++++ > .../Ipf/InternalGetSpinLockProperties.c | 29 +++++++++++ > .../BaseSynchronizationLib/SynchronizationGcc.c | 2 +- > .../BaseSynchronizationLib/SynchronizationMsc.c | 2 +- > 6 files changed, 111 insertions(+), 4 deletions(-) > create mode 100644 > MdePkg/Library/BaseSynchronizationLib/Ia32/InternalGetSpinLockPropertie > s.c > create mode 100644 > MdePkg/Library/BaseSynchronizationLib/Ipf/InternalGetSpinLockProperties. > c > > diff --git > a/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf > b/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf > index bd1bec3..6930d21 100755 > --- a/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf > +++ b/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf > @@ -1,7 +1,7 @@ > ## @file > # Base Synchronization Library implementation. > # > -# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR> > +# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR> > # Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR> > # > # This program and the accompanying materials > @@ -30,6 +30,8 @@ > BaseSynchronizationLibInternals.h > > [Sources.IA32] > + Ia32/InternalGetSpinLockProperties.c > + > Ia32/InterlockedCompareExchange64.c | MSFT > Ia32/InterlockedCompareExchange32.c | MSFT > Ia32/InterlockedCompareExchange16.c | MSFT > @@ -48,6 +50,8 @@ > SynchronizationGcc.c | GCC > > [Sources.X64] > + Ia32/InternalGetSpinLockProperties.c > + > X64/InterlockedCompareExchange64.c | MSFT > X64/InterlockedCompareExchange32.c | MSFT > X64/InterlockedCompareExchange16.c | MSFT > @@ -68,6 +72,8 @@ > SynchronizationGcc.c | GCC > > [Sources.IPF] > + Ipf/InternalGetSpinLockProperties.c > + > Ipf/Synchronization.c > Ipf/InterlockedCompareExchange64.s > Ipf/InterlockedCompareExchange32.s > diff --git > a/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLibInternals. > h > b/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLibInternals. > h > index 76f7023..9716b92 100644 > --- > a/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLibInternals. > h > +++ > b/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLibInternals. > h > @@ -1,7 +1,7 @@ > /** @file > Declaration of internal functions in BaseSynchronizationLib. > > - Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR> > + Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR> > This program and the accompanying materials > are licensed and made available under the terms and conditions of the BSD > License > which accompanies this distribution. The full text of the license may be > found at > @@ -138,4 +138,16 @@ InternalSyncCompareExchange64 ( > IN UINT64 ExchangeValue > ); > > +/** > + Internal function to retrieve the architecture specific spin lock alignment > + requirements for optimal spin lock performance. > + > + @return The architecture specific spin lock alignment. > + > +**/ > +UINTN > +InternalGetSpinLockProperties ( > + VOID > + ); > + > #endif > diff --git > a/MdePkg/Library/BaseSynchronizationLib/Ia32/InternalGetSpinLockPropert > ies.c > b/MdePkg/Library/BaseSynchronizationLib/Ia32/InternalGetSpinLockPropert > ies.c > new file mode 100644 > index 0000000..49f05fb > --- /dev/null > +++ > b/MdePkg/Library/BaseSynchronizationLib/Ia32/InternalGetSpinLockPropert > ies.c > @@ -0,0 +1,60 @@ > +/** @file > + Internal function to get spin lock alignment. > + > + Copyright (c) 2016, Intel Corporation. All rights reserved.<BR> > + This program and the accompanying materials > + are licensed and made available under the terms and conditions of the BSD > License > + which accompanies this distribution. The full text of the license may be > found at > + http://opensource.org/licenses/bsd-license.php. > + > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > + > +**/ > + > +#include "BaseSynchronizationLibInternals.h" > + > +/** > + Internal function to retrieve the architecture specific spin lock alignment > + requirements for optimal spin lock performance. > + > + @return The architecture specific spin lock alignment. > + > +**/ > +UINTN > +InternalGetSpinLockProperties ( > + VOID > + ) > +{ > + UINT32 RegEax; > + UINT32 RegEbx; > + UINTN FamilyId; > + UINTN ModelId; > + UINTN CacheLineSize; > + > + // > + // Retrieve CPUID Version Information > + // > + AsmCpuid (0x01, &RegEax, &RegEbx, NULL, NULL); > + // > + // EBX: Bits 15 - 08: CLFLUSH line size (Value * 8 = cache line size) > + // > + CacheLineSize = ((RegEbx >> 8) & 0xff) * 8; > + // > + // Retrieve CPU Family and Model > + // > + FamilyId = (RegEax >> 8) & 0xf; > + ModelId = (RegEax >> 4) & 0xf; > + if (FamilyId == 0x0f) { > + // > + // In processors based on Intel NetBurst microarchitecture, use two cache > lines > + // > + ModelId = ModelId | ((RegEax >> 12) & 0xf0); > + if (ModelId <= 0x04 || ModelId == 0x06) { > + CacheLineSize *= 2; > + } > + } > + > + return CacheLineSize; > +} > + > diff --git > a/MdePkg/Library/BaseSynchronizationLib/Ipf/InternalGetSpinLockProperti > es.c > b/MdePkg/Library/BaseSynchronizationLib/Ipf/InternalGetSpinLockProperti > es.c > new file mode 100644 > index 0000000..f6464c2 > --- /dev/null > +++ > b/MdePkg/Library/BaseSynchronizationLib/Ipf/InternalGetSpinLockProperti > es.c > @@ -0,0 +1,29 @@ > +/** @file > + Internal function to get spin lock alignment. > + > + Copyright (c) 2016, Intel Corporation. All rights reserved.<BR> > + This program and the accompanying materials > + are licensed and made available under the terms and conditions of the BSD > License > + which accompanies this distribution. The full text of the license may be > found at > + http://opensource.org/licenses/bsd-license.php. > + > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > + > +**/ > + > +/** > + Internal function to retrieve the architecture specific spin lock alignment > + requirements for optimal spin lock performance. > + > + @return The architecture specific spin lock alignment. > + > +**/ > +UINTN > +InternalGetSpinLockProperties ( > + VOID > + ) > +{ > + return 32; > +} > + > diff --git a/MdePkg/Library/BaseSynchronizationLib/SynchronizationGcc.c > b/MdePkg/Library/BaseSynchronizationLib/SynchronizationGcc.c > index 31f28ec..4b8c8e5 100644 > --- a/MdePkg/Library/BaseSynchronizationLib/SynchronizationGcc.c > +++ b/MdePkg/Library/BaseSynchronizationLib/SynchronizationGcc.c > @@ -45,7 +45,7 @@ GetSpinLockProperties ( > VOID > ) > { > - return 32; > + return InternalGetSpinLockProperties (); > } > > /** > diff --git a/MdePkg/Library/BaseSynchronizationLib/SynchronizationMsc.c > b/MdePkg/Library/BaseSynchronizationLib/SynchronizationMsc.c > index 821c798..db344b7 100644 > --- a/MdePkg/Library/BaseSynchronizationLib/SynchronizationMsc.c > +++ b/MdePkg/Library/BaseSynchronizationLib/SynchronizationMsc.c > @@ -47,7 +47,7 @@ GetSpinLockProperties ( > VOID > ) > { > - return 32; > + return InternalGetSpinLockProperties (); > } > > /** > -- > 1.9.5.msysgit.0
_______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel