/** @file
  This library defines some routines that are generic for IA32 family CPU.
  The library routines are UEFI specification compliant.
  Copyright (c) 2020, AMD Inc. All rights reserved.
  Copyright (c) 2021, Intel Corporation. All rights reserved.
  SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include 
#include 
#include 
#include 
/**
  Determine if the standard CPU signature is "AuthenticAMD".
  @retval TRUE  The CPU signature matches.
  @retval FALSE The CPU signature does not match.
**/
BOOLEAN
EFIAPI
StandardSignatureIsAuthenticAMD (
  VOID
  )
{
  UINT32  RegEbx;
  UINT32  RegEcx;
  UINT32  RegEdx;
  AsmCpuid (CPUID_SIGNATURE, NULL, &RegEbx, &RegEcx, &RegEdx);
  return (RegEbx == CPUID_SIGNATURE_AUTHENTIC_AMD_EBX &&
          RegEcx == CPUID_SIGNATURE_AUTHENTIC_AMD_ECX &&
          RegEdx == CPUID_SIGNATURE_AUTHENTIC_AMD_EDX);
}
/**
  Return the 32bit CPU family and model value.
  @return CPUID[01h].EAX with Processor Type and Stepping ID cleared.
**/
UINT32
EFIAPI
GetCpuFamilyModel (
  VOID
  )
{
  CPUID_VERSION_INFO_EAX  Eax;
  AsmCpuid (CPUID_VERSION_INFO, &Eax.Uint32, NULL, NULL, NULL);
  //
  // Mask other fields than Family and Model.
  //
  Eax.Bits.SteppingId    = 0;
  Eax.Bits.ProcessorType = 0;
  Eax.Bits.Reserved1     = 0;
  Eax.Bits.Reserved2     = 0;
  return Eax.Uint32;
}
/**
  Return the CPU stepping ID.
  @return CPU stepping ID value in CPUID[01h].EAX.
**/
UINT8
EFIAPI
GetCpuSteppingId (
  VOID
  )
{
  CPUID_VERSION_INFO_EAX  Eax;
  AsmCpuid (CPUID_VERSION_INFO, &Eax.Uint32, NULL, NULL, NULL);
  return (UINT8)Eax.Bits.SteppingId;
}