]> git.proxmox.com Git - mirror_edk2.git/blobdiff - CorebootModulePkg/Library/CbParseLib/CbParseLib.c
MdeModulePkg: RegularExpressionDxe: support free(NULL)
[mirror_edk2.git] / CorebootModulePkg / Library / CbParseLib / CbParseLib.c
index 56c8472f6caed23d4a08da4ddc3a854f6b4ddead..8509bd2f9e51013e7ffecbeae8a2713bd467b26e 100644 (file)
 \r
 #include "Coreboot.h"\r
 \r
-/* Helpful inlines */\r
 \r
-static UINT64 cb_unpack64(struct cbuint64 val)\r
+/**\r
+  Convert a packed value from cbuint64 to a UINT64 value.\r
+\r
+  @param  val      The pointer to packed data.\r
+\r
+  @return          the UNIT64 value after convertion.\r
+\r
+**/\r
+UINT64 \r
+cb_unpack64 (\r
+  IN struct cbuint64 val\r
+  )\r
 {\r
   return LShiftU64 (val.hi, 32) | val.lo;\r
 }\r
 \r
+\r
+/**\r
+  Returns the sum of all elements in a buffer of 16-bit values.  During\r
+  calculation, the carry bits are also been added.\r
+\r
+  @param  Buffer      The pointer to the buffer to carry out the sum operation.\r
+  @param  Length      The size, in bytes, of Buffer.\r
+\r
+  @return Sum         The sum of Buffer with carry bits included during additions.\r
+\r
+**/\r
 UINT16\r
 CbCheckSum16 (\r
   IN UINT16   *Buffer,\r
   IN UINTN    Length\r
   )\r
 {\r
-       UINT32 Sum, TmpValue;\r
-       UINTN  Idx;\r
-       UINT8  *TmpPtr;\r
-       \r
-       Sum = 0;\r
-       TmpPtr = (UINT8 *)Buffer;\r
-       for(Idx = 0; Idx < Length; Idx++) {\r
-               TmpValue  = TmpPtr[Idx];\r
-               if (Idx % 2 == 1) {\r
-                       TmpValue <<= 8;\r
-               }\r
-               \r
-               Sum += TmpValue;\r
-               \r
-               // Wrap\r
-               if (Sum >= 0x10000) {\r
-                       Sum = (Sum + (Sum >> 16)) & 0xFFFF;\r
-               }\r
-       }\r
-       \r
-       return (UINT16)((~Sum) & 0xFFFF);               \r
+  UINT32 Sum, TmpValue;\r
+  UINTN  Idx;\r
+  UINT8  *TmpPtr;\r
+\r
+  Sum = 0;\r
+  TmpPtr = (UINT8 *)Buffer;\r
+  for(Idx = 0; Idx < Length; Idx++) {\r
+    TmpValue  = TmpPtr[Idx];\r
+    if (Idx % 2 == 1) {\r
+      TmpValue <<= 8;\r
+    }\r
+\r
+    Sum += TmpValue;\r
+\r
+    // Wrap\r
+    if (Sum >= 0x10000) {\r
+      Sum = (Sum + (Sum >> 16)) & 0xFFFF;\r
+    }\r
+  }\r
+\r
+  return (UINT16)((~Sum) & 0xFFFF);\r
 }\r
 \r
+\r
+/**\r
+  Find coreboot record with given Tag from the memory Start in 4096\r
+  bytes range.\r
+\r
+  @param  Start              The start memory to be searched in\r
+  @param  Tag                The tag id to be found\r
+\r
+  @retval NULL              The Tag is not found.\r
+  @retval Others            The poiter to the record found.\r
+\r
+**/\r
 VOID *\r
 FindCbTag (\r
-  IN  VOID    *Start,\r
+  IN  VOID     *Start,\r
   IN  UINT32   Tag\r
   )\r
 {\r
   struct cb_header   *Header;\r
   struct cb_record   *Record;\r
-  UINT8              *TmpPtr;  \r
-  UINT8              *TagPtr;  \r
-  UINTN              Idx;  \r
+  UINT8              *TmpPtr;\r
+  UINT8              *TagPtr;\r
+  UINTN              Idx;\r
   UINT16             CheckSum;\r
-      \r
+\r
   Header = NULL;\r
   TmpPtr = (UINT8 *)Start;\r
   for (Idx = 0; Idx < 4096; Idx += 16, TmpPtr += 16) {\r
-    Header = (struct cb_header   *)TmpPtr;\r
+    Header = (struct cb_header *)TmpPtr;\r
     if (Header->signature == CB_HEADER_SIGNATURE) {\r
       break;\r
     }\r
   }\r
-  \r
-  if (Idx >= 4096)\r
-       return NULL;\r
-  \r
-  if (Header == NULL || !Header->table_bytes)\r
+\r
+  if (Idx >= 4096) {\r
+    return NULL;\r
+  }\r
+\r
+  if ((Header == NULL) || (Header->table_bytes == 0)) {\r
     return NULL;\r
-    \r
+  }\r
+\r
   //\r
   // Check the checksum of the coreboot table header\r
   //\r
   CheckSum = CbCheckSum16 ((UINT16 *)Header, sizeof (*Header));\r
   if (CheckSum != 0) {\r
-       DEBUG ((EFI_D_ERROR, "Invalid coreboot table header checksum\n"));\r
-       return NULL;\r
-  }  \r
-  \r
+    DEBUG ((EFI_D_ERROR, "Invalid coreboot table header checksum\n"));\r
+    return NULL;\r
+  }\r
+\r
   CheckSum = CbCheckSum16 ((UINT16 *)(TmpPtr + sizeof (*Header)), Header->table_bytes);\r
   if (CheckSum != Header->table_checksum) {\r
-       DEBUG ((EFI_D_ERROR, "Incorrect checksum of all the coreboot table entries\n"));\r
-       return NULL;\r
+    DEBUG ((EFI_D_ERROR, "Incorrect checksum of all the coreboot table entries\n"));\r
+    return NULL;\r
   }\r
