Home | History | Annotate | Download | only in CpuIA32Lib
      1 /** @file
      2 
      3   Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
      4 
      5   This program and the accompanying materials are licensed and made available under
      7   the terms and conditions of the BSD License that accompanies this distribution.
      9   The full text of the license may be found at
     11   http://opensource.org/licenses/bsd-license.php.
     13 
     15   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     17   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     19 
     21 
     23 Module Name:
     24 
     25 
     26   EfiCpuVersion.c
     27 
     28 Abstract:
     29 
     30   Provide cpu version extract considering extended family & model ID.
     31 --*/
     32 
     33 #include <Library/CpuIA32.h>
     34 
     35 /**
     36   Extract CPU detail version infomation
     37 
     38   @param  FamilyId    FamilyId, including ExtendedFamilyId
     39   @param  Model       Model, including ExtendedModel
     40   @param  SteppingId  SteppingId
     41   @param  Processor   Processor
     42 
     43 **/
     44 VOID
     45 EFIAPI
     46 EfiCpuVersion (
     47   IN  OUT UINT16  *FamilyId,    OPTIONAL
     48   IN  OUT UINT8   *Model,       OPTIONAL
     49   IN  OUT UINT8   *SteppingId,  OPTIONAL
     50   IN  OUT UINT8   *Processor    OPTIONAL
     51   )
     52 
     53 {
     54   EFI_CPUID_REGISTER Register;
     55   UINT8              TempFamilyId;
     56 
     57   EfiCpuid (EFI_CPUID_VERSION_INFO, &Register);
     58 
     59   if (SteppingId != NULL) {
     60     *SteppingId = (UINT8) (Register.RegEax & 0xF);
     61   }
     62 
     63   if (Processor != NULL) {
     64     *Processor = (UINT8) ((Register.RegEax >> 12) & 0x3);
     65   }
     66 
     67   if (Model != NULL || FamilyId != NULL) {
     68     TempFamilyId = (UINT8) ((Register.RegEax >> 8) & 0xF);
     69 
     70     if (Model != NULL) {
     71       *Model = (UINT8) ((Register.RegEax >> 4) & 0xF);
     72       if (TempFamilyId == 0x6 || TempFamilyId == 0xF) {
     73         *Model = (UINT8) (*Model  | ((Register.RegEax >> 12) & 0xF0));
     74       }
     75     }
     76 
     77     if (FamilyId != NULL) {
     78       *FamilyId = TempFamilyId;
     79       if (TempFamilyId == 0xF) {
     80         *FamilyId = (UINT8 ) (*FamilyId + (UINT16) ((Register.RegEax >> 20) & 0xFF));
     81       }
     82     }
     83   }
     84 }
     85