]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacyBootSupport.c
IntelFrameworkModulePkg/LegacyBios: Rename local variables
[mirror_edk2.git] / IntelFrameworkModulePkg / Csm / LegacyBiosDxe / LegacyBootSupport.c
index 4e16880bd6360e8e67e2311ffce410d3b7495b7b..52bcae2d1331eeb9527707fd54c3d1eac7e7173a 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 - 2015, 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
@@ -33,6 +33,10 @@ UINT64              mLowWater           = 0xffffffffffffffffULL;
 \r
 extern BBS_TABLE           *mBbsTable;\r
 \r
 \r
 extern BBS_TABLE           *mBbsTable;\r
 \r
+extern VOID                  *mRuntimeSmbiosEntryPoint;\r
+extern EFI_PHYSICAL_ADDRESS  mReserveSmbiosEntryPoint;\r
+extern EFI_PHYSICAL_ADDRESS  mStructureTableAddress;\r
+\r
 /**\r
   Print the BBS Table.\r
 \r
 /**\r
   Print the BBS Table.\r
 \r
@@ -777,6 +781,63 @@ LegacyGetDataOrTable (
   return EFI_SUCCESS;\r
 }\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Copy SMBIOS table to EfiReservedMemoryType of memory for legacy boot.\r
+\r
+**/\r
+VOID\r
+CreateSmbiosTableInReservedMemory (\r
+  VOID\r
+  )\r
+{\r
+  SMBIOS_TABLE_ENTRY_POINT    *EntryPointStructure;\r
+  \r
+  if ((mRuntimeSmbiosEntryPoint == NULL) || \r
+      (mReserveSmbiosEntryPoint == 0) || \r
+      (mStructureTableAddress == 0)) {\r
+    return;\r
+  }\r
+  \r
+  EntryPointStructure = (SMBIOS_TABLE_ENTRY_POINT *) mRuntimeSmbiosEntryPoint;\r
+  \r
+  //\r
+  // Copy SMBIOS Entry Point Structure\r
+  //\r
+  CopyMem (\r
+    (VOID *)(UINTN) mReserveSmbiosEntryPoint,\r
+    EntryPointStructure,\r
+    EntryPointStructure->EntryPointLength\r
+  );\r
+  \r
+  //\r
+  // Copy SMBIOS Structure Table into EfiReservedMemoryType memory\r
+  //\r
+  CopyMem (\r
+    (VOID *)(UINTN) mStructureTableAddress,\r
+    (VOID *)(UINTN) EntryPointStructure->TableAddress,\r
+    EntryPointStructure->TableLength\r
+  );\r
+  \r
+  //\r
+  // Update TableAddress in Entry Point Structure\r
+  //\r
+  EntryPointStructure = (SMBIOS_TABLE_ENTRY_POINT *)(UINTN) mReserveSmbiosEntryPoint;\r
+  EntryPointStructure->TableAddress = (UINT32)(UINTN) mStructureTableAddress;\r
+  \r
+  //\r
+  // Fixup checksums in the Entry Point Structure\r
+  //\r
+  EntryPointStructure->IntermediateChecksum = 0;\r
+  EntryPointStructure->EntryPointStructureChecksum = 0;\r
+\r
+  EntryPointStructure->IntermediateChecksum = \r
+    CalculateCheckSum8 (\r
+      (UINT8 *) EntryPointStructure + OFFSET_OF (SMBIOS_TABLE_ENTRY_POINT, IntermediateAnchorString), \r
+      EntryPointStructure->EntryPointLength - OFFSET_OF (SMBIOS_TABLE_ENTRY_POINT, IntermediateAnchorString)\r
+      );\r
+  EntryPointStructure->EntryPointStructureChecksum =\r
+    CalculateCheckSum8 ((UINT8 *) EntryPointStructure, EntryPointStructure->EntryPointLength);\r
+}\r
 \r
 /**\r
   Assign drive number to legacy HDD drives prior to booting an EFI\r
 \r
 /**\r
   Assign drive number to legacy HDD drives prior to booting an EFI\r
@@ -815,7 +876,6 @@ GenericLegacyBoot (
   EFI_HANDLE                        IdeController;\r
   UINTN                             HandleCount;\r
   EFI_HANDLE                        *HandleBuffer;\r
   EFI_HANDLE                        IdeController;\r
   UINTN                             HandleCount;\r
   EFI_HANDLE                        *HandleBuffer;\r
-  VOID                              *SmbiosTable;\r
   VOID                              *AcpiTable;\r
   UINTN                             ShadowAddress;\r
   UINT32                            Granularity;\r
   VOID                              *AcpiTable;\r
   UINTN                             ShadowAddress;\r
   UINT32                            Granularity;\r
@@ -904,21 +964,15 @@ GenericLegacyBoot (
       );\r
     Private->Legacy16Table->E820Length = (UINT32) CopySize;\r
   }\r
       );\r
     Private->Legacy16Table->E820Length = (UINT32) CopySize;\r
   }\r
-  //\r
-  // Get SMBIOS and ACPI table pointers\r
-  //\r
-  SmbiosTable = NULL;\r
-  EfiGetSystemConfigurationTable (\r
-    &gEfiSmbiosTableGuid,\r
-    &SmbiosTable\r
-    );\r
+\r
   //\r
   // We do not ASSERT if SmbiosTable not found. It is possbile that a platform does not produce SmbiosTable.\r
   //\r
   //\r
   // We do not ASSERT if SmbiosTable not found. It is possbile that a platform does not produce SmbiosTable.\r
   //\r
-  if (SmbiosTable == NULL) {\r
+  if (mReserveSmbiosEntryPoint == 0) {\r
     DEBUG ((EFI_D_INFO, "Smbios table is not found!\n"));\r
   }\r
     DEBUG ((EFI_D_INFO, "Smbios table is not found!\n"));\r
   }\r
-  EfiToLegacy16BootTable->SmbiosTable = (UINT32)(UINTN)SmbiosTable;\r
+  CreateSmbiosTableInReservedMemory ();\r
+  EfiToLegacy16BootTable->SmbiosTable = (UINT32)(UINTN)mReserveSmbiosEntryPoint;\r
 \r
   AcpiTable = NULL;\r
   Status = EfiGetSystemConfigurationTable (\r
 \r
   AcpiTable = NULL;\r
   Status = EfiGetSystemConfigurationTable (\r
@@ -1184,6 +1238,24 @@ GenericLegacyBoot (
                            0x40000,\r
                            &Granularity\r
                            );\r
                            0x40000,\r
                            &Granularity\r
                            );\r
+\r
+  if ((Private->Legacy16Table->TableLength >= OFFSET_OF (EFI_COMPATIBILITY16_TABLE, HiPermanentMemoryAddress)) &&\r
+      ((Private->Legacy16Table->UmaAddress != 0) && (Private->Legacy16Table->UmaSize != 0))) {\r
+    //\r
+    // Here we could reduce UmaAddress down as far as Private->OptionRom, taking into\r
+    // account the granularity of the access control.\r
+    //\r
+    DEBUG((EFI_D_INFO, "Unlocking UMB RAM region 0x%x-0x%x\n", Private->Legacy16Table->UmaAddress,\r
+                        Private->Legacy16Table->UmaAddress + Private->Legacy16Table->UmaSize));\r
+\r
+    Private->LegacyRegion->UnLock (\r
+                             Private->LegacyRegion,\r
+                             Private->Legacy16Table->UmaAddress,\r
+                             Private->Legacy16Table->UmaSize,\r
+                             &Granularity\r
+                             );\r
+  }\r
+\r
   //\r
   // Lock attributes of the Legacy Region if chipset supports\r
   //\r
   //\r
   // Lock attributes of the Legacy Region if chipset supports\r
   //\r
@@ -1199,10 +1271,20 @@ GenericLegacyBoot (
   //\r
   EnableAllControllers (Private);\r
   if ((mBootMode == BOOT_LEGACY_OS) || (mBootMode == BOOT_UNCONVENTIONAL_DEVICE)) {\r
   //\r
   EnableAllControllers (Private);\r
   if ((mBootMode == BOOT_LEGACY_OS) || (mBootMode == BOOT_UNCONVENTIONAL_DEVICE)) {\r
+\r
     //\r
     // Signal all the events that are waiting on EVT_SIGNAL_LEGACY_BOOT\r
     //\r
     EfiSignalEventLegacyBoot ();\r
     //\r
     // Signal all the events that are waiting on EVT_SIGNAL_LEGACY_BOOT\r
     //\r
     EfiSignalEventLegacyBoot ();\r
+\r
+    //\r
+    // Report Status Code to indicate legacy boot event was signalled\r
+    //\r
+    REPORT_STATUS_CODE (\r
+      EFI_PROGRESS_CODE,\r
+      (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_LEGACY_BOOT_EVENT)\r
+      );\r
+\r
     DEBUG ((EFI_D_INFO, "Legacy INT19 Boot...\n"));\r
 \r
     //\r
     DEBUG ((EFI_D_INFO, "Legacy INT19 Boot...\n"));\r
 \r
     //\r
@@ -1531,10 +1613,19 @@ EfiMemoryTypeToE820Type (
   case EfiBootServicesCode:\r
   case EfiBootServicesData:\r
   case EfiConventionalMemory:\r
   case EfiBootServicesCode:\r
   case EfiBootServicesData:\r
   case EfiConventionalMemory:\r
+  //\r
+  // The memory of EfiRuntimeServicesCode and EfiRuntimeServicesData are\r
+  // usable memory for legacy OS, because legacy OS is not aware of EFI runtime concept.\r
+  // In ACPI specification, EfiRuntimeServiceCode and EfiRuntimeServiceData\r
+  // should be mapped to AddressRangeReserved. This statement is for UEFI OS, not for legacy OS.\r
+  //\r
   case EfiRuntimeServicesCode:\r
   case EfiRuntimeServicesData:\r
     return EfiAcpiAddressRangeMemory;\r
 \r
   case EfiRuntimeServicesCode:\r
   case EfiRuntimeServicesData:\r
     return EfiAcpiAddressRangeMemory;\r
 \r
+  case EfiPersistentMemory:\r
+    return EfiAddressRangePersistentMemory;\r
+\r
   case EfiACPIReclaimMemory:\r
     return EfiAcpiAddressRangeACPI;\r
 \r
   case EfiACPIReclaimMemory:\r
     return EfiAcpiAddressRangeACPI;\r
 \r
@@ -2039,7 +2130,7 @@ LegacyBiosCompleteStandardCmosBeforeBoot (
   //\r
   // redo memory size since it can change\r
   //\r
   //\r
   // redo memory size since it can change\r
   //\r
-  Size = 15 * SIZE_1MB;\r
+  Size = (15 * SIZE_1MB) >> 10;\r
   if (Private->IntThunk->EfiToLegacy16InitTable.OsMemoryAbove1Mb < (15 * SIZE_1MB)) {\r
     Size  = Private->IntThunk->EfiToLegacy16InitTable.OsMemoryAbove1Mb >> 10;\r
   }\r
   if (Private->IntThunk->EfiToLegacy16InitTable.OsMemoryAbove1Mb < (15 * SIZE_1MB)) {\r
     Size  = Private->IntThunk->EfiToLegacy16InitTable.OsMemoryAbove1Mb >> 10;\r
   }\r