-     \r
+\r
   TagPtr = NULL;\r
   TmpPtr += Header->header_bytes;\r
   for (Idx = 0; Idx < Header->table_entries; Idx++) {\r
-    Record = (struct cb_record *)TmpPtr;        \r
+    Record = (struct cb_record *)TmpPtr;\r
     if (Record->tag == CB_TAG_FORWARD) {\r
       TmpPtr = (VOID *)(UINTN)((struct cb_forward *)(UINTN)Record)->forward;\r
-      if (Tag == CB_TAG_FORWARD)\r
+      if (Tag == CB_TAG_FORWARD) {\r
         return TmpPtr;\r
-      else \r
+      } else {\r
         return FindCbTag (TmpPtr, Tag);\r
-    }       \r
+      }\r
+    }\r
     if (Record->tag == Tag) {\r
       TagPtr = TmpPtr;\r
       break;\r
     }\r
-    TmpPtr += Record->size;    \r
+    TmpPtr += Record->size;\r
   }\r
-    \r
+\r
   return TagPtr;\r
 }\r
 \r
+\r
+/**\r
+  Find the given table with TableId from the given coreboot memory Root.\r
+\r
+  @param  Root               The coreboot memory table to be searched in\r
+  @param  TableId            Table id to be found\r
+  @param  pMemTable          To save the base address of the memory table found\r
+  @param  pMemTableSize      To save the size of memory table found\r
+\r
+  @retval RETURN_SUCCESS            Successfully find out the memory table.\r
+  @retval RETURN_INVALID_PARAMETER  Invalid input parameters.\r
+  @retval RETURN_NOT_FOUND          Failed to find the memory table.\r
+\r
+**/\r
 RETURN_STATUS\r
