]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacyBios.c
EmbeddedPkg: Removing ipf which is no longer supported from edk2.
[mirror_edk2.git] / IntelFrameworkModulePkg / Csm / LegacyBiosDxe / LegacyBios.c
index 99a76c9f21acdd7b12f340621615c91122af8104..8f14687b28335988844407e9e5fb3dd10afa80d0 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
 /** @file\r
 \r
-Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
 \r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions\r
 \r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions\r
@@ -29,11 +29,24 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 //\r
 LEGACY_BIOS_INSTANCE  mPrivateData;\r
 \r
 //\r
 LEGACY_BIOS_INSTANCE  mPrivateData;\r
 \r
+//\r
+// The SMBIOS table in EfiRuntimeServicesData memory\r
+//\r
+VOID                  *mRuntimeSmbiosEntryPoint = NULL;\r
+\r
+//\r
+// The SMBIOS table in EfiReservedMemoryType memory\r
+//\r
+EFI_PHYSICAL_ADDRESS  mReserveSmbiosEntryPoint = 0;\r
+EFI_PHYSICAL_ADDRESS  mStructureTableAddress   = 0;\r
+UINTN                 mStructureTablePages     = 0;\r
+BOOLEAN               mEndOfDxe                = FALSE;\r
+\r
 /**\r
 /**\r
-  Do an AllocatePages () of type AllocateMaxAddress for EfiBootServicesCode\r
-  memory.\r
+  Allocate memory for legacy usage.\r
 \r
 \r
-  @param  AllocateType               Allocated Legacy Memory Type\r
+  @param  AllocateType               The type of allocation to perform.\r
+  @param  MemoryType                 The type of memory to allocate.\r
   @param  StartPageAddress           Start address of range\r
   @param  Pages                      Number of pages to allocate\r
   @param  Result                     Result of allocation\r
   @param  StartPageAddress           Start address of range\r
   @param  Pages                      Number of pages to allocate\r
   @param  Result                     Result of allocation\r
@@ -45,6 +58,7 @@ LEGACY_BIOS_INSTANCE  mPrivateData;
 EFI_STATUS\r
 AllocateLegacyMemory (\r
   IN  EFI_ALLOCATE_TYPE         AllocateType,\r
 EFI_STATUS\r
 AllocateLegacyMemory (\r
   IN  EFI_ALLOCATE_TYPE         AllocateType,\r
+  IN  EFI_MEMORY_TYPE           MemoryType,\r
   IN  EFI_PHYSICAL_ADDRESS      StartPageAddress,\r
   IN  UINTN                     Pages,\r
   OUT EFI_PHYSICAL_ADDRESS      *Result\r
   IN  EFI_PHYSICAL_ADDRESS      StartPageAddress,\r
   IN  UINTN                     Pages,\r
   OUT EFI_PHYSICAL_ADDRESS      *Result\r
@@ -59,7 +73,7 @@ AllocateLegacyMemory (
   MemPage = (EFI_PHYSICAL_ADDRESS) (UINTN) StartPageAddress;\r
   Status = gBS->AllocatePages (\r
                   AllocateType,\r
   MemPage = (EFI_PHYSICAL_ADDRESS) (UINTN) StartPageAddress;\r
   Status = gBS->AllocatePages (\r
                   AllocateType,\r
-                  EfiBootServicesCode,\r
+                  MemoryType,\r
                   Pages,\r
                   &MemPage\r
                   );\r
                   Pages,\r
                   &MemPage\r
                   );\r
@@ -132,7 +146,7 @@ LegacyBiosGetLegacyRegion (
      );\r
 \r
   if (Regs.X.AX == 0) {\r
      );\r
 \r
   if (Regs.X.AX == 0) {\r
-    *LegacyMemoryAddress  = (VOID *) (UINTN) ((Regs.X.DS << 4) + Regs.X.BX);\r
+    *LegacyMemoryAddress  = (VOID *) (((UINTN) Regs.X.DS << 4) + Regs.X.BX);\r
     Status = EFI_SUCCESS;\r
   } else {\r
     Status = EFI_OUT_OF_RESOURCES;\r
     Status = EFI_SUCCESS;\r
   } else {\r
     Status = EFI_OUT_OF_RESOURCES;\r
@@ -257,7 +271,7 @@ ShadowAndStartLegacy16 (
     if (EFI_ERROR (Status)) {\r
       //\r
       // Bugbug: need to figure out whether C/D/E/F segment should be marked as reserved memory.\r
     if (EFI_ERROR (Status)) {\r
       //\r
       // Bugbug: need to figure out whether C/D/E/F segment should be marked as reserved memory.\r
-      // \r
+      //\r
       DEBUG ((DEBUG_ERROR, "Failed to allocate the C/D/E/F segment Status = %r", Status));\r
     }\r
   }\r
       DEBUG ((DEBUG_ERROR, "Failed to allocate the C/D/E/F segment Status = %r", Status));\r
     }\r
   }\r
@@ -401,7 +415,7 @@ ShadowAndStartLegacy16 (
   Private->Legacy8259->GetMask(Private->Legacy8259, &OldMask, NULL, NULL, NULL);\r
   NewMask = 0xFFFF;\r
   Private->Legacy8259->SetMask(Private->Legacy8259, &NewMask, NULL, NULL, NULL);\r
   Private->Legacy8259->GetMask(Private->Legacy8259, &OldMask, NULL, NULL, NULL);\r
   NewMask = 0xFFFF;\r
   Private->Legacy8259->SetMask(Private->Legacy8259, &NewMask, NULL, NULL, NULL);\r
-  \r
+\r
   //\r
   // Call into Legacy16 code to do an INIT\r
   //\r
   //\r
   // Call into Legacy16 code to do an INIT\r
   //\r
@@ -423,7 +437,7 @@ ShadowAndStartLegacy16 (
   // Restore original legacy interrupt mask value\r
   //\r
   Private->Legacy8259->SetMask(Private->Legacy8259, &OldMask, NULL, NULL, NULL);\r
   // Restore original legacy interrupt mask value\r
   //\r
   Private->Legacy8259->SetMask(Private->Legacy8259, &OldMask, NULL, NULL, NULL);\r
-  \r
+\r
   if (Regs.X.AX != 0) {\r
     return EFI_DEVICE_ERROR;\r
   }\r
   if (Regs.X.AX != 0) {\r
     return EFI_DEVICE_ERROR;\r
   }\r
@@ -639,7 +653,7 @@ GetPciInterfaceVersion (
   UINT16                PciInterfaceVersion;\r
 \r
   PciInterfaceVersion = 0;\r
   UINT16                PciInterfaceVersion;\r
 \r
   PciInterfaceVersion = 0;\r
-  \r
+\r
   Reg.X.AX = 0xB101;\r
   Reg.E.EDI = 0;\r
 \r
   Reg.X.AX = 0xB101;\r
   Reg.E.EDI = 0;\r
 \r
@@ -661,6 +675,118 @@ GetPciInterfaceVersion (
   return PciInterfaceVersion;\r
 }\r
 \r
   return PciInterfaceVersion;\r
 }\r
 \r
+/**\r
+  Callback function to calculate SMBIOS table size, and allocate memory for SMBIOS table.\r
+  SMBIOS table will be copied into EfiReservedMemoryType memory in legacy boot path.\r
+\r
+  @param  Event                 Event whose notification function is being invoked.\r
+  @param  Context               The pointer to the notification function's context,\r
+                                which is implementation-dependent.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+InstallSmbiosEventCallback (\r
+  IN EFI_EVENT                Event,\r
+  IN VOID                     *Context\r
+  )\r
+{\r
+  EFI_STATUS                  Status;\r
+  SMBIOS_TABLE_ENTRY_POINT    *EntryPointStructure;\r
+\r
+  //\r
+  // Get SMBIOS table from EFI configuration table\r
+  //\r
+  Status = EfiGetSystemConfigurationTable (\r
+            &gEfiSmbiosTableGuid,\r
+            &mRuntimeSmbiosEntryPoint\r
+            );\r
+  if ((EFI_ERROR (Status)) || (mRuntimeSmbiosEntryPoint == NULL)) {\r
+    return;\r
+  }\r
+\r
+  EntryPointStructure = (SMBIOS_TABLE_ENTRY_POINT *) mRuntimeSmbiosEntryPoint;\r
+\r
+  //\r
+  // Allocate memory for SMBIOS Entry Point Structure.\r
+  // CSM framework spec requires SMBIOS table below 4GB in EFI_TO_COMPATIBILITY16_BOOT_TABLE.\r
+  //\r
+  if (mReserveSmbiosEntryPoint == 0) {\r
+    //\r
+    // Entrypoint structure with fixed size is allocated only once.\r
+    //\r
+    mReserveSmbiosEntryPoint = SIZE_4GB - 1;\r
+    Status = gBS->AllocatePages (\r
+                    AllocateMaxAddress,\r
+                    EfiReservedMemoryType,\r
+                    EFI_SIZE_TO_PAGES ((UINTN) (EntryPointStructure->EntryPointLength)),\r
+                    &mReserveSmbiosEntryPoint\r
+                    );\r
+    if (EFI_ERROR (Status)) {\r
+      mReserveSmbiosEntryPoint = 0;\r
+      return;\r
+    }\r
+    DEBUG ((EFI_D_INFO, "Allocate memory for Smbios Entry Point Structure\n"));\r
+  }\r
+\r
+  if ((mStructureTableAddress != 0) &&\r
+      (mStructureTablePages < EFI_SIZE_TO_PAGES ((UINT32)EntryPointStructure->TableLength))) {\r
+    //\r
+    // If original buffer is not enough for the new SMBIOS table, free original buffer and re-allocate\r
+    //\r
+    gBS->FreePages (mStructureTableAddress, mStructureTablePages);\r
+    mStructureTableAddress = 0;\r
+    mStructureTablePages   = 0;\r
+    DEBUG ((EFI_D_INFO, "Original size is not enough. Re-allocate the memory.\n"));\r
+  }\r
+\r
+  if (mStructureTableAddress == 0) {\r
+    //\r
+    // Allocate reserved memory below 4GB.\r
+    // Smbios spec requires the structure table is below 4GB.\r
+    //\r
+    mStructureTableAddress = SIZE_4GB - 1;\r
+    mStructureTablePages   = EFI_SIZE_TO_PAGES (EntryPointStructure->TableLength);\r
+    Status = gBS->AllocatePages (\r
+                    AllocateMaxAddress,\r
+                    EfiReservedMemoryType,\r
+                    mStructureTablePages,\r
+                    &mStructureTableAddress\r
+                    );\r
+    if (EFI_ERROR (Status)) {\r
+      gBS->FreePages (\r
+        mReserveSmbiosEntryPoint,\r
+        EFI_SIZE_TO_PAGES ((UINTN) (EntryPointStructure->EntryPointLength))\r
+        );\r
+      mReserveSmbiosEntryPoint = 0;\r
+      mStructureTableAddress   = 0;\r
+      mStructureTablePages     = 0;\r
+      return;\r
+    }\r
+    DEBUG ((EFI_D_INFO, "Allocate memory for Smbios Structure Table\n"));\r
+  }\r
+}\r
+\r
+/**\r
+  Callback function to toggle EndOfDxe status. NULL pointer detection needs\r
+  this status to decide if it's necessary to change attributes of page 0.\r
+\r
+  @param  Event            Event whose notification function is being invoked.\r
+  @param  Context          The pointer to the notification function's context,\r
+                           which is implementation-dependent.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+ToggleEndOfDxeStatus (\r
+  IN EFI_EVENT                Event,\r
+  IN VOID                     *Context\r
+  )\r
+{\r
+  mEndOfDxe = TRUE;\r
+  return;\r
+}\r
+\r
 /**\r
   Install Driver to produce Legacy BIOS protocol.\r
 \r
 /**\r
   Install Driver to produce Legacy BIOS protocol.\r
 \r
@@ -697,6 +823,8 @@ LegacyBiosInstall (
   EFI_GCD_MEMORY_SPACE_DESCRIPTOR    Descriptor;\r
   UINT64                             Length;\r
   UINT8                              *SecureBoot;\r
   EFI_GCD_MEMORY_SPACE_DESCRIPTOR    Descriptor;\r
   UINT64                             Length;\r
   UINT8                              *SecureBoot;\r
+  EFI_EVENT                          InstallSmbiosEvent;\r
+  EFI_EVENT                          EndOfDxeEvent;\r
 \r
   //\r
   // Load this driver's image to memory\r
 \r
   //\r
   // Load this driver's image to memory\r
@@ -715,7 +843,7 @@ LegacyBiosInstall (
     FreePool (SecureBoot);\r
     return EFI_SECURITY_VIOLATION;\r
   }\r
     FreePool (SecureBoot);\r
     return EFI_SECURITY_VIOLATION;\r
   }\r
-  \r
+\r
   if (SecureBoot != NULL) {\r
     FreePool (SecureBoot);\r
   }\r
   if (SecureBoot != NULL) {\r
     FreePool (SecureBoot);\r
   }\r
@@ -847,6 +975,7 @@ LegacyBiosInstall (
   //\r
   AllocateLegacyMemory (\r
     AllocateAddress,\r
   //\r
   AllocateLegacyMemory (\r
     AllocateAddress,\r
+    EfiReservedMemoryType,\r
     0,\r
     1,\r
     &MemoryAddress\r
     0,\r
     1,\r
     &MemoryAddress\r
@@ -859,8 +988,10 @@ LegacyBiosInstall (
   // Initialize region from 0x0000 to 4k. This initializes interrupt vector\r
   // range.\r
   //\r
   // Initialize region from 0x0000 to 4k. This initializes interrupt vector\r
   // range.\r
   //\r
-  gBS->SetMem ((VOID *) ClearPtr, 0x400, INITIAL_VALUE_BELOW_1K);\r
-  ZeroMem ((VOID *) ((UINTN)ClearPtr + 0x400), 0xC00);\r
+  ACCESS_PAGE0_CODE (\r
+    gBS->SetMem ((VOID *) ClearPtr, 0x400, INITIAL_VALUE_BELOW_1K);\r
+    ZeroMem ((VOID *) ((UINTN)ClearPtr + 0x400), 0xC00);\r
+  );\r
 \r
   //\r
   // Allocate pages for OPROM usage\r
 \r
   //\r
   // Allocate pages for OPROM usage\r
@@ -870,6 +1001,7 @@ LegacyBiosInstall (
 \r
   Status = AllocateLegacyMemory (\r
              AllocateAddress,\r
 \r
   Status = AllocateLegacyMemory (\r
              AllocateAddress,\r
+             EfiReservedMemoryType,\r
              CONVENTIONAL_MEMORY_TOP - MemorySize,\r
              EFI_SIZE_TO_PAGES (MemorySize),\r
              &MemoryAddress\r
              CONVENTIONAL_MEMORY_TOP - MemorySize,\r
              EFI_SIZE_TO_PAGES (MemorySize),\r
              &MemoryAddress\r
@@ -898,12 +1030,13 @@ LegacyBiosInstall (
   for (MemStart = MemoryAddress; MemStart < MemoryAddress + MemorySize; MemStart += 0x1000) {\r
     Status = AllocateLegacyMemory (\r
                AllocateAddress,\r
   for (MemStart = MemoryAddress; MemStart < MemoryAddress + MemorySize; MemStart += 0x1000) {\r
     Status = AllocateLegacyMemory (\r
                AllocateAddress,\r
+               EfiBootServicesCode,\r
                MemStart,\r
                1,\r
                MemStart,\r
                1,\r
-               &MemoryAddress\r
+               &StartAddress\r
                );\r
     if (!EFI_ERROR (Status)) {\r
                );\r
     if (!EFI_ERROR (Status)) {\r
-      MemoryPtr = (VOID *) ((UINTN) MemoryAddress);\r
+      MemoryPtr = (VOID *) ((UINTN) StartAddress);\r
       ZeroMem (MemoryPtr, 0x1000);\r
     } else {\r
       DEBUG ((EFI_D_ERROR, "WARNING: Allocate legacy memory fail for SCSI card - %x\n", MemStart));\r
       ZeroMem (MemoryPtr, 0x1000);\r
     } else {\r
       DEBUG ((EFI_D_ERROR, "WARNING: Allocate legacy memory fail for SCSI card - %x\n", MemStart));\r
@@ -914,9 +1047,10 @@ LegacyBiosInstall (
   // Allocate low PMM memory and zero it out\r
   //\r
   MemorySize = PcdGet32 (PcdLowPmmMemorySize);\r
   // Allocate low PMM memory and zero it out\r
   //\r
   MemorySize = PcdGet32 (PcdLowPmmMemorySize);\r
-  ASSERT ((MemorySize & 0xFFF) == 0);  \r
+  ASSERT ((MemorySize & 0xFFF) == 0);\r
   Status = AllocateLegacyMemory (\r
              AllocateMaxAddress,\r
   Status = AllocateLegacyMemory (\r
              AllocateMaxAddress,\r
+             EfiBootServicesCode,\r
              CONVENTIONAL_MEMORY_TOP,\r
              EFI_SIZE_TO_PAGES (MemorySize),\r
              &MemoryAddressUnder1MB\r
              CONVENTIONAL_MEMORY_TOP,\r
              EFI_SIZE_TO_PAGES (MemorySize),\r
              &MemoryAddressUnder1MB\r
@@ -930,6 +1064,7 @@ LegacyBiosInstall (
   //\r
   Status = AllocateLegacyMemory (\r
              AllocateMaxAddress,\r
   //\r
   Status = AllocateLegacyMemory (\r
              AllocateMaxAddress,\r
+             EfiReservedMemoryType,\r
              CONVENTIONAL_MEMORY_TOP,\r
              (sizeof (LOW_MEMORY_THUNK) / EFI_PAGE_SIZE) + 2,\r
              &MemoryAddress\r
              CONVENTIONAL_MEMORY_TOP,\r
              (sizeof (LOW_MEMORY_THUNK) / EFI_PAGE_SIZE) + 2,\r
              &MemoryAddress\r
@@ -954,9 +1089,10 @@ LegacyBiosInstall (
   ASSERT ((MemorySize & 0xFFF) == 0);\r
   //\r
   // Allocate high PMM Memory under 16 MB\r
   ASSERT ((MemorySize & 0xFFF) == 0);\r
   //\r
   // Allocate high PMM Memory under 16 MB\r
-  //   \r
+  //\r
   Status = AllocateLegacyMemory (\r
              AllocateMaxAddress,\r
   Status = AllocateLegacyMemory (\r
              AllocateMaxAddress,\r
+             EfiBootServicesCode,\r
              0x1000000,\r
              EFI_SIZE_TO_PAGES (MemorySize),\r
              &MemoryAddress\r
              0x1000000,\r
              EFI_SIZE_TO_PAGES (MemorySize),\r
              &MemoryAddress\r
@@ -964,18 +1100,19 @@ LegacyBiosInstall (
   if (EFI_ERROR (Status)) {\r
     //\r
     // If it fails, allocate high PMM Memory under 4GB\r
   if (EFI_ERROR (Status)) {\r
     //\r
     // If it fails, allocate high PMM Memory under 4GB\r
-    //   \r
+    //\r
     Status = AllocateLegacyMemory (\r
                AllocateMaxAddress,\r
     Status = AllocateLegacyMemory (\r
                AllocateMaxAddress,\r
+               EfiBootServicesCode,\r
                0xFFFFFFFF,\r
                EFI_SIZE_TO_PAGES (MemorySize),\r
                &MemoryAddress\r
                0xFFFFFFFF,\r
                EFI_SIZE_TO_PAGES (MemorySize),\r
                &MemoryAddress\r
-               );    \r
+               );\r
   }\r
   if (!EFI_ERROR (Status)) {\r
     EfiToLegacy16InitTable->HiPmmMemory            = (UINT32) (EFI_PHYSICAL_ADDRESS) (UINTN) MemoryAddress;\r
     EfiToLegacy16InitTable->HiPmmMemorySizeInBytes = MemorySize;\r
   }\r
   if (!EFI_ERROR (Status)) {\r
     EfiToLegacy16InitTable->HiPmmMemory            = (UINT32) (EFI_PHYSICAL_ADDRESS) (UINTN) MemoryAddress;\r
     EfiToLegacy16InitTable->HiPmmMemorySizeInBytes = MemorySize;\r
-  } \r
+  }\r
 \r
   //\r
   //  ShutdownAPs();\r
 \r
   //\r
   //  ShutdownAPs();\r
@@ -999,17 +1136,52 @@ LegacyBiosInstall (
   //\r
   // Save Unexpected interrupt vector so can restore it just prior to boot\r
   //\r
   //\r
   // Save Unexpected interrupt vector so can restore it just prior to boot\r
   //\r
-  BaseVectorMaster = (UINT32 *) (sizeof (UINT32) * PROTECTED_MODE_BASE_VECTOR_MASTER);\r
-  Private->BiosUnexpectedInt = BaseVectorMaster[0];\r
-  IntRedirCode = (UINT32) (UINTN) Private->IntThunk->InterruptRedirectionCode;\r
-  for (Index = 0; Index < 8; Index++) {\r
-    BaseVectorMaster[Index] = (EFI_SEGMENT (IntRedirCode + Index * 4) << 16) | EFI_OFFSET (IntRedirCode + Index * 4);\r
-  }\r
+  ACCESS_PAGE0_CODE (\r
+    BaseVectorMaster = (UINT32 *) (sizeof (UINT32) * PROTECTED_MODE_BASE_VECTOR_MASTER);\r
+    Private->BiosUnexpectedInt = BaseVectorMaster[0];\r
+    IntRedirCode = (UINT32) (UINTN) Private->IntThunk->InterruptRedirectionCode;\r
+    for (Index = 0; Index < 8; Index++) {\r
+      BaseVectorMaster[Index] = (EFI_SEGMENT (IntRedirCode + Index * 4) << 16) | EFI_OFFSET (IntRedirCode + Index * 4);\r
+    }\r
+  );\r
+\r
   //\r
   // Save EFI value\r
   //\r
   Private->ThunkSeg = (UINT16) (EFI_SEGMENT (IntRedirCode));\r
 \r
   //\r
   // Save EFI value\r
   //\r
   Private->ThunkSeg = (UINT16) (EFI_SEGMENT (IntRedirCode));\r
 \r
+  //\r
+  // Allocate reserved memory for SMBIOS table used in legacy boot if SMBIOS table exists\r
+  //\r
+  InstallSmbiosEventCallback (NULL, NULL);\r
+\r
+  //\r
+  // Create callback function to update the size of reserved memory after LegacyBiosDxe starts\r
+  //\r
+  Status = gBS->CreateEventEx (\r
+                  EVT_NOTIFY_SIGNAL,\r
+                  TPL_NOTIFY,\r
+                  InstallSmbiosEventCallback,\r
+                  NULL,\r
+                  &gEfiSmbiosTableGuid,\r
+                  &InstallSmbiosEvent\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  //\r
+  // Create callback to update status of EndOfDxe, which is needed by NULL\r
+  // pointer detection\r
+  //\r
+  Status = gBS->CreateEventEx (\r
+                  EVT_NOTIFY_SIGNAL,\r
+                  TPL_NOTIFY,\r
+                  ToggleEndOfDxeStatus,\r
+                  NULL,\r
+                  &gEfiEndOfDxeEventGroupGuid,\r
+                  &EndOfDxeEvent\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
   //\r
   // Make a new handle and install the protocol\r
   //\r
   //\r
   // Make a new handle and install the protocol\r
   //\r
@@ -1021,9 +1193,9 @@ LegacyBiosInstall (
                   &Private->LegacyBios\r
                   );\r
   Private->Csm16PciInterfaceVersion = GetPciInterfaceVersion (Private);\r
                   &Private->LegacyBios\r
                   );\r
   Private->Csm16PciInterfaceVersion = GetPciInterfaceVersion (Private);\r
-  \r
-  DEBUG ((EFI_D_INFO, "CSM16 PCI BIOS Interface Version: %02x.%02x\n", \r
-          (UINT8) (Private->Csm16PciInterfaceVersion >> 8), \r
+\r
+  DEBUG ((EFI_D_INFO, "CSM16 PCI BIOS Interface Version: %02x.%02x\n",\r
+          (UINT8) (Private->Csm16PciInterfaceVersion >> 8),\r
           (UINT8) Private->Csm16PciInterfaceVersion\r
         ));\r
   ASSERT (Private->Csm16PciInterfaceVersion != 0);\r
           (UINT8) Private->Csm16PciInterfaceVersion\r
         ));\r
   ASSERT (Private->Csm16PciInterfaceVersion != 0);\r