/** @file\r
\r
-Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2017, 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
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 DescString\r
//\r
- String = (CHAR8 *)(UINTN)((BbsTable[Index].DescStringSegment << 4) + BbsTable[Index].DescStringOffset);\r
+ String = (CHAR8 *)(((UINTN)BbsTable[Index].DescStringSegment << 4) + BbsTable[Index].DescStringOffset);\r
if (String != NULL) {\r
DEBUG ((EFI_D_INFO," ("));\r
for (SubIndex = 0; String[SubIndex] != 0; SubIndex++) {\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
EFI_HANDLE IdeController;\r
UINTN HandleCount;\r
EFI_HANDLE *HandleBuffer;\r
- VOID *SmbiosTable;\r
VOID *AcpiTable;\r
UINTN ShadowAddress;\r
UINT32 Granularity;\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
- if (SmbiosTable == NULL) {\r
+ if (mReserveSmbiosEntryPoint == 0) {\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
// Pass in handoff data\r
//\r
- Regs.X.ES = EFI_SEGMENT ((UINTN)EfiToLegacy16BootTable);\r
- Regs.X.BX = EFI_OFFSET ((UINTN)EfiToLegacy16BootTable);\r
+ Regs.X.ES = NORMALIZE_EFI_SEGMENT ((UINTN)EfiToLegacy16BootTable);\r
+ Regs.X.BX = NORMALIZE_EFI_OFFSET ((UINTN)EfiToLegacy16BootTable);\r
\r
Private->LegacyBios.FarCall86 (\r
This,\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
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
+ //\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
- // Raise TPL to high level to disable CPU interrupts\r
+ // Disable DXE Timer while executing in real mode\r
//\r
- gBS->RaiseTPL (TPL_HIGH_LEVEL);\r
+ Private->Timer->SetTimerPeriod (Private->Timer, 0);\r
+ \r
+ //\r
+ // Save and disable interrupt of debug timer\r
+ //\r
+ SaveAndSetDebugTimerInterrupt (FALSE);\r
+\r
\r
//\r
// Put the 8259 into its legacy mode by reprogramming the vector bases\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 EfiPersistentMemory:\r
+ return EfiAddressRangePersistentMemory;\r
+\r
case EfiACPIReclaimMemory:\r
return EfiAcpiAddressRangeACPI;\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