-FindCbMemTable (  \r
+FindCbMemTable (\r
   IN  struct cbmem_root  *Root,\r
   IN  UINT32             TableId,\r
   OUT VOID               **pMemTable,\r
   OUT UINT32             *pMemTableSize\r
-)\r
-{      \r
+  )\r
+{\r
   UINTN                Idx;\r
   BOOLEAN              IsImdEntry;\r
   struct cbmem_entry  *Entries;\r
-       \r
+\r
   if ((Root == NULL) || (pMemTable == NULL)) {\r
     return RETURN_INVALID_PARAMETER;\r
   }\r
-               \r
   //\r
   // Check if the entry is CBMEM or IMD\r
   // and handle them separately\r
   //\r
-  Entries    = Root->entries;\r
+  Entries = Root->entries;\r
   if (Entries[0].magic == CBMEM_ENTRY_MAGIC) {\r
     IsImdEntry = FALSE;\r
   } else {\r
-    Entries    = (struct cbmem_entry *)((struct imd_root *)Root)->entries;\r
+    Entries = (struct cbmem_entry *)((struct imd_root *)Root)->entries;\r
     if (Entries[0].magic == IMD_ENTRY_MAGIC) {\r
       IsImdEntry = TRUE;\r
     } else {\r
@@ -166,13 +215,13 @@ FindCbMemTable (
       if (pMemTableSize != NULL) {\r
         *pMemTableSize = Entries[Idx].size;\r
       }\r
-       \r
+\r
       DEBUG ((EFI_D_INFO, "Find CbMemTable Id 0x%x, base %p, size 0x%x\n", TableId, *pMemTable, *pMemTableSize));\r
-       return RETURN_SUCCESS;\r
+      return RETURN_SUCCESS;\r
     }\r
   }\r
-  \r
-  return RETURN_NOT_FOUND;     \r
+\r
+  return RETURN_NOT_FOUND;\r
 }\r
 \r
 \r
@@ -189,53 +238,56 @@ FindCbMemTable (
 **/\r
 RETURN_STATUS\r
 CbParseMemoryInfo (\r
-  IN UINT64*    pLowMemorySize,\r
-  IN UINT64*    pHighMemorySize\r
+  OUT UINT64     *pLowMemorySize,\r
+  OUT UINT64     *pHighMemorySize\r
   )\r
 {\r
-       struct cb_memory*        rec;\r
-       struct cb_memory_range*  Range;\r
+  struct cb_memory         *rec;\r
+  struct cb_memory_range   *Range;\r
   UINT64                   Start;\r
   UINT64                   Size;\r
-       UINTN                    Index;\r
-       \r
-       if ((!pLowMemorySize) || (!pHighMemorySize))\r
-               return RETURN_INVALID_PARAMETER;\r
-       \r
-       //\r
-       // Get the coreboot memory table\r
-       //\r
-       rec = (struct cb_memory *)FindCbTag (0, CB_TAG_MEMORY);\r
-       if (!rec) \r
-         rec = (struct cb_memory *)FindCbTag ((VOID *)(UINTN)PcdGet32 (PcdCbHeaderPointer), CB_TAG_MEMORY);\r
-               \r
-       if (!rec) \r
-               return RETURN_NOT_FOUND;\r
-               \r
-       *pLowMemorySize = 0;\r
-       *pHighMemorySize = 0;\r
-               \r
-       for (Index = 0; Index < MEM_RANGE_COUNT(rec); Index++) {\r
-    Range = MEM_RANGE_PTR(rec, Index);    \r
+  UINTN                    Index;\r
+\r
+  if ((pLowMemorySize == NULL) || (pHighMemorySize == NULL)) {\r
+    return RETURN_INVALID_PARAMETER;\r
+  }\r
+\r
+  //\r
+  // Get the coreboot memory table\r
+  //\r
+  rec = (struct cb_memory *)FindCbTag (0, CB_TAG_MEMORY);\r
+  if (rec == NULL) {\r
+    rec = (struct cb_memory *)FindCbTag ((VOID *)(UINTN)PcdGet32 (PcdCbHeaderPointer), CB_TAG_MEMORY);\r
+  }\r
+\r
+  if (rec == NULL) {\r
+    return RETURN_NOT_FOUND;\r
+  }\r
+\r
+  *pLowMemorySize = 0;\r
+  *pHighMemorySize = 0;\r
+\r
+  for (Index = 0; Index < MEM_RANGE_COUNT(rec); Index++) {\r
+    Range = MEM_RANGE_PTR(rec, Index);\r
     Start = cb_unpack64(Range->start);\r
     Size = cb_unpack64(Range->size);\r
-    DEBUG ((EFI_D_ERROR, "%d. %016lx - %016lx [%02x]\n",\r
-      Index, Start, Start + Size - 1, Range->type));\r
-    \r
+    DEBUG ((EFI_D_INFO, "%d. %016lx - %016lx [%02x]\n",\r
+            Index, Start, Start + Size - 1, Range->type));\r
+\r
     if (Range->type != CB_MEM_RAM) {\r
       continue;\r
     }\r
-      \r
+\r
     if (Start + Size < 0x100000000ULL) {\r
       *pLowMemorySize = Start + Size;\r
-    } else {      \r
+    } else {\r
       *pHighMemorySize = Start + Size - 0x100000000ULL;\r
     }\r
   }\r
-  \r
-  DEBUG ((EFI_D_ERROR, "Low memory 0x%lx, High Memory 0x%lx\n", *pLowMemorySize, *pHighMemorySize));\r
-  \r
-  return RETURN_SUCCESS;       \r
+\r
+  DEBUG ((EFI_D_INFO, "Low memory 0x%lx, High Memory 0x%lx\n", *pLowMemorySize, *pHighMemorySize));\r
+\r
+  return RETURN_SUCCESS;\r
 }\r
 \r
 \r
@@ -253,44 +305,46 @@ CbParseMemoryInfo (
 **/\r
 RETURN_STATUS\r
 CbParseCbMemTable (\r
-  IN UINT32     TableId, \r
-  IN VOID**     pMemTable,\r
-  IN UINT32*    pMemTableSize\r
+  IN  UINT32     TableId,\r
+  OUT VOID       **pMemTable,\r
+  OUT UINT32     *pMemTableSize\r
   )\r
 {\r
-       struct cb_memory*        rec;\r
-       struct cb_memory_range*  Range;\r
+  struct cb_memory         *rec;\r
+  struct cb_memory_range   *Range;\r
   UINT64                   Start;\r
   UINT64                   Size;\r
-       UINTN                    Index;\r
-       \r
-       if (!pMemTable)\r
-               return RETURN_INVALID_PARAMETER;\r
-               \r
-       *pMemTable = NULL;\r
-       \r
-       //\r
-       // Get the coreboot memory table\r
-       //\r
-       rec = (struct cb_memory *)FindCbTag (0, CB_TAG_MEMORY);\r
-       if (!rec)\r
-               rec = (struct cb_memory *)FindCbTag ((VOID *)(UINTN)PcdGet32 (PcdCbHeaderPointer), CB_TAG_MEMORY);\r
-               \r
-       if (!rec)\r
-               return RETURN_NOT_FOUND;\r
-               \r
-       for (Index = 0; Index < MEM_RANGE_COUNT(rec); Index++) {\r
-    Range = MEM_RANGE_PTR(rec, Index);    \r
+  UINTN                    Index;\r
+\r
+  if (pMemTable == NULL) {\r
+    return RETURN_INVALID_PARAMETER;\r
+  }\r
+  *pMemTable = NULL;\r
+\r
+  //\r
+  // Get the coreboot memory table\r
+  //\r
+  rec = (struct cb_memory *)FindCbTag (0, CB_TAG_MEMORY);\r
+  if (rec == NULL) {\r
+    rec = (struct cb_memory *)FindCbTag ((VOID *)(UINTN)PcdGet32 (PcdCbHeaderPointer), CB_TAG_MEMORY);\r
+  }\r
+\r
+  if (rec == NULL) {\r
+    return RETURN_NOT_FOUND;\r
+  }\r
+\r
+  for (Index = 0; Index < MEM_RANGE_COUNT(rec); Index++) {\r
+    Range = MEM_RANGE_PTR(rec, Index);\r
     Start = cb_unpack64(Range->start);\r
     Size = cb_unpack64(Range->size);\r
-    \r
+\r
     if ((Range->type == CB_MEM_TABLE) && (Start > 0x1000)) {\r
-        if (FindCbMemTable ((struct  cbmem_root *)(UINTN)(Start + Size - DYN_CBMEM_ALIGN_SIZE), TableId, pMemTable, pMemTableSize) == RETURN_SUCCESS)\r
-               return RETURN_SUCCESS;\r
+      if (FindCbMemTable ((struct  cbmem_root *)(UINTN)(Start + Size - DYN_CBMEM_ALIGN_SIZE), TableId, pMemTable, pMemTableSize) == RETURN_SUCCESS)\r
+        return RETURN_SUCCESS;\r
     }\r
   }\r
-       \r
-       return RETURN_NOT_FOUND;\r
+\r
+  return RETURN_NOT_FOUND;\r
 }\r
 \r
 \r
@@ -307,11 +361,11 @@ CbParseCbMemTable (
 **/\r
 RETURN_STATUS\r
 CbParseAcpiTable (\r
-  IN VOID*      pMemTable,\r
-  IN UINT32*    pMemTableSize\r
+  OUT VOID       **pMemTable,\r
+  OUT UINT32     *pMemTableSize\r
   )\r
 {\r
-       return CbParseCbMemTable (SIGNATURE_32 ('I', 'P', 'C', 'A'), (VOID **)pMemTable, pMemTableSize);        \r
+  return CbParseCbMemTable (SIGNATURE_32 ('I', 'P', 'C', 'A'), pMemTable, pMemTableSize);\r
 }\r
 \r
 /**\r
@@ -327,11 +381,11 @@ CbParseAcpiTable (
 **/\r
 RETURN_STATUS\r
 CbParseSmbiosTable (\r
-  IN VOID**     pMemTable,\r
-  IN UINT32*    pMemTableSize\r
+  OUT VOID       **pMemTable,\r
+  OUT UINT32     *pMemTableSize\r
   )\r
 {\r
-       return CbParseCbMemTable (SIGNATURE_32 ('T', 'B', 'M', 'S'), pMemTable, pMemTableSize); \r
+  return CbParseCbMemTable (SIGNATURE_32 ('T', 'B', 'M', 'S'), pMemTable, pMemTableSize);\r
 }\r
 \r
 /**\r
@@ -341,6 +395,8 @@ CbParseSmbiosTable (
   @param  pPmTimerReg        Pointer to the address of power management timer register\r
   @param  pResetReg          Pointer to the address of system reset register\r
   @param  pResetValue        Pointer to the value to be writen to the system reset register\r
+  @param  pPmEvtReg          Pointer to the address of power management event register\r
+  @param  pPmGpeEnReg        Pointer to the address of power management GPE enable register\r
 \r
   @retval RETURN_SUCCESS     Successfully find out all the required fadt information.\r
   @retval RETURN_NOT_FOUND   Failed to find the fadt table.\r
@@ -348,99 +404,126 @@ CbParseSmbiosTable (
 **/\r
 RETURN_STATUS\r
 CbParseFadtInfo (\r
-  IN UINTN*     pPmCtrlReg,\r
-  IN UINTN*     pPmTimerReg,\r
-  IN UINTN*     pResetReg,\r
-  IN UINTN*     pResetValue\r
+  OUT UINTN      *pPmCtrlReg,\r
+  OUT UINTN      *pPmTimerReg,\r
+  OUT UINTN      *pResetReg,\r
+  OUT UINTN      *pResetValue,\r
+  OUT UINTN      *pPmEvtReg,\r
+  OUT UINTN      *pPmGpeEnReg\r
   )\r
 {\r
-       EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER* Rsdp;\r
-       EFI_ACPI_DESCRIPTION_HEADER*                  Rsdt;\r
-  UINT32*                                       Entry32;\r
+  EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER  *Rsdp;\r
+  EFI_ACPI_DESCRIPTION_HEADER                   *Rsdt;\r
+  UINT32                                        *Entry32;\r
   UINTN                                         Entry32Num;\r
-  EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE*    Fadt;\r
-  EFI_ACPI_DESCRIPTION_HEADER*                  Xsdt; \r
-  UINT64*                                       Entry64;\r
+  EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE     *Fadt;\r
+  EFI_ACPI_DESCRIPTION_HEADER                   *Xsdt;\r
+  UINT64                                        *Entry64;\r
   UINTN                                         Entry64Num;\r
-       UINTN                                         Idx;\r
-       RETURN_STATUS                                 Status;\r
-       \r
-       Rsdp = NULL;\r
-       Status = RETURN_SUCCESS;\r
-       \r
-       Status = CbParseAcpiTable (&Rsdp, NULL);\r
-       if (RETURN_ERROR(Status))\r
-               return Status;\r
-               \r
-       if (!Rsdp)\r
-               return RETURN_NOT_FOUND;\r
-               \r
-       DEBUG ((EFI_D_ERROR, "Find Rsdp at %p\n", Rsdp));\r
-       DEBUG ((EFI_D_ERROR, "Find Rsdt 0x%x, Xsdt 0x%lx\n", Rsdp->RsdtAddress, Rsdp->XsdtAddress));\r
-       \r
-       //\r
-       // Search Rsdt First\r
-       //\r
-       Rsdt     = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->RsdtAddress);  \r
-       if (Rsdt != NULL) {\r
-         Entry32  = (UINT32 *)(Rsdt + 1);\r
-         Entry32Num = (Rsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 2;\r
-         for (Idx = 0; Idx < Entry32Num; Idx++) {\r
-           if (*(UINT32 *)(UINTN)(Entry32[Idx]) == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
-             Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)(UINTN)(Entry32[Idx]);  \r
-             if (pPmCtrlReg)\r
-               *pPmCtrlReg = Fadt->Pm1aCntBlk;         \r
-             DEBUG ((EFI_D_ERROR, "PmCtrl Reg 0x%x\n", Fadt->Pm1aCntBlk));\r
-               \r
-             if (pPmTimerReg)   \r
-               *pPmTimerReg = Fadt->PmTmrBlk; \r
-             DEBUG ((EFI_D_ERROR, "PmTimer Reg 0x%x\n", Fadt->PmTmrBlk));\r
-               \r
-             if (pResetReg)   \r
-               *pResetReg = (UINTN)Fadt->ResetReg.Address; \r
-             DEBUG ((EFI_D_ERROR, "Reset Reg 0x%lx\n", Fadt->ResetReg.Address));\r
-               \r
-             if (pResetValue)   \r
-               *pResetValue = Fadt->ResetValue;\r
-             DEBUG ((EFI_D_ERROR, "Reset Value 0x%x\n", Fadt->ResetValue));\r
-                                \r
-             return RETURN_SUCCESS;        \r
-           }\r
-         }\r
-       }\r
-       \r
-       //\r
-       // Search Xsdt Second\r
-       //\r
-       Xsdt     = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->XsdtAddress);  \r
-       if (Xsdt != NULL) {\r
-         Entry64  = (UINT64 *)(Xsdt + 1);\r
-         Entry64Num = (Xsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 3;\r
-         for (Idx = 0; Idx < Entry64Num; Idx++) {\r
-           if (*(UINT32 *)(UINTN)(Entry64[Idx]) == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
-             Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)(UINTN)(Entry64[Idx]);  \r
-             if (pPmCtrlReg)\r
-               *pPmCtrlReg = Fadt->Pm1aCntBlk;         \r
-             DEBUG ((EFI_D_ERROR, "PmCtrl Reg 0x%x\n", Fadt->Pm1aCntBlk));\r
-               \r
-             if (pPmTimerReg)   \r
-               *pPmTimerReg = Fadt->PmTmrBlk; \r
-             DEBUG ((EFI_D_ERROR, "PmTimer Reg 0x%x\n", Fadt->PmTmrBlk));\r
-               \r
-             if (pResetReg)   \r
-               *pResetReg = (UINTN)Fadt->ResetReg.Address; \r
-             DEBUG ((EFI_D_ERROR, "Reset Reg 0x%lx\n", Fadt->ResetReg.Address));\r
-               \r
-             if (pResetValue)   \r
-               *pResetValue = Fadt->ResetValue;\r
-             DEBUG ((EFI_D_ERROR, "Reset Value 0x%x\n", Fadt->ResetValue));\r
-                                \r
-             return RETURN_SUCCESS;        \r
-           }\r
-         }\r
-       }       \r
-       \r
-       return RETURN_NOT_FOUND;\r
+  UINTN                                         Idx;\r
+  RETURN_STATUS                                 Status;\r
+\r
+  Rsdp = NULL;\r
+  Status = RETURN_SUCCESS;\r
+\r
+  Status = CbParseAcpiTable ((VOID **)&Rsdp, NULL);\r
+  if (RETURN_ERROR(Status)) {\r
+    return Status;\r
+  }\r
+\r
+  if (Rsdp == NULL) {\r
+    return RETURN_NOT_FOUND;\r
+  }\r
+\r
+  DEBUG ((EFI_D_INFO, "Find Rsdp at %p\n", Rsdp));\r
+  DEBUG ((EFI_D_INFO, "Find Rsdt 0x%x, Xsdt 0x%lx\n", Rsdp->RsdtAddress, Rsdp->XsdtAddress));\r
+\r
+  //\r
+  // Search Rsdt First\r
+  //\r
+  Rsdt     = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->RsdtAddress);\r
+  if (Rsdt != NULL) {\r
+    Entry32  = (UINT32 *)(Rsdt + 1);\r
+    Entry32Num = (Rsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 2;\r
+    for (Idx = 0; Idx < Entry32Num; Idx++) {\r
+      if (*(UINT32 *)(UINTN)(Entry32[Idx]) == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
+        Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)(UINTN)(Entry32[Idx]);\r
+        if (pPmCtrlReg != NULL) {\r
+          *pPmCtrlReg = Fadt->Pm1aCntBlk;\r
+        }\r
+        DEBUG ((EFI_D_INFO, "PmCtrl Reg 0x%x\n", Fadt->Pm1aCntBlk));\r
+\r
+        if (pPmTimerReg != NULL) {\r
+          *pPmTimerReg = Fadt->PmTmrBlk;\r
+        }\r
+        DEBUG ((EFI_D_INFO, "PmTimer Reg 0x%x\n", Fadt->PmTmrBlk));\r
+\r
+        if (pResetReg != NULL) {\r
+          *pResetReg = (UINTN)Fadt->ResetReg.Address;\r
+        }\r
+        DEBUG ((EFI_D_INFO, "Reset Reg 0x%lx\n", Fadt->ResetReg.Address));\r
+\r
+        if (pResetValue != NULL) {\r
+          *pResetValue = Fadt->ResetValue;\r
+        }\r
+        DEBUG ((EFI_D_INFO, "Reset Value 0x%x\n", Fadt->ResetValue));\r
+\r
+        if (pPmEvtReg != NULL) {   \r
+          *pPmEvtReg = Fadt->Pm1aEvtBlk;\r
+          DEBUG ((EFI_D_INFO, "PmEvt Reg 0x%x\n", Fadt->Pm1aEvtBlk));\r
+        }\r
+\r
+        if (pPmGpeEnReg != NULL) {   \r
+          *pPmGpeEnReg = Fadt->Gpe0Blk + Fadt->Gpe0BlkLen / 2;\r
+          DEBUG ((EFI_D_INFO, "PmGpeEn Reg 0x%x\n", *pPmGpeEnReg));\r
+        }\r
+\r
+        return RETURN_SUCCESS;\r
+      }\r
+    }\r
+  }\r
+\r
+  //\r
+  // Search Xsdt Second\r
+  //\r
+  Xsdt     = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->XsdtAddress);\r
+  if (Xsdt != NULL) {\r
+    Entry64  = (UINT64 *)(Xsdt + 1);\r
+    Entry64Num = (Xsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 3;\r
+    for (Idx = 0; Idx < Entry64Num; Idx++) {\r
+      if (*(UINT32 *)(UINTN)(Entry64[Idx]) == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
+        Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)(UINTN)(Entry64[Idx]);\r
+        if (pPmCtrlReg)\r
+          *pPmCtrlReg = Fadt->Pm1aCntBlk;\r
+        DEBUG ((EFI_D_ERROR, "PmCtrl Reg 0x%x\n", Fadt->Pm1aCntBlk));\r
+\r
+        if (pPmTimerReg)\r
+          *pPmTimerReg = Fadt->PmTmrBlk;\r
+        DEBUG ((EFI_D_ERROR, "PmTimer Reg 0x%x\n", Fadt->PmTmrBlk));\r
+\r
+        if (pResetReg)\r
+          *pResetReg = (UINTN)Fadt->ResetReg.Address;\r
+        DEBUG ((EFI_D_ERROR, "Reset Reg 0x%lx\n", Fadt->ResetReg.Address));\r
+\r
+        if (pResetValue)\r
+          *pResetValue = Fadt->ResetValue;\r
+        DEBUG ((EFI_D_ERROR, "Reset Value 0x%x\n", Fadt->ResetValue));\r
+\r
+        if (pPmEvtReg != NULL) {   \r
+          *pPmEvtReg = Fadt->Pm1aEvtBlk;\r
+           DEBUG ((EFI_D_INFO, "PmEvt Reg 0x%x\n", Fadt->Pm1aEvtBlk));\r
+        }\r
+\r
+        if (pPmGpeEnReg != NULL) {   \r
+          *pPmGpeEnReg = Fadt->Gpe0Blk + Fadt->Gpe0BlkLen / 2;\r
+          DEBUG ((EFI_D_INFO, "PmGpeEn Reg 0x%x\n", *pPmGpeEnReg));\r
+        }        \r
+        return RETURN_SUCCESS;\r
+      }\r
+    }\r
+  }\r
+\r
+  return RETURN_NOT_FOUND;\r
 }\r
 \r
 /**\r
@@ -456,30 +539,35 @@ CbParseFadtInfo (
 **/\r
 RETURN_STATUS\r
 CbParseSerialInfo (\r
-  IN UINT32*     pRegBase,\r
-  IN UINT32*     pRegAccessType,\r
-  IN UINT32*     pBaudrate\r
+  OUT UINT32      *pRegBase,\r
+  OUT UINT32      *pRegAccessType,\r
+  OUT UINT32      *pBaudrate\r
   )\r
 {\r
-       struct cb_serial*   CbSerial;\r
-       \r
-       CbSerial = FindCbTag (0, CB_TAG_SERIAL);\r
-       if (!CbSerial)\r
-               CbSerial = FindCbTag ((VOID *)(UINTN)PcdGet32 (PcdCbHeaderPointer), CB_TAG_SERIAL);\r
-       \r
-       if (!CbSerial)\r
-               return RETURN_NOT_FOUND;\r
-               \r
-       if (pRegBase)\r
-               *pRegBase = CbSerial->baseaddr;\r
-               \r
-       if (pRegAccessType)\r
-               *pRegAccessType = CbSerial->type;\r
-               \r
-       if (pBaudrate)\r
-               *pBaudrate = CbSerial->baud;\r
-                       \r
-       return RETURN_SUCCESS;\r
+  struct cb_serial    *CbSerial;\r
+\r
+  CbSerial = FindCbTag (0, CB_TAG_SERIAL);\r
+  if (CbSerial == NULL) {\r
+    CbSerial = FindCbTag ((VOID *)(UINTN)PcdGet32 (PcdCbHeaderPointer), CB_TAG_SERIAL);\r
+  }\r
+\r
+  if (CbSerial == NULL) {\r
+    return RETURN_NOT_FOUND;\r
+  }\r
+\r
+  if (pRegBase != NULL) {\r
+    *pRegBase = CbSerial->baseaddr;\r
+  }\r
+\r
+  if (pRegAccessType != NULL) {\r
+    *pRegAccessType = CbSerial->type;\r
+  }\r
+\r
+  if (pBaudrate != NULL) {\r
+    *pBaudrate = CbSerial->baud;\r
+  }\r
+\r
+  return RETURN_SUCCESS;\r
 }\r
 \r
 /**\r
@@ -494,29 +582,31 @@ CbParseSerialInfo (
 **/\r
 RETURN_STATUS\r
 CbParseGetCbHeader (\r
-  IN UINTN  Level,\r
-  IN VOID** HeaderPtr\r
+  IN  UINTN  Level,\r
+  OUT VOID   **HeaderPtr\r
   )\r
 {\r
-       UINTN Index;\r
-       VOID* TempPtr;\r
-       \r
-       if (!HeaderPtr)\r
-               return RETURN_NOT_FOUND;\r
-       \r
-       TempPtr = NULL; \r
-       for (Index = 0; Index < Level; Index++) {\r
-               TempPtr = FindCbTag (TempPtr, CB_TAG_FORWARD);\r
-               if (!TempPtr)\r
-                       break;          \r
-       }\r
-       \r
-       if ((Index >= Level) && (TempPtr != NULL)) {\r
-               *HeaderPtr = TempPtr;\r
-               return RETURN_SUCCESS;\r
-       }\r
-       \r
-       return RETURN_NOT_FOUND;\r
+  UINTN Index;\r
+  VOID  *TempPtr;\r
+\r
+  if (HeaderPtr == NULL) {\r
+    return RETURN_NOT_FOUND;\r
+  }\r
+\r
+  TempPtr = NULL;\r
+  for (Index = 0; Index < Level; Index++) {\r
+    TempPtr = FindCbTag (TempPtr, CB_TAG_FORWARD);\r
+    if (TempPtr == NULL) {\r
+      break;\r
+    }\r
+  }\r
+\r
+  if ((Index >= Level) && (TempPtr != NULL)) {\r
+    *HeaderPtr = TempPtr;\r
+    return RETURN_SUCCESS;\r
+  }\r
+\r
+  return RETURN_NOT_FOUND;\r
 }\r
 \r
 /**\r
@@ -530,38 +620,41 @@ CbParseGetCbHeader (
 **/\r
 RETURN_STATUS\r
 CbParseFbInfo (\r
-  IN FRAME_BUFFER_INFO*     pFbInfo\r
+  OUT FRAME_BUFFER_INFO       *pFbInfo\r
   )\r
 {\r
-       struct cb_framebuffer*   CbFbRec;\r
-       \r
-       if (!pFbInfo)\r
-               return RETURN_INVALID_PARAMETER;\r
-       \r
-       CbFbRec = FindCbTag (0, CB_TAG_FRAMEBUFFER);\r
-       if (!CbFbRec)\r
-               CbFbRec = FindCbTag ((VOID *)(UINTN)PcdGet32 (PcdCbHeaderPointer), CB_TAG_FRAMEBUFFER);\r
-       \r
-       if (!CbFbRec)\r
-               return RETURN_NOT_FOUND;\r
-               \r
-  DEBUG ((EFI_D_ERROR, "Found coreboot video frame buffer information\n"));\r
-  DEBUG ((EFI_D_ERROR, "physical_address: 0x%lx\n", CbFbRec->physical_address));\r
-  DEBUG ((EFI_D_ERROR, "x_resolution: 0x%x\n", CbFbRec->x_resolution));\r
-  DEBUG ((EFI_D_ERROR, "y_resolution: 0x%x\n", CbFbRec->y_resolution));\r
-  DEBUG ((EFI_D_ERROR, "bits_per_pixel: 0x%x\n", CbFbRec->bits_per_pixel));\r
-  DEBUG ((EFI_D_ERROR, "bytes_per_line: 0x%x\n", CbFbRec->bytes_per_line));\r
-  \r
-  DEBUG ((EFI_D_ERROR, "red_mask_size: 0x%x\n", CbFbRec->red_mask_size));\r
-  DEBUG ((EFI_D_ERROR, "red_mask_pos: 0x%x\n", CbFbRec->red_mask_pos));\r
-  DEBUG ((EFI_D_ERROR, "green_mask_size: 0x%x\n", CbFbRec->green_mask_size));\r
-  DEBUG ((EFI_D_ERROR, "green_mask_pos: 0x%x\n", CbFbRec->green_mask_pos));\r
-  DEBUG ((EFI_D_ERROR, "blue_mask_size: 0x%x\n", CbFbRec->blue_mask_size));\r
-  DEBUG ((EFI_D_ERROR, "blue_mask_pos: 0x%x\n", CbFbRec->blue_mask_pos));\r
-  DEBUG ((EFI_D_ERROR, "reserved_mask_size: 0x%x\n", CbFbRec->reserved_mask_size));\r
-  DEBUG ((EFI_D_ERROR, "reserved_mask_pos: 0x%x\n", CbFbRec->reserved_mask_pos));\r
-       \r
-  pFbInfo->LinearFrameBuffer    = CbFbRec->physical_address;  \r
+  struct cb_framebuffer       *CbFbRec;\r
+\r
+  if (pFbInfo == NULL) {\r
+    return RETURN_INVALID_PARAMETER;\r
+  }\r
+\r
+  CbFbRec = FindCbTag (0, CB_TAG_FRAMEBUFFER);\r
+  if (CbFbRec == NULL) {\r
+    CbFbRec = FindCbTag ((VOID *)(UINTN)PcdGet32 (PcdCbHeaderPointer), CB_TAG_FRAMEBUFFER);\r
+  }\r
+\r
+  if (CbFbRec == NULL) {\r
+    return RETURN_NOT_FOUND;\r
+  }\r
+\r
+  DEBUG ((EFI_D_INFO, "Found coreboot video frame buffer information\n"));\r
+  DEBUG ((EFI_D_INFO, "physical_address: 0x%lx\n", CbFbRec->physical_address));\r
+  DEBUG ((EFI_D_INFO, "x_resolution: 0x%x\n", CbFbRec->x_resolution));\r
+  DEBUG ((EFI_D_INFO, "y_resolution: 0x%x\n", CbFbRec->y_resolution));\r
+  DEBUG ((EFI_D_INFO, "bits_per_pixel: 0x%x\n", CbFbRec->bits_per_pixel));\r
+  DEBUG ((EFI_D_INFO, "bytes_per_line: 0x%x\n", CbFbRec->bytes_per_line));\r
+\r
+  DEBUG ((EFI_D_INFO, "red_mask_size: 0x%x\n", CbFbRec->red_mask_size));\r
+  DEBUG ((EFI_D_INFO, "red_mask_pos: 0x%x\n", CbFbRec->red_mask_pos));\r
+  DEBUG ((EFI_D_INFO, "green_mask_size: 0x%x\n", CbFbRec->green_mask_size));\r
+  DEBUG ((EFI_D_INFO, "green_mask_pos: 0x%x\n", CbFbRec->green_mask_pos));\r
+  DEBUG ((EFI_D_INFO, "blue_mask_size: 0x%x\n", CbFbRec->blue_mask_size));\r
+  DEBUG ((EFI_D_INFO, "blue_mask_pos: 0x%x\n", CbFbRec->blue_mask_pos));\r
+  DEBUG ((EFI_D_INFO, "reserved_mask_size: 0x%x\n", CbFbRec->reserved_mask_size));\r
+  DEBUG ((EFI_D_INFO, "reserved_mask_pos: 0x%x\n", CbFbRec->reserved_mask_pos));\r
+\r
+  pFbInfo->LinearFrameBuffer    = CbFbRec->physical_address;\r
   pFbInfo->HorizontalResolution = CbFbRec->x_resolution;\r
   pFbInfo->VerticalResolution   = CbFbRec->y_resolution;\r
   pFbInfo->BitsPerPixel         = CbFbRec->bits_per_pixel;\r
@@ -573,9 +666,8 @@ CbParseFbInfo (
   pFbInfo->Blue.Mask            = (1 << CbFbRec->blue_mask_size) - 1;\r
   pFbInfo->Blue.Position        = CbFbRec->blue_mask_pos;\r
   pFbInfo->Reserved.Mask        = (1 << CbFbRec->reserved_mask_size) - 1;\r
-  pFbInfo->Reserved.Position    = CbFbRec->reserved_mask_pos;  \r
-                       \r
-       return RETURN_SUCCESS;\r
-}\r
+  pFbInfo->Reserved.Position    = CbFbRec->reserved_mask_pos;\r
 \r
+  return RETURN_SUCCESS;\r
+}\r
 \r