Dear Michael and Liming,

I submited the patch as the changes need to be done anyway, though I think the 
library might be better moved to UefiCpuPkg.
Also, is my understanding of the mask value being incorrect right? I was 
confused by the 'ULL' suffix, which makes it look like it was intended. Is it?

Regards,
Marvin.

> -----Original Message-----
> From: edk2-devel [mailto:[email protected]] On Behalf Of
> Marvin Häuser
> Sent: Sunday, July 23, 2017 12:12 PM
> To: [email protected]
> Cc: [email protected]; [email protected]
> Subject: [edk2] [PATCH] MdePkg/SecPeiDxeTimerLibCpu: Consume
> UefiCpuPkg LAPIC code.
> 
> X86TimerLib is changed to use UefiCpuPkg LAPIC register definitions and
> LocalApicLib to remove duplicated code. An implicite change is the value
> returned by InternalX86GetApicBase() as it now returns the result of
> GetLocalApicBaseAddress(), which is the full LAPIC address. This also
> implicitely fixes the incorrect mask value used previously, which did not only
> mask AcpiBase, but also the first nibble of AcpiBaseHi. This does not apply to
> 32-bit platforms.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Marvin Haeuser <[email protected]>
> ---
>  MdePkg/Library/SecPeiDxeTimerLibCpu/X86TimerLib.c            | 35 +++++++--
> -----------
>  MdePkg/Library/SecPeiDxeTimerLibCpu/SecPeiDxeTimerLibCpu.inf |  4 ++-
>  MdePkg/MdePkg.dsc                                            |  3 ++
>  3 files changed, 18 insertions(+), 24 deletions(-)
> 
> diff --git a/MdePkg/Library/SecPeiDxeTimerLibCpu/X86TimerLib.c
> b/MdePkg/Library/SecPeiDxeTimerLibCpu/X86TimerLib.c
> index 76c66fbce6fb..fa6e6f213029 100644
> --- a/MdePkg/Library/SecPeiDxeTimerLibCpu/X86TimerLib.c
> +++ b/MdePkg/Library/SecPeiDxeTimerLibCpu/X86TimerLib.c
> @@ -1,7 +1,7 @@
>  /** @file
>    Timer Library functions built upon local APIC on IA32/x64.
> 
> -  Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
> +  Copyright (c) 2006 - 2017, 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 @@ -13,18 +13,14 @@  **/
> 
>  #include <Base.h>
> +#include <Register/LocalApic.h>
> +#include <Library/LocalApicLib.h>
>  #include <Library/TimerLib.h>
>  #include <Library/BaseLib.h>
>  #include <Library/IoLib.h>
>  #include <Library/PcdLib.h>
>  #include <Library/DebugLib.h>
> 
> -#define APIC_SVR        0x0f0
> -#define APIC_LVTERR     0x370
> -#define APIC_TMICT      0x380
> -#define APIC_TMCCT      0x390
> -#define APIC_TDCR       0x3e0
> -
>  //
>  // The following array is used in calculating the frequency of local APIC  //
> timer. Refer to IA-32 developers' manual for more details.
> @@ -54,30 +50,21 @@ InternalX86GetApicBase (
>    VOID
>    )
>  {
> -  UINTN                             MsrValue;
>    UINTN                             ApicBase;
> 
> -  MsrValue = (UINTN) AsmReadMsr64 (27);
> -  ApicBase = MsrValue & 0xffffff000ULL;
> -
>    //
> -  // Check the APIC Global Enable bit (bit 11) in IA32_APIC_BASE MSR.
> -  // This bit will be 1, if local APIC is globally enabled.
> +  // Verify local APIC is under XAPIC mode.
>    //
> -  ASSERT ((MsrValue & BIT11) != 0);
> +  ASSERT (GetApicMode () == LOCAL_APIC_MODE_XAPIC);
> 
> -  //
> -  // Check the APIC Extended Mode bit (bit 10) in IA32_APIC_BASE MSR.
> -  // This bit will be 0, if local APIC is under XAPIC mode.
> -  //
> -  ASSERT ((MsrValue & BIT10) == 0);
> +  ApicBase = GetLocalApicBaseAddress ();
> 
>    //
>    // Check the APIC Software Enable/Disable bit (bit 8) in Spurious-Interrupt
>    // Vector Register.
>    // This bit will be 1, if local APIC is software enabled.
>    //
> -  ASSERT ((MmioRead32 (ApicBase + APIC_SVR) & BIT8) != 0);
> +  ASSERT ((MmioRead32 (ApicBase + XAPIC_SPURIOUS_VECTOR_OFFSET) &
> BIT8)
> + != 0);
> 
>    return ApicBase;
>  }
> @@ -98,7 +85,9 @@ InternalX86GetTimerFrequency (  {
>    return
>      PcdGet32(PcdFSBClock) /
> -    mTimerLibLocalApicDivisor[MmioBitFieldRead32 (ApicBase + APIC_TDCR,
> 0, 3)];
> +    mTimerLibLocalApicDivisor[
> +      MmioBitFieldRead32 (ApicBase +
> XAPIC_TIMER_DIVIDE_CONFIGURATION_OFFSET, 0, 3)
> +      ];
>  }
> 
>  /**
> @@ -115,7 +104,7 @@ InternalX86GetTimerTick (
>    IN      UINTN                     ApicBase
>    )
>  {
> -  return MmioRead32 (ApicBase + APIC_TMCCT);
> +  return MmioRead32 (ApicBase +
> XAPIC_TIMER_CURRENT_COUNT_OFFSET);
>  }
> 
>  /**
> @@ -131,7 +120,7 @@ InternalX86GetInitTimerCount (
>    IN      UINTN                     ApicBase
>    )
>  {
> -  return MmioRead32 (ApicBase + APIC_TMICT);
> +  return MmioRead32 (ApicBase + XAPIC_TIMER_INIT_COUNT_OFFSET);
>  }
> 
>  /**
> diff --git
> a/MdePkg/Library/SecPeiDxeTimerLibCpu/SecPeiDxeTimerLibCpu.inf
> b/MdePkg/Library/SecPeiDxeTimerLibCpu/SecPeiDxeTimerLibCpu.inf
> index a00ebb0eeb64..286da09db174 100644
> --- a/MdePkg/Library/SecPeiDxeTimerLibCpu/SecPeiDxeTimerLibCpu.inf
> +++ b/MdePkg/Library/SecPeiDxeTimerLibCpu/SecPeiDxeTimerLibCpu.inf
> @@ -13,7 +13,7 @@
>  # Note that for IA-32 and x64, this library only supports xAPIC mode. If
> x2APIC  # support is desired, the SecPeiDxeTimerLibUefiCpu library can be
> used.
>  #
> -# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
> +# Copyright (c) 2007 - 2017, 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 @@ -48,6 +48,7
> @@ [Sources.IPF]
> 
>  [Packages]
>    MdePkg/MdePkg.dec
> +  UefiCpuPkg/UefiCpuPkg.dec
> 
> 
>  [LibraryClasses]
> @@ -57,6 +58,7 @@ [LibraryClasses.IA32, LibraryClasses.X64]
>    PcdLib
>    IoLib
>    DebugLib
> +  LocalApicLib
> 
>  [LibraryClasses.IPF]
>    PalLib
> diff --git a/MdePkg/MdePkg.dsc b/MdePkg/MdePkg.dsc index
> 010ce533d7ea..8988d1947566 100644
> --- a/MdePkg/MdePkg.dsc
> +++ b/MdePkg/MdePkg.dsc
> @@ -35,6 +35,9 @@ [PcdsFixedAtBuild]
>  [PcdsFixedAtBuild.IPF]
>    gEfiMdePkgTokenSpaceGuid.PcdIoBlockBaseAddressForIpf|0x0ffffc000000
> 
> +[LibraryClasses]
> +
> +LocalApicLib|UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.i
> +nf
> +
> 
> ##########################################################
> #########################################
>  #
>  # Components Section - list of the modules and components that will be
> processed by compilation
> --
> 2.12.2.windows.2
> 
> _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to