EfiCpuVersion.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /** @file
  2. Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>
  3. SPDX-License-Identifier: BSD-2-Clause-Patent
  4. Module Name:
  5. EfiCpuVersion.c
  6. Abstract:
  7. Provide cpu version extract considering extended family & model ID.
  8. --*/
  9. #include <Library/CpuIA32.h>
  10. /**
  11. Extract CPU detail version infomation
  12. @param FamilyId FamilyId, including ExtendedFamilyId
  13. @param Model Model, including ExtendedModel
  14. @param SteppingId SteppingId
  15. @param Processor Processor
  16. **/
  17. VOID
  18. EFIAPI
  19. EfiCpuVersion (
  20. IN OUT UINT16 *FamilyId, OPTIONAL
  21. IN OUT UINT8 *Model, OPTIONAL
  22. IN OUT UINT8 *SteppingId, OPTIONAL
  23. IN OUT UINT8 *Processor OPTIONAL
  24. )
  25. {
  26. EFI_CPUID_REGISTER Register;
  27. UINT8 TempFamilyId;
  28. EfiCpuid (EFI_CPUID_VERSION_INFO, &Register);
  29. if (SteppingId != NULL) {
  30. *SteppingId = (UINT8) (Register.RegEax & 0xF);
  31. }
  32. if (Processor != NULL) {
  33. *Processor = (UINT8) ((Register.RegEax >> 12) & 0x3);
  34. }
  35. if (Model != NULL || FamilyId != NULL) {
  36. TempFamilyId = (UINT8) ((Register.RegEax >> 8) & 0xF);
  37. if (Model != NULL) {
  38. *Model = (UINT8) ((Register.RegEax >> 4) & 0xF);
  39. if (TempFamilyId == 0x6 || TempFamilyId == 0xF) {
  40. *Model = (UINT8) (*Model | ((Register.RegEax >> 12) & 0xF0));
  41. }
  42. }
  43. if (FamilyId != NULL) {
  44. *FamilyId = TempFamilyId;
  45. if (TempFamilyId == 0xF) {
  46. *FamilyId = (UINT8 ) (*FamilyId + (UINT16) ((Register.RegEax >> 20) & 0xFF));
  47. }
  48. }
  49. }
  50. }