--- /dev/null
+/*++\r
+\r
+Copyright (c) 2006, Intel Corporation \r
+All rights reserved. This program and the accompanying materials \r
+are licensed and made available under the terms and conditions of the BSD License \r
+which accompanies this distribution. The full text of the license may be found at \r
+http://opensource.org/licenses/bsd-license.php \r
+ \r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
+\r
+Module Name:\r
+\r
+ Bds.dxs\r
+\r
+Abstract:\r
+\r
+ Dependency expression source file. This driver produces an arch protocol, so\r
+ must dipatch early.\r
+ \r
+--*/\r
+#include <AutoGen.h>\r
+#include <DxeDepex.h>\r
+\r
+DEPENDENCY_START\r
+ EFI_HII_PROTOCOL_GUID\r
+DEPENDENCY_END\r
\r
--*/\r
\r
-#include "Generic/Bds.h"\r
#include "BdsPlatform.h"\r
-#include "Generic/String.h"\r
-#include "Generic/Language.h"\r
-#include "Generic/FrontPage.h"\r
\r
CHAR16 mFirmwareVendor[] = L"TianoCore.org";\r
\r
//\r
gBS->CalculateCrc32 ((VOID *) gST, sizeof (EFI_SYSTEM_TABLE), &gST->Hdr.CRC32);\r
\r
- //\r
- // Initialize the platform specific string and language\r
- //\r
- InitializeStringSupport ();\r
- InitializeLanguage (TRUE);\r
- InitializeFrontPage (FALSE);\r
-\r
}\r
\r
EFI_STATUS\r
\r
}\r
\r
-VOID\r
-PlatformBdsBootSuccess (\r
- IN BDS_COMMON_OPTION *Option\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Hook point after a boot attempt succeeds. We don't expect a boot option to\r
- return, so the EFI 1.0 specification defines that you will default to an\r
- interactive mode and stop processing the BootOrder list in this case. This\r
- is alos a platform implementation and can be customized by IBV/OEM.\r
-\r
-Arguments:\r
-\r
- Option - Pointer to Boot Option that succeeded to boot.\r
-\r
-Returns:\r
- \r
- None.\r
-\r
---*/\r
-{\r
- CHAR16 *TmpStr;\r
-\r
- //\r
- // If Boot returned with EFI_SUCCESS and there is not in the boot device\r
- // select loop then we need to pop up a UI and wait for user input.\r
- //\r
- TmpStr = GetStringById (STRING_TOKEN (STR_BOOT_SUCCEEDED));\r
- if (TmpStr != NULL) {\r
- BdsLibOutputStrings (gST->ConOut, TmpStr, Option->Description, L"\n\r", NULL);\r
- gBS->FreePool (TmpStr);\r
- }\r
-}\r
-\r
-VOID\r
-PlatformBdsBootFail (\r
- IN BDS_COMMON_OPTION *Option,\r
- IN EFI_STATUS Status,\r
- IN CHAR16 *ExitData,\r
- IN UINTN ExitDataSize\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Hook point after a boot attempt fails.\r
-\r
-Arguments:\r
- \r
- Option - Pointer to Boot Option that failed to boot.\r
-\r
- Status - Status returned from failed boot.\r
-\r
- ExitData - Exit data returned from failed boot.\r
-\r
- ExitDataSize - Exit data size returned from failed boot.\r
-\r
-Returns:\r
- \r
- None.\r
-\r
---*/\r
-{\r
- CHAR16 *TmpStr;\r
-\r
- //\r
- // If Boot returned with failed status then we need to pop up a UI and wait\r
- // for user input.\r
- //\r
- TmpStr = GetStringById (STRING_TOKEN (STR_BOOT_FAILED));\r
- if (TmpStr != NULL) {\r
- BdsLibOutputStrings (gST->ConOut, TmpStr, Option->Description, L"\n\r", NULL);\r
- gBS->FreePool (TmpStr);\r
- }\r
-\r
-}\r
-\r
EFI_STATUS\r
PlatformBdsNoConsoleAction (\r
VOID\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- Bds.dxs\r
-\r
-Abstract:\r
-\r
- Dependency expression source file. This driver produces an arch protocol, so\r
- must dipatch early.\r
- \r
---*/\r
-#include <AutoGen.h>\r
-#include <DxeDepex.h>\r
-\r
-DEPENDENCY_START\r
- EFI_HII_PROTOCOL_GUID\r
-DEPENDENCY_END
\ No newline at end of file
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- Bds.h\r
-\r
-Abstract:\r
-\r
- Head file for BDS Architectural Protocol implementation\r
-\r
-Revision History\r
-\r
---*/\r
-\r
-#ifndef _BDS_H\r
-#define _BDS_H\r
-\r
-//\r
-// Bds AP Context data\r
-//\r
-#define EFI_BDS_ARCH_PROTOCOL_INSTANCE_SIGNATURE EFI_SIGNATURE_32 ('B', 'd', 's', 'A')\r
-typedef struct {\r
- UINTN Signature;\r
-\r
- EFI_HANDLE Handle;\r
-\r
- EFI_BDS_ARCH_PROTOCOL Bds;\r
-\r
- //\r
- // Save the current boot mode\r
- //\r
- EFI_BOOT_MODE BootMode;\r
-\r
- //\r
- // Set true if boot with default settings\r
- //\r
- BOOLEAN DefaultBoot;\r
-\r
- //\r
- // The system default timeout for choose the boot option\r
- //\r
- UINT16 TimeoutDefault;\r
-\r
- //\r
- // Memory Test Level\r
- //\r
- EXTENDMEM_COVERAGE_LEVEL MemoryTestLevel;\r
-\r
-} EFI_BDS_ARCH_PROTOCOL_INSTANCE;\r
-\r
-#define EFI_BDS_ARCH_PROTOCOL_INSTANCE_FROM_THIS(_this) \\r
- CR (_this, \\r
- EFI_BDS_ARCH_PROTOCOL_INSTANCE, \\r
- Bds, \\r
- EFI_BDS_ARCH_PROTOCOL_INSTANCE_SIGNATURE \\r
- )\r
-\r
-//\r
-// Prototypes\r
-//\r
-EFI_STATUS\r
-EFIAPI\r
-BdsInitialize (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
- );\r
-\r
-VOID\r
-EFIAPI\r
-BdsEntry (\r
- IN EFI_BDS_ARCH_PROTOCOL *This\r
- );\r
-\r
-#endif\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- BdsEntry.c\r
-\r
-Abstract:\r
-\r
- The entry of the bds\r
-\r
---*/\r
-\r
-#include "Bds.h"\r
-#include "BdsPlatform.h"\r
-#include "FrontPage.h"\r
-\r
-EFI_BDS_ARCH_PROTOCOL_INSTANCE gBdsInstanceTemplate = {\r
- EFI_BDS_ARCH_PROTOCOL_INSTANCE_SIGNATURE,\r
- NULL,\r
- {\r
- BdsEntry\r
- },\r
- 0xFFFF,\r
- TRUE,\r
- EXTENSIVE\r
-};\r
-\r
-UINT16 *mBootNext = NULL;\r
-\r
-EFI_HANDLE mBdsImageHandle;\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-BdsInitialize (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Install Boot Device Selection Protocol\r
-\r
-Arguments:\r
- \r
- (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT)\r
-\r
-Returns:\r
-\r
- EFI_SUCEESS - BDS has finished initializing.\r
- Rerun the \r
- dispatcher and recall BDS.Entry\r
-\r
- Other - Return value from EfiLibAllocatePool()\r
- or gBS->InstallProtocolInterface\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
-\r
- mBdsImageHandle = ImageHandle;\r
-\r
- //\r
- // Install protocol interface\r
- //\r
- Status = gBS->InstallProtocolInterface (\r
- &gBdsInstanceTemplate.Handle,\r
- &gEfiBdsArchProtocolGuid,\r
- EFI_NATIVE_INTERFACE,\r
- &gBdsInstanceTemplate.Bds\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- return Status;\r
-}\r
-\r
-VOID\r
-BdsBootDeviceSelect (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- In the loop of attempt to boot for the boot order\r
-\r
-Arguments:\r
- \r
- None.\r
-\r
-Returns:\r
-\r
- None.\r
- \r
---*/\r
-{\r
- EFI_STATUS Status;\r
- LIST_ENTRY *Link;\r
- BDS_COMMON_OPTION *BootOption;\r
- UINTN ExitDataSize;\r
- CHAR16 *ExitData;\r
- UINT16 Timeout;\r
- LIST_ENTRY BootLists;\r
- CHAR16 Buffer[20];\r
- BOOLEAN BootNextExist;\r
- LIST_ENTRY *LinkBootNext;\r
-\r
- //\r
- // Got the latest boot option\r
- //\r
- BootNextExist = FALSE;\r
- LinkBootNext = NULL;\r
- InitializeListHead (&BootLists);\r
-\r
- //\r
- // First check the boot next option\r
- //\r
- ZeroMem (Buffer, sizeof (Buffer));\r
-\r
- if (mBootNext != NULL) {\r
- //\r
- // Indicate we have the boot next variable, so this time\r
- // boot will always have this boot option\r
- //\r
- BootNextExist = TRUE;\r
-\r
- //\r
- // Clear the this variable so it's only exist in this time boot\r
- //\r
- gRT->SetVariable (\r
- L"BootNext",\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
- 0,\r
- mBootNext\r
- );\r
-\r
- //\r
- // Add the boot next boot option\r
- //\r
- UnicodeSPrint (Buffer, sizeof (Buffer), L"Boot%04x", *mBootNext);\r
- BootOption = BdsLibVariableToOption (&BootLists, Buffer);\r
- }\r
- //\r
- // Parse the boot order to get boot option\r
- //\r
- BdsLibBuildOptionFromVar (&BootLists, L"BootOrder");\r
- Link = BootLists.ForwardLink;\r
-\r
- //\r
- // Parameter check, make sure the loop will be valid\r
- //\r
- if (Link == NULL) {\r
- return ;\r
- }\r
- //\r
- // Here we make the boot in a loop, every boot success will\r
- // return to the front page\r
- //\r
- for (;;) {\r
- //\r
- // Check the boot option list first\r
- //\r
- if (Link == &BootLists) {\r
- //\r
- // There are two ways to enter here:\r
- // 1. There is no active boot option, give user chance to\r
- // add new boot option\r
- // 2. All the active boot option processed, and there is no\r
- // one is success to boot, then we back here to allow user\r
- // add new active boot option\r
- //\r
- Timeout = 0xffff;\r
- PlatformBdsEnterFrontPage (Timeout, FALSE);\r
- InitializeListHead (&BootLists);\r
- BdsLibBuildOptionFromVar (&BootLists, L"BootOrder");\r
- Link = BootLists.ForwardLink;\r
- continue;\r
- }\r
- //\r
- // Get the boot option from the link list\r
- //\r
- BootOption = CR (Link, BDS_COMMON_OPTION, Link, BDS_LOAD_OPTION_SIGNATURE);\r
-\r
- //\r
- // According to EFI Specification, if a load option is not marked\r
- // as LOAD_OPTION_ACTIVE, the boot manager will not automatically\r
- // load the option.\r
- //\r
- if (!IS_LOAD_OPTION_TYPE (BootOption->Attribute, LOAD_OPTION_ACTIVE)) {\r
- //\r
- // skip the header of the link list, becuase it has no boot option\r
- //\r
- Link = Link->ForwardLink;\r
- continue;\r
- }\r
- //\r
- // Make sure the boot option device path connected,\r
- // but ignore the BBS device path\r
- //\r
- if (DevicePathType (BootOption->DevicePath) != BBS_DEVICE_PATH) {\r
- //\r
- // Notes: the internal shell can not been connected with device path\r
- // so we do not check the status here\r
- //\r
- BdsLibConnectDevicePath (BootOption->DevicePath);\r
- }\r
- //\r
- // All the driver options should have been processed since\r
- // now boot will be performed.\r
- //\r
- PERF_END (0, BDS_TOK, NULL, 0);\r
- Status = BdsLibBootViaBootOption (BootOption, BootOption->DevicePath, &ExitDataSize, &ExitData);\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // Call platform action to indicate the boot fail\r
- //\r
- PlatformBdsBootFail (BootOption, Status, ExitData, ExitDataSize);\r
-\r
- //\r
- // Check the next boot option\r
- //\r
- Link = Link->ForwardLink;\r
-\r
- } else {\r
- //\r
- // Call platform action to indicate the boot success\r
- //\r
- PlatformBdsBootSuccess (BootOption);\r
-\r
- //\r
- // Boot success, then stop process the boot order, and\r
- // present the boot manager menu, front page\r
- //\r
- Timeout = 0xffff;\r
- PlatformBdsEnterFrontPage (Timeout, FALSE);\r
-\r
- //\r
- // Rescan the boot option list, avoid pertential risk of the boot\r
- // option change in front page\r
- //\r
- if (BootNextExist) {\r
- LinkBootNext = BootLists.ForwardLink;\r
- }\r
-\r
- InitializeListHead (&BootLists);\r
- if (LinkBootNext != NULL) {\r
- //\r
- // Reserve the boot next option\r
- //\r
- InsertTailList (&BootLists, LinkBootNext);\r
- }\r
-\r
- BdsLibBuildOptionFromVar (&BootLists, L"BootOrder");\r
- Link = BootLists.ForwardLink;\r
- }\r
- }\r
-\r
- return ;\r
-\r
-}\r
-\r
-VOID\r
-EFIAPI\r
-BdsEntry (\r
- IN EFI_BDS_ARCH_PROTOCOL *This\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Service routine for BdsInstance->Entry(). Devices are connected, the \r
- consoles are initialized, and the boot options are tried. \r
-\r
-Arguments:\r
-\r
- This - Protocol Instance structure.\r
-\r
-Returns:\r
-\r
- EFI_SUCEESS - BDS->Entry has finished executing. \r
- \r
---*/\r
-{\r
- EFI_BDS_ARCH_PROTOCOL_INSTANCE *PrivateData;\r
- LIST_ENTRY DriverOptionList;\r
- LIST_ENTRY BootOptionList;\r
- UINTN BootNextSize;\r
-\r
- //\r
- // Insert the performance probe\r
- //\r
- PERF_END (0, DXE_TOK, NULL, 0);\r
- PERF_START (0, BDS_TOK, NULL, 0);\r
-\r
- //\r
- // Initialize the global system boot option and driver option\r
- //\r
- InitializeListHead (&DriverOptionList);\r
- InitializeListHead (&BootOptionList);\r
-\r
- //\r
- // Get the BDS private data\r
- //\r
- PrivateData = EFI_BDS_ARCH_PROTOCOL_INSTANCE_FROM_THIS (This);\r
-\r
- //\r
- // Do the platform init, can be customized by OEM/IBV\r
- //\r
- PERF_START (0, "PlatformBds", "BDS", 0);\r
- PlatformBdsInit (PrivateData);\r
-\r
- //\r
- // Set up the device list based on EFI 1.1 variables\r
- // process Driver#### and Load the driver's in the\r
- // driver option list\r
- //\r
- BdsLibBuildOptionFromVar (&DriverOptionList, L"DriverOrder");\r
- if (!IsListEmpty (&DriverOptionList)) {\r
- BdsLibLoadDrivers (&DriverOptionList);\r
- }\r
- //\r
- // Check if we have the boot next option\r
- //\r
- mBootNext = BdsLibGetVariableAndSize (\r
- L"BootNext",\r
- &gEfiGlobalVariableGuid,\r
- &BootNextSize\r
- );\r
-\r
- //\r
- // Setup some platform policy here\r
- //\r
- PlatformBdsPolicyBehavior (PrivateData, &DriverOptionList, &BootOptionList);\r
- PERF_END (0, "PlatformBds", "BDS", 0);\r
-\r
- //\r
- // BDS select the boot device to load OS\r
- //\r
- BdsBootDeviceSelect ();\r
-\r
- //\r
- // Only assert here since this is the right behavior, we should never\r
- // return back to DxeCore.\r
- //\r
- ASSERT (FALSE);\r
-}\r
-\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- BBSsupport.c\r
-\r
-Abstract:\r
-\r
- This function deal with the legacy boot option, it create, delete\r
- and manage the legacy boot option, all legacy boot option is getting from\r
- the legacy BBS table.\r
-\r
---*/\r
-\r
-#include "BBSsupport.h"\r
-\r
-EFI_DEVICE_PATH_PROTOCOL EndDevicePath[] = {\r
- {\r
- END_DEVICE_PATH_TYPE,\r
- END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
- {\r
- END_DEVICE_PATH_LENGTH,\r
- 0\r
- }\r
- }\r
-};\r
-\r
-VOID\r
-AsciiToUnicodeSize (\r
- IN UINT8 *a,\r
- IN UINTN Size,\r
- OUT UINT16 *u\r
- )\r
-/*++\r
-\r
- Routine Description:\r
-\r
- Translate the first n characters of an Ascii string to\r
- Unicode characters. The count n is indicated by parameter\r
- Size. If Size is greater than the length of string, then\r
- the entire string is translated.\r
-\r
- Arguments:\r
-\r
- a - Pointer to input Ascii string.\r
- Size - The number of characters to translate.\r
- u - Pointer to output Unicode string buffer.\r
-\r
- Returns:\r
-\r
- None\r
-\r
---*/\r
-{\r
- UINTN i;\r
-\r
- i = 0;\r
- while (a[i] != 0) {\r
- u[i] = (CHAR16) a[i];\r
- if (i == Size) {\r
- break;\r
- }\r
-\r
- i++;\r
- }\r
- u[i] = 0;\r
-}\r
-\r
-VOID\r
-BdsBuildLegacyDevNameString (\r
- IN BBS_TABLE *CurBBSEntry,\r
- IN UINTN Index,\r
- IN UINTN BufSize,\r
- OUT CHAR16 *BootString\r
- )\r
-{\r
- CHAR16 *Fmt;\r
- CHAR16 *Type;\r
- UINT8 *StringDesc;\r
- CHAR16 temp[80];\r
-\r
- switch (Index) {\r
- //\r
- // Primary Master\r
- //\r
- case 1:\r
- Fmt = L"Primary Master %s";\r
- break;\r
-\r
- //\r
- // Primary Slave\r
- //\r
- case 2:\r
- Fmt = L"Primary Slave %s";\r
- break;\r
-\r
- //\r
- // Secondary Master\r
- //\r
- case 3:\r
- Fmt = L"Secondary Master %s";\r
- break;\r
-\r
- //\r
- // Secondary Slave\r
- //\r
- case 4:\r
- Fmt = L"Secondary Slave %s";\r
- break;\r
-\r
- default:\r
- Fmt = L"%s";\r
- break;\r
- }\r
-\r
- switch (CurBBSEntry->DeviceType) {\r
- case BBS_FLOPPY:\r
- Type = L"Floppy";\r
- break;\r
-\r
- case BBS_HARDDISK:\r
- Type = L"Harddisk";\r
- break;\r
-\r
- case BBS_CDROM:\r
- Type = L"CDROM";\r
- break;\r
-\r
- case BBS_PCMCIA:\r
- Type = L"PCMCIAe";\r
- break;\r
-\r
- case BBS_USB:\r
- Type = L"USB";\r
- break;\r
-\r
- case BBS_EMBED_NETWORK:\r
- Type = L"Network";\r
- break;\r
-\r
- case BBS_BEV_DEVICE:\r
- Type = L"BEVe";\r
- break;\r
-\r
- case BBS_UNKNOWN:\r
- default:\r
- Type = L"Unknown";\r
- break;\r
- }\r
- //\r
- // If current BBS entry has its description then use it.\r
- //\r
- StringDesc = (UINT8 *) (UINTN) ((CurBBSEntry->DescStringSegment << 4) + CurBBSEntry->DescStringOffset);\r
- if (NULL != StringDesc) {\r
- //\r
- // Only get fisrt 32 characters, this is suggested by BBS spec\r
- //\r
- AsciiToUnicodeSize (StringDesc, 32, temp);\r
- Fmt = L"%s";\r
- Type = temp;\r
- }\r
-\r
- UnicodeSPrint (BootString, BufSize, Fmt, Type);\r
-}\r
-\r
-EFI_STATUS\r
-BdsCreateLegacyBootOption (\r
- IN BBS_TABLE *CurrentBbsEntry,\r
- IN EFI_DEVICE_PATH_PROTOCOL *CurrentBbsDevPath,\r
- IN UINTN Index,\r
- IN OUT UINT16 **BootOrderList,\r
- IN OUT UINTN *BootOrderListSize\r
- )\r
-/*++\r
-\r
- Routine Description:\r
-\r
- Create a legacy boot option for the specified entry of\r
- BBS table, save it as variable, and append it to the boot\r
- order list.\r
-\r
- Arguments:\r
-\r
- CurrentBbsEntry - Pointer to current BBS table.\r
- CurrentBbsDevPath - Pointer to the Device Path Protocol instance of BBS\r
- Index - Index of the specified entry in BBS table.\r
- BootOrderList - On input, the original boot order list.\r
- On output, the new boot order list attached with the\r
- created node.\r
- BootOrderListSize - On input, the original size of boot order list.\r
- - On output, the size of new boot order list.\r
-\r
- Returns:\r
-\r
- EFI_SUCCESS - Boot Option successfully created.\r
- EFI_OUT_OF_RESOURCES - Fail to allocate necessary memory.\r
- Other - Error occurs while setting variable.\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- UINT16 CurrentBootOptionNo;\r
- UINT16 BootString[10];\r
- UINT16 BootDesc[100];\r
- UINT16 *NewBootOrderList;\r
- UINTN BufferSize;\r
- VOID *Buffer;\r
- UINT8 *Ptr;\r
- UINT16 CurrentBbsDevPathSize;\r
- UINTN BootOrderIndex;\r
- UINTN BootOrderLastIndex;\r
- UINTN ArrayIndex;\r
- BOOLEAN IndexNotFound;\r
-\r
- if (NULL == (*BootOrderList)) {\r
- CurrentBootOptionNo = 0;\r
- } else {\r
- for (ArrayIndex = 0; ArrayIndex < (UINTN) (*BootOrderListSize / sizeof (UINT16)); ArrayIndex++) {\r
- IndexNotFound = TRUE;\r
- for (BootOrderIndex = 0; BootOrderIndex < (UINTN) (*BootOrderListSize / sizeof (UINT16)); BootOrderIndex++) {\r
- if ((*BootOrderList)[BootOrderIndex] == ArrayIndex) {\r
- IndexNotFound = FALSE;\r
- break;\r
- }\r
- }\r
-\r
- if (!IndexNotFound) {\r
- continue;\r
- } else {\r
- break;\r
- }\r
- }\r
-\r
- CurrentBootOptionNo = (UINT16) ArrayIndex;\r
- }\r
-\r
- UnicodeSPrint (\r
- BootString,\r
- sizeof (BootString),\r
- L"Boot%04x",\r
- CurrentBootOptionNo\r
- );\r
-\r
- BdsBuildLegacyDevNameString (CurrentBbsEntry, Index, sizeof (BootDesc), BootDesc);\r
-\r
- CurrentBbsDevPathSize = (UINT16) (GetDevicePathSize (CurrentBbsDevPath));\r
-\r
- BufferSize = sizeof (UINT32) +\r
- sizeof (UINT16) +\r
- StrSize (BootDesc) +\r
- CurrentBbsDevPathSize +\r
- sizeof (BBS_TABLE) +\r
- sizeof (UINT16);\r
-\r
- Buffer = AllocateZeroPool (BufferSize);\r
- if (Buffer == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- Ptr = (UINT8 *) Buffer;\r
-\r
- *((UINT32 *) Ptr) = LOAD_OPTION_ACTIVE;\r
- Ptr += sizeof (UINT32);\r
-\r
- *((UINT16 *) Ptr) = CurrentBbsDevPathSize;\r
- Ptr += sizeof (UINT16);\r
-\r
- CopyMem (\r
- Ptr,\r
- BootDesc,\r
- StrSize (BootDesc)\r
- );\r
- Ptr += StrSize (BootDesc);\r
-\r
- CopyMem (\r
- Ptr,\r
- CurrentBbsDevPath,\r
- CurrentBbsDevPathSize\r
- );\r
- Ptr += CurrentBbsDevPathSize;\r
-\r
- CopyMem (\r
- Ptr,\r
- CurrentBbsEntry,\r
- sizeof (BBS_TABLE)\r
- );\r
-\r
- Ptr += sizeof (BBS_TABLE);\r
- *((UINT16 *) Ptr) = (UINT16) Index;\r
-\r
- Status = gRT->SetVariable (\r
- BootString,\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- BufferSize,\r
- Buffer\r
- );\r
-\r
- SafeFreePool (Buffer);\r
- Buffer = NULL;\r
-\r
- NewBootOrderList = AllocateZeroPool (*BootOrderListSize + sizeof (UINT16));\r
- if (NULL == NewBootOrderList) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- if (NULL != *BootOrderList) {\r
- CopyMem (NewBootOrderList, *BootOrderList, *BootOrderListSize);\r
- }\r
-\r
- SafeFreePool (*BootOrderList);\r
-\r
- BootOrderLastIndex = (UINTN) (*BootOrderListSize / sizeof (UINT16));\r
- NewBootOrderList[BootOrderLastIndex] = CurrentBootOptionNo;\r
- *BootOrderListSize += sizeof (UINT16);\r
- *BootOrderList = NewBootOrderList;\r
-\r
- return Status;\r
-}\r
-\r
-BOOLEAN\r
-BdsIsLegacyBootOption (\r
- IN UINT8 *BootOptionVar,\r
- OUT BBS_TABLE **BbsEntry,\r
- OUT UINT16 *BbsIndex\r
- )\r
-{\r
- UINT8 *Ptr;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- BOOLEAN Ret;\r
- UINT16 DevPathLen;\r
-\r
- Ptr = BootOptionVar;\r
- Ptr += sizeof (UINT32);\r
- DevPathLen = *(UINT16 *) Ptr;\r
- Ptr += sizeof (UINT16);\r
- Ptr += StrSize ((UINT16 *) Ptr);\r
- DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr;\r
- if ((BBS_DEVICE_PATH == DevicePath->Type) && (BBS_BBS_DP == DevicePath->SubType)) {\r
- Ptr += DevPathLen;\r
- *BbsEntry = (BBS_TABLE *) Ptr;\r
- Ptr += sizeof (BBS_TABLE);\r
- *BbsIndex = *(UINT16 *) Ptr;\r
- Ret = TRUE;\r
- } else {\r
- *BbsEntry = NULL;\r
- Ret = FALSE;\r
- }\r
-\r
- return Ret;\r
-}\r
-\r
-EFI_STATUS\r
-BdsDeleteBootOption (\r
- IN UINTN OptionNumber,\r
- IN OUT UINT16 *BootOrder,\r
- IN OUT UINTN *BootOrderSize\r
- )\r
-{\r
- UINT16 BootOption[100];\r
- UINTN Index;\r
- EFI_STATUS Status;\r
- UINTN Index2Del;\r
-\r
- Status = EFI_SUCCESS;\r
- Index2Del = 0;\r
-\r
- UnicodeSPrint (BootOption, sizeof (BootOption), L"Boot%04x", OptionNumber);\r
- Status = EfiLibDeleteVariable (BootOption, &gEfiGlobalVariableGuid);\r
- //\r
- // adjust boot order array\r
- //\r
- for (Index = 0; Index < *BootOrderSize / sizeof (UINT16); Index++) {\r
- if (BootOrder[Index] == OptionNumber) {\r
- Index2Del = Index;\r
- break;\r
- }\r
- }\r
-\r
- if (Index != *BootOrderSize / sizeof (UINT16)) {\r
- for (Index = 0; Index < *BootOrderSize / sizeof (UINT16) - 1; Index++) {\r
- if (Index >= Index2Del) {\r
- BootOrder[Index] = BootOrder[Index + 1];\r
- }\r
- }\r
-\r
- *BootOrderSize -= sizeof (UINT16);\r
- }\r
-\r
- return Status;\r
-\r
-}\r
-\r
-EFI_STATUS\r
-BdsDeleteAllInvalidLegacyBootOptions (\r
- VOID\r
- )\r
-/*++\r
-\r
- Routine Description:\r
-\r
- Delete all the invalid legacy boot options.\r
-\r
- Arguments:\r
-\r
- None.\r
-\r
- Returns:\r
-\r
- EFI_SUCCESS - All invalide legacy boot options are deleted.\r
- EFI_OUT_OF_RESOURCES - Fail to allocate necessary memory.\r
- EFI_NOT_FOUND - Fail to retrive variable of boot order.\r
- Other - Error occurs while setting variable or locating\r
- protocol.\r
-\r
---*/\r
-{\r
- UINT16 *BootOrder;\r
- UINT8 *BootOptionVar;\r
- UINTN BootOrderSize;\r
- UINTN BootOptionSize;\r
- EFI_STATUS Status;\r
- UINT16 HddCount;\r
- UINT16 BbsCount;\r
- HDD_INFO *LocalHddInfo;\r
- BBS_TABLE *LocalBbsTable;\r
- BBS_TABLE *BbsEntry;\r
- UINT16 BbsIndex;\r
- EFI_LEGACY_BIOS_PROTOCOL *LegacyBios;\r
- UINTN Index;\r
- UINT16 BootOption[10];\r
- UINT16 BootDesc[100];\r
- BOOLEAN DescStringMatch;\r
-\r
- Status = EFI_SUCCESS;\r
- BootOrder = NULL;\r
- BootOrderSize = 0;\r
- HddCount = 0;\r
- BbsCount = 0;\r
- LocalHddInfo = NULL;\r
- LocalBbsTable = NULL;\r
- BbsEntry = NULL;\r
-\r
- Status = EfiLibLocateProtocol (&gEfiLegacyBiosProtocolGuid, (VOID**) &LegacyBios);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- LegacyBios->GetBbsInfo (\r
- LegacyBios,\r
- &HddCount,\r
- &LocalHddInfo,\r
- &BbsCount,\r
- &LocalBbsTable\r
- );\r
-\r
- BootOrder = BdsLibGetVariableAndSize (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- &BootOrderSize\r
- );\r
- if (NULL == BootOrder) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- Index = 0;\r
- while (Index < BootOrderSize / sizeof (UINT16)) {\r
- UnicodeSPrint (BootOption, sizeof (BootOption), L"Boot%04x", BootOrder[Index]);\r
- BootOptionVar = BdsLibGetVariableAndSize (\r
- BootOption,\r
- &gEfiGlobalVariableGuid,\r
- &BootOptionSize\r
- );\r
- if (NULL == BootOptionVar) {\r
- SafeFreePool (BootOrder);\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- if (!BdsIsLegacyBootOption (BootOptionVar, &BbsEntry, &BbsIndex)) {\r
- SafeFreePool (BootOptionVar);\r
- Index++;\r
- continue;\r
- }\r
- \r
- //\r
- // Check if BBS Description String is changed\r
- //\r
- DescStringMatch = FALSE;\r
- \r
- BdsBuildLegacyDevNameString (\r
- &LocalBbsTable[BbsIndex], \r
- BbsIndex, \r
- sizeof(BootDesc), \r
- BootDesc\r
- );\r
- \r
- if (StrCmp (BootDesc, (UINT16*)(BootOptionVar + sizeof (UINT32) + sizeof (UINT16))) == 0) {\r
- DescStringMatch = TRUE;\r
- }\r
-\r
- if (!((LocalBbsTable[BbsIndex].BootPriority == BBS_IGNORE_ENTRY) ||\r
- (LocalBbsTable[BbsIndex].BootPriority == BBS_DO_NOT_BOOT_FROM) ||\r
- (LocalBbsTable[BbsIndex].BootPriority == BBS_LOWEST_PRIORITY)) &&\r
- (LocalBbsTable[BbsIndex].DeviceType == BbsEntry->DeviceType) &&\r
- DescStringMatch) {\r
- Index++;\r
- continue;\r
- }\r
-\r
- SafeFreePool (BootOptionVar);\r
- //\r
- // should delete\r
- //\r
- BdsDeleteBootOption (\r
- BootOrder[Index],\r
- BootOrder,\r
- &BootOrderSize\r
- );\r
- }\r
-\r
- if (BootOrderSize) {\r
- Status = gRT->SetVariable (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- BootOrderSize,\r
- BootOrder\r
- );\r
- } else {\r
- EfiLibDeleteVariable (L"BootOrder", &gEfiGlobalVariableGuid);\r
- }\r
-\r
- SafeFreePool (BootOrder);\r
-\r
- return Status;\r
-}\r
-\r
-BOOLEAN\r
-BdsFindLegacyBootOptionByDevType (\r
- IN UINT16 *BootOrder,\r
- IN UINTN BootOptionNum,\r
- IN UINT16 DevType,\r
- OUT UINT32 *Attribute,\r
- OUT UINT16 *BbsIndex,\r
- OUT UINTN *OptionNumber\r
- )\r
-{\r
- UINTN Index;\r
- UINTN BootOrderIndex;\r
- UINT16 BootOption[100];\r
- UINTN BootOptionSize;\r
- UINT8 *BootOptionVar;\r
- BBS_TABLE *BbsEntry;\r
- BOOLEAN Found;\r
-\r
- BbsEntry = NULL;\r
- Found = FALSE;\r
-\r
- if (NULL == BootOrder) {\r
- return Found;\r
- }\r
-\r
- for (BootOrderIndex = 0; BootOrderIndex < BootOptionNum; BootOrderIndex++) {\r
- Index = (UINTN) BootOrder[BootOrderIndex];\r
- UnicodeSPrint (BootOption, sizeof (BootOption), L"Boot%04x", Index);\r
- BootOptionVar = BdsLibGetVariableAndSize (\r
- BootOption,\r
- &gEfiGlobalVariableGuid,\r
- &BootOptionSize\r
- );\r
- if (NULL == BootOptionVar) {\r
- continue;\r
- }\r
-\r
- if (!BdsIsLegacyBootOption (BootOptionVar, &BbsEntry, BbsIndex)) {\r
- SafeFreePool (BootOptionVar);\r
- continue;\r
- }\r
-\r
- if (BbsEntry->DeviceType != DevType) {\r
- SafeFreePool (BootOptionVar);\r
- continue;\r
- }\r
-\r
- *Attribute = *(UINT32 *) BootOptionVar;\r
- *OptionNumber = Index;\r
- Found = TRUE;\r
- SafeFreePool (BootOptionVar);\r
- break;\r
- }\r
-\r
- return Found;\r
-}\r
-\r
-EFI_STATUS\r
-BdsCreateOneLegacyBootOption (\r
- IN BBS_TABLE *BbsItem,\r
- IN UINTN Index,\r
- IN OUT UINT16 **BootOrderList,\r
- IN OUT UINTN *BootOrderListSize\r
- )\r
-{\r
- BBS_BBS_DEVICE_PATH BbsDevPathNode;\r
- EFI_STATUS Status;\r
- EFI_DEVICE_PATH_PROTOCOL *DevPath;\r
-\r
- DevPath = NULL;\r
-\r
- BbsDevPathNode.Header.Type = BBS_DEVICE_PATH;\r
- BbsDevPathNode.Header.SubType = BBS_BBS_DP;\r
- SetDevicePathNodeLength (&BbsDevPathNode.Header, sizeof (BBS_BBS_DEVICE_PATH));\r
- BbsDevPathNode.DeviceType = BbsItem->DeviceType;\r
- CopyMem (&BbsDevPathNode.StatusFlag, &BbsItem->StatusFlags, sizeof (UINT16));\r
-\r
- DevPath = AppendDevicePathNode (\r
- EndDevicePath,\r
- (EFI_DEVICE_PATH_PROTOCOL *) &BbsDevPathNode\r
- );\r
- if (NULL == DevPath) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- Status = BdsCreateLegacyBootOption (\r
- BbsItem,\r
- DevPath,\r
- Index,\r
- BootOrderList,\r
- BootOrderListSize\r
- );\r
- BbsItem->BootPriority = 0x00;\r
-\r
- gBS->FreePool (DevPath);\r
-\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-BdsAddNonExistingLegacyBootOptions (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Add the legacy boot options from BBS table if they do not exist.\r
-\r
-Arguments:\r
-\r
- None.\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - The boot options are added successfully or they are already in boot options.\r
- others - An error occurred when creating legacy boot options.\r
-\r
---*/\r
-{\r
- UINT16 *BootOrder;\r
- UINTN BootOrderSize;\r
- EFI_STATUS Status;\r
- UINT16 HddCount;\r
- UINT16 BbsCount;\r
- HDD_INFO *LocalHddInfo;\r
- BBS_TABLE *LocalBbsTable;\r
- UINT16 BbsIndex;\r
- EFI_LEGACY_BIOS_PROTOCOL *LegacyBios;\r
- UINTN Index;\r
- UINT32 Attribute;\r
- UINTN OptionNumber;\r
- BOOLEAN Ret;\r
-\r
- BootOrder = NULL;\r
- HddCount = 0;\r
- BbsCount = 0;\r
- LocalHddInfo = NULL;\r
- LocalBbsTable = NULL;\r
-\r
- Status = EfiLibLocateProtocol (&gEfiLegacyBiosProtocolGuid, (VOID**)&LegacyBios);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- LegacyBios->GetBbsInfo (\r
- LegacyBios,\r
- &HddCount,\r
- &LocalHddInfo,\r
- &BbsCount,\r
- &LocalBbsTable\r
- );\r
-\r
- BootOrder = BdsLibGetVariableAndSize (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- &BootOrderSize\r
- );\r
- if (NULL == BootOrder) {\r
- BootOrderSize = 0;\r
- }\r
-\r
- for (Index = 0; Index < BbsCount; Index++) {\r
- if ((LocalBbsTable[Index].BootPriority == BBS_IGNORE_ENTRY) ||\r
- (LocalBbsTable[Index].BootPriority == BBS_DO_NOT_BOOT_FROM)\r
- ) {\r
- continue;\r
- }\r
-\r
- Ret = BdsFindLegacyBootOptionByDevType (\r
- BootOrder,\r
- BootOrderSize / sizeof (UINT16),\r
- LocalBbsTable[Index].DeviceType,\r
- &Attribute,\r
- &BbsIndex,\r
- &OptionNumber\r
- );\r
- if (Ret && (Attribute & LOAD_OPTION_ACTIVE) != 0) {\r
- continue;\r
- }\r
-\r
- if (Ret) {\r
- if (Index != BbsIndex) {\r
- BdsDeleteBootOption (\r
- OptionNumber,\r
- BootOrder,\r
- &BootOrderSize\r
- );\r
- } else {\r
- continue;\r
- }\r
- }\r
- //\r
- // Not found such type of legacy device in boot options or we found but it's disabled\r
- // so we have to create one and put it to the tail of boot order list\r
- //\r
- Status = BdsCreateOneLegacyBootOption (\r
- &LocalBbsTable[Index],\r
- Index,\r
- &BootOrder,\r
- &BootOrderSize\r
- );\r
- if (EFI_ERROR (Status)) {\r
- break;\r
- }\r
- }\r
-\r
- if (BootOrderSize > 0) {\r
- Status = gRT->SetVariable (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- BootOrderSize,\r
- BootOrder\r
- );\r
- } else {\r
- EfiLibDeleteVariable (L"BootOrder", &gEfiGlobalVariableGuid);\r
- }\r
-\r
- if (BootOrder != NULL) {\r
- SafeFreePool (BootOrder);\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-UINT16 *\r
-BdsFillDevOrderBuf (\r
- IN BBS_TABLE *BbsTable,\r
- IN BBS_TYPE BbsType,\r
- IN UINTN BbsCount,\r
- IN UINT16 *Buf\r
- )\r
-{\r
- UINTN Index;\r
-\r
- for (Index = 0; Index < BbsCount; Index++) {\r
- if (BbsTable[Index].BootPriority == BBS_IGNORE_ENTRY) {\r
- continue;\r
- }\r
-\r
- if (BbsTable[Index].DeviceType != BbsType) {\r
- continue;\r
- }\r
-\r
- *Buf = (UINT16) (Index & 0xFF);\r
- Buf++;\r
- }\r
-\r
- return Buf;\r
-}\r
-\r
-EFI_STATUS\r
-BdsCreateDevOrder (\r
- IN BBS_TABLE *BbsTable,\r
- IN UINT16 BbsCount\r
- )\r
-{\r
- UINTN Index;\r
- UINTN FDCount;\r
- UINTN HDCount;\r
- UINTN CDCount;\r
- UINTN NETCount;\r
- UINTN BEVCount;\r
- UINTN TotalSize;\r
- UINTN HeaderSize;\r
- UINT8 *DevOrder;\r
- UINT8 *Ptr;\r
- EFI_STATUS Status;\r
-\r
- FDCount = 0;\r
- HDCount = 0;\r
- CDCount = 0;\r
- NETCount = 0;\r
- BEVCount = 0;\r
- TotalSize = 0;\r
- HeaderSize = sizeof (BBS_TYPE) + sizeof (UINT16);\r
- DevOrder = NULL;\r
- Ptr = NULL;\r
- Status = EFI_SUCCESS;\r
-\r
- for (Index = 0; Index < BbsCount; Index++) {\r
- if (BbsTable[Index].BootPriority == BBS_IGNORE_ENTRY) {\r
- continue;\r
- }\r
-\r
- switch (BbsTable[Index].DeviceType) {\r
- case BBS_FLOPPY:\r
- FDCount++;\r
- break;\r
-\r
- case BBS_HARDDISK:\r
- HDCount++;\r
- break;\r
-\r
- case BBS_CDROM:\r
- CDCount++;\r
- break;\r
-\r
- case BBS_EMBED_NETWORK:\r
- NETCount++;\r
- break;\r
-\r
- case BBS_BEV_DEVICE:\r
- BEVCount++;\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
- }\r
-\r
- TotalSize += (HeaderSize + sizeof (UINT16) * FDCount);\r
- TotalSize += (HeaderSize + sizeof (UINT16) * HDCount);\r
- TotalSize += (HeaderSize + sizeof (UINT16) * CDCount);\r
- TotalSize += (HeaderSize + sizeof (UINT16) * NETCount);\r
- TotalSize += (HeaderSize + sizeof (UINT16) * BEVCount);\r
-\r
- DevOrder = AllocateZeroPool (TotalSize);\r
- if (NULL == DevOrder) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- Ptr = DevOrder;\r
-\r
- *((BBS_TYPE *) Ptr) = BBS_FLOPPY;\r
- Ptr += sizeof (BBS_TYPE);\r
- *((UINT16 *) Ptr) = (UINT16) (sizeof (UINT16) + FDCount * sizeof (UINT16));\r
- Ptr += sizeof (UINT16);\r
- if (FDCount) {\r
- Ptr = (UINT8 *) BdsFillDevOrderBuf (BbsTable, BBS_FLOPPY, BbsCount, (UINT16 *) Ptr);\r
- }\r
-\r
- *((BBS_TYPE *) Ptr) = BBS_HARDDISK;\r
- Ptr += sizeof (BBS_TYPE);\r
- *((UINT16 *) Ptr) = (UINT16) (sizeof (UINT16) + HDCount * sizeof (UINT16));\r
- Ptr += sizeof (UINT16);\r
- if (HDCount) {\r
- Ptr = (UINT8 *) BdsFillDevOrderBuf (BbsTable, BBS_HARDDISK, BbsCount, (UINT16 *) Ptr);\r
- }\r
-\r
- *((BBS_TYPE *) Ptr) = BBS_CDROM;\r
- Ptr += sizeof (BBS_TYPE);\r
- *((UINT16 *) Ptr) = (UINT16) (sizeof (UINT16) + CDCount * sizeof (UINT16));\r
- Ptr += sizeof (UINT16);\r
- if (CDCount) {\r
- Ptr = (UINT8 *) BdsFillDevOrderBuf (BbsTable, BBS_CDROM, BbsCount, (UINT16 *) Ptr);\r
- }\r
-\r
- *((BBS_TYPE *) Ptr) = BBS_EMBED_NETWORK;\r
- Ptr += sizeof (BBS_TYPE);\r
- *((UINT16 *) Ptr) = (UINT16) (sizeof (UINT16) + NETCount * sizeof (UINT16));\r
- Ptr += sizeof (UINT16);\r
- if (NETCount) {\r
- Ptr = (UINT8 *) BdsFillDevOrderBuf (BbsTable, BBS_EMBED_NETWORK, BbsCount, (UINT16 *) Ptr);\r
- }\r
-\r
- *((BBS_TYPE *) Ptr) = BBS_BEV_DEVICE;\r
- Ptr += sizeof (BBS_TYPE);\r
- *((UINT16 *) Ptr) = (UINT16) (sizeof (UINT16) + BEVCount * sizeof (UINT16));\r
- Ptr += sizeof (UINT16);\r
- if (BEVCount) {\r
- Ptr = (UINT8 *) BdsFillDevOrderBuf (BbsTable, BBS_BEV_DEVICE, BbsCount, (UINT16 *) Ptr);\r
- }\r
-\r
- Status = gRT->SetVariable (\r
- VarLegacyDevOrder,\r
- &EfiLegacyDevOrderGuid,\r
- VAR_FLAG,\r
- TotalSize,\r
- DevOrder\r
- );\r
- SafeFreePool (DevOrder);\r
-\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-BdsUpdateLegacyDevOrder (\r
- VOID\r
- )\r
-/*++\r
-Format of LegacyDevOrder variable:\r
-|-----------------------------------------------------------------------------------------------------------------\r
-| BBS_FLOPPY | Length | Index0 | Index1 | ... | BBS_HARDDISK | Length | Index0 | Index1 | ... | BBS_CDROM | Length | Index0 | ...\r
-|-----------------------------------------------------------------------------------------------------------------\r
-\r
-Length is a 16 bit integer, it indicates how many Indexes follows, including the size of itself.\r
-Index# is a 16 bit integer, the low byte of it stands for the index in BBS table\r
- the high byte of it only have two value 0 and 0xFF, 0xFF means this device has been\r
- disabled by user.\r
---*/\r
-{\r
- UINT8 *DevOrder;\r
- UINT8 *NewDevOrder;\r
- UINTN DevOrderSize;\r
- EFI_LEGACY_BIOS_PROTOCOL *LegacyBios;\r
- EFI_STATUS Status;\r
- UINT16 HddCount;\r
- UINT16 BbsCount;\r
- HDD_INFO *LocalHddInfo;\r
- BBS_TABLE *LocalBbsTable;\r
- UINTN Index;\r
- UINTN Index2;\r
- UINTN *Idx;\r
- UINTN FDCount;\r
- UINTN HDCount;\r
- UINTN CDCount;\r
- UINTN NETCount;\r
- UINTN BEVCount;\r
- UINTN TotalSize;\r
- UINTN HeaderSize;\r
- UINT8 *Ptr;\r
- UINT8 *NewPtr;\r
- UINT16 *NewFDPtr;\r
- UINT16 *NewHDPtr;\r
- UINT16 *NewCDPtr;\r
- UINT16 *NewNETPtr;\r
- UINT16 *NewBEVPtr;\r
- UINT16 *NewDevPtr;\r
- UINT16 Length;\r
- UINT16 tmp;\r
- UINTN FDIndex;\r
- UINTN HDIndex;\r
- UINTN CDIndex;\r
- UINTN NETIndex;\r
- UINTN BEVIndex;\r
-\r
- LocalHddInfo = NULL;\r
- LocalBbsTable = NULL;\r
- Idx = NULL;\r
- FDCount = 0;\r
- HDCount = 0;\r
- CDCount = 0;\r
- NETCount = 0;\r
- BEVCount = 0;\r
- TotalSize = 0;\r
- HeaderSize = sizeof (BBS_TYPE) + sizeof (UINT16);\r
- FDIndex = 0;\r
- HDIndex = 0;\r
- CDIndex = 0;\r
- NETIndex = 0;\r
- BEVIndex = 0;\r
- NewDevPtr = NULL;\r
-\r
- Status = EfiLibLocateProtocol (&gEfiLegacyBiosProtocolGuid, (VOID**) &LegacyBios);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- LegacyBios->GetBbsInfo (\r
- LegacyBios,\r
- &HddCount,\r
- &LocalHddInfo,\r
- &BbsCount,\r
- &LocalBbsTable\r
- );\r
-\r
- DevOrder = (UINT8 *) BdsLibGetVariableAndSize (\r
- VarLegacyDevOrder,\r
- &EfiLegacyDevOrderGuid,\r
- &DevOrderSize\r
- );\r
- if (NULL == DevOrder) {\r
- return BdsCreateDevOrder (LocalBbsTable, BbsCount);\r
- }\r
- //\r
- // First we figure out how many boot devices with same device type respectively\r
- //\r
- for (Index = 0; Index < BbsCount; Index++) {\r
- if ((LocalBbsTable[Index].BootPriority == BBS_IGNORE_ENTRY) ||\r
- (LocalBbsTable[Index].BootPriority == BBS_DO_NOT_BOOT_FROM) ||\r
- (LocalBbsTable[Index].BootPriority == BBS_LOWEST_PRIORITY)\r
- ) {\r
- continue;\r
- }\r
-\r
- switch (LocalBbsTable[Index].DeviceType) {\r
- case BBS_FLOPPY:\r
- FDCount++;\r
- break;\r
-\r
- case BBS_HARDDISK:\r
- HDCount++;\r
- break;\r
-\r
- case BBS_CDROM:\r
- CDCount++;\r
- break;\r
-\r
- case BBS_EMBED_NETWORK:\r
- NETCount++;\r
- break;\r
-\r
- case BBS_BEV_DEVICE:\r
- BEVCount++;\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
- }\r
-\r
- TotalSize += (HeaderSize + FDCount * sizeof (UINT16));\r
- TotalSize += (HeaderSize + HDCount * sizeof (UINT16));\r
- TotalSize += (HeaderSize + CDCount * sizeof (UINT16));\r
- TotalSize += (HeaderSize + NETCount * sizeof (UINT16));\r
- TotalSize += (HeaderSize + BEVCount * sizeof (UINT16));\r
-\r
- NewDevOrder = AllocateZeroPool (TotalSize);\r
- if (NULL == NewDevOrder) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewFDPtr = (UINT16 *) (NewDevOrder + HeaderSize);\r
- NewHDPtr = (UINT16 *) ((UINT8 *) NewFDPtr + FDCount * sizeof (UINT16) + HeaderSize);\r
- NewCDPtr = (UINT16 *) ((UINT8 *) NewHDPtr + HDCount * sizeof (UINT16) + HeaderSize);\r
- NewNETPtr = (UINT16 *) ((UINT8 *) NewCDPtr + CDCount * sizeof (UINT16) + HeaderSize);\r
- NewBEVPtr = (UINT16 *) ((UINT8 *) NewNETPtr + NETCount * sizeof (UINT16) + HeaderSize);\r
-\r
- //\r
- // copy FD\r
- //\r
- Ptr = DevOrder;\r
- NewPtr = NewDevOrder;\r
- *((BBS_TYPE *) NewPtr) = *((BBS_TYPE *) Ptr);\r
- Ptr += sizeof (BBS_TYPE);\r
- NewPtr += sizeof (BBS_TYPE);\r
- Length = *((UINT16 *) Ptr);\r
- *((UINT16 *) NewPtr) = (UINT16) (sizeof (UINT16) + FDCount * sizeof (UINT16));\r
- Ptr += sizeof (UINT16);\r
-\r
- for (Index = 0; Index < Length / sizeof (UINT16) - 1; Index++) {\r
- if (LocalBbsTable[*Ptr].BootPriority == BBS_IGNORE_ENTRY ||\r
- LocalBbsTable[*Ptr].BootPriority == BBS_DO_NOT_BOOT_FROM ||\r
- LocalBbsTable[*Ptr].BootPriority == BBS_LOWEST_PRIORITY ||\r
- LocalBbsTable[*Ptr].DeviceType != BBS_FLOPPY\r
- ) {\r
- Ptr += sizeof (UINT16);\r
- continue;\r
- }\r
-\r
- NewFDPtr[FDIndex] = *(UINT16 *) Ptr;\r
- FDIndex++;\r
- Ptr += sizeof (UINT16);\r
- }\r
- //\r
- // copy HD\r
- //\r
- NewPtr = (UINT8 *) NewHDPtr - HeaderSize;\r
- *((BBS_TYPE *) NewPtr) = *((BBS_TYPE *) Ptr);\r
- Ptr += sizeof (BBS_TYPE);\r
- NewPtr += sizeof (BBS_TYPE);\r
- Length = *((UINT16 *) Ptr);\r
- *((UINT16 *) NewPtr) = (UINT16) (sizeof (UINT16) + HDCount * sizeof (UINT16));\r
- Ptr += sizeof (UINT16);\r
-\r
- for (Index = 0; Index < Length / sizeof (UINT16) - 1; Index++) {\r
- if (LocalBbsTable[*Ptr].BootPriority == BBS_IGNORE_ENTRY ||\r
- LocalBbsTable[*Ptr].BootPriority == BBS_DO_NOT_BOOT_FROM ||\r
- LocalBbsTable[*Ptr].BootPriority == BBS_LOWEST_PRIORITY ||\r
- LocalBbsTable[*Ptr].DeviceType != BBS_HARDDISK\r
- ) {\r
- Ptr += sizeof (UINT16);\r
- continue;\r
- }\r
-\r
- NewHDPtr[HDIndex] = *(UINT16 *) Ptr;\r
- HDIndex++;\r
- Ptr += sizeof (UINT16);\r
- }\r
- //\r
- // copy CD\r
- //\r
- NewPtr = (UINT8 *) NewCDPtr - HeaderSize;\r
- *((BBS_TYPE *) NewPtr) = *((BBS_TYPE *) Ptr);\r
- Ptr += sizeof (BBS_TYPE);\r
- NewPtr += sizeof (BBS_TYPE);\r
- Length = *((UINT16 *) Ptr);\r
- *((UINT16 *) NewPtr) = (UINT16) (sizeof (UINT16) + CDCount * sizeof (UINT16));\r
- Ptr += sizeof (UINT16);\r
-\r
- for (Index = 0; Index < Length / sizeof (UINT16) - 1; Index++) {\r
- if (LocalBbsTable[*Ptr].BootPriority == BBS_IGNORE_ENTRY ||\r
- LocalBbsTable[*Ptr].BootPriority == BBS_DO_NOT_BOOT_FROM ||\r
- LocalBbsTable[*Ptr].BootPriority == BBS_LOWEST_PRIORITY ||\r
- LocalBbsTable[*Ptr].DeviceType != BBS_CDROM\r
- ) {\r
- Ptr += sizeof (UINT16);\r
- continue;\r
- }\r
-\r
- NewCDPtr[CDIndex] = *(UINT16 *) Ptr;\r
- CDIndex++;\r
- Ptr += sizeof (UINT16);\r
- }\r
- //\r
- // copy NET\r
- //\r
- NewPtr = (UINT8 *) NewNETPtr - HeaderSize;\r
- *((BBS_TYPE *) NewPtr) = *((BBS_TYPE *) Ptr);\r
- Ptr += sizeof (BBS_TYPE);\r
- NewPtr += sizeof (BBS_TYPE);\r
- Length = *((UINT16 *) Ptr);\r
- *((UINT16 *) NewPtr) = (UINT16) (sizeof (UINT16) + NETCount * sizeof (UINT16));\r
- Ptr += sizeof (UINT16);\r
-\r
- for (Index = 0; Index < Length / sizeof (UINT16) - 1; Index++) {\r
- if (LocalBbsTable[*Ptr].BootPriority == BBS_IGNORE_ENTRY ||\r
- LocalBbsTable[*Ptr].BootPriority == BBS_DO_NOT_BOOT_FROM ||\r
- LocalBbsTable[*Ptr].BootPriority == BBS_LOWEST_PRIORITY ||\r
- LocalBbsTable[*Ptr].DeviceType != BBS_EMBED_NETWORK\r
- ) {\r
- Ptr += sizeof (UINT16);\r
- continue;\r
- }\r
-\r
- NewNETPtr[NETIndex] = *(UINT16 *) Ptr;\r
- NETIndex++;\r
- Ptr += sizeof (UINT16);\r
- }\r
- //\r
- // copy BEV\r
- //\r
- NewPtr = (UINT8 *) NewBEVPtr - HeaderSize;\r
- *((BBS_TYPE *) NewPtr) = *((BBS_TYPE *) Ptr);\r
- Ptr += sizeof (BBS_TYPE);\r
- NewPtr += sizeof (BBS_TYPE);\r
- Length = *((UINT16 *) Ptr);\r
- *((UINT16 *) NewPtr) = (UINT16) (sizeof (UINT16) + BEVCount * sizeof (UINT16));\r
- Ptr += sizeof (UINT16);\r
-\r
- for (Index = 0; Index < Length / sizeof (UINT16) - 1; Index++) {\r
- if (LocalBbsTable[*Ptr].BootPriority == BBS_IGNORE_ENTRY ||\r
- LocalBbsTable[*Ptr].BootPriority == BBS_DO_NOT_BOOT_FROM ||\r
- LocalBbsTable[*Ptr].BootPriority == BBS_LOWEST_PRIORITY ||\r
- LocalBbsTable[*Ptr].DeviceType != BBS_BEV_DEVICE\r
- ) {\r
- Ptr += sizeof (UINT16);\r
- continue;\r
- }\r
-\r
- NewBEVPtr[BEVIndex] = *(UINT16 *) Ptr;\r
- BEVIndex++;\r
- Ptr += sizeof (UINT16);\r
- }\r
-\r
- for (Index = 0; Index < BbsCount; Index++) {\r
- if ((LocalBbsTable[Index].BootPriority == BBS_IGNORE_ENTRY) ||\r
- (LocalBbsTable[Index].BootPriority == BBS_DO_NOT_BOOT_FROM) ||\r
- (LocalBbsTable[Index].BootPriority == BBS_LOWEST_PRIORITY)\r
- ) {\r
- continue;\r
- }\r
-\r
- switch (LocalBbsTable[Index].DeviceType) {\r
- case BBS_FLOPPY:\r
- Idx = &FDIndex;\r
- NewDevPtr = NewFDPtr;\r
- break;\r
-\r
- case BBS_HARDDISK:\r
- Idx = &HDIndex;\r
- NewDevPtr = NewHDPtr;\r
- break;\r
-\r
- case BBS_CDROM:\r
- Idx = &CDIndex;\r
- NewDevPtr = NewCDPtr;\r
- break;\r
-\r
- case BBS_EMBED_NETWORK:\r
- Idx = &NETIndex;\r
- NewDevPtr = NewNETPtr;\r
- break;\r
-\r
- case BBS_BEV_DEVICE:\r
- Idx = &BEVIndex;\r
- NewDevPtr = NewBEVPtr;\r
- break;\r
-\r
- default:\r
- Idx = NULL;\r
- break;\r
- }\r
- //\r
- // at this point we have copied those valid indexes to new buffer\r
- // and we should check if there is any new appeared boot device\r
- //\r
- if (Idx) {\r
- for (Index2 = 0; Index2 < *Idx; Index2++) {\r
- if ((NewDevPtr[Index2] & 0xFF) == (UINT16) Index) {\r
- break;\r
- }\r
- }\r
-\r
- if (Index2 == *Idx) {\r
- //\r
- // Index2 == *Idx means we didn't find Index\r
- // so Index is a new appeared device's index in BBS table\r
- // save it.\r
- //\r
- NewDevPtr[*Idx] = (UINT16) (Index & 0xFF);\r
- (*Idx)++;\r
- }\r
- }\r
- }\r
-\r
- if (FDCount) {\r
- //\r
- // Just to make sure that disabled indexes are all at the end of the array\r
- //\r
- for (Index = 0; Index < FDIndex - 1; Index++) {\r
- if (0xFF00 != (NewFDPtr[Index] & 0xFF00)) {\r
- continue;\r
- }\r
-\r
- for (Index2 = Index + 1; Index2 < FDIndex; Index2++) {\r
- if (0 == (NewFDPtr[Index2] & 0xFF00)) {\r
- tmp = NewFDPtr[Index];\r
- NewFDPtr[Index] = NewFDPtr[Index2];\r
- NewFDPtr[Index2] = tmp;\r
- break;\r
- }\r
- }\r
- }\r
- }\r
-\r
- if (HDCount) {\r
- //\r
- // Just to make sure that disabled indexes are all at the end of the array\r
- //\r
- for (Index = 0; Index < HDIndex - 1; Index++) {\r
- if (0xFF00 != (NewHDPtr[Index] & 0xFF00)) {\r
- continue;\r
- }\r
-\r
- for (Index2 = Index + 1; Index2 < HDIndex; Index2++) {\r
- if (0 == (NewHDPtr[Index2] & 0xFF00)) {\r
- tmp = NewHDPtr[Index];\r
- NewHDPtr[Index] = NewHDPtr[Index2];\r
- NewHDPtr[Index2] = tmp;\r
- break;\r
- }\r
- }\r
- }\r
- }\r
-\r
- if (CDCount) {\r
- //\r
- // Just to make sure that disabled indexes are all at the end of the array\r
- //\r
- for (Index = 0; Index < CDIndex - 1; Index++) {\r
- if (0xFF00 != (NewCDPtr[Index] & 0xFF00)) {\r
- continue;\r
- }\r
-\r
- for (Index2 = Index + 1; Index2 < CDIndex; Index2++) {\r
- if (0 == (NewCDPtr[Index2] & 0xFF00)) {\r
- tmp = NewCDPtr[Index];\r
- NewCDPtr[Index] = NewCDPtr[Index2];\r
- NewCDPtr[Index2] = tmp;\r
- break;\r
- }\r
- }\r
- }\r
- }\r
-\r
- if (NETCount) {\r
- //\r
- // Just to make sure that disabled indexes are all at the end of the array\r
- //\r
- for (Index = 0; Index < NETIndex - 1; Index++) {\r
- if (0xFF00 != (NewNETPtr[Index] & 0xFF00)) {\r
- continue;\r
- }\r
-\r
- for (Index2 = Index + 1; Index2 < NETIndex; Index2++) {\r
- if (0 == (NewNETPtr[Index2] & 0xFF00)) {\r
- tmp = NewNETPtr[Index];\r
- NewNETPtr[Index] = NewNETPtr[Index2];\r
- NewNETPtr[Index2] = tmp;\r
- break;\r
- }\r
- }\r
- }\r
- }\r
-\r
- if (BEVCount) {\r
- //\r
- // Just to make sure that disabled indexes are all at the end of the array\r
- //\r
- for (Index = 0; Index < BEVIndex - 1; Index++) {\r
- if (0xFF00 != (NewBEVPtr[Index] & 0xFF00)) {\r
- continue;\r
- }\r
-\r
- for (Index2 = Index + 1; Index2 < BEVIndex; Index2++) {\r
- if (0 == (NewBEVPtr[Index2] & 0xFF00)) {\r
- tmp = NewBEVPtr[Index];\r
- NewBEVPtr[Index] = NewBEVPtr[Index2];\r
- NewBEVPtr[Index2] = tmp;\r
- break;\r
- }\r
- }\r
- }\r
- }\r
-\r
- SafeFreePool (DevOrder);\r
-\r
- Status = gRT->SetVariable (\r
- VarLegacyDevOrder,\r
- &EfiLegacyDevOrderGuid,\r
- VAR_FLAG,\r
- TotalSize,\r
- NewDevOrder\r
- );\r
- SafeFreePool (NewDevOrder);\r
-\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-BdsSetBootPriority4SameTypeDev (\r
- IN UINT16 DeviceType,\r
- IN OUT BBS_TABLE *LocalBbsTable,\r
- IN OUT UINT16 *Priority\r
- )\r
-/*++\r
-DeviceType - BBS_FLOPPY, BBS_HARDDISK, BBS_CDROM and so on\r
-LocalBbsTable - BBS table instance\r
-Priority - As input arg, it is the start point of boot priority, as output arg, it is the start point of boot\r
- priority can be used next time.\r
---*/\r
-{\r
- UINT8 *DevOrder;\r
-\r
- UINT8 *OrigBuffer;\r
- UINT16 *DevIndex;\r
- UINTN DevOrderSize;\r
- UINTN DevCount;\r
- UINTN Index;\r
-\r
- DevOrder = BdsLibGetVariableAndSize (\r
- VarLegacyDevOrder,\r
- &EfiLegacyDevOrderGuid,\r
- &DevOrderSize\r
- );\r
- if (NULL == DevOrder) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- OrigBuffer = DevOrder;\r
- while (DevOrder < OrigBuffer + DevOrderSize) {\r
- if (DeviceType == * (BBS_TYPE *) DevOrder) {\r
- break;\r
- }\r
-\r
- DevOrder += sizeof (BBS_TYPE);\r
- DevOrder += *(UINT16 *) DevOrder;\r
- }\r
-\r
- if (DevOrder >= OrigBuffer + DevOrderSize) {\r
- SafeFreePool (OrigBuffer);\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- DevOrder += sizeof (BBS_TYPE);\r
- DevCount = (*((UINT16 *) DevOrder) - sizeof (UINT16)) / sizeof (UINT16);\r
- DevIndex = (UINT16 *) (DevOrder + sizeof (UINT16));\r
- //\r
- // If the high byte of the DevIndex is 0xFF, it indicates that this device has been disabled.\r
- //\r
- for (Index = 0; Index < DevCount; Index++) {\r
- if ((DevIndex[Index] & 0xFF00) == 0xFF00) {\r
- //\r
- // LocalBbsTable[DevIndex[Index] & 0xFF].BootPriority = BBS_DISABLED_ENTRY;\r
- //\r
- } else {\r
- LocalBbsTable[DevIndex[Index] & 0xFF].BootPriority = *Priority;\r
- (*Priority)++;\r
- }\r
- }\r
-\r
- SafeFreePool (OrigBuffer);\r
- return EFI_SUCCESS;\r
-}\r
-\r
-VOID\r
-PrintBbsTable (\r
- IN BBS_TABLE *LocalBbsTable\r
- )\r
-{\r
- UINT16 Idx;\r
-\r
- DEBUG ((EFI_D_ERROR, "\n"));\r
- DEBUG ((EFI_D_ERROR, " NO Prio bb/dd/ff cl/sc Type Stat segm:offs\n"));\r
- DEBUG ((EFI_D_ERROR, "=============================================\n"));\r
- for (Idx = 0; Idx < MAX_BBS_ENTRIES; Idx++) {\r
- if ((LocalBbsTable[Idx].BootPriority == BBS_IGNORE_ENTRY) ||\r
- (LocalBbsTable[Idx].BootPriority == BBS_DO_NOT_BOOT_FROM) ||\r
- (LocalBbsTable[Idx].BootPriority == BBS_LOWEST_PRIORITY)\r
- ) {\r
- continue;\r
- }\r
-\r
- DEBUG (\r
- (EFI_D_ERROR,\r
- " %02x: %04x %02x/%02x/%02x %02x/02%x %04x %04x %04x:%04x\n",\r
- (UINTN) Idx,\r
- (UINTN) LocalBbsTable[Idx].BootPriority,\r
- (UINTN) LocalBbsTable[Idx].Bus,\r
- (UINTN) LocalBbsTable[Idx].Device,\r
- (UINTN) LocalBbsTable[Idx].Function,\r
- (UINTN) LocalBbsTable[Idx].Class,\r
- (UINTN) LocalBbsTable[Idx].SubClass,\r
- (UINTN) LocalBbsTable[Idx].DeviceType,\r
- (UINTN) * (UINT16 *) &LocalBbsTable[Idx].StatusFlags,\r
- (UINTN) LocalBbsTable[Idx].BootHandlerSegment,\r
- (UINTN) LocalBbsTable[Idx].BootHandlerOffset,\r
- (UINTN) ((LocalBbsTable[Idx].MfgStringSegment << 4) + LocalBbsTable[Idx].MfgStringOffset),\r
- (UINTN) ((LocalBbsTable[Idx].DescStringSegment << 4) + LocalBbsTable[Idx].DescStringOffset))\r
- );\r
- }\r
-\r
- DEBUG ((EFI_D_ERROR, "\n"));\r
-}\r
-\r
-EFI_STATUS\r
-BdsRefreshBbsTableForBoot (\r
- IN BDS_COMMON_OPTION *Entry\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINT16 HddCount;\r
- UINT16 BbsCount;\r
- HDD_INFO *LocalHddInfo;\r
- BBS_TABLE *LocalBbsTable;\r
- UINT16 DevType;\r
- EFI_LEGACY_BIOS_PROTOCOL *LegacyBios;\r
- UINTN Index;\r
- UINT16 Priority;\r
- UINT16 *BootOrder;\r
- UINTN BootOrderSize;\r
- UINT8 *BootOptionVar;\r
- UINTN BootOptionSize;\r
- UINT16 BootOption[100];\r
- UINT8 *Ptr;\r
- UINT16 DevPathLen;\r
- EFI_DEVICE_PATH_PROTOCOL *DevPath;\r
-\r
- HddCount = 0;\r
- BbsCount = 0;\r
- LocalHddInfo = NULL;\r
- LocalBbsTable = NULL;\r
- DevType = BBS_UNKNOWN;\r
-\r
- Status = EfiLibLocateProtocol (&gEfiLegacyBiosProtocolGuid, (VOID**) &LegacyBios);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- LegacyBios->GetBbsInfo (\r
- LegacyBios,\r
- &HddCount,\r
- &LocalHddInfo,\r
- &BbsCount,\r
- &LocalBbsTable\r
- );\r
- //\r
- // First, set all the present devices' boot priority to BBS_UNPRIORITIZED_ENTRY\r
- // We will set them according to the settings setup by user\r
- //\r
- for (Index = 0; Index < BbsCount; Index++) {\r
- if (!((BBS_IGNORE_ENTRY == LocalBbsTable[Index].BootPriority) ||\r
- (BBS_DO_NOT_BOOT_FROM == LocalBbsTable[Index].BootPriority) ||\r
- (BBS_LOWEST_PRIORITY == LocalBbsTable[Index].BootPriority))) {\r
- LocalBbsTable[Index].BootPriority = BBS_UNPRIORITIZED_ENTRY;\r
- }\r
- }\r
- //\r
- // boot priority always starts at 0\r
- //\r
- Priority = 0;\r
- if (Entry->LoadOptionsSize == sizeof (BBS_TABLE) + sizeof (UINT16)) {\r
- //\r
- // If Entry stands for a legacy boot option, we prioritize the devices with the same type first.\r
- //\r
- DevType = ((BBS_TABLE *) Entry->LoadOptions)->DeviceType;\r
- Status = BdsSetBootPriority4SameTypeDev (\r
- DevType,\r
- LocalBbsTable,\r
- &Priority\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- }\r
- //\r
- // we have to set the boot priority for other BBS entries with different device types\r
- //\r
- BootOrder = (UINT16 *) BdsLibGetVariableAndSize (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- &BootOrderSize\r
- );\r
- for (Index = 0; BootOrder && Index < BootOrderSize / sizeof (UINT16); Index++) {\r
- UnicodeSPrint (BootOption, sizeof (BootOption), L"Boot%04x", BootOrder[Index]);\r
- BootOptionVar = BdsLibGetVariableAndSize (\r
- BootOption,\r
- &gEfiGlobalVariableGuid,\r
- &BootOptionSize\r
- );\r
- if (NULL == BootOptionVar) {\r
- continue;\r
- }\r
-\r
- Ptr = BootOptionVar;\r
-\r
- Ptr += sizeof (UINT32);\r
- DevPathLen = *(UINT16 *) Ptr;\r
- Ptr += sizeof (UINT16);\r
- Ptr += StrSize ((UINT16 *) Ptr);\r
- DevPath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr;\r
- if (BBS_DEVICE_PATH != DevPath->Type || BBS_BBS_DP != DevPath->SubType) {\r
- SafeFreePool (BootOptionVar);\r
- continue;\r
- }\r
-\r
- Ptr += DevPathLen;\r
- if (DevType == ((BBS_TABLE *) Ptr)->DeviceType) {\r
- //\r
- // We don't want to process twice for a device type\r
- //\r
- SafeFreePool (BootOptionVar);\r
- continue;\r
- }\r
-\r
- Status = BdsSetBootPriority4SameTypeDev (\r
- ((BBS_TABLE *) Ptr)->DeviceType,\r
- LocalBbsTable,\r
- &Priority\r
- );\r
- SafeFreePool (BootOptionVar);\r
- if (EFI_ERROR (Status)) {\r
- break;\r
- }\r
- }\r
-\r
- if (BootOrder) {\r
- SafeFreePool (BootOrder);\r
- }\r
- //\r
- // For debug\r
- //\r
- PrintBbsTable (LocalBbsTable);\r
-\r
- return Status;\r
-}\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- BBSsupport.h\r
-\r
-Abstract:\r
-\r
- declares interface functions\r
-\r
-Revision History\r
-\r
---*/\r
-\r
-#ifndef _EFI_BDS_BBS_SUPPORT_H\r
-#define _EFI_BDS_BBS_SUPPORT_H\r
-\r
-#include "Generic/BootMaint/BootMaint.h"\r
-\r
-#ifdef EFI32\r
-#define REFRESH_LEGACY_BOOT_OPTIONS \\r
- BdsDeleteAllInvalidLegacyBootOptions ();\\r
- BdsAddNonExistingLegacyBootOptions (); \\r
- BdsUpdateLegacyDevOrder ()\r
-#else\r
-#define REFRESH_LEGACY_BOOT_OPTIONS\r
-#endif\r
-\r
-VOID\r
-BdsBuildLegacyDevNameString (\r
- IN BBS_TABLE *CurBBSEntry,\r
- IN UINTN Index,\r
- IN UINTN BufSize,\r
- OUT CHAR16 *BootString\r
- );\r
-\r
-EFI_STATUS\r
-BdsDeleteAllInvalidLegacyBootOptions (\r
- VOID\r
- );\r
-\r
-EFI_STATUS\r
-BdsAddNonExistingLegacyBootOptions (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Add the legacy boot options from BBS table if they do not exist.\r
-\r
-Arguments:\r
-\r
- None.\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - The boot options are added successfully or they are already in boot options.\r
- others - An error occurred when creating legacy boot options.\r
-\r
---*/\r
-;\r
-\r
-EFI_STATUS\r
-BdsUpdateLegacyDevOrder (\r
- VOID\r
- );\r
-\r
-EFI_STATUS\r
-BdsRefreshBbsTableForBoot (\r
- IN BDS_COMMON_OPTION *Entry\r
- );\r
-\r
-#endif\r
+++ /dev/null
-// *++\r
-//\r
-// Copyright (c) 2006, Intel Corporation \r
-// All rights reserved. This program and the accompanying materials \r
-// are licensed and made available under the terms and conditions of the BSD License \r
-// which accompanies this distribution. The full text of the license may be found at \r
-// http://opensource.org/licenses/bsd-license.php \r
-// \r
-// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-// \r
-// Module Name:\r
-//\r
-// bm.vfr \r
-// \r
-// Abstract:\r
-// \r
-// Boot Maintenance Utility Formset\r
-// \r
-// Revision History: \r
-// \r
-// --*/\r
-\r
-#include "BdsStrDefs.h" \r
-#include "FormGuid.h"\r
-\r
-#pragma pack(1)\r
-\r
-//\r
-// This is the structure that will be used to store the \r
-// question's current value. Use it at initialize time to \r
-// set default value for each question. When using at run\r
-// time, this map is returned by the callback function,\r
-// so dynamically changing the question's value will be\r
-// possible through this mechanism\r
-//\r
-typedef struct {\r
-\r
-//\r
-// Three questions displayed at the main page\r
-// for Timeout, BootNext Variables respectively\r
-//\r
- UINT16 BootTimeOut;\r
- UINT16 BootNext;\r
-\r
-//\r
-// This is the COM1 Attributes value storage\r
-//\r
- UINT8 COM1BaudRate;\r
- UINT8 COM1DataRate;\r
- UINT8 COM1StopBits;\r
- UINT8 COM1Parity;\r
- UINT8 COM1TerminalType;\r
- \r
-//\r
-// This is the COM2 Attributes value storage\r
-//\r
- UINT8 COM2BaudRate;\r
- UINT8 COM2DataRate;\r
- UINT8 COM2StopBits;\r
- UINT8 COM2Parity;\r
- UINT8 COM2TerminalType;\r
-\r
-// \r
-// Driver Option Add Handle page storage\r
-//\r
- UINT16 DriverAddHandleDesc[100];\r
- UINT16 DriverAddHandleOptionalData[100];\r
- UINT8 DriverAddActive;\r
- UINT8 DriverAddForceReconnect;\r
- \r
-//\r
-// Console Input/Output/Errorout using COM port check storage\r
-//\r
- UINT8 ConsoleInputCOM1;\r
- UINT8 ConsoleInputCOM2;\r
- UINT8 ConsoleOutputCOM1;\r
- UINT8 ConsoleOutputCOM2;\r
- UINT8 ConsoleErrorCOM1;\r
- UINT8 ConsoleErrorCOM2;\r
-\r
-//\r
-// At most 100 input/output/errorout device for console storage\r
-//\r
- UINT8 ConsoleCheck[100];\r
-\r
-//\r
-// Boot or Driver Option Order storage\r
-//\r
- UINT8 OptionOrder[100];\r
- UINT8 DriverOptionToBeDeleted[100];\r
-\r
-//\r
-// Boot Option Delete storage\r
-// \r
- UINT8 BootOptionDel[100];\r
- UINT8 DriverOptionDel[100];\r
- \r
-//\r
-// This is the Terminal Attributes value storage\r
-//\r
- UINT8 COMBaudRate;\r
- UINT8 COMDataRate;\r
- UINT8 COMStopBits;\r
- UINT8 COMParity;\r
- UINT8 COMTerminalType;\r
- \r
-//\r
-// Legacy Device Order Selection Storage\r
-//\r
- UINT8 LegacyFD[100];\r
- UINT8 LegacyHD[100];\r
- UINT8 LegacyCD[100];\r
- UINT8 LegacyNET[100];\r
- UINT8 LegacyBEV[100];\r
-} BMM_FAKE_NV_DATA;\r
-#pragma pack()\r
-\r
-\r
-#define FORM_MAIN_ID 0x0001\r
-#define FORM_BOOT_ADD_ID 0x0002\r
-#define FORM_BOOT_DEL_ID 0x0003\r
-#define FORM_BOOT_CHG_ID 0x0004\r
-#define FORM_DRV_ADD_ID 0x0005\r
-#define FORM_DRV_DEL_ID 0x0006\r
-#define FORM_DRV_CHG_ID 0x0007\r
-#define FORM_CON_MAIN_ID 0x0008\r
-#define FORM_CON_IN_ID 0x0009\r
-#define FORM_CON_OUT_ID 0x000A\r
-#define FORM_CON_ERR_ID 0x000B\r
-#define FORM_FILE_SEEK_ID 0x000C\r
-#define FORM_FILE_NEW_SEEK_ID 0x000D\r
-#define FORM_DRV_ADD_FILE_ID 0x000E\r
-#define FORM_DRV_ADD_HANDLE_ID 0x000F\r
-#define FORM_DRV_ADD_HANDLE_DESC_ID 0x0010\r
-#define FORM_BOOT_NEXT_ID 0x0011\r
-#define FORM_TIME_OUT_ID 0x0012\r
-#define FORM_RESET 0x0013\r
-#define FORM_BOOT_SETUP_ID 0x0014\r
-#define FORM_DRIVER_SETUP_ID 0x0015\r
-#define FORM_BOOT_LEGACY_DEVICE_ID 0x0016\r
-#define FORM_CON_COM_ID 0x0017\r
-#define FORM_CON_COM_SETUP_ID 0x0018\r
-#define FORM_SET_FD_ORDER_ID 0x0019\r
-#define FORM_SET_HD_ORDER_ID 0x001A\r
-#define FORM_SET_CD_ORDER_ID 0x001B\r
-#define FORM_SET_NET_ORDER_ID 0x001C\r
-#define FORM_SET_BEV_ORDER_ID 0x001D\r
- \r
-#define KEY_VALUE_BOOT_FROM_FILE 0x0092\r
-\r
-formset \r
- guid = MAIN_FORMSET_GUID,\r
- title = STRING_TOKEN(STR_FORM_MAIN_TITLE), // uint8 opcode, uint8 length, guid Handle, uint16 Title\r
- help = STRING_TOKEN(STR_NULL_STRING),\r
- class = 0, \r
- subclass = 0,\r
-\r
- form formid = FORM_MAIN_ID,\r
- title = STRING_TOKEN(STR_FORM_MAIN_TITLE);\r
-\r
- goto FORM_BOOT_SETUP_ID,\r
- prompt = STRING_TOKEN(STR_FORM_BOOT_SETUP_TITLE),\r
- help = STRING_TOKEN(STR_FORM_BOOT_SETUP_HELP),\r
- flags = INTERACTIVE | NV_ACCESS,\r
- key = FORM_BOOT_SETUP_ID;\r
-\r
- subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
-\r
- goto FORM_DRIVER_SETUP_ID,\r
- prompt = STRING_TOKEN(STR_FORM_DRIVER_SETUP_TITLE),\r
- help = STRING_TOKEN(STR_FORM_DRIVER_SETUP_HELP),\r
- flags = INTERACTIVE | NV_ACCESS,\r
- key = FORM_DRIVER_SETUP_ID;\r
-\r
- subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
-\r
- goto FORM_CON_MAIN_ID,\r
- prompt = STRING_TOKEN(STR_FORM_CON_MAIN_TITLE),\r
- help = STRING_TOKEN(STR_FORM_CON_MAIN_HELP),\r
- flags = INTERACTIVE | NV_ACCESS,\r
- key = FORM_CON_MAIN_ID;\r
- \r
- subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
-\r
- text \r
- help = STRING_TOKEN(STR_BOOT_FROM_FILE_HELP), \r
- text = STRING_TOKEN(STR_BOOT_FROM_FILE),\r
- text = STRING_TOKEN(STR_NULL_STRING),\r
- flags = INTERACTIVE | NV_ACCESS,\r
- key = KEY_VALUE_BOOT_FROM_FILE;\r
-\r
- subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
-\r
-// label FORM_MAIN_ID;\r
-\r
- goto FORM_BOOT_NEXT_ID,\r
- prompt = STRING_TOKEN(STR_FORM_BOOT_NEXT_TITLE),\r
- help = STRING_TOKEN(STR_FORM_BOOT_NEXT_HELP),\r
- flags = INTERACTIVE | NV_ACCESS,\r
- key = FORM_BOOT_NEXT_ID; \r
-\r
- goto FORM_TIME_OUT_ID,\r
- prompt = STRING_TOKEN(STR_FORM_TIME_OUT_TITLE),\r
- help = STRING_TOKEN(STR_FORM_TIME_OUT_HELP),\r
- flags = INTERACTIVE | NV_ACCESS,\r
- key = FORM_TIME_OUT_ID;\r
- \r
- subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
-\r
- goto FORM_MAIN_ID,\r
- prompt = STRING_TOKEN(STR_RESET),\r
- help = STRING_TOKEN(STR_RESET),\r
- flags = INTERACTIVE | NV_ACCESS,\r
- key = FORM_RESET;\r
- \r
- endform; \r
-\r
- form formid = FORM_BOOT_SETUP_ID,\r
- title = STRING_TOKEN(STR_FORM_BOOT_SETUP_TITLE);\r
-\r
- goto FORM_MAIN_ID,\r
- prompt = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
- help = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
- flags = INTERACTIVE | NV_ACCESS,\r
- key = FORM_MAIN_ID;\r
-\r
- goto FORM_BOOT_ADD_ID,\r
- prompt = STRING_TOKEN(STR_FORM_BOOT_ADD_TITLE),\r
- help = STRING_TOKEN(STR_FORM_BOOT_ADD_HELP),\r
- flags = INTERACTIVE | NV_ACCESS,\r
- key = FORM_BOOT_ADD_ID;\r
- \r
- goto FORM_BOOT_DEL_ID,\r
- prompt = STRING_TOKEN(STR_FORM_BOOT_DEL_TITLE),\r
- help = STRING_TOKEN(STR_FORM_NEXT_BOOT_HELP),\r
- flags = INTERACTIVE | NV_ACCESS,\r
- key = FORM_BOOT_DEL_ID;\r
- \r
- goto FORM_BOOT_CHG_ID,\r
- prompt = STRING_TOKEN(STR_FORM_BOOT_CHG_TITLE),\r
- help = STRING_TOKEN(STR_FORM_NEXT_BOOT_HELP),\r
- flags = INTERACTIVE | NV_ACCESS,\r
- key = FORM_BOOT_CHG_ID;\r
-\r
- subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
- //\r
- // We will add "Select Legacy Boot Floppy Drive" and "Select Legacy Boot Hard Drive" \r
- // here dynamically\r
- //\r
- label FORM_BOOT_LEGACY_DEVICE_ID;\r
-\r
- endform; \r
-\r
- form formid = FORM_DRIVER_SETUP_ID,\r
- title = STRING_TOKEN(STR_FORM_DRIVER_SETUP_TITLE);\r
-\r
- goto FORM_MAIN_ID,\r
- prompt = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
- help = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
- flags = INTERACTIVE | NV_ACCESS,\r
- key = FORM_MAIN_ID;\r
-\r
- goto FORM_DRV_ADD_ID,\r
- prompt = STRING_TOKEN(STR_FORM_DRV_ADD_TITLE),\r
- help = STRING_TOKEN(STR_FORM_DRV_ADD_HELP),\r
- flags = INTERACTIVE | NV_ACCESS,\r
- key = FORM_DRV_ADD_ID;\r
- \r
- goto FORM_DRV_DEL_ID,\r
- prompt = STRING_TOKEN(STR_FORM_DRV_DEL_TITLE),\r
- help = STRING_TOKEN(STR_FORM_NEXT_BOOT_HELP),\r
- flags = INTERACTIVE | NV_ACCESS,\r
- key = FORM_DRV_DEL_ID;\r
- \r
- goto FORM_DRV_CHG_ID,\r
- prompt = STRING_TOKEN(STR_FORM_DRV_CHG_TITLE),\r
- help = STRING_TOKEN(STR_FORM_NEXT_BOOT_HELP),\r
- flags = INTERACTIVE | NV_ACCESS,\r
- key = FORM_DRV_CHG_ID;\r
- endform; \r
-\r
- form formid = FORM_BOOT_ADD_ID,\r
- title = STRING_TOKEN(STR_FORM_BOOT_ADD_TITLE);\r
-\r
- label FORM_BOOT_ADD_ID;\r
- endform;\r
-\r
- form formid = FORM_BOOT_DEL_ID,\r
- title = STRING_TOKEN(STR_FORM_BOOT_DEL_TITLE);\r
-\r
- label FORM_BOOT_DEL_ID;\r
- endform;\r
-\r
- form formid = FORM_BOOT_CHG_ID,\r
- title = STRING_TOKEN(STR_FORM_BOOT_CHG_TITLE);\r
-\r
- label FORM_BOOT_CHG_ID;\r
- \r
- //\r
- // This tag is added for bypassing issue of setup browser\r
- // setup browser could not support dynamic form very well.\r
- //\r
- checkbox varid = BMM_FAKE_NV_DATA.OptionOrder[0],\r
- prompt = STRING_TOKEN(STR_FORM_BOOT_CHG_TITLE),\r
- help = STRING_TOKEN(STR_FORM_BOOT_CHG_TITLE), \r
- flags = 1,\r
- key = 0,\r
- endcheckbox;\r
- \r
- endform;\r
-\r
- form formid = FORM_BOOT_NEXT_ID,\r
- title = STRING_TOKEN(STR_FORM_BOOT_NEXT_TITLE);\r
-\r
- label FORM_BOOT_NEXT_ID;\r
- endform;\r
- \r
- form formid = FORM_TIME_OUT_ID,\r
- title = STRING_TOKEN(STR_FORM_TIME_OUT_TITLE);\r
- \r
- label FORM_TIME_OUT_ID;\r
- endform;\r
- \r
- form formid = FORM_DRV_ADD_ID,\r
- title = STRING_TOKEN(STR_FORM_DRV_ADD_TITLE);\r
-\r
- goto FORM_MAIN_ID,\r
- prompt = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
- help = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
- flags = INTERACTIVE | NV_ACCESS,\r
- key = FORM_MAIN_ID;\r
- \r
- goto FORM_DRV_ADD_FILE_ID,\r
- prompt = STRING_TOKEN(STR_FORM_DRV_ADD_FILE_TITLE),\r
- help = STRING_TOKEN(STR_FORM_DRV_ADD_FILE_TITLE),\r
- flags = INTERACTIVE | NV_ACCESS,\r
- key = FORM_DRV_ADD_FILE_ID;\r
-\r
- endform;\r
-\r
- form formid = FORM_DRV_DEL_ID,\r
- title = STRING_TOKEN(STR_FORM_DRV_DEL_TITLE);\r
-\r
- label FORM_DRV_DEL_ID;\r
-\r
- endform;\r
-\r
- form formid = FORM_DRV_CHG_ID,\r
- title = STRING_TOKEN(STR_FORM_DRV_CHG_TITLE);\r
-\r
- label FORM_DRV_CHG_ID;\r
- \r
- //\r
- // This tag is added for bypassing issue of setup browser\r
- // setup browser could not support dynamic form very well.\r
- //\r
- checkbox varid = BMM_FAKE_NV_DATA.OptionOrder[0],\r
- prompt = STRING_TOKEN(STR_FORM_DRV_CHG_TITLE),\r
- help = STRING_TOKEN(STR_FORM_DRV_CHG_TITLE), \r
- flags = 1,\r
- key = 0,\r
- endcheckbox;\r
- \r
- endform;\r
-\r
- form formid = FORM_CON_MAIN_ID,\r
- title = STRING_TOKEN(STR_FORM_CON_MAIN_TITLE);\r
-\r
- goto FORM_MAIN_ID,\r
- prompt = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
- help = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
- flags = INTERACTIVE | NV_ACCESS,\r
- key = FORM_MAIN_ID;\r
-\r
- goto FORM_CON_IN_ID,\r
- prompt = STRING_TOKEN(STR_FORM_CON_IN_TITLE),\r
- help = STRING_TOKEN(STR_FORM_CON_IN_HELP),\r
- flags = INTERACTIVE | NV_ACCESS,\r
- key = FORM_CON_IN_ID;\r
-\r
- goto FORM_CON_OUT_ID,\r
- prompt = STRING_TOKEN(STR_FORM_CON_OUT_TITLE),\r
- help = STRING_TOKEN(STR_FORM_CON_OUT_HELP),\r
- flags = INTERACTIVE | NV_ACCESS,\r
- key = FORM_CON_OUT_ID;\r
- \r
- goto FORM_CON_ERR_ID,\r
- prompt = STRING_TOKEN(STR_FORM_STD_ERR_TITLE),\r
- help = STRING_TOKEN(STR_FORM_STD_ERR_HELP),\r
- flags = INTERACTIVE | NV_ACCESS,\r
- key = FORM_CON_ERR_ID;\r
-\r
- goto FORM_CON_COM_ID,\r
- prompt = STRING_TOKEN(STR_FORM_COM_TITLE),\r
- help = STRING_TOKEN(STR_FORM_COM_HELP),\r
- flags = INTERACTIVE | NV_ACCESS,\r
- key = FORM_CON_COM_ID;\r
- endform;\r
-\r
- form formid = FORM_CON_COM_ID,\r
- title = STRING_TOKEN(STR_FORM_COM_TITLE);\r
-\r
- label FORM_CON_COM_ID;\r
- endform;\r
-\r
- form formid = FORM_CON_COM_SETUP_ID,\r
- title = STRING_TOKEN(STR_CON_COM_SETUP);\r
-\r
- label FORM_CON_COM_SETUP_ID;\r
- endform;\r
-\r
- form formid = FORM_FILE_SEEK_ID,\r
- title = STRING_TOKEN(STR_FORM_BOOT_ADD_TITLE);\r
-\r
- label FORM_FILE_SEEK_ID;\r
- endform;\r
-\r
- form formid = FORM_FILE_NEW_SEEK_ID,\r
- title = STRING_TOKEN(STR_FORM_BOOT_ADD_TITLE);\r
-\r
- label FORM_FILE_NEW_SEEK_ID;\r
- endform;\r
-\r
- form formid = FORM_DRV_ADD_FILE_ID,\r
- title = STRING_TOKEN(STR_FORM_DRV_ADD_FILE_TITLE);\r
-\r
- label FORM_DRV_ADD_FILE_ID;\r
- endform;\r
-\r
- form formid = FORM_DRV_ADD_HANDLE_ID,\r
- title = STRING_TOKEN(STR_FORM_DRV_ADD_HANDLE_TITLE);\r
-\r
- label FORM_DRV_ADD_HANDLE_ID;\r
- endform; \r
-\r
- form formid = FORM_DRV_ADD_HANDLE_DESC_ID,\r
- title = STRING_TOKEN(STR_FORM_DRV_ADD_DESC_TITLE);\r
-\r
- label FORM_DRV_ADD_HANDLE_DESC_ID;\r
-\r
- endform;\r
-\r
- form formid = FORM_CON_IN_ID,\r
- title = STRING_TOKEN(STR_FORM_CON_IN_TITLE);\r
-\r
- label FORM_CON_IN_ID;\r
-\r
- endform;\r
-\r
- form formid = FORM_CON_OUT_ID,\r
- title = STRING_TOKEN(STR_FORM_CON_OUT_TITLE);\r
-\r
- label FORM_CON_OUT_ID;\r
-\r
- endform;\r
-\r
- form formid = FORM_CON_ERR_ID,\r
- title = STRING_TOKEN(STR_FORM_STD_ERR_TITLE);\r
-\r
- label FORM_CON_ERR_ID;\r
-\r
- endform;\r
-\r
- form formid = FORM_SET_FD_ORDER_ID,\r
- title = STRING_TOKEN(STR_FORM_SET_FD_ORDER_TITLE);\r
-\r
- label FORM_SET_FD_ORDER_ID;\r
- endform;\r
- \r
- form formid = FORM_SET_HD_ORDER_ID,\r
- title = STRING_TOKEN(STR_FORM_SET_HD_ORDER_TITLE);\r
-\r
- label FORM_SET_HD_ORDER_ID;\r
- endform;\r
-\r
- form formid = FORM_SET_CD_ORDER_ID,\r
- title = STRING_TOKEN(STR_FORM_SET_CD_ORDER_TITLE);\r
-\r
- label FORM_SET_CD_ORDER_ID;\r
- endform;\r
-\r
- form formid = FORM_SET_NET_ORDER_ID,\r
- title = STRING_TOKEN(STR_FORM_SET_NET_ORDER_TITLE);\r
-\r
- label FORM_SET_NET_ORDER_ID;\r
- endform;\r
-\r
- form formid = FORM_SET_BEV_ORDER_ID,\r
- title = STRING_TOKEN(STR_FORM_SET_BEV_ORDER_TITLE);\r
-\r
- label FORM_SET_BEV_ORDER_ID;\r
- endform;\r
-\r
-endformset;\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- BmLib.c\r
- \r
-AgBStract:\r
-\r
- Boot Maintainence Helper functions\r
-\r
---*/\r
-\r
-#include "BootMaint.h"\r
-\r
-EFI_STATUS\r
-EfiLibLocateProtocol (\r
- IN EFI_GUID *ProtocolGuid,\r
- OUT VOID **Interface\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Find the first instance of this Protocol \r
- in the system and return it's interface\r
-\r
-Arguments:\r
-\r
- ProtocolGuid - Provides the protocol to search for\r
- Interface - On return, a pointer to the first interface \r
- that matches ProtocolGuid\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - A protocol instance matching ProtocolGuid was found\r
-\r
- EFI_NOT_FOUND - No protocol instances were found that match ProtocolGuid\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
-\r
- Status = gBS->LocateProtocol (\r
- ProtocolGuid,\r
- NULL,\r
- Interface\r
- );\r
- return Status;\r
-}\r
-\r
-EFI_FILE_HANDLE\r
-EfiLibOpenRoot (\r
- IN EFI_HANDLE DeviceHandle\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Function opens and returns a file handle to the root directory of a volume.\r
-\r
-Arguments:\r
-\r
- DeviceHandle - A handle for a device\r
-\r
-Returns:\r
- \r
- A valid file handle or NULL is returned\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Volume;\r
- EFI_FILE_HANDLE File;\r
-\r
- File = NULL;\r
-\r
- //\r
- // File the file system interface to the device\r
- //\r
- Status = gBS->HandleProtocol (\r
- DeviceHandle,\r
- &gEfiSimpleFileSystemProtocolGuid,\r
- (VOID *) &Volume\r
- );\r
-\r
- //\r
- // Open the root directory of the volume\r
- //\r
- if (!EFI_ERROR (Status)) {\r
- Status = Volume->OpenVolume (\r
- Volume,\r
- &File\r
- );\r
- }\r
- //\r
- // Done\r
- //\r
- return EFI_ERROR (Status) ? NULL : File;\r
-}\r
-\r
-BOOLEAN\r
-EfiGrowBuffer (\r
- IN OUT EFI_STATUS *Status,\r
- IN OUT VOID **Buffer,\r
- IN UINTN BufferSize\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Helper function called as part of the code needed\r
- to allocate the proper sized buffer for various \r
- EFI interfaces.\r
-\r
-Arguments:\r
-\r
- Status - Current status\r
-\r
- Buffer - Current allocated buffer, or NULL\r
-\r
- BufferSize - Current buffer size needed\r
- \r
-Returns:\r
- \r
- TRUE - if the buffer was reallocated and the caller \r
- should try the API again.\r
-\r
---*/\r
-{\r
- BOOLEAN TryAgain;\r
-\r
- //\r
- // If this is an initial request, buffer will be null with a new buffer size\r
- //\r
- if (!*Buffer && BufferSize) {\r
- *Status = EFI_BUFFER_TOO_SMALL;\r
- }\r
- //\r
- // If the status code is "buffer too small", resize the buffer\r
- //\r
- TryAgain = FALSE;\r
- if (*Status == EFI_BUFFER_TOO_SMALL) {\r
-\r
- SafeFreePool (*Buffer);\r
-\r
- *Buffer = AllocateZeroPool (BufferSize);\r
-\r
- if (*Buffer) {\r
- TryAgain = TRUE;\r
- } else {\r
- *Status = EFI_OUT_OF_RESOURCES;\r
- }\r
- }\r
- //\r
- // If there's an error, free the buffer\r
- //\r
- if (!TryAgain && EFI_ERROR (*Status) && *Buffer) {\r
- SafeFreePool (*Buffer);\r
- *Buffer = NULL;\r
- }\r
-\r
- return TryAgain;\r
-}\r
-\r
-VOID *\r
-EfiLibGetVariable (\r
- IN CHAR16 *Name,\r
- IN EFI_GUID *VendorGuid\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Function returns the value of the specified variable.\r
-\r
-Arguments:\r
- Name - A Null-terminated Unicode string that is \r
- the name of the vendor's variable.\r
-\r
- VendorGuid - A unique identifier for the vendor.\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-{\r
- UINTN VarSize;\r
-\r
- return BdsLibGetVariableAndSize (Name, VendorGuid, &VarSize);\r
-}\r
-\r
-EFI_STATUS\r
-EfiLibDeleteVariable (\r
- IN CHAR16 *VarName,\r
- IN EFI_GUID *VarGuid\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Function deletes the variable specified by VarName and VarGuid.\r
-\r
-Arguments:\r
- VarName - A Null-terminated Unicode string that is \r
- the name of the vendor's variable.\r
-\r
- VendorGuid - A unique identifier for the vendor.\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - The variable was found and removed\r
-\r
- EFI_UNSUPPORTED - The variable store was inaccessible\r
-\r
- EFI_OUT_OF_RESOURCES - The temporary buffer was not available\r
-\r
- EFI_NOT_FOUND - The variable was not found\r
-\r
---*/\r
-{\r
- VOID *VarBuf;\r
- EFI_STATUS Status;\r
-\r
- VarBuf = EfiLibGetVariable (VarName, VarGuid);\r
- Status = EFI_NOT_FOUND;\r
-\r
- if (VarBuf) {\r
- //\r
- // Delete variable from Storage\r
- //\r
- Status = gRT->SetVariable (VarName, VarGuid, VAR_FLAG, 0, NULL);\r
- ASSERT (!EFI_ERROR (Status));\r
- SafeFreePool (VarBuf);\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-EFI_FILE_SYSTEM_VOLUME_LABEL_INFO *\r
-EfiLibFileSystemVolumeLabelInfo (\r
- IN EFI_FILE_HANDLE FHand\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Function gets the file system information from an open file descriptor, \r
- and stores it in a buffer allocated from pool.\r
-\r
-Arguments:\r
-\r
- Fhand - A file handle\r
-\r
-Returns:\r
- \r
- A pointer to a buffer with file information or NULL is returned\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_FILE_SYSTEM_VOLUME_LABEL_INFO *Buffer;\r
- UINTN BufferSize;\r
- //\r
- // Initialize for GrowBuffer loop\r
- //\r
- Buffer = NULL;\r
- BufferSize = SIZE_OF_EFI_FILE_SYSTEM_VOLUME_LABEL_INFO + 200;\r
-\r
- //\r
- // Call the real function\r
- //\r
- while (EfiGrowBuffer (&Status, (VOID **) &Buffer, BufferSize)) {\r
- Status = FHand->GetInfo (\r
- FHand,\r
- &gEfiFileSystemVolumeLabelInfoIdGuid,\r
- &BufferSize,\r
- Buffer\r
- );\r
- }\r
-\r
- return Buffer;\r
-}\r
-\r
-CHAR16 *\r
-EfiStrDuplicate (\r
- IN CHAR16 *Src\r
- )\r
-{\r
- CHAR16 *Dest;\r
- UINTN Size;\r
-\r
- Size = StrSize (Src);\r
- Dest = AllocateZeroPool (Size);\r
- ASSERT (Dest != NULL);\r
- if (Dest) {\r
- CopyMem (Dest, Src, Size);\r
- }\r
-\r
- return Dest;\r
-}\r
-\r
-EFI_FILE_INFO *\r
-EfiLibFileInfo (\r
- IN EFI_FILE_HANDLE FHand\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Function gets the file information from an open file descriptor, and stores it \r
- in a buffer allocated from pool.\r
-\r
-Arguments:\r
-\r
- Fhand - A file handle\r
-\r
-Returns:\r
- \r
- A pointer to a buffer with file information or NULL is returned\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_FILE_INFO *Buffer;\r
- UINTN BufferSize;\r
-\r
- //\r
- // Initialize for GrowBuffer loop\r
- //\r
- Buffer = NULL;\r
- BufferSize = SIZE_OF_EFI_FILE_INFO + 200;\r
-\r
- //\r
- // Call the real function\r
- //\r
- while (EfiGrowBuffer (&Status, (VOID **) &Buffer, BufferSize)) {\r
- Status = FHand->GetInfo (\r
- FHand,\r
- &gEfiFileInfoGuid,\r
- &BufferSize,\r
- Buffer\r
- );\r
- }\r
-\r
- return Buffer;\r
-}\r
-\r
-UINTN\r
-EfiDevicePathInstanceCount (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Function is used to determine the number of device path instances \r
- that exist in a device path.\r
-\r
-Arguments:\r
- DevicePath - A pointer to a device path data structure.\r
-\r
-Returns:\r
-\r
- This function counts and returns the number of device path instances \r
- in DevicePath.\r
-\r
---*/\r
-{\r
- UINTN Count;\r
- UINTN Size;\r
-\r
- Count = 0;\r
- while (GetNextDevicePathInstance (&DevicePath, &Size)) {\r
- Count += 1;\r
- }\r
-\r
- return Count;\r
-}\r
-\r
-VOID *\r
-EfiReallocatePool (\r
- IN VOID *OldPool,\r
- IN UINTN OldSize,\r
- IN UINTN NewSize\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Adjusts the size of a previously allocated buffer.\r
-\r
-Arguments:\r
- OldPool - A pointer to the buffer whose size is being adjusted.\r
- OldSize - The size of the current buffer.\r
- NewSize - The size of the new buffer.\r
-\r
-Returns:\r
-\r
- EFI_SUCEESS - The requested number of bytes were allocated.\r
-\r
- EFI_OUT_OF_RESOURCES - The pool requested could not be allocated.\r
-\r
- EFI_INVALID_PARAMETER - The buffer was invalid.\r
-\r
---*/\r
-{\r
- VOID *NewPool;\r
-\r
- NewPool = NULL;\r
- if (NewSize) {\r
- NewPool = AllocateZeroPool (NewSize);\r
- }\r
-\r
- if (OldPool) {\r
- if (NewPool) {\r
- CopyMem (NewPool, OldPool, OldSize < NewSize ? OldSize : NewSize);\r
- }\r
-\r
- SafeFreePool (OldPool);\r
- }\r
-\r
- return NewPool;\r
-}\r
-\r
-EFI_STATUS\r
-EfiLibGetStringFromToken (\r
- IN EFI_GUID *ProducerGuid,\r
- IN STRING_REF Token,\r
- OUT CHAR16 **String\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Acquire the string associated with the ProducerGuid and return it.\r
-\r
-Arguments:\r
- \r
- ProducerGuid - The Guid to search the HII database for\r
- Token - The token value of the string to extract\r
- String - The string that is extracted\r
- \r
-Returns:\r
-\r
- EFI_SUCCESS - Buffer filled with the requested forms. BufferLength\r
- was updated.\r
- EFI_BUFFER_TOO_SMALL - The buffer provided was not large enough to allow the form to be stored.\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- UINT16 HandleBufferLength;\r
- EFI_HII_HANDLE *HiiHandleBuffer;\r
- UINTN StringBufferLength;\r
- UINTN NumberOfHiiHandles;\r
- UINTN Index;\r
- UINT16 Length;\r
- EFI_GUID HiiGuid;\r
- EFI_HII_PROTOCOL *Hii;\r
-\r
- //\r
- // Initialize params.\r
- //\r
- HandleBufferLength = 0;\r
- HiiHandleBuffer = NULL;\r
- \r
- Status = gBS->LocateProtocol (\r
- &gEfiHiiProtocolGuid,\r
- NULL,\r
- (VOID**) &Hii\r
- );\r
- if (EFI_ERROR (Status)) {\r
- *String = NULL;\r
- return Status;\r
- }\r
- //\r
- // Get all the Hii handles\r
- //\r
- Status = BdsLibGetHiiHandles (Hii, &HandleBufferLength, &HiiHandleBuffer);\r
- ASSERT_EFI_ERROR (Status);\r
- \r
- //\r
- // Get the Hii Handle that matches the StructureNode->ProducerName\r
- //\r
- NumberOfHiiHandles = HandleBufferLength / sizeof (EFI_HII_HANDLE);\r
- for (Index = 0; Index < NumberOfHiiHandles; Index++) {\r
- Length = 0;\r
- Status = ExtractDataFromHiiHandle (\r
- HiiHandleBuffer[Index],\r
- &Length,\r
- NULL,\r
- &HiiGuid\r
- );\r
- if (CompareGuid (ProducerGuid, &HiiGuid)) {\r
- break;\r
- }\r
- }\r
- //\r
- // Find the string based on the current language\r
- //\r
- StringBufferLength = 0x100;\r
- *String = AllocateZeroPool (0x100);\r
- ASSERT (*String != NULL);\r
-\r
- Status = Hii->GetString (\r
- Hii,\r
- HiiHandleBuffer[Index],\r
- Token,\r
- FALSE,\r
- NULL,\r
- &StringBufferLength,\r
- *String\r
- );\r
-\r
- gBS->FreePool (HiiHandleBuffer);\r
-\r
- return Status;\r
-}\r
-\r
-BOOLEAN\r
-TimeCompare (\r
- IN EFI_TIME *FirstTime,\r
- IN EFI_TIME *SecondTime\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Compare two EFI_TIME data.\r
-\r
-Arguments:\r
-\r
- FirstTime - A pointer to the first EFI_TIME data.\r
- SecondTime - A pointer to the second EFI_TIME data.\r
-\r
-Returns:\r
- TRUE The FirstTime is not later than the SecondTime.\r
- FALSE The FirstTime is later than the SecondTime.\r
- \r
---*/\r
-{\r
- if (FirstTime->Year != SecondTime->Year) {\r
- return (BOOLEAN) (FirstTime->Year < SecondTime->Year);\r
- } else if (FirstTime->Month != SecondTime->Month) {\r
- return (BOOLEAN) (FirstTime->Month < SecondTime->Month);\r
- } else if (FirstTime->Day != SecondTime->Day) {\r
- return (BOOLEAN) (FirstTime->Day < SecondTime->Day);\r
- } else if (FirstTime->Hour != SecondTime->Hour) {\r
- return (BOOLEAN) (FirstTime->Hour < SecondTime->Hour);\r
- } else if (FirstTime->Minute != SecondTime->Minute) {\r
- return (BOOLEAN) (FirstTime->Minute < FirstTime->Minute);\r
- } else if (FirstTime->Second != SecondTime->Second) {\r
- return (BOOLEAN) (FirstTime->Second < SecondTime->Second);\r
- }\r
-\r
- return (BOOLEAN) (FirstTime->Nanosecond <= SecondTime->Nanosecond);\r
-}\r
-\r
-UINT16 *\r
-EfiLibStrFromDatahub (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevPath\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINT16 *Desc;\r
- EFI_DATA_HUB_PROTOCOL *Datahub;\r
- UINT64 Count;\r
- EFI_DATA_RECORD_HEADER *Record;\r
- EFI_SUBCLASS_TYPE1_HEADER *DataHdr;\r
- EFI_GUID MiscGuid = EFI_MISC_SUBCLASS_GUID;\r
- EFI_MISC_ONBOARD_DEVICE_DATA *ob;\r
- EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *Port;\r
- EFI_TIME CurTime;\r
-\r
- Status = gBS->LocateProtocol (\r
- &gEfiDataHubProtocolGuid,\r
- NULL,\r
- (VOID**) &Datahub\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return NULL;\r
- }\r
-\r
- Status = gRT->GetTime (&CurTime, NULL);\r
- if (EFI_ERROR (Status)) {\r
- return NULL;\r
- }\r
-\r
- Count = 0;\r
- do {\r
- Status = Datahub->GetNextRecord (Datahub, &Count, NULL, &Record);\r
-\r
- if (EFI_ERROR (Status)) {\r
- break;\r
- }\r
-\r
- if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA && CompareGuid (&Record->DataRecordGuid, &MiscGuid)) {\r
- //\r
- // This record is what we need\r
- //\r
- DataHdr = (EFI_SUBCLASS_TYPE1_HEADER *) (Record + 1);\r
- if (EFI_MISC_ONBOARD_DEVICE_RECORD_NUMBER == DataHdr->RecordType) {\r
- ob = (EFI_MISC_ONBOARD_DEVICE_DATA *) (DataHdr + 1);\r
- if (BdsLibMatchDevicePaths ((EFI_DEVICE_PATH_PROTOCOL *) &ob->OnBoardDevicePath, DevPath)) {\r
- EfiLibGetStringFromToken (&Record->ProducerName, ob->OnBoardDeviceDescription, &Desc);\r
- return Desc;\r
- }\r
- }\r
-\r
- if (EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_RECORD_NUMBER == DataHdr->RecordType) {\r
- Port = (EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *) (DataHdr + 1);\r
- if (BdsLibMatchDevicePaths ((EFI_DEVICE_PATH_PROTOCOL *) &Port->PortPath, DevPath)) {\r
- EfiLibGetStringFromToken (&Record->ProducerName, Port->PortExternalConnectorDesignator, &Desc);\r
- return Desc;\r
- }\r
- }\r
- }\r
-\r
- } while (TimeCompare (&Record->LogTime, &CurTime) && Count != 0);\r
-\r
- return NULL;\r
-}\r
+++ /dev/null
-/*++ \r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- BootMaint.c\r
- \r
-Abstract:\r
-\r
- Boot Maintainence Main File\r
-\r
---*/\r
-\r
-#include "Generic/Bds.h"\r
-#include "BootMaint.h"\r
-#include "BdsStrDefs.h"\r
-#include "FormGuid.h"\r
-\r
-//\r
-// Form binary for Boot Maintenance\r
-//\r
-extern UINT8 BmBin[];\r
-extern UINT8 FEBin[];\r
-extern EFI_GUID gBdsStringPackGuid;\r
-extern BOOLEAN gConnectAllHappened;\r
-\r
-EFI_GUID EfiLegacyDevOrderGuid = EFI_LEGACY_DEV_ORDER_VARIABLE_GUID;\r
-\r
-VOID\r
-InitAllMenu (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-VOID\r
-FreeAllMenu (\r
- VOID\r
- );\r
-\r
-EFI_STATUS\r
-CreateMenuStringToken (\r
- IN BMM_CALLBACK_DATA *CallbackData,\r
- IN EFI_HII_HANDLE HiiHandle,\r
- IN BM_MENU_OPTION *MenuOption\r
- )\r
-/*++\r
-Routine Description:\r
-\r
- Create string tokens for a menu from its help strings and display strings\r
-\r
-Arguments:\r
-\r
- HiiHandle - Hii Handle of the package to be updated.\r
- \r
- MenuOption - The Menu whose string tokens need to be created\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - string tokens created successfully\r
- \r
- others - contain some errors\r
- \r
---*/\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- UINTN Index;\r
-\r
- for (Index = 0; Index < MenuOption->MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (MenuOption, Index);\r
- CallbackData->Hii->NewString (\r
- CallbackData->Hii,\r
- NULL,\r
- HiiHandle,\r
- &NewMenuEntry->DisplayStringToken,\r
- NewMenuEntry->DisplayString\r
- );\r
-\r
- if (NULL == NewMenuEntry->HelpString) {\r
- NewMenuEntry->HelpStringToken = NewMenuEntry->DisplayStringToken;\r
- } else {\r
- CallbackData->Hii->NewString (\r
- CallbackData->Hii,\r
- NULL,\r
- HiiHandle,\r
- &NewMenuEntry->HelpStringToken,\r
- NewMenuEntry->HelpString\r
- );\r
- }\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-DriverCallback (\r
- IN EFI_FORM_CALLBACK_PROTOCOL *This,\r
- IN UINT16 KeyValue,\r
- IN EFI_IFR_DATA_ARRAY *Data,\r
- OUT EFI_HII_CALLBACK_PACKET **Packet\r
- )\r
-/*++\r
-Routine Description:\r
-\r
- Callback Function for boot maintenance utility user interface interaction.\r
-\r
-Arguments:\r
-\r
- This - File explorer callback protocol pointer. \r
- KeyValue - Key value to identify the type of data to expect.\r
- Data - A pointer to the data being sent to the original exporting driver.\r
- Packet - A pointer to a packet of information which a driver passes back to the browser.\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - Callback ended successfully.\r
- Others - Contain some errors.\r
- \r
---*/\r
-{\r
- BMM_CALLBACK_DATA *Private;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BMM_FAKE_NV_DATA *CurrentFakeNVMap;\r
- EFI_STATUS Status;\r
- UINTN OldValue;\r
- UINTN NewValue;\r
- UINTN Number;\r
- UINTN Pos;\r
- UINTN Bit;\r
- UINT16 NewValuePos;\r
- UINT16 Index2;\r
- UINT16 Index;\r
- UINT8 *OldLegacyDev;\r
- UINT8 *NewLegacyDev;\r
- UINT8 *Location;\r
- UINT8 *DisMap;\r
- FORM_ID FormId;\r
-\r
- OldValue = 0;\r
- NewValue = 0;\r
- Number = 0;\r
- OldLegacyDev = NULL;\r
- NewLegacyDev = NULL;\r
- NewValuePos = 0;\r
- DisMap = NULL;\r
-\r
- Private = BMM_CALLBACK_DATA_FROM_THIS (This);\r
- UpdateData->FormCallbackHandle = (EFI_PHYSICAL_ADDRESS) (UINTN) Private->BmmCallbackHandle;\r
- CurrentFakeNVMap = (BMM_FAKE_NV_DATA *) Data->NvRamMap;\r
- Private->BmmFakeNvData = CurrentFakeNVMap;\r
- Location = (UINT8 *) &UpdateData->Data;\r
-\r
- UpdatePageId (Private, KeyValue);\r
-\r
- //\r
- // need to be subtituded.\r
- //\r
- // Update Select FD/HD/CD/NET/BEV Order Form\r
- //\r
- if (FORM_SET_FD_ORDER_ID == Private->BmmPreviousPageId ||\r
- FORM_SET_HD_ORDER_ID == Private->BmmPreviousPageId ||\r
- FORM_SET_CD_ORDER_ID == Private->BmmPreviousPageId ||\r
- FORM_SET_NET_ORDER_ID == Private->BmmPreviousPageId ||\r
- FORM_SET_BEV_ORDER_ID == Private->BmmPreviousPageId ||\r
- ((FORM_BOOT_SETUP_ID == Private->BmmPreviousPageId) &&\r
- (KeyValue >= LEGACY_FD_QUESTION_ID) &&\r
- (KeyValue < (LEGACY_BEV_QUESTION_ID + 100)) )\r
- ) {\r
-\r
- DisMap = Private->BmmOldFakeNVData.DisableMap;\r
-\r
- FormId = Private->BmmPreviousPageId;\r
- if (FormId == FORM_BOOT_SETUP_ID) {\r
- FormId = Private->BmmCurrentPageId;\r
- }\r
-\r
- switch (FormId) {\r
- case FORM_SET_FD_ORDER_ID:\r
- Number = (UINT16) LegacyFDMenu.MenuNumber;\r
- OldLegacyDev = Private->BmmOldFakeNVData.LegacyFD;\r
- NewLegacyDev = CurrentFakeNVMap->LegacyFD;\r
- break;\r
-\r
- case FORM_SET_HD_ORDER_ID:\r
- Number = (UINT16) LegacyHDMenu.MenuNumber;\r
- OldLegacyDev = Private->BmmOldFakeNVData.LegacyHD;\r
- NewLegacyDev = CurrentFakeNVMap->LegacyHD;\r
- break;\r
-\r
- case FORM_SET_CD_ORDER_ID:\r
- Number = (UINT16) LegacyCDMenu.MenuNumber;\r
- OldLegacyDev = Private->BmmOldFakeNVData.LegacyCD;\r
- NewLegacyDev = CurrentFakeNVMap->LegacyCD;\r
- break;\r
-\r
- case FORM_SET_NET_ORDER_ID:\r
- Number = (UINT16) LegacyNETMenu.MenuNumber;\r
- OldLegacyDev = Private->BmmOldFakeNVData.LegacyNET;\r
- NewLegacyDev = CurrentFakeNVMap->LegacyNET;\r
- break;\r
-\r
- case FORM_SET_BEV_ORDER_ID:\r
- Number = (UINT16) LegacyBEVMenu.MenuNumber;\r
- OldLegacyDev = Private->BmmOldFakeNVData.LegacyBEV;\r
- NewLegacyDev = CurrentFakeNVMap->LegacyBEV;\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
- //\r
- // First, find the different position\r
- // if there is change, it should be only one\r
- //\r
- for (Index = 0; Index < Number; Index++) {\r
- if (OldLegacyDev[Index] != NewLegacyDev[Index]) {\r
- OldValue = OldLegacyDev[Index];\r
- NewValue = NewLegacyDev[Index];\r
- break;\r
- }\r
- }\r
-\r
- if (Index != Number) {\r
- //\r
- // there is change, now process\r
- //\r
- if (0xFF == NewValue) {\r
- //\r
- // This item will be disable\r
- // Just move the items behind this forward to overlap it\r
- //\r
- Pos = OldValue / 8;\r
- Bit = 7 - (OldValue % 8);\r
- DisMap[Pos] |= (UINT8) (1 << Bit);\r
- for (Index2 = Index; Index2 < Number - 1; Index2++) {\r
- NewLegacyDev[Index2] = NewLegacyDev[Index2 + 1];\r
- }\r
-\r
- NewLegacyDev[Index2] = 0xFF;\r
- } else {\r
- for (Index2 = 0; Index2 < Number; Index2++) {\r
- if (Index2 == Index) {\r
- continue;\r
- }\r
-\r
- if (OldLegacyDev[Index2] == NewValue) {\r
- //\r
- // If NewValue is in OldLegacyDev array\r
- // remember its old position\r
- //\r
- NewValuePos = Index2;\r
- break;\r
- }\r
- }\r
-\r
- if (Index2 != Number) {\r
- //\r
- // We will change current item to an existing item\r
- // (It's hard to describe here, please read code, it's like a cycle-moving)\r
- //\r
- for (Index2 = NewValuePos; Index2 != Index;) {\r
- if (NewValuePos < Index) {\r
- NewLegacyDev[Index2] = OldLegacyDev[Index2 + 1];\r
- Index2++;\r
- } else {\r
- NewLegacyDev[Index2] = OldLegacyDev[Index2 - 1];\r
- Index2--;\r
- }\r
- }\r
- } else {\r
- //\r
- // If NewValue is not in OldlegacyDev array, we are changing to a disabled item\r
- // so we should modify DisMap to reflect the change\r
- //\r
- Pos = NewValue / 8;\r
- Bit = 7 - (NewValue % 8);\r
- DisMap[Pos] &= ~ (UINT8) (1 << Bit);\r
- if (0xFF != OldValue) {\r
- //\r
- // Because NewValue is a item that was disabled before\r
- // so after changing the OldValue should be disabled\r
- // actually we are doing a swap of enable-disable states of two items\r
- //\r
- Pos = OldValue / 8;\r
- Bit = 7 - (OldValue % 8);\r
- DisMap[Pos] |= (UINT8) (1 << Bit);\r
- }\r
- }\r
- }\r
- //\r
- // To prevent DISABLE appears in the middle of the list\r
- // we should perform a re-ordering\r
- //\r
- Index = 0;\r
- while (Index < Number) {\r
- if (0xFF != NewLegacyDev[Index]) {\r
- Index++;\r
- continue;\r
- }\r
-\r
- Index2 = Index;\r
- Index2++;\r
- while (Index2 < Number) {\r
- if (0xFF != NewLegacyDev[Index2]) {\r
- break;\r
- }\r
-\r
- Index2++;\r
- }\r
-\r
- if (Index2 < Number) {\r
- NewLegacyDev[Index] = NewLegacyDev[Index2];\r
- NewLegacyDev[Index2] = 0xFF;\r
- }\r
-\r
- Index++;\r
- }\r
-\r
- CopyMem (\r
- OldLegacyDev,\r
- NewLegacyDev,\r
- Number\r
- );\r
- }\r
- }\r
-\r
- if (KeyValue < FILE_OPTION_OFFSET) {\r
- if (KeyValue < NORMAL_GOTO_OFFSET) {\r
- switch (KeyValue) {\r
- case KEY_VALUE_BOOT_FROM_FILE:\r
- Private->FeCurrentState = BOOT_FROM_FILE_STATE;\r
-\r
- //\r
- // Exit Bmm main formset to send File Explorer formset.\r
- //\r
- CreateCallbackPacket (Packet, EXIT_REQUIRED);\r
-\r
- break;\r
-\r
- case FORM_BOOT_ADD_ID:\r
- Private->FeCurrentState = ADD_BOOT_OPTION_STATE;\r
-\r
- //\r
- // Exit Bmm main formset to send File Explorer formset.\r
- //\r
- CreateCallbackPacket (Packet, EXIT_REQUIRED);\r
- break;\r
-\r
- case FORM_DRV_ADD_FILE_ID:\r
- Private->FeCurrentState = ADD_DRIVER_OPTION_STATE;\r
-\r
- //\r
- // Exit Bmm main formset to send File Explorer formset.\r
- //\r
- CreateCallbackPacket (Packet, EXIT_REQUIRED);\r
-\r
- break;\r
-\r
- case FORM_DRV_ADD_HANDLE_ID:\r
- CleanUpPage (FORM_DRV_ADD_HANDLE_ID, Private);\r
- UpdateDrvAddHandlePage (Private);\r
- break;\r
-\r
- case FORM_BOOT_DEL_ID:\r
- CleanUpPage (FORM_BOOT_DEL_ID, Private);\r
- UpdateBootDelPage (Private);\r
- break;\r
-\r
- case FORM_BOOT_CHG_ID:\r
- case FORM_DRV_CHG_ID:\r
- UpdatePageBody (KeyValue, Private);\r
- break;\r
-\r
- case FORM_DRV_DEL_ID:\r
- CleanUpPage (FORM_DRV_DEL_ID, Private);\r
- UpdateDrvDelPage (Private);\r
- break;\r
-\r
- case FORM_BOOT_NEXT_ID:\r
- CleanUpPage (FORM_BOOT_NEXT_ID, Private);\r
- UpdateBootNextPage (Private);\r
- break;\r
-\r
- case FORM_TIME_OUT_ID:\r
- CleanUpPage (FORM_TIME_OUT_ID, Private);\r
- UpdateTimeOutPage (Private);\r
- break;\r
-\r
- case FORM_RESET:\r
- gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);\r
- return EFI_UNSUPPORTED;\r
-\r
- case FORM_CON_IN_ID:\r
- case FORM_CON_OUT_ID:\r
- case FORM_CON_ERR_ID:\r
- UpdatePageBody (KeyValue, Private);\r
- break;\r
-\r
- case FORM_CON_COM_ID:\r
- CleanUpPage (FORM_CON_COM_ID, Private);\r
- UpdateConCOMPage (Private);\r
- break;\r
-\r
- case FORM_SET_FD_ORDER_ID:\r
- case FORM_SET_HD_ORDER_ID:\r
- case FORM_SET_CD_ORDER_ID:\r
- case FORM_SET_NET_ORDER_ID:\r
- case FORM_SET_BEV_ORDER_ID:\r
- CleanUpPage (KeyValue, Private);\r
- UpdateSetLegacyDeviceOrderPage (KeyValue, Private);\r
- break;\r
-\r
- case KEY_VALUE_SAVE_AND_EXIT:\r
- case KEY_VALUE_NO_SAVE_AND_EXIT:\r
-\r
- if (KeyValue == KEY_VALUE_SAVE_AND_EXIT) {\r
- Status = ApplyChangeHandler (Private, CurrentFakeNVMap, Private->BmmPreviousPageId);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- } else if (KeyValue == KEY_VALUE_NO_SAVE_AND_EXIT) {\r
- DiscardChangeHandler (Private, CurrentFakeNVMap);\r
- }\r
- //\r
- // Tell browser not to ask for confirmation of changes,\r
- // since we have already applied or discarded.\r
- //\r
- CreateCallbackPacket (Packet, NV_NOT_CHANGED);\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
- } else if ((KeyValue >= TERMINAL_OPTION_OFFSET) && (KeyValue < CONSOLE_OPTION_OFFSET)) {\r
- Index2 = (UINT16) (KeyValue - TERMINAL_OPTION_OFFSET);\r
- Private->CurrentTerminal = Index2;\r
-\r
- CleanUpPage (FORM_CON_COM_SETUP_ID, Private);\r
- UpdateTerminalPage (Private);\r
-\r
- } else if (KeyValue >= HANDLE_OPTION_OFFSET) {\r
- Index2 = (UINT16) (KeyValue - HANDLE_OPTION_OFFSET);\r
-\r
- NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index2);\r
- ASSERT (NewMenuEntry != NULL);\r
- Private->HandleContext = (BM_HANDLE_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
- CleanUpPage (FORM_DRV_ADD_HANDLE_DESC_ID, Private);\r
-\r
- Private->MenuEntry = NewMenuEntry;\r
- Private->LoadContext->FilePathList = Private->HandleContext->DevicePath;\r
-\r
- UpdateDriverAddHandleDescPage (Private);\r
- }\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-ApplyChangeHandler (\r
- IN BMM_CALLBACK_DATA *Private,\r
- IN BMM_FAKE_NV_DATA *CurrentFakeNVMap,\r
- IN FORM_ID FormId\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Function handling request to apply changes for BMM pages.\r
-\r
-Arguments:\r
-\r
- Private - Pointer to callback data buffer.\r
- CurrentFakeNVMap - Pointer to buffer holding data of various values used by BMM\r
- FormId - ID of the form which has sent the request to apply change.\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - Change successfully applied.\r
- Other - Error occurs while trying to apply changes.\r
-\r
---*/\r
-{\r
- BM_CONSOLE_CONTEXT *NewConsoleContext;\r
- BM_TERMINAL_CONTEXT *NewTerminalContext;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- EFI_STATUS Status;\r
- UINT16 Index;\r
-\r
- Status = EFI_SUCCESS;\r
-\r
- switch (FormId) {\r
- case FORM_SET_FD_ORDER_ID:\r
- case FORM_SET_HD_ORDER_ID:\r
- case FORM_SET_CD_ORDER_ID:\r
- case FORM_SET_NET_ORDER_ID:\r
- case FORM_SET_BEV_ORDER_ID:\r
- Var_UpdateBBSOption (Private);\r
- break;\r
-\r
- case FORM_BOOT_DEL_ID:\r
- for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewLoadContext->Deleted = CurrentFakeNVMap->BootOptionDel[Index];\r
- }\r
-\r
- Var_DelBootOption ();\r
- break;\r
-\r
- case FORM_DRV_DEL_ID:\r
- for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewLoadContext->Deleted = CurrentFakeNVMap->DriverOptionDel[Index];\r
- }\r
-\r
- Var_DelDriverOption ();\r
- break;\r
-\r
- case FORM_BOOT_CHG_ID:\r
- Status = Var_UpdateBootOrder (Private);\r
- break;\r
-\r
- case FORM_DRV_CHG_ID:\r
- Status = Var_UpdateDriverOrder (Private);\r
- break;\r
-\r
- case FORM_TIME_OUT_ID:\r
- Status = gRT->SetVariable (\r
- L"Timeout",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- sizeof (UINT16),\r
- &(CurrentFakeNVMap->BootTimeOut)\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto Error;\r
- }\r
-\r
- Private->BmmOldFakeNVData.BootTimeOut = CurrentFakeNVMap->BootTimeOut;\r
- break;\r
-\r
- case FORM_BOOT_NEXT_ID:\r
- Status = Var_UpdateBootNext (Private);\r
- break;\r
-\r
- case FORM_CON_COM_ID:\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Private->CurrentTerminal);\r
-\r
- ASSERT (NewMenuEntry != NULL);\r
-\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
- NewTerminalContext->BaudRateIndex = CurrentFakeNVMap->COMBaudRate;\r
- NewTerminalContext->BaudRate = BaudRateList[CurrentFakeNVMap->COMBaudRate].Value;\r
- NewTerminalContext->DataBitsIndex = CurrentFakeNVMap->COMDataRate;\r
- NewTerminalContext->DataBits = (UINT8) DataBitsList[CurrentFakeNVMap->COMDataRate].Value;\r
- NewTerminalContext->StopBitsIndex = CurrentFakeNVMap->COMStopBits;\r
- NewTerminalContext->StopBits = (UINT8) StopBitsList[CurrentFakeNVMap->COMStopBits].Value;\r
- NewTerminalContext->ParityIndex = CurrentFakeNVMap->COMParity;\r
- NewTerminalContext->Parity = (UINT8) ParityList[CurrentFakeNVMap->COMParity].Value;\r
- NewTerminalContext->TerminalType = CurrentFakeNVMap->COMTerminalType;\r
-\r
- ChangeTerminalDevicePath (\r
- NewTerminalContext->DevicePath,\r
- FALSE\r
- );\r
-\r
- Var_UpdateConsoleInpOption ();\r
- Var_UpdateConsoleOutOption ();\r
- Var_UpdateErrorOutOption ();\r
- break;\r
-\r
- case FORM_CON_IN_ID:\r
- for (Index = 0; Index < ConsoleInpMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&ConsoleInpMenu, Index);\r
- NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleCheck[Index];\r
- }\r
-\r
- for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewTerminalContext->IsConIn = CurrentFakeNVMap->ConsoleCheck[Index + ConsoleInpMenu.MenuNumber];\r
- }\r
-\r
- Var_UpdateConsoleInpOption ();\r
- break;\r
-\r
- case FORM_CON_OUT_ID:\r
- for (Index = 0; Index < ConsoleOutMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&ConsoleOutMenu, Index);\r
- NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleCheck[Index];\r
- }\r
-\r
- for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewTerminalContext->IsConOut = CurrentFakeNVMap->ConsoleCheck[Index + ConsoleOutMenu.MenuNumber];\r
- }\r
-\r
- Var_UpdateConsoleOutOption ();\r
- break;\r
-\r
- case FORM_CON_ERR_ID:\r
- for (Index = 0; Index < ConsoleErrMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&ConsoleErrMenu, Index);\r
- NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleCheck[Index];\r
- }\r
-\r
- for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewTerminalContext->IsStdErr = CurrentFakeNVMap->ConsoleCheck[Index + ConsoleErrMenu.MenuNumber];\r
- }\r
-\r
- Var_UpdateErrorOutOption ();\r
- break;\r
-\r
- case FORM_DRV_ADD_HANDLE_DESC_ID:\r
- Status = Var_UpdateDriverOption (\r
- Private,\r
- Private->BmmHiiHandle,\r
- CurrentFakeNVMap->DriverAddHandleDesc,\r
- CurrentFakeNVMap->DriverAddHandleOptionalData,\r
- CurrentFakeNVMap->DriverAddForceReconnect\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto Error;\r
- }\r
-\r
- BOpt_GetDriverOptions (Private);\r
- CreateMenuStringToken (Private, Private->BmmHiiHandle, &DriverOptionMenu);\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
-\r
-Error:\r
- return Status;\r
-}\r
-\r
-VOID\r
-DiscardChangeHandler (\r
- IN BMM_CALLBACK_DATA *Private,\r
- IN BMM_FAKE_NV_DATA *CurrentFakeNVMap\r
- )\r
-{\r
- UINT16 Index;\r
-\r
- switch (Private->BmmPreviousPageId) {\r
- case FORM_BOOT_CHG_ID:\r
- case FORM_DRV_CHG_ID:\r
- CopyMem (CurrentFakeNVMap->OptionOrder, Private->BmmOldFakeNVData.OptionOrder, 100);\r
- break;\r
-\r
- case FORM_BOOT_DEL_ID:\r
- for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
- CurrentFakeNVMap->BootOptionDel[Index] = 0x00;\r
- }\r
- break;\r
-\r
- case FORM_DRV_DEL_ID:\r
- for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
- CurrentFakeNVMap->DriverOptionDel[Index] = 0x00;\r
- }\r
- break;\r
-\r
- case FORM_BOOT_NEXT_ID:\r
- CurrentFakeNVMap->BootNext = Private->BmmOldFakeNVData.BootNext;\r
- break;\r
-\r
- case FORM_TIME_OUT_ID:\r
- CurrentFakeNVMap->BootTimeOut = Private->BmmOldFakeNVData.BootTimeOut;\r
- break;\r
-\r
- case FORM_DRV_ADD_HANDLE_DESC_ID:\r
- case FORM_DRV_ADD_FILE_ID:\r
- case FORM_DRV_ADD_HANDLE_ID:\r
- CurrentFakeNVMap->DriverAddHandleDesc[0] = 0x0000;\r
- CurrentFakeNVMap->DriverAddHandleOptionalData[0] = 0x0000;\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-NvWrite (\r
- IN EFI_FORM_CALLBACK_PROTOCOL *This,\r
- IN CHAR16 *VariableName,\r
- IN EFI_GUID *VendorGuid,\r
- OUT UINT32 Attributes OPTIONAL,\r
- IN OUT UINTN DataSize,\r
- OUT VOID *Buffer,\r
- OUT BOOLEAN *ResetRequired\r
- )\r
-{\r
- //\r
- // Do nothing here. Just to catch the F10, we use "Apply Changes" tag to save.\r
- //\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-InitializeBM (\r
- VOID\r
- )\r
-/*++\r
-Routine Description:\r
-\r
- Initialize the Boot Maintenance Utitliy\r
-\r
-Arguments:\r
-\r
- ImageHandle - caller provided handle\r
- \r
- SystemTable - caller provided system tables\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - utility ended successfully\r
- \r
- others - contain some errors\r
- \r
---*/\r
-{\r
- EFI_LEGACY_BIOS_PROTOCOL *LegacyBios;\r
- EFI_HII_PACKAGES *PackageList;\r
- BMM_CALLBACK_DATA *BmmCallbackInfo;\r
- EFI_HII_PROTOCOL *Hii;\r
- EFI_HII_HANDLE HiiHandle;\r
- EFI_STATUS Status;\r
- EFI_HANDLE Handle;\r
- UINT8 *Ptr;\r
- UINT8 *Location;\r
-\r
- Status = EFI_SUCCESS;\r
- UpdateData = NULL;\r
- //\r
- // Initialize EfiUtilityLib and EfiDriverLib\r
- // Since many functions in UtilityLib must be used and\r
- // SetupBrowser use DriverLib\r
- //\r
- //\r
- // There should be only one EFI_HII_PROTOCOL Image\r
- //\r
- Status = EfiLibLocateProtocol (&gEfiHiiProtocolGuid, (VOID**)&Hii);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- //\r
- // Create CallbackData structures for Driver Callback\r
- //\r
- BmmCallbackInfo = AllocateZeroPool (sizeof (BMM_CALLBACK_DATA));\r
- if (!BmmCallbackInfo) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- //\r
- // Create LoadOption in BmmCallbackInfo for Driver Callback\r
- //\r
- Ptr = AllocateZeroPool (sizeof (BM_LOAD_CONTEXT) + sizeof (BM_FILE_CONTEXT) + sizeof (BM_HANDLE_CONTEXT) + sizeof (BM_MENU_ENTRY));\r
- if (!Ptr) {\r
- SafeFreePool (BmmCallbackInfo);\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- //\r
- // Initialize Bmm callback data.\r
- //\r
- BmmCallbackInfo->LoadContext = (BM_LOAD_CONTEXT *) Ptr;\r
- Ptr += sizeof (BM_LOAD_CONTEXT);\r
-\r
- BmmCallbackInfo->FileContext = (BM_FILE_CONTEXT *) Ptr;\r
- Ptr += sizeof (BM_FILE_CONTEXT);\r
-\r
- BmmCallbackInfo->HandleContext = (BM_HANDLE_CONTEXT *) Ptr;\r
- Ptr += sizeof (BM_HANDLE_CONTEXT);\r
-\r
- BmmCallbackInfo->MenuEntry = (BM_MENU_ENTRY *) Ptr;\r
-\r
- BmmCallbackInfo->BmmFakeNvData = &BmmCallbackInfo->BmmOldFakeNVData;\r
-\r
- ZeroMem (BmmCallbackInfo->BmmFakeNvData, sizeof (BMM_FAKE_NV_DATA));\r
-\r
- BmmCallbackInfo->Signature = BMM_CALLBACK_DATA_SIGNATURE;\r
- BmmCallbackInfo->Hii = Hii;\r
- BmmCallbackInfo->BmmDriverCallback.NvRead = NULL;\r
- BmmCallbackInfo->BmmDriverCallback.NvWrite = NvWrite;\r
- BmmCallbackInfo->BmmDriverCallback.Callback = DriverCallback;\r
- BmmCallbackInfo->BmmPreviousPageId = FORM_MAIN_ID;\r
- BmmCallbackInfo->BmmCurrentPageId = FORM_MAIN_ID;\r
- BmmCallbackInfo->FeDriverCallback.NvRead = NULL;\r
- BmmCallbackInfo->FeDriverCallback.NvWrite = NvWrite;\r
- BmmCallbackInfo->FeDriverCallback.Callback = FileExplorerCallback;\r
- BmmCallbackInfo->FeCurrentState = INACTIVE_STATE;\r
- BmmCallbackInfo->FeDisplayContext = UNKNOWN_CONTEXT;\r
-\r
- //\r
- // Install bmm callback protocol interface\r
- //\r
- Handle = NULL;\r
- Status = gBS->InstallProtocolInterface (\r
- &Handle,\r
- &gEfiFormCallbackProtocolGuid,\r
- EFI_NATIVE_INTERFACE,\r
- &BmmCallbackInfo->BmmDriverCallback\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- BmmCallbackInfo->BmmCallbackHandle = Handle;\r
-\r
- //\r
- // Install file explorer callback protocol interface\r
- //\r
- Handle = NULL;\r
- Status = gBS->InstallProtocolInterface (\r
- &Handle,\r
- &gEfiFormCallbackProtocolGuid,\r
- EFI_NATIVE_INTERFACE,\r
- &BmmCallbackInfo->FeDriverCallback\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- BmmCallbackInfo->FeCallbackHandle = Handle;\r
-\r
- //\r
- // Post our VFR to the HII database.\r
- //\r
- PackageList = PreparePackages (1, &gBdsStringPackGuid, BmBin);\r
- Status = Hii->NewPack (Hii, PackageList, &HiiHandle);\r
- gBS->FreePool (PackageList);\r
-\r
- BmmCallbackInfo->BmmHiiHandle = HiiHandle;\r
-\r
- PackageList = PreparePackages (1, &gBdsStringPackGuid, FEBin);\r
- Status = Hii->NewPack (Hii, PackageList, &HiiHandle);\r
- gBS->FreePool (PackageList);\r
-\r
- BmmCallbackInfo->FeHiiHandle = HiiHandle;\r
-\r
- //\r
- // Allocate space for creation of Buffer\r
- //\r
- UpdateData = AllocateZeroPool (UPDATE_DATA_SIZE);\r
- if (!UpdateData) {\r
- SafeFreePool (BmmCallbackInfo->LoadContext);\r
- SafeFreePool (BmmCallbackInfo);\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- //\r
- // Initialize UpdateData structure\r
- //\r
- RefreshUpdateData (TRUE, (EFI_PHYSICAL_ADDRESS) (UINTN) BmmCallbackInfo->BmmCallbackHandle, FALSE, 0, 0);\r
-\r
- Location = (UINT8 *) &UpdateData->Data;\r
-\r
- InitializeStringDepository ();\r
-\r
- InitAllMenu (BmmCallbackInfo);\r
-\r
- CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &ConsoleInpMenu);\r
- CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &ConsoleOutMenu);\r
- CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &ConsoleErrMenu);\r
- CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &BootOptionMenu);\r
- CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &DriverOptionMenu);\r
- CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &TerminalMenu);\r
- CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &DriverMenu);\r
-\r
- UpdateBootDelPage (BmmCallbackInfo);\r
- UpdateDrvDelPage (BmmCallbackInfo);\r
-\r
- if (TerminalMenu.MenuNumber > 0) {\r
- BmmCallbackInfo->CurrentTerminal = 0;\r
- UpdateTerminalPage (BmmCallbackInfo);\r
- }\r
-\r
- Location = (UINT8 *) &UpdateData->Data;\r
- Status = EfiLibLocateProtocol (&gEfiLegacyBiosProtocolGuid, (VOID**) &LegacyBios);\r
- if (!EFI_ERROR (Status)) {\r
- //\r
- // If LegacyBios Protocol is installed, add 3 tags about legacy boot option\r
- // in BootOption form: legacy FD/HD/CD/NET/BEV\r
- //\r
- UpdateData->DataCount = 5;\r
- CreateGotoOpCode (\r
- FORM_SET_FD_ORDER_ID,\r
- STRING_TOKEN (STR_FORM_SET_FD_ORDER_TITLE),\r
- STRING_TOKEN (STR_FORM_SET_FD_ORDER_TITLE),\r
- EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,\r
- FORM_SET_FD_ORDER_ID,\r
- Location\r
- );\r
-\r
- Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;\r
-\r
- CreateGotoOpCode (\r
- FORM_SET_HD_ORDER_ID,\r
- STRING_TOKEN (STR_FORM_SET_HD_ORDER_TITLE),\r
- STRING_TOKEN (STR_FORM_SET_HD_ORDER_TITLE),\r
- EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,\r
- FORM_SET_HD_ORDER_ID,\r
- Location\r
- );\r
-\r
- Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;\r
-\r
- CreateGotoOpCode (\r
- FORM_SET_CD_ORDER_ID,\r
- STRING_TOKEN (STR_FORM_SET_CD_ORDER_TITLE),\r
- STRING_TOKEN (STR_FORM_SET_CD_ORDER_TITLE),\r
- EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,\r
- FORM_SET_CD_ORDER_ID,\r
- Location\r
- );\r
-\r
- Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;\r
-\r
- CreateGotoOpCode (\r
- FORM_SET_NET_ORDER_ID,\r
- STRING_TOKEN (STR_FORM_SET_NET_ORDER_TITLE),\r
- STRING_TOKEN (STR_FORM_SET_NET_ORDER_TITLE),\r
- EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,\r
- FORM_SET_NET_ORDER_ID,\r
- Location\r
- );\r
-\r
- Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;\r
-\r
- CreateGotoOpCode (\r
- FORM_SET_BEV_ORDER_ID,\r
- STRING_TOKEN (STR_FORM_SET_BEV_ORDER_TITLE),\r
- STRING_TOKEN (STR_FORM_SET_BEV_ORDER_TITLE),\r
- EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,\r
- FORM_SET_BEV_ORDER_ID,\r
- Location\r
- );\r
-\r
- Hii->UpdateForm (\r
- Hii,\r
- BmmCallbackInfo->BmmHiiHandle,\r
- (EFI_FORM_LABEL) FORM_BOOT_LEGACY_DEVICE_ID,\r
- TRUE,\r
- UpdateData\r
- );\r
- }\r
- //\r
- // Dispatch BMM main formset and File Explorer formset.\r
- //\r
- FormSetDispatcher (BmmCallbackInfo);\r
-\r
- Hii->ResetStrings (Hii, HiiHandle);\r
-\r
- CleanUpStringDepository ();\r
-\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- FreeAllMenu ();\r
-\r
- SafeFreePool (BmmCallbackInfo->LoadContext);\r
- BmmCallbackInfo->LoadContext = NULL;\r
- SafeFreePool (BmmCallbackInfo);\r
- BmmCallbackInfo = NULL;\r
- SafeFreePool (UpdateData);\r
- UpdateData = NULL;\r
-\r
- return Status;\r
-}\r
-\r
-VOID\r
-InitAllMenu (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- InitializeListHead (&BootOptionMenu.Head);\r
- InitializeListHead (&DriverOptionMenu.Head);\r
- BOpt_GetBootOptions (CallbackData);\r
- BOpt_GetDriverOptions (CallbackData);\r
- BOpt_GetLegacyOptions ();\r
- InitializeListHead (&FsOptionMenu.Head);\r
- BOpt_FindDrivers ();\r
- InitializeListHead (&DirectoryMenu.Head);\r
- InitializeListHead (&ConsoleInpMenu.Head);\r
- InitializeListHead (&ConsoleOutMenu.Head);\r
- InitializeListHead (&ConsoleErrMenu.Head);\r
- InitializeListHead (&TerminalMenu.Head);\r
- LocateSerialIo ();\r
- GetAllConsoles ();\r
-}\r
-\r
-VOID\r
-FreeAllMenu (\r
- VOID\r
- )\r
-{\r
- BOpt_FreeMenu (&DirectoryMenu);\r
- BOpt_FreeMenu (&FsOptionMenu);\r
- BOpt_FreeMenu (&BootOptionMenu);\r
- BOpt_FreeMenu (&DriverOptionMenu);\r
- BOpt_FreeMenu (&DriverMenu);\r
- BOpt_FreeLegacyOptions ();\r
- FreeAllConsoles ();\r
-}\r
-\r
-VOID\r
-InitializeStringDepository (\r
- VOID\r
- )\r
-/*++\r
-Routine Description:\r
- Intialize all the string depositories.\r
-\r
-Arguments:\r
- None.\r
-\r
-Returns:\r
- None. \r
---*/\r
-{\r
- STRING_DEPOSITORY *StringDepository;\r
- StringDepository = AllocateZeroPool (sizeof (STRING_DEPOSITORY) * STRING_DEPOSITORY_NUMBER);\r
- FileOptionStrDepository = StringDepository++;\r
- ConsoleOptionStrDepository = StringDepository++;\r
- BootOptionStrDepository = StringDepository++;\r
- BootOptionHelpStrDepository = StringDepository++;\r
- DriverOptionStrDepository = StringDepository++;\r
- DriverOptionHelpStrDepository = StringDepository++;\r
- TerminalStrDepository = StringDepository;\r
-}\r
-\r
-STRING_REF\r
-GetStringTokenFromDepository (\r
- IN BMM_CALLBACK_DATA *CallbackData,\r
- IN STRING_DEPOSITORY *StringDepository\r
- )\r
-/*++\r
-Routine Description:\r
- Fetch a usable string node from the string depository and return the string token.\r
-\r
-Arguments:\r
- StringDepository - Pointer of the string depository.\r
-\r
-Returns:\r
- STRING_REF - String token.\r
---*/\r
-{\r
- STRING_LIST_NODE *CurrentListNode;\r
- STRING_LIST_NODE *NextListNode;\r
-\r
- CurrentListNode = StringDepository->CurrentNode;\r
-\r
- if ((NULL != CurrentListNode) && (NULL != CurrentListNode->Next)) {\r
- //\r
- // Fetch one reclaimed node from the list.\r
- //\r
- NextListNode = StringDepository->CurrentNode->Next;\r
- } else {\r
- //\r
- // If there is no usable node in the list, update the list.\r
- //\r
- NextListNode = AllocateZeroPool (sizeof (STRING_LIST_NODE));\r
-\r
- CallbackData->Hii->NewString (\r
- CallbackData->Hii,\r
- NULL,\r
- CallbackData->BmmHiiHandle,\r
- &(NextListNode->StringToken),\r
- L" "\r
- );\r
-\r
- ASSERT (NextListNode->StringToken != 0);\r
-\r
- StringDepository->TotalNodeNumber++;\r
-\r
- if (NULL == CurrentListNode) {\r
- StringDepository->ListHead = NextListNode;\r
- } else {\r
- CurrentListNode->Next = NextListNode;\r
- }\r
- }\r
-\r
- StringDepository->CurrentNode = NextListNode;\r
-\r
- return StringDepository->CurrentNode->StringToken;\r
-}\r
-\r
-VOID\r
-ReclaimStringDepository (\r
- VOID\r
- )\r
-/*++\r
-Routine Description:\r
- Reclaim string depositories by moving the current node pointer to list head..\r
-\r
-Arguments:\r
- None.\r
-\r
-Returns:\r
- None.\r
---*/\r
-{\r
- UINTN DepositoryIndex;\r
- STRING_DEPOSITORY *StringDepository;\r
-\r
- StringDepository = FileOptionStrDepository;\r
- for (DepositoryIndex = 0; DepositoryIndex < STRING_DEPOSITORY_NUMBER; DepositoryIndex++) {\r
- StringDepository->CurrentNode = StringDepository->ListHead;\r
- StringDepository++;\r
- }\r
-}\r
-\r
-VOID\r
-CleanUpStringDepository (\r
- VOID\r
- )\r
-/*++\r
-Routine Description:\r
- Release resource for all the string depositories.\r
-\r
-Arguments:\r
- None.\r
-\r
-Returns:\r
- None.\r
---*/\r
-{\r
- UINTN NodeIndex;\r
- UINTN DepositoryIndex;\r
- STRING_LIST_NODE *CurrentListNode;\r
- STRING_LIST_NODE *NextListNode;\r
- STRING_DEPOSITORY *StringDepository;\r
-\r
- //\r
- // Release string list nodes.\r
- //\r
- StringDepository = FileOptionStrDepository;\r
- for (DepositoryIndex = 0; DepositoryIndex < STRING_DEPOSITORY_NUMBER; DepositoryIndex++) {\r
- CurrentListNode = StringDepository->ListHead;\r
- for (NodeIndex = 0; NodeIndex < StringDepository->TotalNodeNumber; NodeIndex++) {\r
- NextListNode = CurrentListNode->Next;\r
- SafeFreePool (CurrentListNode);\r
- CurrentListNode = NextListNode;\r
- }\r
-\r
- StringDepository++;\r
- }\r
- //\r
- // Release string depository.\r
- //\r
- SafeFreePool (FileOptionStrDepository);\r
-}\r
-\r
-EFI_STATUS\r
-BdsStartBootMaint (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Start boot maintenance manager\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- LIST_ENTRY BdsBootOptionList;\r
-\r
- InitializeListHead (&BdsBootOptionList);\r
-\r
- //\r
- // Connect all prior to entering the platform setup menu.\r
- //\r
- if (!gConnectAllHappened) {\r
- BdsLibConnectAllDriversToAllControllers ();\r
- gConnectAllHappened = TRUE;\r
- }\r
- //\r
- // Have chance to enumerate boot device\r
- //\r
- BdsLibEnumerateAllBootOption (&BdsBootOptionList);\r
-\r
- //\r
- // Init the BMM\r
- //\r
- Status = InitializeBM ();\r
-\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-FormSetDispatcher (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Dispatch BMM formset and FileExplorer formset.\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
---*/\r
-{\r
- EFI_FORM_BROWSER_PROTOCOL *FormConfig;\r
- UINT8 *Location;\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_FILE_CONTEXT *NewFileContext;\r
- BOOLEAN BootMaintMenuResetRequired;\r
-\r
- Location = NULL;\r
- Index = 0;\r
- NewMenuEntry = NULL;\r
- NewFileContext = NULL;\r
-\r
- //\r
- // There should only be one Form Configuration protocol\r
- //\r
- Status = EfiLibLocateProtocol (&gEfiFormBrowserProtocolGuid, (VOID**) &FormConfig);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- while (1) {\r
- UpdatePageId (CallbackData, FORM_MAIN_ID);\r
-\r
- BootMaintMenuResetRequired = FALSE;\r
- Status = FormConfig->SendForm (\r
- FormConfig,\r
- TRUE,\r
- &(CallbackData->BmmHiiHandle),\r
- 1,\r
- NULL,\r
- NULL,\r
- (UINT8 *) CallbackData->BmmFakeNvData,\r
- NULL,\r
- &BootMaintMenuResetRequired\r
- );\r
-\r
- if (BootMaintMenuResetRequired) {\r
- EnableResetRequired ();\r
- }\r
-\r
- ReclaimStringDepository ();\r
-\r
- //\r
- // When this Formset returns, check if we are going to explore files.\r
- //\r
- if (INACTIVE_STATE != CallbackData->FeCurrentState) {\r
- UpdateFileExplorer (CallbackData, 0);\r
-\r
- BootMaintMenuResetRequired = FALSE;\r
- Status = FormConfig->SendForm (\r
- FormConfig,\r
- TRUE,\r
- &(CallbackData->FeHiiHandle),\r
- 1,\r
- NULL,\r
- NULL,\r
- NULL,\r
- NULL,\r
- &BootMaintMenuResetRequired\r
- );\r
-\r
- if (BootMaintMenuResetRequired) {\r
- EnableResetRequired ();\r
- }\r
-\r
- CallbackData->FeCurrentState = INACTIVE_STATE;\r
- CallbackData->FeDisplayContext = UNKNOWN_CONTEXT;\r
- ReclaimStringDepository ();\r
- } else {\r
- break;\r
- }\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-VOID\r
-CreateCallbackPacket (\r
- OUT EFI_HII_CALLBACK_PACKET **Packet,\r
- IN UINT16 Flags\r
- )\r
-{\r
- *Packet = (EFI_HII_CALLBACK_PACKET *) AllocateZeroPool (sizeof (EFI_HII_CALLBACK_PACKET) + 2);\r
- ASSERT (*Packet != NULL);\r
-\r
- (*Packet)->DataArray.EntryCount = 1;\r
- (*Packet)->DataArray.NvRamMap = NULL;\r
- ((EFI_IFR_DATA_ENTRY *) (&((*Packet)->DataArray) + 1))->Flags = Flags;\r
-}\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- BootMaint.h\r
-\r
-Abstract:\r
-\r
-Revision History\r
-\r
---*/\r
-\r
-#ifndef _BOOT_MAINT_H\r
-#define _BOOT_MAINT_H\r
-\r
-#include "BdsStrDefs.h"\r
-#include "Generic/BootMaint/BBSsupport.h"\r
-\r
-//\r
-// Constants which are variable names used to access variables\r
-//\r
-#define VarLegacyDevOrder L"LegacyDevOrder"\r
-\r
-//\r
-// Guid of a NV Variable which store the information about the\r
-// FD/HD/CD/NET/BEV order\r
-//\r
-#define EFI_LEGACY_DEV_ORDER_VARIABLE_GUID \\r
- { \\r
- 0xa56074db, 0x65fe, 0x45f7, {0xbd, 0x21, 0x2d, 0x2b, 0xdd, 0x8e, 0x96, 0x52 } \\r
- }\r
-\r
-//\r
-// String Contant\r
-//\r
-#define StrFloppy L"Floppy Drive #%02x"\r
-#define StrHardDisk L"HardDisk Drive #%02x"\r
-#define StrCDROM L"ATAPI CDROM Drive #%02x"\r
-#define StrNET L"NET Drive #%02x"\r
-#define StrBEV L"BEV Drive #%02x"\r
-#define StrFloppyHelp L"Select Floppy Drive #%02x"\r
-#define StrHardDiskHelp L"Select HardDisk Drive #%02x"\r
-#define StrCDROMHelp L"Select ATAPI CDROM Drive #%02x"\r
-#define StrNETHelp L"NET Drive #%02x"\r
-#define StrBEVHelp L"BEV Drive #%02x"\r
-\r
-//\r
-// Constant will be used in display and file system navigation\r
-//\r
-#define UPDATE_DATA_SIZE 0x100000\r
-#define MAX_BBS_OFFSET 0xE000\r
-#define NET_OPTION_OFFSET 0xD800\r
-#define BEV_OPTION_OFFSET 0xD000\r
-#define FD_OPTION_OFFSET 0xC000\r
-#define HD_OPTION_OFFSET 0xB000\r
-#define CD_OPTION_OFFSET 0xA000\r
-#define FILE_OPTION_OFFSET 0x8000\r
-#define FILE_OPTION_MASK 0x7FFF\r
-#define HANDLE_OPTION_OFFSET 0x7000\r
-#define CONSOLE_OPTION_OFFSET 0x0A00\r
-#define TERMINAL_OPTION_OFFSET 0x0700\r
-#define NORMAL_GOTO_OFFSET 0x0100\r
-#define MAX_STRING_TOKEN_COUNT 0x00FF\r
-//\r
-// Variable created with this flag will be "Efi:...."\r
-//\r
-#define VAR_FLAG EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE\r
-\r
-//\r
-// Define Maxmim characters that will be accepted\r
-//\r
-#define MAX_CHAR 480\r
-#define MAX_CHAR_SIZE (MAX_CHAR * 2)\r
-\r
-//\r
-// Check to see if current build support option active feature of\r
-// some driver option\r
-//\r
-#ifndef LOAD_OPTION_ACTIVE\r
-#define LOAD_OPTION_ACTIVE 0x00000001\r
-#endif\r
-//\r
-// Check to see if current build support force reconnect feature of\r
-// some driver option\r
-//\r
-#ifndef LOAD_OPTION_FORCE_RECONNECT\r
-#define LOAD_OPTION_FORCE_RECONNECT 0x00000002\r
-#endif\r
-//\r
-// Below are the form ids for display, form id is used as callback key value,\r
-// some key value definitions are also defined here. By defining this enum type,\r
-// We can easy know where we are. The int to UINT16 convertion should be ok because\r
-// there is a MAXIMUM_FORM_ID which in within the range of UINT16.\r
-//\r
-typedef enum {\r
- IplRelative,\r
- BcvRelative\r
-} BBS_TYPE;\r
-\r
-typedef enum {\r
- FORM_RESERVED_ID = 0,\r
- FORM_MAIN_ID, // 0x0001\r
- FORM_BOOT_ADD_ID, // 0x0002\r
- FORM_BOOT_DEL_ID, // 0x0003\r
- FORM_BOOT_CHG_ID, // 0x0004\r
- FORM_DRV_ADD_ID, // 0x0005\r
- FORM_DRV_DEL_ID, // 0x0006\r
- FORM_DRV_CHG_ID, // 0x0007\r
- FORM_CON_MAIN_ID, // 0x0008\r
- FORM_CON_IN_ID, // 0x0009\r
- FORM_CON_OUT_ID, // 0x000A\r
- FORM_CON_ERR_ID, // 0x000B\r
- FORM_FILE_SEEK_ID, // 0x000C\r
- FORM_FILE_NEW_SEEK_ID, // 0x000D\r
- FORM_DRV_ADD_FILE_ID, // 0x000E\r
- FORM_DRV_ADD_HANDLE_ID, // 0x000F\r
- FORM_DRV_ADD_HANDLE_DESC_ID, // 0x0010\r
- FORM_BOOT_NEXT_ID, // 0x0011\r
- FORM_TIME_OUT_ID, // 0x0012\r
- FORM_RESET, // 0x0013\r
- FORM_BOOT_SETUP_ID, // 0x0014\r
- FORM_DRIVER_SETUP_ID, // 0x0015\r
- FORM_BOOT_LEGACY_DEVICE_ID, // 0x0016\r
- FORM_CON_COM_ID, // 0x0017\r
- FORM_CON_COM_SETUP_ID, // 0x0018\r
- FORM_SET_FD_ORDER_ID, // 0x0019\r
- FORM_SET_HD_ORDER_ID, // 0x001A\r
- FORM_SET_CD_ORDER_ID, // 0x001B\r
- FORM_SET_NET_ORDER_ID, // 0x001C\r
- FORM_SET_BEV_ORDER_ID, // 0x001D\r
- FORM_FILE_EXPLORER_ID, // 0x001E\r
- FORM_BOOT_ADD_DESCRIPTION_ID, // 0x001F\r
- FORM_DRIVER_ADD_FILE_DESCRIPTION_ID, // 0x0020\r
-} FORM_ID;\r
-\r
-#define MAXIMUM_FORM_ID 0x007F\r
-\r
-#define KEY_VALUE_COM_SET_BAUD_RATE 0x0080\r
-#define KEY_VALUE_COM_SET_DATA_BITS 0x0081\r
-#define KEY_VALUE_COM_SET_STOP_BITS 0x0082\r
-#define KEY_VALUE_COM_SET_PARITY 0x0083\r
-#define KEY_VALUE_COM_SET_TERMI_TYPE 0x0084\r
-#define KEY_VALUE_MAIN_BOOT_NEXT 0x0085\r
-#define KEY_VALUE_BOOT_ADD_DESC_DATA 0x0086\r
-#define KEY_VALUE_BOOT_ADD_OPT_DATA 0x0087\r
-#define KEY_VALUE_DRIVER_ADD_DESC_DATA 0x0088\r
-#define KEY_VALUE_DRIVER_ADD_OPT_DATA 0x0089\r
-#define KEY_VALUE_SAVE_AND_EXIT 0x0090\r
-#define KEY_VALUE_NO_SAVE_AND_EXIT 0x0091\r
-#define KEY_VALUE_BOOT_FROM_FILE 0x0092\r
-\r
-#define MAXIMUM_NORMAL_KEY_VALUE NORMAL_GOTO_OFFSET\r
-//\r
-// Below are the number of options in Baudrate, Databits,\r
-// Parity and Stopbits selection for serial ports.\r
-//\r
-#define BM_COM_ATTR_BUADRATE 19\r
-#define BM_COM_ATTR_DATABITS 4\r
-#define BM_COM_ATTR_PARITY 5\r
-#define BM_COM_ATTR_STOPBITS 3\r
-\r
-//\r
-// Callback function helper\r
-//\r
-#define BMM_CALLBACK_DATA_SIGNATURE EFI_SIGNATURE_32 ('C', 'b', 'c', 'k')\r
-#define BMM_CALLBACK_DATA_FROM_THIS(a) CR (a, BMM_CALLBACK_DATA, BmmDriverCallback, BMM_CALLBACK_DATA_SIGNATURE)\r
-\r
-#define FE_CALLBACK_DATA_FROM_THIS(a) CR (a, BMM_CALLBACK_DATA, FeDriverCallback, BMM_CALLBACK_DATA_SIGNATURE)\r
-\r
-//\r
-// Enumeration type definition\r
-//\r
-typedef enum {\r
- PC_ANSI = 0,\r
- VT_100,\r
- VT_100_PLUS,\r
- VT_UTF8\r
-} TYPE_OF_TERMINAL;\r
-\r
-typedef enum {\r
- COM1 = 0,\r
- COM2,\r
- UNKNOW_COM\r
-} TYPE_OF_COM;\r
-\r
-typedef enum {\r
- CONIN = 0,\r
- CONOUT,\r
- CONERR,\r
- UNKNOWN_CON\r
-} TYPE_OF_CON;\r
-\r
-typedef enum {\r
- BAUDRATE = 0,\r
- DATABITS,\r
- PARITY,\r
- STOPBITS,\r
- UNKNOW_ATTR\r
-} TYPE_OF_ATTRIBUTE;\r
-\r
-typedef enum {\r
- MANNER_GOTO = 0,\r
- MANNER_CHECK,\r
- MANNER_ONEOF,\r
- MANNER_USER_DEFINE\r
-} TYPE_OF_UPATE_MANNER;\r
-\r
-typedef enum {\r
- INACTIVE_STATE = 0,\r
- BOOT_FROM_FILE_STATE,\r
- ADD_BOOT_OPTION_STATE,\r
- ADD_DRIVER_OPTION_STATE,\r
- UNKNOWN_STATE\r
-} FILE_EXPLORER_STATE;\r
-\r
-typedef enum {\r
- FILE_SYSTEM,\r
- DIRECTORY,\r
- UNKNOWN_CONTEXT\r
-} FILE_EXPLORER_DISPLAY_CONTEXT;\r
-\r
-//\r
-// All of the signatures that will be used in list structure\r
-//\r
-#define BM_MENU_OPTION_SIGNATURE EFI_SIGNATURE_32 ('m', 'e', 'n', 'u')\r
-#define BM_LOAD_OPTION_SIGNATURE EFI_SIGNATURE_32 ('l', 'o', 'a', 'd')\r
-#define BM_CONSOLE_OPTION_SIGNATURE EFI_SIGNATURE_32 ('c', 'n', 's', 'l')\r
-#define BM_FILE_OPTION_SIGNATURE EFI_SIGNATURE_32 ('f', 'i', 'l', 'e')\r
-#define BM_HANDLE_OPTION_SIGNATURE EFI_SIGNATURE_32 ('h', 'n', 'd', 'l')\r
-#define BM_TERMINAL_OPTION_SIGNATURE EFI_SIGNATURE_32 ('t', 'r', 'm', 'l')\r
-#define BM_MENU_ENTRY_SIGNATURE EFI_SIGNATURE_32 ('e', 'n', 't', 'r')\r
-\r
-#define BM_LOAD_CONTEXT_SELECT 0x0\r
-#define BM_CONSOLE_CONTEXT_SELECT 0x1\r
-#define BM_FILE_CONTEXT_SELECT 0x2\r
-#define BM_HANDLE_CONTEXT_SELECT 0x3\r
-#define BM_TERMINAL_CONTEXT_SELECT 0x5\r
-\r
-#define BM_CONSOLE_IN_CONTEXT_SELECT 0x6\r
-#define BM_CONSOLE_OUT_CONTEXT_SELECT 0x7\r
-#define BM_CONSOLE_ERR_CONTEXT_SELECT 0x8\r
-#define BM_LEGACY_DEV_CONTEXT_SELECT 0x9\r
-\r
-//\r
-// Question Id that will be used to create question\r
-// all these values are computed from the structure\r
-// defined below\r
-//\r
-#define QUESTION_ID(Field) ((UINTN) &(((BMM_FAKE_NV_DATA *) 0)->Field))\r
-\r
-#define BOOT_TIME_OUT_QUESTION_ID QUESTION_ID (BootTimeOut)\r
-#define BOOT_NEXT_QUESTION_ID QUESTION_ID (BootNext)\r
-#define COM1_BAUD_RATE_QUESTION_ID QUESTION_ID (COM1BaudRate)\r
-#define COM1_DATA_RATE_QUESTION_ID QUESTION_ID (COM1DataRate)\r
-#define COM1_STOP_BITS_QUESTION_ID QUESTION_ID (COM1StopBits)\r
-#define COM1_PARITY_QUESTION_ID QUESTION_ID (COM1Parity)\r
-#define COM1_TERMINAL_QUESTION_ID QUESTION_ID (COM2TerminalType)\r
-#define COM2_BAUD_RATE_QUESTION_ID QUESTION_ID (COM2BaudRate)\r
-#define COM2_DATA_RATE_QUESTION_ID QUESTION_ID (COM2DataRate)\r
-#define COM2_STOP_BITS_QUESTION_ID QUESTION_ID (COM2StopBits)\r
-#define COM2_PARITY_QUESTION_ID QUESTION_ID (COM2Parity)\r
-#define COM2_TERMINAL_QUESTION_ID QUESTION_ID (COM2TerminalType)\r
-#define DRV_ADD_HANDLE_DESC_QUESTION_ID QUESTION_ID (DriverAddHandleDesc)\r
-#define DRV_ADD_ACTIVE_QUESTION_ID QUESTION_ID (DriverAddActive)\r
-#define DRV_ADD_RECON_QUESTION_ID QUESTION_ID (DriverAddForceReconnect)\r
-#define CON_IN_COM1_QUESTION_ID QUESTION_ID (ConsoleInputCOM1)\r
-#define CON_IN_COM2_QUESTION_ID QUESTION_ID (ConsoleInputCOM2)\r
-#define CON_OUT_COM1_QUESTION_ID QUESTION_ID (ConsoleOutputCOM1)\r
-#define CON_OUT_COM2_QUESTION_ID QUESTION_ID (ConsoleOutputCOM2)\r
-#define CON_ERR_COM1_QUESTION_ID QUESTION_ID (ConsoleErrorCOM1)\r
-#define CON_ERR_COM2_QUESTION_ID QUESTION_ID (ConsoleErrorCOM2)\r
-#define CON_DEVICE_QUESTION_ID QUESTION_ID (ConsoleCheck)\r
-#define OPTION_ORDER_QUESTION_ID QUESTION_ID (OptionOrder)\r
-#define DRIVER_OPTION_ORDER_QUESTION_ID QUESTION_ID (DriverOptionToBeDeleted)\r
-#define BOOT_OPTION_DEL_QUESTION_ID QUESTION_ID (BootOptionDel)\r
-#define DRIVER_OPTION_DEL_QUESTION_ID QUESTION_ID (DriverOptionDel)\r
-#define DRIVER_ADD_OPTION_QUESTION_ID QUESTION_ID (DriverAddHandleOptionalData)\r
-#define COM_BAUD_RATE_QUESTION_ID QUESTION_ID (COMBaudRate)\r
-#define COM_DATA_RATE_QUESTION_ID QUESTION_ID (COMDataRate)\r
-#define COM_STOP_BITS_QUESTION_ID QUESTION_ID (COMStopBits)\r
-#define COM_PARITY_QUESTION_ID QUESTION_ID (COMParity)\r
-#define COM_TERMINAL_QUESTION_ID QUESTION_ID (COMTerminalType)\r
-#define LEGACY_FD_QUESTION_ID QUESTION_ID (LegacyFD)\r
-#define LEGACY_HD_QUESTION_ID QUESTION_ID (LegacyHD)\r
-#define LEGACY_CD_QUESTION_ID QUESTION_ID (LegacyCD)\r
-#define LEGACY_NET_QUESTION_ID QUESTION_ID (LegacyNET)\r
-#define LEGACY_BEV_QUESTION_ID QUESTION_ID (LegacyBEV)\r
-\r
-#define STRING_DEPOSITORY_NUMBER 8\r
-\r
-//\r
-// #pragma pack(1)\r
-//\r
-// Serial Ports attributes, first one is the value for\r
-// return from callback function, stringtoken is used to\r
-// display the value properly\r
-//\r
-typedef struct {\r
- UINTN Value;\r
- UINT16 StringToken;\r
-} COM_ATTR;\r
-\r
-//\r
-// This is the structure that will be used to store the\r
-// question's current value. Use it at initialize time to\r
-// set default value for each question. When using at run\r
-// time, this map is returned by the callback function,\r
-// so dynamically changing the question's value will be\r
-// possible through this mechanism\r
-//\r
-typedef struct {\r
- //\r
- // Three questions displayed at the main page\r
- // for Timeout, BootNext Variables respectively\r
- //\r
- UINT16 BootTimeOut;\r
- UINT16 BootNext;\r
-\r
- //\r
- // This is the COM1 Attributes value storage\r
- //\r
- UINT8 COM1BaudRate;\r
- UINT8 COM1DataRate;\r
- UINT8 COM1StopBits;\r
- UINT8 COM1Parity;\r
- UINT8 COM1TerminalType;\r
-\r
- //\r
- // This is the COM2 Attributes value storage\r
- //\r
- UINT8 COM2BaudRate;\r
- UINT8 COM2DataRate;\r
- UINT8 COM2StopBits;\r
- UINT8 COM2Parity;\r
- UINT8 COM2TerminalType;\r
-\r
- //\r
- // Driver Option Add Handle page storage\r
- //\r
- UINT16 DriverAddHandleDesc[100];\r
- UINT16 DriverAddHandleOptionalData[100];\r
- UINT8 DriverAddActive;\r
- UINT8 DriverAddForceReconnect;\r
-\r
- //\r
- // Console Input/Output/Errorout using COM port check storage\r
- //\r
- UINT8 ConsoleInputCOM1;\r
- UINT8 ConsoleInputCOM2;\r
- UINT8 ConsoleOutputCOM1;\r
- UINT8 ConsoleOutputCOM2;\r
- UINT8 ConsoleErrorCOM1;\r
- UINT8 ConsoleErrorCOM2;\r
-\r
- //\r
- // At most 100 input/output/errorout device for console storage\r
- //\r
- UINT8 ConsoleCheck[100];\r
-\r
- //\r
- // Boot or Driver Option Order storage\r
- //\r
- UINT8 OptionOrder[100];\r
- UINT8 DriverOptionToBeDeleted[100];\r
-\r
- //\r
- // Boot Option Delete storage\r
- //\r
- UINT8 BootOptionDel[100];\r
- UINT8 DriverOptionDel[100];\r
-\r
- //\r
- // This is the Terminal Attributes value storage\r
- //\r
- UINT8 COMBaudRate;\r
- UINT8 COMDataRate;\r
- UINT8 COMStopBits;\r
- UINT8 COMParity;\r
- UINT8 COMTerminalType;\r
-\r
- //\r
- // Legacy Device Order Selection Storage\r
- //\r
- UINT8 LegacyFD[100];\r
- UINT8 LegacyHD[100];\r
- UINT8 LegacyCD[100];\r
- UINT8 LegacyNET[100];\r
- UINT8 LegacyBEV[100];\r
-\r
- //\r
- // We use DisableMap array to record the enable/disable state of each boot device\r
- // It should be taken as a bit array, from left to right there are totally 256 bits\r
- // the most left one stands for BBS table item 0, and the most right one stands for item 256\r
- // If the bit is 1, it means the boot device has been disabled.\r
- //\r
- UINT8 DisableMap[32];\r
-\r
- //\r
- // UINT16 PadArea[10];\r
- //\r
-} BMM_FAKE_NV_DATA;\r
-\r
-typedef struct {\r
- UINT16 DescriptionData[75];\r
- UINT16 OptionalData[127];\r
- UINT8 Active;\r
- UINT8 ForceReconnect;\r
-} FILE_EXPLORER_NV_DATA;\r
-\r
-typedef struct {\r
- BBS_TYPE BbsType;\r
- //\r
- // Length = sizeof (UINT16) + SIZEOF (Data)\r
- //\r
- UINT16 Length;\r
- UINT16 *Data;\r
-} BM_LEGACY_DEV_ORDER_CONTEXT;\r
-\r
-typedef struct {\r
- UINT64 BaudRate;\r
- UINT8 DataBits;\r
- UINT8 Parity;\r
- UINT8 StopBits;\r
-\r
- UINT8 BaudRateIndex;\r
- UINT8 DataBitsIndex;\r
- UINT8 ParityIndex;\r
- UINT8 StopBitsIndex;\r
-\r
- UINT8 IsConIn;\r
- UINT8 IsConOut;\r
- UINT8 IsStdErr;\r
- UINT8 TerminalType;\r
-\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
-} BM_TERMINAL_CONTEXT;\r
-\r
-typedef struct {\r
- BOOLEAN IsBootNext;\r
- BOOLEAN LoadOptionModified;\r
- BOOLEAN Deleted;\r
-\r
- BOOLEAN IsLegacy;\r
- BOOLEAN IsActive;\r
- BOOLEAN ForceReconnect;\r
- UINTN OptionalDataSize;\r
-\r
- UINTN LoadOptionSize;\r
- UINT8 *LoadOption;\r
-\r
- UINT32 Attributes;\r
- UINT16 FilePathListLength;\r
- UINT16 *Description;\r
- EFI_DEVICE_PATH_PROTOCOL *FilePathList;\r
- UINT8 *OptionalData;\r
-\r
- UINT16 BbsIndex;\r
-} BM_LOAD_CONTEXT;\r
-\r
-typedef struct {\r
- BBS_TABLE *BbsTable;\r
- UINTN Index;\r
- UINTN BbsCount;\r
- UINT16 *Description;\r
-} BM_LEGACY_DEVICE_CONTEXT;\r
-\r
-typedef struct {\r
-\r
- BOOLEAN IsActive;\r
-\r
- BOOLEAN IsTerminal;\r
-\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
-} BM_CONSOLE_CONTEXT;\r
-\r
-typedef struct {\r
- EFI_HANDLE Handle;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- EFI_FILE_HANDLE FHandle;\r
- UINT16 *FileName;\r
- EFI_FILE_SYSTEM_VOLUME_LABEL_INFO *Info;\r
-\r
- BOOLEAN IsRoot;\r
- BOOLEAN IsDir;\r
- BOOLEAN IsRemovableMedia;\r
- BOOLEAN IsLoadFile;\r
- BOOLEAN IsBootLegacy;\r
-} BM_FILE_CONTEXT;\r
-\r
-typedef struct {\r
- EFI_HANDLE Handle;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
-} BM_HANDLE_CONTEXT;\r
-\r
-typedef struct {\r
- UINTN Signature;\r
- LIST_ENTRY Head;\r
- UINTN MenuNumber;\r
-} BM_MENU_OPTION;\r
-\r
-typedef struct {\r
- UINTN Signature;\r
- LIST_ENTRY Link;\r
- UINTN OptionNumber;\r
- UINT16 *DisplayString;\r
- UINT16 *HelpString;\r
- STRING_REF DisplayStringToken;\r
- STRING_REF HelpStringToken;\r
- UINTN ContextSelection;\r
- VOID *VariableContext;\r
-} BM_MENU_ENTRY;\r
-\r
-typedef struct {\r
- //\r
- // Shared callback data.\r
- //\r
- UINTN Signature;\r
- EFI_HII_PROTOCOL *Hii;\r
- BM_MENU_ENTRY *MenuEntry;\r
- BM_HANDLE_CONTEXT *HandleContext;\r
- BM_FILE_CONTEXT *FileContext;\r
- BM_LOAD_CONTEXT *LoadContext;\r
- BM_TERMINAL_CONTEXT *TerminalContext;\r
- UINTN CurrentTerminal;\r
- BBS_TYPE BbsType;\r
-\r
- //\r
- // BMM main formset callback data.\r
- //\r
- EFI_HII_HANDLE BmmHiiHandle;\r
- EFI_HANDLE BmmCallbackHandle;\r
- EFI_FORM_CALLBACK_PROTOCOL BmmDriverCallback;\r
- FORM_ID BmmCurrentPageId;\r
- FORM_ID BmmPreviousPageId;\r
- BOOLEAN BmmAskSaveOrNot;\r
- BMM_FAKE_NV_DATA *BmmFakeNvData;\r
- BMM_FAKE_NV_DATA BmmOldFakeNVData;\r
-\r
- //\r
- // File explorer formset callback data.\r
- //\r
- EFI_HII_HANDLE FeHiiHandle;\r
- EFI_HANDLE FeCallbackHandle;\r
- EFI_FORM_CALLBACK_PROTOCOL FeDriverCallback;\r
- FILE_EXPLORER_STATE FeCurrentState;\r
- FILE_EXPLORER_DISPLAY_CONTEXT FeDisplayContext;\r
-} BMM_CALLBACK_DATA;\r
-\r
-typedef struct _STRING_LIST_NODE {\r
- STRING_REF StringToken;\r
- struct _STRING_LIST_NODE *Next;\r
-} STRING_LIST_NODE;\r
-\r
-typedef struct _STRING_DEPOSITORY {\r
- UINTN TotalNodeNumber;\r
- STRING_LIST_NODE *CurrentNode;\r
- STRING_LIST_NODE *ListHead;\r
-} STRING_DEPOSITORY;\r
-\r
-//\r
-// #pragma pack()\r
-//\r
-// For initializing File System menu\r
-//\r
-EFI_STATUS\r
-BOpt_FindFileSystem (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-;\r
-\r
-//\r
-// For cleaning up File System menu\r
-//\r
-VOID\r
-BOpt_FreeFileSystem (\r
- VOID\r
- )\r
-;\r
-\r
-//\r
-// For initializing File Navigation menu\r
-//\r
-EFI_STATUS\r
-BOpt_FindFiles (\r
- IN BMM_CALLBACK_DATA *CallbackData,\r
- IN BM_MENU_ENTRY *MenuEntry\r
- )\r
-;\r
-\r
-//\r
-// For cleaning up File Navigation menu\r
-//\r
-VOID\r
-BOpt_FreeFiles (\r
- VOID\r
- )\r
-;\r
-\r
-//\r
-// For Initializing handle navigation menu\r
-//\r
-EFI_STATUS\r
-BOpt_FindDrivers (\r
- VOID\r
- )\r
-;\r
-\r
-//\r
-// For Cleaning up handle navigation menu\r
-//\r
-VOID\r
-BOpt_FreeDrivers();\r
-\r
-//\r
-// For initializing Boot Option menu\r
-//\r
-EFI_STATUS\r
-BOpt_GetBootOptions (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-//\r
-// For Initializing Driver option menu\r
-//\r
-EFI_STATUS\r
-BOpt_GetDriverOptions (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-//\r
-// For Cleaning up boot option menu\r
-//\r
-VOID\r
-BOpt_FreeBootOptions ();\r
-\r
-//\r
-// For cleaning up driver option menu\r
-//\r
-VOID\r
-BOpt_FreeDriverOptions();\r
-\r
-//\r
-// For Initializing HD/FD/CD/NET/BEV option menu\r
-//\r
-EFI_STATUS\r
-BOpt_GetLegacyOptions();\r
-\r
-//\r
-// For cleaning up driver option menu\r
-//\r
-VOID\r
-BOpt_FreeLegacyOptions();\r
-\r
-//\r
-// this function is used to take place of all other free menu actions\r
-//\r
-VOID\r
-BOpt_FreeMenu (\r
- BM_MENU_OPTION *FreeMenu\r
- );\r
-\r
-\r
-//\r
-// Following are the helper functions used\r
-//\r
-CHAR16 *\r
-BOpt_AppendFileName (\r
- IN CHAR16 *Str1,\r
- IN CHAR16 *Str2\r
- );\r
-\r
-BOOLEAN\r
-BOpt_IsEfiImageName (\r
- IN UINT16 *FileName\r
- );\r
-\r
-BOOLEAN\r
-BOpt_IsEfiApp (\r
- IN EFI_FILE_HANDLE Dir,\r
- IN UINT16 *FileName\r
- );\r
-\r
-//\r
-// Get current unused boot option number\r
-//\r
-UINT16\r
-BOpt_GetBootOptionNumber ();\r
-\r
-//\r
-// Get current unused driver option number\r
-//\r
-UINT16\r
-BOpt_GetDriverOptionNumber ();\r
-\r
-BM_MENU_ENTRY *\r
-BOpt_CreateMenuEntry (\r
- UINTN MenuType\r
- );\r
-\r
-VOID\r
-BOpt_DestroyMenuEntry (\r
- BM_MENU_ENTRY *MenuEntry\r
- );\r
-\r
-BM_MENU_ENTRY *\r
-BOpt_GetMenuEntry (\r
- BM_MENU_OPTION *MenuOption,\r
- UINTN MenuNumber\r
- );\r
-\r
-//\r
-// a helper function used to free pool type memory\r
-//\r
-VOID\r
-SafeFreePool (\r
- IN VOID *Buffer\r
- );\r
-\r
-//\r
-// Locate all serial io devices for console\r
-//\r
-EFI_STATUS\r
-LocateSerialIo ();\r
-\r
-//\r
-// Initializing Console menu\r
-//\r
-EFI_STATUS\r
-GetAllConsoles();\r
-\r
-//\r
-// Cleaning up console menu\r
-//\r
-EFI_STATUS\r
-FreeAllConsoles();\r
-\r
-VOID\r
-ChangeVariableDevicePath (\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
-); \r
-\r
-EFI_STATUS\r
-ChangeTerminalDevicePath (\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
- BOOLEAN ChangeTerminal\r
-);\r
-//\r
-// Variable operation by menu selection\r
-//\r
-EFI_STATUS\r
-Var_UpdateBootOption (\r
- IN BMM_CALLBACK_DATA *CallbackData,\r
- IN FILE_EXPLORER_NV_DATA *NvRamMap\r
- );\r
-\r
-EFI_STATUS\r
-Var_DelBootOption ();\r
-\r
-EFI_STATUS\r
-Var_ChangeBootOrder ();\r
-\r
-EFI_STATUS\r
-Var_UpdateDriverOption (\r
- IN BMM_CALLBACK_DATA *CallbackData,\r
- IN EFI_HII_HANDLE HiiHandle,\r
- IN UINT16 *DescriptionData,\r
- IN UINT16 *OptionalData,\r
- IN UINT8 ForceReconnect\r
- );\r
-\r
-EFI_STATUS\r
-Var_DelDriverOption ();\r
-\r
-EFI_STATUS\r
-Var_ChangeDriverOrder ();\r
-\r
-EFI_STATUS\r
-Var_UpdateConsoleInpOption ();\r
-\r
-EFI_STATUS\r
-Var_UpdateConsoleOutOption ();\r
-\r
-EFI_STATUS\r
-Var_UpdateErrorOutOption ();\r
-\r
-VOID\r
-Var_UpdateAllConsoleOption ();\r
-\r
-EFI_STATUS\r
-Var_UpdateBootNext (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-EFI_STATUS\r
-Var_UpdateBootOrder (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-EFI_STATUS\r
-Var_UpdateDriverOrder (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-EFI_STATUS\r
-Var_UpdateBBSOption (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-//\r
-// Following are page create and refresh functions\r
-//\r
-VOID\r
-RefreshUpdateData (\r
- IN BOOLEAN FormSetUpdate,\r
- IN EFI_PHYSICAL_ADDRESS FormCallbackHandle,\r
- IN BOOLEAN FormUpdate,\r
- IN STRING_REF FormTitle,\r
- IN UINT16 DataCount\r
- );\r
-\r
-VOID\r
-CleanUpPage (\r
- IN EFI_FORM_LABEL LabelId,\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-EFI_STATUS\r
-UpdatePage (\r
- IN BMM_CALLBACK_DATA *CallbackData,\r
- IN BM_MENU_OPTION *UpdatingMenu,\r
- IN UINT16 UpdatingPage,\r
- IN UINT16 UpdatingManner,\r
- IN UINT16 QuestionIdStart,\r
- IN UINT16 GotoForm,\r
- IN UINT16 GotoAlternateForm,\r
- IN STRING_REF DisplayTokenStart,\r
- IN STRING_REF HelpTokenStart,\r
- IN UINT16 KeyValueStart\r
- );\r
-\r
-VOID\r
-UpdateBootAddPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-VOID\r
-UpdateBootDelPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-VOID\r
-UpdateDrvAddFilePage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-VOID\r
-UpdateDrvAddHandlePage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-VOID\r
-UpdateDrvDelPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-VOID\r
-UpdateDriverAddHandleDescPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-VOID\r
-UpdateBootTimeOut (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-VOID\r
-UpdateConInPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-VOID\r
-UpdateConOutPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-VOID\r
-UpdateStdErrPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-VOID\r
-UpdatePageBody (\r
- IN UINT16 UpdatePageId,\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-VOID\r
-UpdateCOM1Page (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-VOID\r
-UpdateCOM2Page (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-VOID\r
-UpdateBootOrderPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-VOID\r
-UpdateDriverOrderPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-VOID\r
-UpdateBootNextPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-VOID\r
-UpdateTimeOutPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-VOID\r
-UpdateTerminalPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-VOID\r
-UpdateConCOMPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-VOID\r
-UpdateSetLegacyDeviceOrderPage (\r
- IN UINT16 UpdatePageId,\r
- IN BMM_CALLBACK_DATA *CallbackData\r
-);\r
-\r
-EFI_STATUS\r
-BootLegacy (\r
- IN UINT16 BbsType,\r
- IN UINT16 BbsFlag\r
-);\r
-\r
-BM_MENU_ENTRY *\r
-GetCurrentTerminal (\r
- UINTN TerminalNumber\r
-);\r
-\r
-EFI_FILE_HANDLE\r
-EfiLibOpenRoot (\r
- IN EFI_HANDLE DeviceHandle\r
- );\r
-\r
-EFI_FILE_SYSTEM_VOLUME_LABEL_INFO *\r
-EfiLibFileSystemVolumeLabelInfo (\r
- IN EFI_FILE_HANDLE FHand\r
- );\r
-\r
-EFI_FILE_INFO *\r
-EfiLibFileInfo (\r
- IN EFI_FILE_HANDLE FHand\r
- );\r
-\r
-CHAR16 *\r
-DevicePathToStr (\r
- EFI_DEVICE_PATH_PROTOCOL *DevPath\r
- );\r
-\r
-EFI_STATUS\r
-EfiLibLocateProtocol (\r
- IN EFI_GUID *ProtocolGuid,\r
- OUT VOID **Interface\r
- );\r
-\r
-VOID *\r
-EfiReallocatePool (\r
- IN VOID *OldPool,\r
- IN UINTN OldSize,\r
- IN UINTN NewSize\r
- );\r
-\r
-CHAR16 *\r
-DevicePathToStr (\r
- EFI_DEVICE_PATH_PROTOCOL *DevPath\r
- );\r
-\r
-VOID *\r
-BdsLibGetVariableAndSize (\r
- IN CHAR16 *Name,\r
- IN EFI_GUID *VendorGuid,\r
- OUT UINTN *VarSize\r
- );\r
-\r
-EFI_STATUS\r
-EfiLibDeleteVariable (\r
- IN CHAR16 *VarName,\r
- IN EFI_GUID *VarGuid\r
- );\r
-\r
-CHAR16 *\r
-EfiStrDuplicate (\r
- IN CHAR16 *Src\r
- );\r
-\r
-BOOLEAN\r
-EfiLibMatchDevicePaths (\r
- IN EFI_DEVICE_PATH_PROTOCOL *Multi,\r
- IN EFI_DEVICE_PATH_PROTOCOL *Single\r
- );\r
-\r
-UINTN\r
-EfiDevicePathInstanceCount (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
- );\r
-\r
-EFI_STATUS\r
-CreateMenuStringToken (\r
- IN BMM_CALLBACK_DATA *CallbackData,\r
- IN EFI_HII_HANDLE HiiHandle,\r
- IN BM_MENU_OPTION *MenuOption\r
- );\r
-\r
-UINT16 *\r
-EfiLibStrFromDatahub (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevPath\r
- );\r
-\r
-VOID *\r
-GetLegacyBootOptionVar (\r
- IN UINTN DeviceType,\r
- OUT UINTN *OptionIndex,\r
- OUT UINTN *OptionSize\r
- );\r
-\r
-EFI_STATUS\r
-InitializeBM (\r
- VOID\r
- );\r
-\r
-EFI_STATUS\r
-BdsStartBootMaint (\r
- VOID\r
- );\r
-\r
-VOID\r
-InitializeStringDepository ();\r
-\r
-STRING_REF\r
-GetStringTokenFromDepository (\r
- IN BMM_CALLBACK_DATA *CallbackData,\r
- IN STRING_DEPOSITORY *StringDepository\r
- ) ;\r
-\r
-VOID\r
-ReclaimStringDepository (\r
- VOID\r
- );\r
-\r
-VOID\r
-CleanUpStringDepository (\r
- VOID\r
- );\r
-\r
-EFI_STATUS\r
-ApplyChangeHandler (\r
- IN BMM_CALLBACK_DATA *Private,\r
- IN BMM_FAKE_NV_DATA *CurrentFakeNVMap,\r
- IN FORM_ID FormId\r
- );\r
-\r
-VOID\r
-DiscardChangeHandler (\r
- IN BMM_CALLBACK_DATA *Private,\r
- IN BMM_FAKE_NV_DATA *CurrentFakeNVMap\r
- );\r
-\r
-VOID\r
-UpdatePageId (\r
- BMM_CALLBACK_DATA *Private,\r
- UINT16 NewPageId\r
- );\r
-\r
-EFI_STATUS\r
-BootThisFile (\r
- IN BM_FILE_CONTEXT *FileContext\r
- );\r
-\r
-BOOLEAN\r
-UpdateFileExplorer (\r
- IN BMM_CALLBACK_DATA *CallbackData,\r
- IN UINT16 KeyValue\r
- );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-FileExplorerCallback (\r
- IN EFI_FORM_CALLBACK_PROTOCOL *This,\r
- IN UINT16 KeyValue,\r
- IN EFI_IFR_DATA_ARRAY *Data,\r
- OUT EFI_HII_CALLBACK_PACKET **Packet\r
- );\r
-\r
-EFI_STATUS\r
-FormSetDispatcher (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-VOID CreateCallbackPacket (\r
- OUT EFI_HII_CALLBACK_PACKET **Packet,\r
- IN UINT16 Flags\r
- );\r
-\r
-//\r
-// Global variable in this program (defined in data.c)\r
-//\r
-extern BM_MENU_OPTION BootOptionMenu;\r
-extern BM_MENU_OPTION DriverOptionMenu;\r
-extern BM_MENU_OPTION FsOptionMenu;\r
-extern BM_MENU_OPTION ConsoleInpMenu;\r
-extern BM_MENU_OPTION ConsoleOutMenu;\r
-extern BM_MENU_OPTION ConsoleErrMenu;\r
-extern BM_MENU_OPTION DirectoryMenu;\r
-extern BM_MENU_OPTION DriverMenu;\r
-extern BM_MENU_OPTION TerminalMenu;\r
-extern BM_MENU_OPTION LegacyFDMenu;\r
-extern BM_MENU_OPTION LegacyHDMenu;\r
-extern BM_MENU_OPTION LegacyCDMenu;\r
-extern BM_MENU_OPTION LegacyNETMenu;\r
-extern BM_MENU_OPTION LegacyBEVMenu;\r
-extern UINT16 TerminalType[];\r
-extern COM_ATTR BaudRateList[19];\r
-extern COM_ATTR DataBitsList[4];\r
-extern COM_ATTR ParityList[5];\r
-extern COM_ATTR StopBitsList[3];\r
-extern EFI_GUID Guid[4];\r
-extern EFI_HII_UPDATE_DATA *UpdateData;\r
-extern STRING_DEPOSITORY *FileOptionStrDepository;\r
-extern STRING_DEPOSITORY *ConsoleOptionStrDepository;\r
-extern STRING_DEPOSITORY *BootOptionStrDepository;\r
-extern STRING_DEPOSITORY *BootOptionHelpStrDepository;\r
-extern STRING_DEPOSITORY *DriverOptionStrDepository;\r
-extern STRING_DEPOSITORY *DriverOptionHelpStrDepository;\r
-extern STRING_DEPOSITORY *TerminalStrDepository;\r
-extern EFI_DEVICE_PATH_PROTOCOL EndDevicePath[];\r
-extern EFI_GUID EfiLegacyDevOrderGuid;\r
-\r
-#endif\r
+++ /dev/null
-/*++\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- BootOption.c\r
- \r
-Abstract:\r
-\r
- Provide boot option support for Application "BootMaint"\r
-\r
- Include file system navigation, system handle selection\r
-\r
- Boot option manipulation\r
- \r
-Revision History\r
-\r
---*/\r
-\r
-#include "BootMaint.h"\r
-#include "BBSsupport.h"\r
-\r
-BM_MENU_ENTRY *\r
-BOpt_CreateMenuEntry (\r
- UINTN MenuType\r
- )\r
-/*++\r
-\r
-Routine Description\r
- Create Menu Entry for future use, make all types together\r
- in order to reduce code size\r
-\r
-Arguments:\r
- MenuType Use this parameter to identify current\r
- Menu type\r
-\r
-Returns:\r
- NULL Cannot allocate memory for current menu \r
- entry\r
- Others A valid pointer pointing to the allocated\r
- memory pool for current menu entry\r
-\r
---*/\r
-{\r
- BM_MENU_ENTRY *MenuEntry;\r
- UINTN ContextSize;\r
-\r
- switch (MenuType) {\r
- case BM_LOAD_CONTEXT_SELECT:\r
- ContextSize = sizeof (BM_LOAD_CONTEXT);\r
- break;\r
-\r
- case BM_FILE_CONTEXT_SELECT:\r
- ContextSize = sizeof (BM_FILE_CONTEXT);\r
- break;\r
-\r
- case BM_CONSOLE_CONTEXT_SELECT:\r
- ContextSize = sizeof (BM_CONSOLE_CONTEXT);\r
- break;\r
-\r
- case BM_TERMINAL_CONTEXT_SELECT:\r
- ContextSize = sizeof (BM_TERMINAL_CONTEXT);\r
- break;\r
-\r
- case BM_HANDLE_CONTEXT_SELECT:\r
- ContextSize = sizeof (BM_HANDLE_CONTEXT);\r
- break;\r
-\r
- case BM_LEGACY_DEV_CONTEXT_SELECT:\r
- ContextSize = sizeof (BM_LEGACY_DEVICE_CONTEXT);\r
- break;\r
-\r
- default:\r
- ContextSize = 0;\r
- break;\r
-\r
- }\r
-\r
- if (0 == ContextSize) {\r
- return NULL;\r
- }\r
-\r
- MenuEntry = AllocateZeroPool (sizeof (BM_MENU_ENTRY));\r
- if (NULL == MenuEntry) {\r
- return MenuEntry;\r
- }\r
-\r
- MenuEntry->VariableContext = AllocateZeroPool (ContextSize);\r
- if (NULL == MenuEntry->VariableContext) {\r
- SafeFreePool (MenuEntry);\r
- MenuEntry = NULL;\r
- return MenuEntry;\r
- }\r
-\r
- MenuEntry->Signature = BM_MENU_ENTRY_SIGNATURE;\r
- MenuEntry->ContextSelection = MenuType;\r
- return MenuEntry;\r
-}\r
-\r
-VOID\r
-BOpt_DestroyMenuEntry (\r
- BM_MENU_ENTRY *MenuEntry\r
- )\r
-/*++\r
- Routine Description :\r
- Destroy the menu entry passed in\r
-\r
- Arguments :\r
- The menu entry need to be destroyed\r
-\r
- Returns :\r
- None\r
-\r
---*/\r
-{\r
- BM_LOAD_CONTEXT *LoadContext;\r
- BM_FILE_CONTEXT *FileContext;\r
- BM_CONSOLE_CONTEXT *ConsoleContext;\r
- BM_TERMINAL_CONTEXT *TerminalContext;\r
- BM_HANDLE_CONTEXT *HandleContext;\r
- BM_LEGACY_DEVICE_CONTEXT *LegacyDevContext;\r
-\r
- //\r
- // Select by the type in Menu entry for current context type\r
- //\r
- switch (MenuEntry->ContextSelection) {\r
- case BM_LOAD_CONTEXT_SELECT:\r
- LoadContext = (BM_LOAD_CONTEXT *) MenuEntry->VariableContext;\r
- SafeFreePool (LoadContext->FilePathList);\r
- SafeFreePool (LoadContext->LoadOption);\r
- SafeFreePool (LoadContext->OptionalData);\r
- SafeFreePool (LoadContext);\r
- break;\r
-\r
- case BM_FILE_CONTEXT_SELECT:\r
- FileContext = (BM_FILE_CONTEXT *) MenuEntry->VariableContext;\r
-\r
- if (!FileContext->IsRoot) {\r
- SafeFreePool (FileContext->DevicePath);\r
- } else {\r
- if (FileContext->FHandle != NULL) {\r
- FileContext->FHandle->Close (FileContext->FHandle);\r
- }\r
- }\r
-\r
- SafeFreePool (FileContext->FileName);\r
- SafeFreePool (FileContext->Info);\r
- SafeFreePool (FileContext);\r
- break;\r
-\r
- case BM_CONSOLE_CONTEXT_SELECT:\r
- ConsoleContext = (BM_CONSOLE_CONTEXT *) MenuEntry->VariableContext;\r
- SafeFreePool (ConsoleContext->DevicePath);\r
- SafeFreePool (ConsoleContext);\r
- break;\r
-\r
- case BM_TERMINAL_CONTEXT_SELECT:\r
- TerminalContext = (BM_TERMINAL_CONTEXT *) MenuEntry->VariableContext;\r
- SafeFreePool (TerminalContext->DevicePath);\r
- SafeFreePool (TerminalContext);\r
- break;\r
-\r
- case BM_HANDLE_CONTEXT_SELECT:\r
- HandleContext = (BM_HANDLE_CONTEXT *) MenuEntry->VariableContext;\r
- SafeFreePool (HandleContext);\r
- break;\r
-\r
- case BM_LEGACY_DEV_CONTEXT_SELECT:\r
- LegacyDevContext = (BM_LEGACY_DEVICE_CONTEXT *) MenuEntry->VariableContext;\r
- SafeFreePool (LegacyDevContext);\r
-\r
- default:\r
- break;\r
- }\r
-\r
- SafeFreePool (MenuEntry->DisplayString);\r
- if (NULL != MenuEntry->HelpString) {\r
- SafeFreePool (MenuEntry->HelpString);\r
- }\r
-\r
- SafeFreePool (MenuEntry);\r
-}\r
-\r
-BM_MENU_ENTRY *\r
-BOpt_GetMenuEntry (\r
- BM_MENU_OPTION *MenuOption,\r
- UINTN MenuNumber\r
- )\r
-/*++\r
- Rountine Description :\r
- Use this routine to get one particular menu entry in specified \r
- menu\r
-\r
- Arguments :\r
- MenuOption The menu that we will search \r
-\r
- MenuNumber The menunubmer that we want\r
-\r
- Returns :\r
- The desired menu entry\r
-\r
---*/\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- UINTN Index;\r
- LIST_ENTRY *List;\r
-\r
- if (MenuNumber >= MenuOption->MenuNumber) {\r
- return NULL;\r
- }\r
-\r
- List = MenuOption->Head.ForwardLink;\r
- for (Index = 0; Index < MenuNumber; Index++) {\r
- List = List->ForwardLink;\r
- }\r
-\r
- NewMenuEntry = CR (List, BM_MENU_ENTRY, Link, BM_MENU_ENTRY_SIGNATURE);\r
-\r
- return NewMenuEntry;\r
-}\r
-\r
-EFI_STATUS\r
-BOpt_FindFileSystem (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-/*++\r
-\r
-Routine Description\r
- Find file systems for current Extensible Firmware\r
- Including Handles that support Simple File System\r
- protocol, Load File protocol.\r
-\r
- Building up the FileSystem Menu for user selection\r
- All file system will be stored in FsOptionMenu \r
- for future use.\r
-\r
-Arguments:\r
- CallbackData - BMM context data\r
-\r
-Returns:\r
- EFI_SUCCESS - Success find the file system\r
- EFI_OUT_OF_RESOURCES - Can not create menu entry\r
-\r
---*/\r
-{\r
- UINTN NoSimpleFsHandles;\r
- UINTN NoLoadFileHandles;\r
- EFI_HANDLE *SimpleFsHandle;\r
- EFI_HANDLE *LoadFileHandle;\r
- UINT16 *VolumeLabel;\r
- EFI_BLOCK_IO_PROTOCOL *BlkIo;\r
- UINTN Index;\r
- EFI_STATUS Status;\r
- BM_MENU_ENTRY *MenuEntry;\r
- BM_FILE_CONTEXT *FileContext;\r
- UINT16 *TempStr;\r
- UINTN OptionNumber;\r
- EFI_LEGACY_BIOS_PROTOCOL *LegacyBios;\r
- UINT16 DeviceType;\r
- BBS_BBS_DEVICE_PATH BbsDevicePathNode;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- BOOLEAN RemovableMedia;\r
-\r
-\r
- NoSimpleFsHandles = 0;\r
- NoLoadFileHandles = 0;\r
- OptionNumber = 0;\r
- InitializeListHead (&FsOptionMenu.Head);\r
-\r
- //\r
- // Locate Handles that support Simple File System protocol\r
- //\r
- Status = gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- &gEfiSimpleFileSystemProtocolGuid,\r
- NULL,\r
- &NoSimpleFsHandles,\r
- &SimpleFsHandle\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- //\r
- // Find all the instances of the File System prototocol\r
- //\r
- for (Index = 0; Index < NoSimpleFsHandles; Index++) {\r
- Status = gBS->HandleProtocol (\r
- SimpleFsHandle[Index],\r
- &gEfiBlockIoProtocolGuid,\r
- (VOID**) &BlkIo\r
- );\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // If no block IO exists assume it's NOT a removable media\r
- //\r
- RemovableMedia = FALSE;\r
- } else {\r
- //\r
- // If block IO exists check to see if it's remobable media\r
- //\r
- RemovableMedia = BlkIo->Media->RemovableMedia; \r
- }\r
-\r
- //\r
- // Allocate pool for this load option\r
- //\r
- MenuEntry = BOpt_CreateMenuEntry (BM_FILE_CONTEXT_SELECT);\r
- if (NULL == MenuEntry) {\r
- SafeFreePool (SimpleFsHandle); \r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- FileContext = (BM_FILE_CONTEXT *) MenuEntry->VariableContext;\r
- \r
- FileContext->Handle = SimpleFsHandle[Index];\r
- MenuEntry->OptionNumber = Index;\r
- FileContext->FHandle = EfiLibOpenRoot (FileContext->Handle);\r
- if (!FileContext->FHandle) {\r
- BOpt_DestroyMenuEntry (MenuEntry);\r
- continue;\r
- }\r
-\r
- MenuEntry->HelpString = DevicePathToStr (DevicePathFromHandle (FileContext->Handle));\r
- FileContext->Info = EfiLibFileSystemVolumeLabelInfo (FileContext->FHandle);\r
- FileContext->FileName = EfiStrDuplicate (L"\\");\r
- FileContext->DevicePath = FileDevicePath (\r
- FileContext->Handle,\r
- FileContext->FileName\r
- );\r
- FileContext->IsDir = TRUE;\r
- FileContext->IsRoot = TRUE;\r
- FileContext->IsRemovableMedia = FALSE;\r
- FileContext->IsLoadFile = FALSE;\r
-\r
- //\r
- // Get current file system's Volume Label\r
- //\r
- if (FileContext->Info == NULL) {\r
- VolumeLabel = L"NO FILE SYSTEM INFO";\r
- } else {\r
- if (FileContext->Info->VolumeLabel == NULL) {\r
- VolumeLabel = L"NULL VOLUME LABEL";\r
- } else {\r
- VolumeLabel = FileContext->Info->VolumeLabel;\r
- if (*VolumeLabel == 0x0000) {\r
- VolumeLabel = L"NO VOLUME LABEL";\r
- }\r
- }\r
- }\r
-\r
- TempStr = MenuEntry->HelpString;\r
- MenuEntry->DisplayString = AllocateZeroPool (MAX_CHAR);\r
- ASSERT (MenuEntry->DisplayString != NULL);\r
- UnicodeSPrint (\r
- MenuEntry->DisplayString,\r
- MAX_CHAR,\r
- L"%s, [%s]",\r
- VolumeLabel,\r
- TempStr\r
- );\r
- OptionNumber++;\r
- InsertTailList (&FsOptionMenu.Head, &MenuEntry->Link); \r
- }\r
- }\r
-\r
- if (NoSimpleFsHandles != 0) {\r
- SafeFreePool (SimpleFsHandle);\r
- }\r
- //\r
- // Searching for handles that support Load File protocol\r
- //\r
- Status = gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- &gEfiLoadFileProtocolGuid,\r
- NULL,\r
- &NoLoadFileHandles,\r
- &LoadFileHandle\r
- );\r
-\r
- if (!EFI_ERROR (Status)) {\r
- for (Index = 0; Index < NoLoadFileHandles; Index++) {\r
- MenuEntry = BOpt_CreateMenuEntry (BM_FILE_CONTEXT_SELECT);\r
- if (NULL == MenuEntry) {\r
- SafeFreePool (LoadFileHandle); \r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- FileContext = (BM_FILE_CONTEXT *) MenuEntry->VariableContext;\r
- FileContext->IsRemovableMedia = FALSE;\r
- FileContext->IsLoadFile = TRUE;\r
- FileContext->Handle = LoadFileHandle[Index];\r
- FileContext->IsRoot = TRUE;\r
-\r
- FileContext->DevicePath = DevicePathFromHandle (FileContext->Handle);\r
-\r
- MenuEntry->HelpString = DevicePathToStr (FileContext->DevicePath);\r
-\r
- TempStr = MenuEntry->HelpString;\r
- MenuEntry->DisplayString = AllocateZeroPool (MAX_CHAR);\r
- ASSERT (MenuEntry->DisplayString != NULL);\r
- UnicodeSPrint (\r
- MenuEntry->DisplayString,\r
- MAX_CHAR,\r
- L"Load File [%s]",\r
- TempStr\r
- );\r
-\r
- MenuEntry->OptionNumber = OptionNumber;\r
- OptionNumber++;\r
- InsertTailList (&FsOptionMenu.Head, &MenuEntry->Link);\r
- }\r
- }\r
-\r
- if (NoLoadFileHandles != 0) {\r
- SafeFreePool (LoadFileHandle);\r
- }\r
-\r
- //\r
- // Add Legacy Boot Option Support Here\r
- //\r
- Status = gBS->LocateProtocol (\r
- &gEfiLegacyBiosProtocolGuid,\r
- NULL,\r
- (VOID**) &LegacyBios\r
- );\r
- if (!EFI_ERROR (Status)) {\r
-\r
- for (Index = BBS_TYPE_FLOPPY; Index <= BBS_TYPE_EMBEDDED_NETWORK; Index++) {\r
- MenuEntry = BOpt_CreateMenuEntry (BM_FILE_CONTEXT_SELECT);\r
- if (NULL == MenuEntry) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- FileContext = (BM_FILE_CONTEXT *) MenuEntry->VariableContext;\r
-\r
- FileContext->IsRemovableMedia = FALSE;\r
- FileContext->IsLoadFile = TRUE;\r
- FileContext->IsBootLegacy = TRUE;\r
- DeviceType = (UINT16) Index;\r
- BbsDevicePathNode.Header.Type = BBS_DEVICE_PATH;\r
- BbsDevicePathNode.Header.SubType = BBS_BBS_DP;\r
- SetDevicePathNodeLength (\r
- &BbsDevicePathNode.Header,\r
- sizeof (BBS_BBS_DEVICE_PATH)\r
- );\r
- BbsDevicePathNode.DeviceType = DeviceType;\r
- BbsDevicePathNode.StatusFlag = 0;\r
- BbsDevicePathNode.String[0] = 0;\r
- DevicePath = AppendDevicePathNode (\r
- EndDevicePath,\r
- (EFI_DEVICE_PATH_PROTOCOL *) &BbsDevicePathNode\r
- );\r
-\r
- FileContext->DevicePath = DevicePath;\r
- MenuEntry->HelpString = DevicePathToStr (FileContext->DevicePath);\r
-\r
- TempStr = MenuEntry->HelpString;\r
- MenuEntry->DisplayString = AllocateZeroPool (MAX_CHAR);\r
- ASSERT (MenuEntry->DisplayString != NULL);\r
- UnicodeSPrint (\r
- MenuEntry->DisplayString,\r
- MAX_CHAR,\r
- L"Boot Legacy [%s]",\r
- TempStr\r
- );\r
- MenuEntry->OptionNumber = OptionNumber;\r
- OptionNumber++;\r
- InsertTailList (&FsOptionMenu.Head, &MenuEntry->Link);\r
- }\r
- }\r
- //\r
- // Remember how many file system options are here\r
- //\r
- FsOptionMenu.MenuNumber = OptionNumber;\r
- return EFI_SUCCESS;\r
-}\r
-\r
-VOID\r
-BOpt_FreeMenu (\r
- BM_MENU_OPTION *FreeMenu\r
- )\r
-/*++\r
-\r
-Routine Description\r
- Free resources allocated in Allocate Rountine\r
-\r
-Arguments:\r
- FreeMenu Menu to be freed\r
-\r
-Returns:\r
- VOID\r
- \r
---*/\r
-{\r
- BM_MENU_ENTRY *MenuEntry;\r
- while (!IsListEmpty (&FreeMenu->Head)) {\r
- MenuEntry = CR (\r
- FreeMenu->Head.ForwardLink,\r
- BM_MENU_ENTRY,\r
- Link,\r
- BM_MENU_ENTRY_SIGNATURE\r
- );\r
- RemoveEntryList (&MenuEntry->Link);\r
- BOpt_DestroyMenuEntry (MenuEntry);\r
- }\r
-}\r
-\r
-EFI_STATUS\r
-BOpt_FindFiles (\r
- IN BMM_CALLBACK_DATA *CallbackData,\r
- IN BM_MENU_ENTRY *MenuEntry\r
- )\r
-/*++\r
-\r
-Routine Description\r
- Find files under current directory\r
- All files and sub-directories in current directory\r
- will be stored in DirectoryMenu for future use.\r
-\r
-Arguments:\r
- FileOption -- Pointer for Dir to explore\r
-\r
-Returns:\r
- TRUE -- Get files from current dir successfully\r
- FALSE -- Can't get files from current dir\r
-\r
---*/\r
-{\r
- EFI_FILE_HANDLE NewDir;\r
- EFI_FILE_HANDLE Dir;\r
- EFI_FILE_INFO *DirInfo;\r
- UINTN BufferSize;\r
- UINTN DirBufferSize;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_FILE_CONTEXT *FileContext;\r
- BM_FILE_CONTEXT *NewFileContext;\r
- UINTN Pass;\r
- EFI_STATUS Status;\r
- UINTN OptionNumber;\r
-\r
- FileContext = (BM_FILE_CONTEXT *) MenuEntry->VariableContext;\r
- Dir = FileContext->FHandle;\r
- OptionNumber = 0;\r
- //\r
- // Open current directory to get files from it\r
- //\r
- Status = Dir->Open (\r
- Dir,\r
- &NewDir,\r
- FileContext->FileName,\r
- EFI_FILE_READ_ONLY,\r
- 0\r
- );\r
- if (!FileContext->IsRoot) {\r
- Dir->Close (Dir);\r
- }\r
-\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- DirInfo = EfiLibFileInfo (NewDir);\r
- if (!DirInfo) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- if (!(DirInfo->Attribute & EFI_FILE_DIRECTORY)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- FileContext->DevicePath = FileDevicePath (\r
- FileContext->Handle,\r
- FileContext->FileName\r
- );\r
-\r
- DirBufferSize = sizeof (EFI_FILE_INFO) + 1024;\r
- DirInfo = AllocateZeroPool (DirBufferSize);\r
- if (!DirInfo) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- //\r
- // Get all files in current directory\r
- // Pass 1 to get Directories\r
- // Pass 2 to get files that are EFI images\r
- //\r
- for (Pass = 1; Pass <= 2; Pass++) {\r
- NewDir->SetPosition (NewDir, 0);\r
- for (;;) {\r
- BufferSize = DirBufferSize;\r
- Status = NewDir->Read (NewDir, &BufferSize, DirInfo);\r
- if (EFI_ERROR (Status) || BufferSize == 0) {\r
- break;\r
- }\r
-\r
- if ((DirInfo->Attribute & EFI_FILE_DIRECTORY && Pass == 2) ||\r
- (!(DirInfo->Attribute & EFI_FILE_DIRECTORY) && Pass == 1)\r
- ) {\r
- //\r
- // Pass 1 is for Directories\r
- // Pass 2 is for file names\r
- //\r
- continue;\r
- }\r
-\r
- if (!(BOpt_IsEfiImageName (DirInfo->FileName) || DirInfo->Attribute & EFI_FILE_DIRECTORY)) {\r
- //\r
- // Slip file unless it is a directory entry or a .EFI file\r
- //\r
- continue;\r
- }\r
-\r
- NewMenuEntry = BOpt_CreateMenuEntry (BM_FILE_CONTEXT_SELECT);\r
- if (NULL == NewMenuEntry) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewFileContext = (BM_FILE_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewFileContext->Handle = FileContext->Handle;\r
- NewFileContext->FileName = BOpt_AppendFileName (\r
- FileContext->FileName,\r
- DirInfo->FileName\r
- );\r
- NewFileContext->FHandle = NewDir;\r
- NewFileContext->DevicePath = FileDevicePath (\r
- NewFileContext->Handle,\r
- NewFileContext->FileName\r
- );\r
- NewMenuEntry->HelpString = NULL;\r
-\r
- MenuEntry->DisplayStringToken = GetStringTokenFromDepository (\r
- CallbackData,\r
- FileOptionStrDepository\r
- );\r
-\r
- NewFileContext->IsDir = (BOOLEAN) ((DirInfo->Attribute & EFI_FILE_DIRECTORY) == EFI_FILE_DIRECTORY);\r
-\r
- if (NewFileContext->IsDir) {\r
- BufferSize = StrLen (DirInfo->FileName) * 2 + 6;\r
- NewMenuEntry->DisplayString = AllocateZeroPool (BufferSize);\r
-\r
- UnicodeSPrint (\r
- NewMenuEntry->DisplayString,\r
- BufferSize,\r
- L"<%s>",\r
- DirInfo->FileName\r
- );\r
-\r
- } else {\r
- NewMenuEntry->DisplayString = EfiStrDuplicate (DirInfo->FileName);\r
- }\r
-\r
- NewFileContext->IsRoot = FALSE;\r
- NewFileContext->IsLoadFile = FALSE;\r
- NewFileContext->IsRemovableMedia = FALSE;\r
-\r
- NewMenuEntry->OptionNumber = OptionNumber;\r
- OptionNumber++;\r
- InsertTailList (&DirectoryMenu.Head, &NewMenuEntry->Link);\r
- }\r
- }\r
-\r
- DirectoryMenu.MenuNumber = OptionNumber;\r
- SafeFreePool (DirInfo);\r
- return TRUE;\r
-}\r
-\r
-EFI_STATUS\r
-BOpt_GetLegacyOptions (\r
- VOID\r
- )\r
-/*++\r
-Routine Description:\r
- \r
- Build the LegacyFDMenu LegacyHDMenu LegacyCDMenu according to LegacyBios.GetBbsInfo().\r
- \r
-Arguments:\r
- None\r
-\r
-Returns:\r
- The device info of legacy device.\r
- \r
---*/\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LEGACY_DEVICE_CONTEXT *NewLegacyDevContext;\r
- EFI_STATUS Status;\r
- EFI_LEGACY_BIOS_PROTOCOL *LegacyBios;\r
- UINT16 HddCount;\r
- HDD_INFO *HddInfo;\r
- UINT16 BbsCount;\r
- BBS_TABLE *BbsTable;\r
- UINTN Index;\r
- CHAR16 DescString[100];\r
- UINTN FDNum;\r
- UINTN HDNum;\r
- UINTN CDNum;\r
- UINTN NETNum;\r
- UINTN BEVNum;\r
-\r
- NewMenuEntry = NULL;\r
- HddInfo = NULL;\r
- BbsTable = NULL;\r
- BbsCount = 0;\r
-\r
- //\r
- // Initialize Bbs Table Context from BBS info data\r
- //\r
- InitializeListHead (&LegacyFDMenu.Head);\r
- InitializeListHead (&LegacyHDMenu.Head);\r
- InitializeListHead (&LegacyCDMenu.Head);\r
- InitializeListHead (&LegacyNETMenu.Head);\r
- InitializeListHead (&LegacyBEVMenu.Head);\r
-\r
- Status = gBS->LocateProtocol (\r
- &gEfiLegacyBiosProtocolGuid,\r
- NULL,\r
- (VOID**) &LegacyBios\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- Status = LegacyBios->GetBbsInfo (\r
- LegacyBios,\r
- &HddCount,\r
- &HddInfo,\r
- &BbsCount,\r
- &BbsTable\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- }\r
-\r
- FDNum = 0;\r
- HDNum = 0;\r
- CDNum = 0;\r
- NETNum = 0;\r
- BEVNum = 0;\r
-\r
- for (Index = 0; Index < BbsCount; Index++) {\r
- if ((BBS_IGNORE_ENTRY == BbsTable[Index].BootPriority) ||\r
- (BBS_DO_NOT_BOOT_FROM == BbsTable[Index].BootPriority) ||\r
- (BBS_LOWEST_PRIORITY == BbsTable[Index].BootPriority)\r
- ) {\r
- continue;\r
- }\r
-\r
- NewMenuEntry = BOpt_CreateMenuEntry (BM_LEGACY_DEV_CONTEXT_SELECT);\r
- if (NULL == NewMenuEntry) {\r
- break;\r
- }\r
-\r
- NewLegacyDevContext = (BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewLegacyDevContext->BbsTable = &BbsTable[Index];\r
- NewLegacyDevContext->Index = Index;\r
- NewLegacyDevContext->BbsCount = BbsCount;\r
- BdsBuildLegacyDevNameString (\r
- &BbsTable[Index],\r
- Index,\r
- sizeof (DescString),\r
- DescString\r
- );\r
- NewLegacyDevContext->Description = AllocateZeroPool (StrSize (DescString));\r
- if (NULL == NewLegacyDevContext->Description) {\r
- break;\r
- }\r
-\r
- CopyMem (NewLegacyDevContext->Description, DescString, StrSize (DescString));\r
- NewMenuEntry->DisplayString = NewLegacyDevContext->Description;\r
- NewMenuEntry->HelpString = NULL;\r
-\r
- switch (BbsTable[Index].DeviceType) {\r
- case BBS_FLOPPY:\r
- InsertTailList (&LegacyFDMenu.Head, &NewMenuEntry->Link);\r
- FDNum++;\r
- break;\r
-\r
- case BBS_HARDDISK:\r
- InsertTailList (&LegacyHDMenu.Head, &NewMenuEntry->Link);\r
- HDNum++;\r
- break;\r
-\r
- case BBS_CDROM:\r
- InsertTailList (&LegacyCDMenu.Head, &NewMenuEntry->Link);\r
- CDNum++;\r
- break;\r
-\r
- case BBS_EMBED_NETWORK:\r
- InsertTailList (&LegacyNETMenu.Head, &NewMenuEntry->Link);\r
- NETNum++;\r
- break;\r
-\r
- case BBS_BEV_DEVICE:\r
- InsertTailList (&LegacyBEVMenu.Head, &NewMenuEntry->Link);\r
- BEVNum++;\r
- break;\r
- }\r
- }\r
-\r
- if (Index != BbsCount) {\r
- BOpt_FreeLegacyOptions ();\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- LegacyFDMenu.MenuNumber = FDNum;\r
- LegacyHDMenu.MenuNumber = HDNum;\r
- LegacyCDMenu.MenuNumber = CDNum;\r
- LegacyNETMenu.MenuNumber = NETNum;\r
- LegacyBEVMenu.MenuNumber = BEVNum;\r
- return EFI_SUCCESS;\r
-}\r
-\r
-VOID\r
-BOpt_FreeLegacyOptions (\r
- VOID\r
- )\r
-{\r
- BOpt_FreeMenu (&LegacyFDMenu);\r
- BOpt_FreeMenu (&LegacyHDMenu);\r
- BOpt_FreeMenu (&LegacyCDMenu);\r
- BOpt_FreeMenu (&LegacyNETMenu);\r
- BOpt_FreeMenu (&LegacyBEVMenu);\r
-}\r
-\r
-EFI_STATUS\r
-BOpt_GetBootOptions (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Build the BootOptionMenu according to BootOrder Variable.\r
- This Routine will access the Boot#### to get EFI_LOAD_OPTION \r
- \r
-Arguments:\r
- None\r
-\r
-Returns:\r
- The number of the Var Boot####\r
- \r
---*/\r
-{\r
- UINTN Index;\r
- UINT16 BootString[10];\r
- UINT8 *LoadOptionFromVar;\r
- UINT8 *LoadOption;\r
- UINTN BootOptionSize;\r
- BOOLEAN BootNextFlag;\r
- UINT16 *BootOrderList;\r
- UINTN BootOrderListSize;\r
- UINT16 *BootNext;\r
- UINTN BootNextSize;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- UINT8 *LoadOptionPtr;\r
- UINTN StringSize;\r
- UINTN OptionalDataSize;\r
- UINT8 *LoadOptionEnd;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- UINTN MenuCount;\r
- UINT8 *Ptr;\r
-\r
- MenuCount = 0;\r
- BootOrderListSize = 0;\r
- BootNextSize = 0;\r
- BootOrderList = NULL;\r
- BootNext = NULL;\r
- LoadOptionFromVar = NULL;\r
- BOpt_FreeMenu (&BootOptionMenu);\r
- InitializeListHead (&BootOptionMenu.Head);\r
-\r
- //\r
- // Get the BootOrder from the Var\r
- //\r
- BootOrderList = BdsLibGetVariableAndSize (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- &BootOrderListSize\r
- );\r
-\r
- //\r
- // Get the BootNext from the Var\r
- //\r
- BootNext = BdsLibGetVariableAndSize (\r
- L"BootNext",\r
- &gEfiGlobalVariableGuid,\r
- &BootNextSize\r
- );\r
-\r
- if (BootNext) {\r
- if (BootNextSize != sizeof (UINT16)) {\r
- SafeFreePool (BootNext);\r
- BootNext = NULL;\r
- }\r
- }\r
-\r
- for (Index = 0; Index < BootOrderListSize / sizeof (UINT16); Index++) {\r
- UnicodeSPrint (BootString, sizeof (BootString), L"Boot%04x", BootOrderList[Index]);\r
- //\r
- // Get all loadoptions from the VAR\r
- //\r
- LoadOptionFromVar = BdsLibGetVariableAndSize (\r
- BootString,\r
- &gEfiGlobalVariableGuid,\r
- &BootOptionSize\r
- );\r
- if (!LoadOptionFromVar) {\r
- continue;\r
- }\r
-\r
- LoadOption = AllocateZeroPool (BootOptionSize);\r
- if (!LoadOption) {\r
- continue;\r
- }\r
-\r
- CopyMem (LoadOption, LoadOptionFromVar, BootOptionSize);\r
- SafeFreePool (LoadOptionFromVar);\r
-\r
- if (BootNext) {\r
- BootNextFlag = (BOOLEAN) (*BootNext == BootOrderList[Index]);\r
- } else {\r
- BootNextFlag = FALSE;\r
- }\r
-\r
- if (0 == (*((UINT32 *) LoadOption) & LOAD_OPTION_ACTIVE)) {\r
- SafeFreePool (LoadOption);\r
- continue;\r
- }\r
- //\r
- // BUGBUG: could not return EFI_OUT_OF_RESOURCES here directly.\r
- // the buffer allocated already should be freed before returning.\r
- //\r
- NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
- if (NULL == NewMenuEntry) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
- LoadOptionPtr = LoadOption;\r
- LoadOptionEnd = LoadOption + BootOptionSize;\r
-\r
- NewMenuEntry->OptionNumber = BootOrderList[Index];\r
- NewLoadContext->LoadOptionModified = FALSE;\r
- NewLoadContext->Deleted = FALSE;\r
- NewLoadContext->IsBootNext = BootNextFlag;\r
-\r
- //\r
- // Is a Legacy Device?\r
- //\r
- Ptr = (UINT8 *) LoadOption;\r
-\r
- //\r
- // Attribute = *(UINT32 *)Ptr;\r
- //\r
- Ptr += sizeof (UINT32);\r
-\r
- //\r
- // FilePathSize = *(UINT16 *)Ptr;\r
- //\r
- Ptr += sizeof (UINT16);\r
-\r
- //\r
- // Description = (CHAR16 *)Ptr;\r
- //\r
- Ptr += StrSize ((CHAR16 *) Ptr);\r
-\r
- //\r
- // Now Ptr point to Device Path\r
- //\r
- DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr;\r
- if ((BBS_DEVICE_PATH == DevicePath->Type) && (BBS_BBS_DP == DevicePath->SubType)) {\r
- NewLoadContext->IsLegacy = TRUE;\r
- } else {\r
- NewLoadContext->IsLegacy = FALSE;\r
- }\r
- //\r
- // LoadOption is a pointer type of UINT8\r
- // for easy use with following LOAD_OPTION\r
- // embedded in this struct\r
- //\r
- NewLoadContext->LoadOption = LoadOption;\r
- NewLoadContext->LoadOptionSize = BootOptionSize;\r
-\r
- NewLoadContext->Attributes = *(UINT32 *) LoadOptionPtr;\r
- NewLoadContext->IsActive = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_ACTIVE);\r
-\r
- NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
-\r
- LoadOptionPtr += sizeof (UINT32);\r
-\r
- NewLoadContext->FilePathListLength = *(UINT16 *) LoadOptionPtr;\r
- LoadOptionPtr += sizeof (UINT16);\r
-\r
- StringSize = StrSize ((UINT16 *) LoadOptionPtr);\r
- NewLoadContext->Description = AllocateZeroPool (StringSize);\r
- ASSERT (NewLoadContext->Description != NULL);\r
- CopyMem (\r
- NewLoadContext->Description,\r
- (UINT16 *) LoadOptionPtr,\r
- StringSize\r
- );\r
- NewMenuEntry->DisplayString = NewLoadContext->Description;\r
-\r
- LoadOptionPtr += StringSize;\r
-\r
- NewLoadContext->FilePathList = AllocateZeroPool (NewLoadContext->FilePathListLength);\r
- ASSERT (NewLoadContext->FilePathList != NULL);\r
- CopyMem (\r
- NewLoadContext->FilePathList,\r
- (EFI_DEVICE_PATH_PROTOCOL *) LoadOptionPtr,\r
- NewLoadContext->FilePathListLength\r
- );\r
-\r
- NewMenuEntry->HelpString = DevicePathToStr (NewLoadContext->FilePathList);\r
- NewMenuEntry->DisplayStringToken = GetStringTokenFromDepository (\r
- CallbackData,\r
- BootOptionStrDepository\r
- );\r
- NewMenuEntry->HelpStringToken = GetStringTokenFromDepository (\r
- CallbackData,\r
- BootOptionHelpStrDepository\r
- );\r
- LoadOptionPtr += NewLoadContext->FilePathListLength;\r
-\r
- if (LoadOptionPtr < LoadOptionEnd) {\r
- OptionalDataSize = BootOptionSize -\r
- sizeof (UINT32) -\r
- sizeof (UINT16) -\r
- StringSize -\r
- NewLoadContext->FilePathListLength;\r
-\r
- NewLoadContext->OptionalData = AllocateZeroPool (OptionalDataSize);\r
- ASSERT (NewLoadContext->OptionalData != NULL);\r
- CopyMem (\r
- NewLoadContext->OptionalData,\r
- LoadOptionPtr,\r
- OptionalDataSize\r
- );\r
-\r
- NewLoadContext->OptionalDataSize = OptionalDataSize;\r
- }\r
-\r
- InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link);\r
- MenuCount++;\r
- }\r
-\r
- SafeFreePool (BootNext);\r
- SafeFreePool (BootOrderList);\r
- BootOptionMenu.MenuNumber = MenuCount;\r
- return MenuCount;\r
-}\r
-\r
-CHAR16 *\r
-BdsStrCpy (\r
- OUT CHAR16 *Destination,\r
- IN CONST CHAR16 *Source\r
- )\r
-{\r
- CHAR16 *ReturnValue;\r
-\r
- //\r
- // Destination cannot be NULL\r
- //\r
- ASSERT (Destination != NULL);\r
-\r
- ReturnValue = Destination;\r
- while (*Source) {\r
- *(Destination++) = *(Source++);\r
- }\r
- *Destination = 0;\r
- return ReturnValue;\r
-}\r
-\r
-CHAR16 *\r
-BOpt_AppendFileName (\r
- IN CHAR16 *Str1,\r
- IN CHAR16 *Str2\r
- )\r
-/*++\r
-\r
-Routine Description\r
- Append file name to existing file name.\r
-\r
-Arguments:\r
- Str1 - existing file name\r
- Str2 - file name to be appended\r
-\r
-Returns:\r
- Allocate a new string to hold the appended result.\r
- Caller is responsible to free the returned string.\r
-\r
---*/\r
-{\r
- UINTN Size1;\r
- UINTN Size2;\r
- CHAR16 *Str;\r
- CHAR16 *Ptr;\r
- CHAR16 *LastSlash;\r
-\r
- Size1 = StrSize (Str1);\r
- Size2 = StrSize (Str2);\r
- Str = AllocateZeroPool (Size1 + Size2 + sizeof (CHAR16));\r
- ASSERT (Str != NULL);\r
-\r
- StrCat (Str, Str1);\r
- if (!((*Str == '\\') && (*(Str + 1) == 0))) {\r
- StrCat (Str, L"\\");\r
- }\r
-\r
- StrCat (Str, Str2);\r
-\r
- Ptr = Str;\r
- LastSlash = Str;\r
- while (*Ptr != 0) {\r
- if (*Ptr == '\\' && *(Ptr + 1) == '.' && *(Ptr + 2) == '.' && *(Ptr + 3) != 0) {\r
- //\r
- // Convert "\Name\..\" to "\"\r
- // DO NOT convert the .. if it is at the end of the string. This will\r
- // break the .. behavior in changing directories.\r
- //\r
- BdsStrCpy (LastSlash, Ptr + 3);\r
- Ptr = LastSlash;\r
- } else if (*Ptr == '\\' && *(Ptr + 1) == '.' && *(Ptr + 2) == '\\') {\r
- //\r
- // Convert a "\.\" to a "\"\r
- //\r
- BdsStrCpy (Ptr, Ptr + 2);\r
- Ptr = LastSlash;\r
- } else if (*Ptr == '\\') {\r
- LastSlash = Ptr;\r
- }\r
-\r
- Ptr++;\r
- }\r
-\r
- return Str;\r
-}\r
-\r
-BOOLEAN\r
-BOpt_IsEfiImageName (\r
- IN UINT16 *FileName\r
- )\r
-/*++\r
-\r
-Routine Description\r
- Check whether current FileName point to a valid \r
- Efi Image File.\r
-\r
-Arguments:\r
- FileName - File need to be checked.\r
-\r
-Returns:\r
- TRUE - Is Efi Image\r
- FALSE - Not a valid Efi Image\r
- \r
---*/\r
-{\r
- //\r
- // Search for ".efi" extension\r
- //\r
- while (*FileName) {\r
- if (FileName[0] == '.') {\r
- if (FileName[1] == 'e' || FileName[1] == 'E') {\r
- if (FileName[2] == 'f' || FileName[2] == 'F') {\r
- if (FileName[3] == 'i' || FileName[3] == 'I') {\r
- return TRUE;\r
- } else if (FileName[3] == 0x0000) {\r
- return FALSE;\r
- }\r
- } else if (FileName[2] == 0x0000) {\r
- return FALSE;\r
- }\r
- } else if (FileName[1] == 0x0000) {\r
- return FALSE;\r
- }\r
- }\r
-\r
- FileName += 1;\r
- }\r
-\r
- return FALSE;\r
-}\r
-\r
-\r
-RETURN_STATUS\r
-EFIAPI\r
-IsEfiAppReadFromFile (\r
- IN VOID *FileHandle,\r
- IN UINTN FileOffset,\r
- IN OUT UINTN *ReadSize,\r
- OUT VOID *Buffer\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_FILE_HANDLE File;\r
- \r
- File = (EFI_FILE_HANDLE)FileHandle;\r
- Status = File->SetPosition (File, FileOffset);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- return File->Read (File, ReadSize, Buffer);\r
-}\r
-\r
-\r
-\r
-BOOLEAN\r
-BOpt_IsEfiApp (\r
- IN EFI_FILE_HANDLE Dir,\r
- IN UINT16 *FileName\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Check whether current FileName point to a valid Efi Application\r
- \r
-Arguments:\r
- Dir - Pointer to current Directory\r
- FileName - Pointer to current File name.\r
- \r
-Returns:\r
- TRUE - Is a valid Efi Application\r
- FALSE - not a valid Efi Application\r
- \r
---*/\r
-{\r
- EFI_STATUS Status;\r
- PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;\r
- EFI_FILE_HANDLE File;\r
-\r
- Status = Dir->Open (Dir, &File, FileName, EFI_FILE_MODE_READ, 0);\r
- if (EFI_ERROR (Status)) {\r
- return FALSE;\r
- }\r
-\r
- ZeroMem (&ImageContext, sizeof (ImageContext));\r
- ImageContext.Handle = (VOID *)File;\r
- ImageContext.ImageRead = IsEfiAppReadFromFile;\r
-\r
- Status = PeCoffLoaderGetImageInfo (&ImageContext);\r
- File->Close (File);\r
- if (EFI_ERROR (Status)) {\r
- return FALSE;\r
- }\r
-\r
- if (ImageContext.ImageType == EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION) {\r
- return TRUE;\r
- } else {\r
- return FALSE;\r
- }\r
- }\r
-\r
-\r
-EFI_STATUS\r
-BOpt_FindDrivers (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description\r
- Find drivers that will be added as Driver#### variables from handles\r
- in current system environment\r
- All valid handles in the system except those consume SimpleFs, LoadFile\r
- are stored in DriverMenu for future use.\r
- \r
-Arguments:\r
- None\r
-\r
-Returns:\r
- EFI_SUCCESS\r
- Others\r
-\r
---*/\r
-{\r
- UINTN NoDevicePathHandles;\r
- EFI_HANDLE *DevicePathHandle;\r
- UINTN Index;\r
- EFI_STATUS Status;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_HANDLE_CONTEXT *NewHandleContext;\r
- EFI_HANDLE CurHandle;\r
- UINTN OptionNumber;\r
- EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFs;\r
- EFI_LOAD_FILE_PROTOCOL *LoadFile;\r
-\r
- SimpleFs = NULL;\r
- LoadFile = NULL;\r
-\r
- InitializeListHead (&DriverMenu.Head);\r
-\r
- //\r
- // At first, get all handles that support Device Path\r
- // protocol which is the basic requirement for\r
- // Driver####\r
- //\r
- Status = gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- &gEfiDevicePathProtocolGuid,\r
- NULL,\r
- &NoDevicePathHandles,\r
- &DevicePathHandle\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- OptionNumber = 0;\r
- for (Index = 0; Index < NoDevicePathHandles; Index++) {\r
- CurHandle = DevicePathHandle[Index];\r
-\r
- //\r
- // Check whether this handle support\r
- // driver binding\r
- //\r
- Status = gBS->HandleProtocol (\r
- CurHandle,\r
- &gEfiSimpleFileSystemProtocolGuid,\r
- (VOID**) &SimpleFs\r
- );\r
- if (Status == EFI_SUCCESS) {\r
- continue;\r
- }\r
-\r
- Status = gBS->HandleProtocol (\r
- CurHandle,\r
- &gEfiLoadFileProtocolGuid,\r
- (VOID**) &LoadFile\r
- );\r
- if (Status == EFI_SUCCESS) {\r
- continue;\r
- }\r
-\r
- NewMenuEntry = BOpt_CreateMenuEntry (BM_HANDLE_CONTEXT_SELECT);\r
- if (NULL == NewMenuEntry) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewHandleContext = (BM_HANDLE_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewHandleContext->Handle = CurHandle;\r
- NewHandleContext->DevicePath = DevicePathFromHandle (CurHandle);\r
- NewMenuEntry->DisplayString = DevicePathToStr (NewHandleContext->DevicePath);\r
- NewMenuEntry->HelpString = NULL;\r
- NewMenuEntry->OptionNumber = OptionNumber;\r
- OptionNumber++;\r
- InsertTailList (&DriverMenu.Head, &NewMenuEntry->Link);\r
-\r
- }\r
-\r
- DriverMenu.MenuNumber = OptionNumber;\r
- return EFI_SUCCESS;\r
-}\r
-\r
-UINT16\r
-BOpt_GetBootOptionNumber (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Get the Option Number that does not used \r
- \r
-Arguments:\r
-\r
-Returns:\r
- The Option Number\r
- \r
---*/\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- UINT16 *BootOrderList;\r
- UINTN BootOrderListSize;\r
- UINT16 Number;\r
- UINTN Index;\r
- UINTN Index2;\r
- BOOLEAN Found;\r
- CHAR16 StrTemp[100];\r
- UINT16 *OptionBuffer;\r
- UINTN OptionSize;\r
-\r
- BootOrderListSize = 0;\r
- BootOrderList = NULL;\r
-\r
- BootOrderList = BdsLibGetVariableAndSize (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- &BootOrderListSize\r
- );\r
- if (BootOrderList) {\r
- //\r
- // already have Boot####\r
- //\r
- // AlreadyBootNumbers = BootOrderListSize / sizeof(UINT16);\r
- //\r
- for (Index = 0; Index < BootOrderListSize / sizeof (UINT16); Index++) {\r
- Found = TRUE;\r
- for (Index2 = 0; Index2 < BootOptionMenu.MenuNumber; Index2++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index2);\r
- if (Index == NewMenuEntry->OptionNumber) {\r
- Found = FALSE;\r
- break;\r
- }\r
- }\r
-\r
- if (Found) {\r
- UnicodeSPrint (StrTemp, 100, L"Boot%04x", Index);\r
- DEBUG((EFI_D_ERROR,"INdex= %s\n", StrTemp));\r
- OptionBuffer = BdsLibGetVariableAndSize (\r
- StrTemp,\r
- &gEfiGlobalVariableGuid,\r
- &OptionSize\r
- );\r
- if (NULL == OptionBuffer) \r
- break;\r
- }\r
- }\r
- //\r
- // end for Index\r
- //\r
- Number = (UINT16) Index;\r
- } else {\r
- //\r
- // No Boot####\r
- //\r
- Number = 0;\r
- }\r
-\r
- return Number;\r
-}\r
-\r
-UINT16\r
-BOpt_GetDriverOptionNumber (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Get the Option Number that does not used \r
- \r
-Arguments:\r
-\r
-Returns:\r
- The Option Number\r
- \r
---*/\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- UINT16 *DriverOrderList;\r
- UINTN DriverOrderListSize;\r
- UINT16 Number;\r
- UINTN Index;\r
- UINTN Index2;\r
- BOOLEAN Found;\r
-\r
- DriverOrderListSize = 0;\r
- DriverOrderList = NULL;\r
-\r
- DriverOrderList = BdsLibGetVariableAndSize (\r
- L"DriverOrder",\r
- &gEfiGlobalVariableGuid,\r
- &DriverOrderListSize\r
- );\r
- if (DriverOrderList) {\r
- //\r
- // already have Driver####\r
- //\r
- // AlreadyDriverNumbers = DriverOrderListSize / sizeof(UINT16);\r
- //\r
- for (Index = 0; Index < DriverOrderListSize / sizeof (UINT16); Index++) {\r
- Found = TRUE;\r
- for (Index2 = 0; Index2 < DriverOptionMenu.MenuNumber; Index2++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index2);\r
- if (Index == NewMenuEntry->OptionNumber) {\r
- Found = FALSE;\r
- break;\r
- }\r
- }\r
-\r
- if (Found) {\r
- break;\r
- }\r
- }\r
- //\r
- // end for Index\r
- //\r
- Number = (UINT16) Index;\r
- } else {\r
- //\r
- // No Driver####\r
- //\r
- Number = 0;\r
- }\r
-\r
- return Number;\r
-}\r
-\r
-EFI_STATUS\r
-BOpt_GetDriverOptions (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Build up all DriverOptionMenu\r
- \r
-Arguments:\r
-\r
-Returns:\r
- The Option Number\r
- \r
---*/\r
-{\r
- UINTN Index;\r
- UINT16 DriverString[12];\r
- UINT8 *LoadOptionFromVar;\r
- UINT8 *LoadOption;\r
- UINTN DriverOptionSize;\r
-\r
- UINT16 *DriverOrderList;\r
- UINTN DriverOrderListSize;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- UINT8 *LoadOptionPtr;\r
- UINTN StringSize;\r
- UINTN OptionalDataSize;\r
- UINT8 *LoadOptionEnd;\r
-\r
- DriverOrderListSize = 0;\r
- DriverOrderList = NULL;\r
- DriverOptionSize = 0;\r
- LoadOptionFromVar = NULL;\r
- BOpt_FreeMenu (&DriverOptionMenu);\r
- InitializeListHead (&DriverOptionMenu.Head);\r
- //\r
- // Get the DriverOrder from the Var\r
- //\r
- DriverOrderList = BdsLibGetVariableAndSize (\r
- L"DriverOrder",\r
- &gEfiGlobalVariableGuid,\r
- &DriverOrderListSize\r
- );\r
-\r
- for (Index = 0; Index < DriverOrderListSize / sizeof (UINT16); Index++) {\r
- UnicodeSPrint (\r
- DriverString,\r
- sizeof (DriverString),\r
- L"Driver%04x",\r
- DriverOrderList[Index]\r
- );\r
- //\r
- // Get all loadoptions from the VAR\r
- //\r
- LoadOptionFromVar = BdsLibGetVariableAndSize (\r
- DriverString,\r
- &gEfiGlobalVariableGuid,\r
- &DriverOptionSize\r
- );\r
- if (!LoadOptionFromVar) {\r
- continue;\r
- }\r
-\r
- LoadOption = AllocateZeroPool (DriverOptionSize);\r
- if (!LoadOption) {\r
- continue;\r
- }\r
-\r
- CopyMem (LoadOption, LoadOptionFromVar, DriverOptionSize);\r
- SafeFreePool (LoadOptionFromVar);\r
-\r
- NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
- if (NULL == NewMenuEntry) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- LoadOptionPtr = LoadOption;\r
- LoadOptionEnd = LoadOption + DriverOptionSize;\r
- NewMenuEntry->OptionNumber = DriverOrderList[Index];\r
- NewLoadContext->LoadOptionModified = FALSE;\r
- NewLoadContext->Deleted = FALSE;\r
- NewLoadContext->IsLegacy = FALSE;\r
-\r
- //\r
- // LoadOption is a pointer type of UINT8\r
- // for easy use with following LOAD_OPTION\r
- // embedded in this struct\r
- //\r
- NewLoadContext->LoadOption = LoadOption;\r
- NewLoadContext->LoadOptionSize = DriverOptionSize;\r
-\r
- NewLoadContext->Attributes = *(UINT32 *) LoadOptionPtr;\r
- NewLoadContext->IsActive = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_ACTIVE);\r
-\r
- NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
-\r
- LoadOptionPtr += sizeof (UINT32);\r
-\r
- NewLoadContext->FilePathListLength = *(UINT16 *) LoadOptionPtr;\r
- LoadOptionPtr += sizeof (UINT16);\r
-\r
- StringSize = StrSize ((UINT16 *) LoadOptionPtr);\r
- NewLoadContext->Description = AllocateZeroPool (StringSize);\r
- ASSERT (NewLoadContext->Description != NULL);\r
- CopyMem (\r
- NewLoadContext->Description,\r
- (UINT16 *) LoadOptionPtr,\r
- StringSize\r
- );\r
- NewMenuEntry->DisplayString = NewLoadContext->Description;\r
-\r
- LoadOptionPtr += StringSize;\r
-\r
- NewLoadContext->FilePathList = AllocateZeroPool (NewLoadContext->FilePathListLength);\r
- ASSERT (NewLoadContext->FilePathList != NULL);\r
- CopyMem (\r
- NewLoadContext->FilePathList,\r
- (EFI_DEVICE_PATH_PROTOCOL *) LoadOptionPtr,\r
- NewLoadContext->FilePathListLength\r
- );\r
-\r
- NewMenuEntry->HelpString = DevicePathToStr (NewLoadContext->FilePathList);\r
- NewMenuEntry->DisplayStringToken = GetStringTokenFromDepository (\r
- CallbackData,\r
- DriverOptionStrDepository\r
- );\r
- NewMenuEntry->HelpStringToken = GetStringTokenFromDepository (\r
- CallbackData,\r
- DriverOptionHelpStrDepository\r
- );\r
- LoadOptionPtr += NewLoadContext->FilePathListLength;\r
-\r
- if (LoadOptionPtr < LoadOptionEnd) {\r
- OptionalDataSize = DriverOptionSize -\r
- sizeof (UINT32) -\r
- sizeof (UINT16) -\r
- StringSize -\r
- NewLoadContext->FilePathListLength;\r
-\r
- NewLoadContext->OptionalData = AllocateZeroPool (OptionalDataSize);\r
- ASSERT (NewLoadContext->OptionalData != NULL);\r
- CopyMem (\r
- NewLoadContext->OptionalData,\r
- LoadOptionPtr,\r
- OptionalDataSize\r
- );\r
-\r
- NewLoadContext->OptionalDataSize = OptionalDataSize;\r
- }\r
-\r
- InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link);\r
-\r
- }\r
-\r
- SafeFreePool (DriverOrderList);\r
- DriverOptionMenu.MenuNumber = Index;\r
- return EFI_SUCCESS;\r
-\r
-}\r
-\r
-VOID\r
-SafeFreePool (\r
- IN VOID *Buffer\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Wrap original FreePool gBS call\r
- in order to decrease code length\r
- \r
-Arguments:\r
-\r
-Returns:\r
-\r
---*/\r
-{\r
- if (Buffer != NULL) {\r
- gBS->FreePool (Buffer);\r
- Buffer = NULL;\r
- }\r
-}\r
+++ /dev/null
-/*++\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- ConsoleOption.c\r
- \r
-Abstract:\r
-\r
- handles console redirection from boot manager\r
-\r
-\r
-Revision History\r
-\r
---*/\r
-\r
-#include "BootMaint.h"\r
-\r
-EFI_DEVICE_PATH_PROTOCOL *\r
-DevicePathInstanceDup (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevPath\r
- );\r
-\r
-EFI_STATUS\r
-UpdateComAttributeFromVariable (\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
- );\r
-\r
-EFI_STATUS\r
-ChangeTerminalDevicePath (\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
- BOOLEAN ChangeTerminal\r
- )\r
-{\r
- EFI_DEVICE_PATH_PROTOCOL *Node;\r
- EFI_DEVICE_PATH_PROTOCOL *Node1;\r
- ACPI_HID_DEVICE_PATH *Acpi;\r
- UART_DEVICE_PATH *Uart;\r
- UART_DEVICE_PATH *Uart1;\r
- UINTN Com;\r
- UINT32 Match;\r
- BM_TERMINAL_CONTEXT *NewTerminalContext;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
-\r
- Match = EISA_PNP_ID (0x0501);\r
- Node = DevicePath;\r
- Node = NextDevicePathNode (Node);\r
- Com = 0;\r
- while (!IsDevicePathEnd (Node)) {\r
- if ((DevicePathType (Node) == ACPI_DEVICE_PATH) && (DevicePathSubType (Node) == ACPI_DP)) {\r
- Acpi = (ACPI_HID_DEVICE_PATH *) Node;\r
- if (CompareMem (&Acpi->HID, &Match, sizeof (UINT32)) == 0) {\r
- CopyMem (&Com, &Acpi->UID, sizeof (UINT32));\r
- }\r
- }\r
-\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Com);\r
- if (NULL == NewMenuEntry) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node) == MSG_UART_DP)) {\r
- Uart = (UART_DEVICE_PATH *) Node;\r
- CopyMem (\r
- &Uart->BaudRate,\r
- &NewTerminalContext->BaudRate,\r
- sizeof (UINT64)\r
- );\r
-\r
- CopyMem (\r
- &Uart->DataBits,\r
- &NewTerminalContext->DataBits,\r
- sizeof (UINT8)\r
- );\r
-\r
- CopyMem (\r
- &Uart->Parity,\r
- &NewTerminalContext->Parity,\r
- sizeof (UINT8)\r
- );\r
-\r
- CopyMem (\r
- &Uart->StopBits,\r
- &NewTerminalContext->StopBits,\r
- sizeof (UINT8)\r
- );\r
- //\r
- // Change the device path in the ComPort\r
- //\r
- if (ChangeTerminal) {\r
- Node1 = NewTerminalContext->DevicePath;\r
- Node1 = NextDevicePathNode (Node1);\r
- while (!IsDevicePathEnd (Node1)) {\r
- if ((DevicePathType (Node1) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node1) == MSG_UART_DP)) {\r
- Uart1 = (UART_DEVICE_PATH *) Node1;\r
- CopyMem (\r
- &Uart1->BaudRate,\r
- &NewTerminalContext->BaudRate,\r
- sizeof (UINT64)\r
- );\r
-\r
- CopyMem (\r
- &Uart1->DataBits,\r
- &NewTerminalContext->DataBits,\r
- sizeof (UINT8)\r
- );\r
-\r
- CopyMem (\r
- &Uart1->Parity,\r
- &NewTerminalContext->Parity,\r
- sizeof (UINT8)\r
- );\r
-\r
- CopyMem (\r
- &Uart1->StopBits,\r
- &NewTerminalContext->StopBits,\r
- sizeof (UINT8)\r
- );\r
- break;\r
- }\r
- //\r
- // end if\r
- //\r
- Node1 = NextDevicePathNode (Node1);\r
- }\r
- //\r
- // end while\r
- //\r
- break;\r
- }\r
- }\r
-\r
- Node = NextDevicePathNode (Node);\r
- }\r
-\r
- return EFI_SUCCESS;\r
-\r
-}\r
-\r
-VOID\r
-ChangeVariableDevicePath (\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
- )\r
-{\r
- EFI_DEVICE_PATH_PROTOCOL *Node;\r
- ACPI_HID_DEVICE_PATH *Acpi;\r
- UART_DEVICE_PATH *Uart;\r
- UINTN Com;\r
- UINT32 Match;\r
- BM_TERMINAL_CONTEXT *NewTerminalContext;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
-\r
- Match = EISA_PNP_ID (0x0501);\r
- Node = DevicePath;\r
- Node = NextDevicePathNode (Node);\r
- Com = 0;\r
- while (!IsDevicePathEnd (Node)) {\r
- if ((DevicePathType (Node) == ACPI_DEVICE_PATH) && (DevicePathSubType (Node) == ACPI_DP)) {\r
- Acpi = (ACPI_HID_DEVICE_PATH *) Node;\r
- if (CompareMem (&Acpi->HID, &Match, sizeof (UINT32)) == 0) {\r
- CopyMem (&Com, &Acpi->UID, sizeof (UINT32));\r
- }\r
- }\r
-\r
- if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node) == MSG_UART_DP)) {\r
- NewMenuEntry = BOpt_GetMenuEntry (\r
- &TerminalMenu,\r
- Com\r
- );\r
- ASSERT (NewMenuEntry != NULL);\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- Uart = (UART_DEVICE_PATH *) Node;\r
- CopyMem (\r
- &Uart->BaudRate,\r
- &NewTerminalContext->BaudRate,\r
- sizeof (UINT64)\r
- );\r
-\r
- CopyMem (\r
- &Uart->DataBits,\r
- &NewTerminalContext->DataBits,\r
- sizeof (UINT8)\r
- );\r
-\r
- CopyMem (\r
- &Uart->Parity,\r
- &NewTerminalContext->Parity,\r
- sizeof (UINT8)\r
- );\r
-\r
- CopyMem (\r
- &Uart->StopBits,\r
- &NewTerminalContext->StopBits,\r
- sizeof (UINT8)\r
- );\r
- }\r
-\r
- Node = NextDevicePathNode (Node);\r
- }\r
-\r
- return ;\r
-}\r
-\r
-BOOLEAN\r
-IsTerminalDevicePath (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
- OUT TYPE_OF_TERMINAL *Termi,\r
- OUT UINTN *Com\r
- );\r
-\r
-EFI_STATUS\r
-LocateSerialIo (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Build a list containing all serial devices \r
- \r
-Arguments:\r
- \r
-Returns:\r
- \r
---*/\r
-{\r
- UINT8 *Ptr;\r
- UINTN Index;\r
- UINTN Index2;\r
- UINTN NoHandles;\r
- EFI_HANDLE *Handles;\r
- EFI_STATUS Status;\r
- ACPI_HID_DEVICE_PATH *Acpi;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- UINT32 Match;\r
- EFI_SERIAL_IO_PROTOCOL *SerialIo;\r
- EFI_DEVICE_PATH_PROTOCOL *OutDevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *InpDevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *ErrDevicePath;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_TERMINAL_CONTEXT *NewTerminalContext;\r
- EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;\r
- VENDOR_DEVICE_PATH Vendor;\r
- //\r
- // Get all handles that have SerialIo protocol installed\r
- //\r
- InitializeListHead (&TerminalMenu.Head);\r
- TerminalMenu.MenuNumber = 0;\r
- Status = gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- &gEfiSerialIoProtocolGuid,\r
- NULL,\r
- &NoHandles,\r
- &Handles\r
- );\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // No serial ports present\r
- //\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- for (Index = 0; Index < NoHandles; Index++) {\r
- //\r
- // Check to see whether the handle has DevicePath Protocol installed\r
- //\r
- gBS->HandleProtocol (\r
- Handles[Index],\r
- &gEfiDevicePathProtocolGuid,\r
- (VOID**) &DevicePath\r
- );\r
- Ptr = (UINT8 *) DevicePath;\r
- while (*Ptr != END_DEVICE_PATH_TYPE) {\r
- Ptr++;\r
- }\r
-\r
- Ptr = Ptr - sizeof (UART_DEVICE_PATH) - sizeof (ACPI_HID_DEVICE_PATH);\r
- Acpi = (ACPI_HID_DEVICE_PATH *) Ptr;\r
- Match = EISA_PNP_ID (0x0501);\r
-\r
- if (CompareMem (&Acpi->HID, &Match, sizeof (UINT32)) == 0) {\r
- NewMenuEntry = BOpt_CreateMenuEntry (BM_TERMINAL_CONTEXT_SELECT);\r
- if (!NewMenuEntry) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- CopyMem (&NewMenuEntry->OptionNumber, &Acpi->UID, sizeof (UINT32));\r
- NewTerminalContext->DevicePath = DevicePathInstanceDup (DevicePath);\r
- //\r
- // BugBug: I have no choice, calling EfiLibStrFromDatahub will hang the system!\r
- // coz' the misc data for each platform is not correct, actually it's the device path stored in\r
- // datahub which is not completed, so a searching for end of device path will enter a\r
- // dead-loop.\r
- //\r
- NewMenuEntry->DisplayString = EfiLibStrFromDatahub (DevicePath);\r
- if (NULL == NewMenuEntry->DisplayString) {\r
- NewMenuEntry->DisplayString = DevicePathToStr (DevicePath);\r
- }\r
-\r
- NewMenuEntry->HelpString = NULL;\r
-\r
- gBS->HandleProtocol (\r
- Handles[Index],\r
- &gEfiSerialIoProtocolGuid,\r
- (VOID**) &SerialIo\r
- );\r
-\r
- CopyMem (\r
- &NewTerminalContext->BaudRate,\r
- &SerialIo->Mode->BaudRate,\r
- sizeof (UINT64)\r
- );\r
-\r
- CopyMem (\r
- &NewTerminalContext->DataBits,\r
- &SerialIo->Mode->DataBits,\r
- sizeof (UINT8)\r
- );\r
-\r
- CopyMem (\r
- &NewTerminalContext->Parity,\r
- &SerialIo->Mode->Parity,\r
- sizeof (UINT8)\r
- );\r
-\r
- CopyMem (\r
- &NewTerminalContext->StopBits,\r
- &SerialIo->Mode->StopBits,\r
- sizeof (UINT8)\r
- );\r
- InsertTailList (&TerminalMenu.Head, &NewMenuEntry->Link);\r
- TerminalMenu.MenuNumber++;\r
- }\r
- }\r
- //\r
- // Get L"ConOut", L"ConIn" and L"ErrOut" from the Var\r
- //\r
- OutDevicePath = EfiLibGetVariable (L"ConOut", &gEfiGlobalVariableGuid);\r
- InpDevicePath = EfiLibGetVariable (L"ConIn", &gEfiGlobalVariableGuid);\r
- ErrDevicePath = EfiLibGetVariable (L"ErrOut", &gEfiGlobalVariableGuid);\r
- if (OutDevicePath) {\r
- UpdateComAttributeFromVariable (OutDevicePath);\r
- }\r
-\r
- if (InpDevicePath) {\r
- UpdateComAttributeFromVariable (InpDevicePath);\r
- }\r
-\r
- if (ErrDevicePath) {\r
- UpdateComAttributeFromVariable (ErrDevicePath);\r
- }\r
-\r
- for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
- if (NULL == NewMenuEntry) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
- NewTerminalContext->TerminalType = 0;\r
- NewTerminalContext->IsConIn = FALSE;\r
- NewTerminalContext->IsConOut = FALSE;\r
- NewTerminalContext->IsStdErr = FALSE;\r
-\r
- Vendor.Header.Type = MESSAGING_DEVICE_PATH;\r
- Vendor.Header.SubType = MSG_VENDOR_DP;\r
-\r
- for (Index2 = 0; Index2 < 4; Index2++) {\r
- CopyMem (&Vendor.Guid, &Guid[Index2], sizeof (EFI_GUID));\r
- SetDevicePathNodeLength (&Vendor.Header, sizeof (VENDOR_DEVICE_PATH));\r
- NewDevicePath = AppendDevicePathNode (\r
- NewTerminalContext->DevicePath,\r
- (EFI_DEVICE_PATH_PROTOCOL *) &Vendor\r
- );\r
- SafeFreePool (NewMenuEntry->HelpString);\r
- //\r
- // NewMenuEntry->HelpString = DevicePathToStr (NewDevicePath);\r
- // NewMenuEntry->DisplayString = NewMenuEntry->HelpString;\r
- //\r
- NewMenuEntry->HelpString = NULL;\r
-\r
- if (BdsLibMatchDevicePaths (OutDevicePath, NewDevicePath)) {\r
- NewTerminalContext->IsConOut = TRUE;\r
- NewTerminalContext->TerminalType = (UINT8) Index2;\r
- }\r
-\r
- if (BdsLibMatchDevicePaths (InpDevicePath, NewDevicePath)) {\r
- NewTerminalContext->IsConIn = TRUE;\r
- NewTerminalContext->TerminalType = (UINT8) Index2;\r
- }\r
-\r
- if (BdsLibMatchDevicePaths (ErrDevicePath, NewDevicePath)) {\r
- NewTerminalContext->IsStdErr = TRUE;\r
- NewTerminalContext->TerminalType = (UINT8) Index2;\r
- }\r
- }\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-UpdateComAttributeFromVariable (\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Update Com Ports attributes from DevicePath\r
- \r
-Arguments:\r
- DevicePath - DevicePath that contains Com ports\r
- \r
-Returns:\r
- \r
---*/\r
-{\r
- EFI_DEVICE_PATH_PROTOCOL *Node;\r
- EFI_DEVICE_PATH_PROTOCOL *SerialNode;\r
- ACPI_HID_DEVICE_PATH *Acpi;\r
- UART_DEVICE_PATH *Uart;\r
- UART_DEVICE_PATH *Uart1;\r
- UINT32 Match;\r
- UINTN TerminalNumber;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_TERMINAL_CONTEXT *NewTerminalContext;\r
- UINTN Index;\r
-\r
- Match = EISA_PNP_ID (0x0501);\r
- Node = DevicePath;\r
- Node = NextDevicePathNode (Node);\r
- TerminalNumber = 0;\r
- for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
- while (!IsDevicePathEnd (Node)) {\r
- if ((DevicePathType (Node) == ACPI_DEVICE_PATH) && (DevicePathSubType (Node) == ACPI_DP)) {\r
- Acpi = (ACPI_HID_DEVICE_PATH *) Node;\r
- if (CompareMem (&Acpi->HID, &Match, sizeof (UINT32)) == 0) {\r
- CopyMem (&TerminalNumber, &Acpi->UID, sizeof (UINT32));\r
- }\r
- }\r
-\r
- if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node) == MSG_UART_DP)) {\r
- Uart = (UART_DEVICE_PATH *) Node;\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, TerminalNumber);\r
- if (NULL == NewMenuEntry) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- CopyMem (\r
- &NewTerminalContext->BaudRate,\r
- &Uart->BaudRate,\r
- sizeof (UINT64)\r
- );\r
-\r
- CopyMem (\r
- &NewTerminalContext->DataBits,\r
- &Uart->DataBits,\r
- sizeof (UINT8)\r
- );\r
-\r
- CopyMem (\r
- &NewTerminalContext->Parity,\r
- &Uart->Parity,\r
- sizeof (UINT8)\r
- );\r
-\r
- CopyMem (\r
- &NewTerminalContext->StopBits,\r
- &Uart->StopBits,\r
- sizeof (UINT8)\r
- );\r
-\r
- SerialNode = NewTerminalContext->DevicePath;\r
- SerialNode = NextDevicePathNode (SerialNode);\r
- while (!IsDevicePathEnd (SerialNode)) {\r
- if ((DevicePathType (SerialNode) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (SerialNode) == MSG_UART_DP)) {\r
- //\r
- // Update following device paths according to\r
- // previous acquired uart attributes\r
- //\r
- Uart1 = (UART_DEVICE_PATH *) SerialNode;\r
- CopyMem (\r
- &Uart1->BaudRate,\r
- &NewTerminalContext->BaudRate,\r
- sizeof (UINT64)\r
- );\r
-\r
- CopyMem (\r
- &Uart1->DataBits,\r
- &NewTerminalContext->DataBits,\r
- sizeof (UINT8)\r
- );\r
- CopyMem (\r
- &Uart1->Parity,\r
- &NewTerminalContext->Parity,\r
- sizeof (UINT8)\r
- );\r
- CopyMem (\r
- &Uart1->StopBits,\r
- &NewTerminalContext->StopBits,\r
- sizeof (UINT8)\r
- );\r
-\r
- break;\r
- }\r
-\r
- SerialNode = NextDevicePathNode (SerialNode);\r
- }\r
- //\r
- // end while\r
- //\r
- }\r
-\r
- Node = NextDevicePathNode (Node);\r
- }\r
- //\r
- // end while\r
- //\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_DEVICE_PATH_PROTOCOL *\r
-DevicePathInstanceDup (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevPath\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Function creates a device path data structure that identically matches the \r
- device path passed in.\r
-\r
-Arguments:\r
- DevPath - A pointer to a device path data structure.\r
-\r
-Returns:\r
-\r
- The new copy of DevPath is created to identically match the input. \r
- Otherwise, NULL is returned.\r
-\r
---*/\r
-{\r
- EFI_DEVICE_PATH_PROTOCOL *NewDevPath;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePathInst;\r
- EFI_DEVICE_PATH_PROTOCOL *Temp;\r
- UINT8 *Ptr;\r
- UINTN Size;\r
-\r
- //\r
- // get the size of an instance from the input\r
- //\r
- Temp = DevPath;\r
- DevicePathInst = GetNextDevicePathInstance (&Temp, &Size);\r
-\r
- //\r
- // Make a copy and set proper end type\r
- //\r
- NewDevPath = NULL;\r
- if (Size) {\r
- NewDevPath = AllocateZeroPool (Size);\r
- ASSERT (NewDevPath != NULL);\r
- }\r
-\r
- if (NewDevPath) {\r
- CopyMem (NewDevPath, DevicePathInst, Size);\r
- Ptr = (UINT8 *) NewDevPath;\r
- Ptr += Size - sizeof (EFI_DEVICE_PATH_PROTOCOL);\r
- Temp = (EFI_DEVICE_PATH_PROTOCOL *) Ptr;\r
- SetDevicePathEndNode (Temp);\r
- }\r
-\r
- return NewDevPath;\r
-}\r
-\r
-EFI_STATUS\r
-GetConsoleMenu (\r
- IN UINTN ConsoleMenuType\r
- )\r
-{\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *AllDevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *MultiDevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePathInst;\r
- UINTN Size;\r
- UINTN AllCount;\r
- UINTN Index;\r
- UINTN Index2;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_CONSOLE_CONTEXT *NewConsoleContext;\r
- BM_TERMINAL_CONTEXT *NewTerminalContext;\r
- TYPE_OF_TERMINAL Terminal;\r
- BM_MENU_ENTRY *NewTerminalMenuEntry;\r
- UINTN Com;\r
- BM_MENU_OPTION *ConsoleMenu;\r
-\r
- DevicePath = NULL;\r
- AllDevicePath = NULL;\r
- AllCount = 0;\r
- switch (ConsoleMenuType) {\r
- case BM_CONSOLE_IN_CONTEXT_SELECT:\r
- ConsoleMenu = &ConsoleInpMenu;\r
- DevicePath = EfiLibGetVariable (\r
- L"ConIn",\r
- &gEfiGlobalVariableGuid\r
- );\r
-\r
- AllDevicePath = EfiLibGetVariable (\r
- L"ConInDev",\r
- &gEfiGlobalVariableGuid\r
- );\r
- break;\r
-\r
- case BM_CONSOLE_OUT_CONTEXT_SELECT:\r
- ConsoleMenu = &ConsoleOutMenu;\r
- DevicePath = EfiLibGetVariable (\r
- L"ConOut",\r
- &gEfiGlobalVariableGuid\r
- );\r
-\r
- AllDevicePath = EfiLibGetVariable (\r
- L"ConOutDev",\r
- &gEfiGlobalVariableGuid\r
- );\r
- break;\r
-\r
- case BM_CONSOLE_ERR_CONTEXT_SELECT:\r
- ConsoleMenu = &ConsoleErrMenu;\r
- DevicePath = EfiLibGetVariable (\r
- L"ErrOut",\r
- &gEfiGlobalVariableGuid\r
- );\r
-\r
- AllDevicePath = EfiLibGetVariable (\r
- L"ErrOutDev",\r
- &gEfiGlobalVariableGuid\r
- );\r
- break;\r
-\r
- default:\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- if (NULL == AllDevicePath) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- InitializeListHead (&ConsoleMenu->Head);\r
-\r
- AllCount = EfiDevicePathInstanceCount (AllDevicePath);\r
- ConsoleMenu->MenuNumber = 0;\r
- //\r
- // Following is menu building up for Console Out Devices\r
- //\r
- MultiDevicePath = AllDevicePath;\r
- Index2 = 0;\r
- for (Index = 0; Index < AllCount; Index++) {\r
- DevicePathInst = GetNextDevicePathInstance (&MultiDevicePath, &Size);\r
-\r
- NewMenuEntry = BOpt_CreateMenuEntry (BM_CONSOLE_CONTEXT_SELECT);\r
- if (NULL == NewMenuEntry) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewMenuEntry->OptionNumber = Index2;\r
-\r
- NewConsoleContext->DevicePath = DevicePathInstanceDup (DevicePathInst);\r
- NewMenuEntry->DisplayString = EfiLibStrFromDatahub (NewConsoleContext->DevicePath);\r
- if (NULL == NewMenuEntry->DisplayString) {\r
- NewMenuEntry->DisplayString = DevicePathToStr (NewConsoleContext->DevicePath);\r
- }\r
-\r
- NewConsoleContext->IsTerminal = IsTerminalDevicePath (\r
- NewConsoleContext->DevicePath,\r
- &Terminal,\r
- &Com\r
- );\r
-\r
- NewConsoleContext->IsActive = BdsLibMatchDevicePaths (\r
- DevicePath,\r
- NewConsoleContext->DevicePath\r
- );\r
- NewTerminalMenuEntry = NULL;\r
- NewTerminalContext = NULL;\r
-\r
- if (NewConsoleContext->IsTerminal) {\r
- BOpt_DestroyMenuEntry (NewMenuEntry);\r
- } else {\r
- Index2++;\r
- ConsoleMenu->MenuNumber++;\r
- InsertTailList (&ConsoleMenu->Head, &NewMenuEntry->Link);\r
- }\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-GetAllConsoles (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Build up ConsoleOutMenu, ConsoleInpMenu and ConsoleErrMenu\r
-\r
-Arguments:\r
- \r
-Returns:\r
- EFI_SUCCESS \r
- Others\r
- \r
---*/\r
-{\r
- GetConsoleMenu (BM_CONSOLE_IN_CONTEXT_SELECT);\r
- GetConsoleMenu (BM_CONSOLE_OUT_CONTEXT_SELECT);\r
- GetConsoleMenu (BM_CONSOLE_ERR_CONTEXT_SELECT);\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-FreeAllConsoles (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Free ConsoleOutMenu, ConsoleInpMenu and ConsoleErrMenu\r
-\r
-Arguments:\r
- \r
-Returns:\r
- EFI_SUCCESS \r
- Others\r
- \r
---*/\r
-{\r
- BOpt_FreeMenu (&ConsoleOutMenu);\r
- BOpt_FreeMenu (&ConsoleInpMenu);\r
- BOpt_FreeMenu (&ConsoleErrMenu);\r
- BOpt_FreeMenu (&TerminalMenu);\r
- return EFI_SUCCESS;\r
-}\r
-\r
-BOOLEAN\r
-IsTerminalDevicePath (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
- OUT TYPE_OF_TERMINAL *Termi,\r
- OUT UINTN *Com\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Test whether DevicePath is a valid Terminal\r
-\r
-Arguments:\r
- DevicePath - DevicePath to be checked\r
- Termi - If is terminal, give its type\r
- Com - If is Com Port, give its type\r
- \r
-Returns:\r
- TRUE - If DevicePath point to a Terminal\r
- FALSE\r
- \r
---*/\r
-{\r
- UINT8 *Ptr;\r
- BOOLEAN IsTerminal;\r
- VENDOR_DEVICE_PATH *Vendor;\r
- ACPI_HID_DEVICE_PATH *Acpi;\r
- UINT32 Match;\r
- EFI_GUID TempGuid;\r
-\r
- IsTerminal = FALSE;\r
-\r
- //\r
- // Parse the Device Path, should be change later!!!\r
- //\r
- Ptr = (UINT8 *) DevicePath;\r
- while (*Ptr != END_DEVICE_PATH_TYPE) {\r
- Ptr++;\r
- }\r
-\r
- Ptr = Ptr - sizeof (VENDOR_DEVICE_PATH);\r
- Vendor = (VENDOR_DEVICE_PATH *) Ptr;\r
-\r
- //\r
- // There are four kinds of Terminal types\r
- // check to see whether this devicepath\r
- // is one of that type\r
- //\r
- CopyMem (&TempGuid, &Vendor->Guid, sizeof (EFI_GUID));\r
-\r
- if (CompareGuid (&TempGuid, &Guid[0])) {\r
- *Termi = PC_ANSI;\r
- IsTerminal = TRUE;\r
- } else {\r
- if (CompareGuid (&TempGuid, &Guid[1])) {\r
- *Termi = VT_100;\r
- IsTerminal = TRUE;\r
- } else {\r
- if (CompareGuid (&TempGuid, &Guid[2])) {\r
- *Termi = VT_100_PLUS;\r
- IsTerminal = TRUE;\r
- } else {\r
- if (CompareGuid (&TempGuid, &Guid[3])) {\r
- *Termi = VT_UTF8;\r
- IsTerminal = TRUE;\r
- } else {\r
- IsTerminal = FALSE;\r
- }\r
- }\r
- }\r
- }\r
-\r
- if (!IsTerminal) {\r
- return FALSE;\r
- }\r
-\r
- Ptr = Ptr - sizeof (UART_DEVICE_PATH) - sizeof (ACPI_HID_DEVICE_PATH);\r
- Acpi = (ACPI_HID_DEVICE_PATH *) Ptr;\r
- Match = EISA_PNP_ID (0x0501);\r
- if (CompareMem (&Acpi->HID, &Match, sizeof (UINT32)) == 0) {\r
- CopyMem (Com, &Acpi->UID, sizeof (UINT32));\r
- } else {\r
- return FALSE;\r
- }\r
-\r
- return TRUE;\r
-}\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- Data.c\r
- \r
-Abstract:\r
-\r
- Define some data used for Boot Maint\r
-\r
-Revision History\r
-\r
---*/\r
-\r
-#include "BootMaint.h"\r
-\r
-EFI_HII_UPDATE_DATA *UpdateData;\r
-STRING_DEPOSITORY *FileOptionStrDepository;\r
-STRING_DEPOSITORY *ConsoleOptionStrDepository;\r
-STRING_DEPOSITORY *BootOptionStrDepository;\r
-STRING_DEPOSITORY *BootOptionHelpStrDepository;\r
-STRING_DEPOSITORY *DriverOptionStrDepository;\r
-STRING_DEPOSITORY *DriverOptionHelpStrDepository;\r
-STRING_DEPOSITORY *TerminalStrDepository;\r
-\r
-//\r
-// Terminal type string token storage\r
-//\r
-UINT16 TerminalType[] = {\r
- STRING_TOKEN(STR_COM_TYPE_0),\r
- STRING_TOKEN(STR_COM_TYPE_1),\r
- STRING_TOKEN(STR_COM_TYPE_2),\r
- STRING_TOKEN(STR_COM_TYPE_3),\r
-};\r
-\r
-//\r
-// File system selection menu\r
-//\r
-BM_MENU_OPTION FsOptionMenu = {\r
- BM_MENU_OPTION_SIGNATURE,\r
- { NULL, NULL},\r
- 0\r
-};\r
-\r
-//\r
-// Console Input Device Selection Menu\r
-//\r
-BM_MENU_OPTION ConsoleInpMenu = {\r
- BM_MENU_OPTION_SIGNATURE,\r
- { NULL, NULL},\r
- 0\r
-};\r
-\r
-//\r
-// Console Output Device Selection Menu\r
-//\r
-BM_MENU_OPTION ConsoleOutMenu = {\r
- BM_MENU_OPTION_SIGNATURE,\r
- { NULL, NULL},\r
- 0\r
-};\r
-\r
-//\r
-// Error Output Device Selection Menu\r
-//\r
-BM_MENU_OPTION ConsoleErrMenu = {\r
- BM_MENU_OPTION_SIGNATURE,\r
- { NULL, NULL},\r
- 0\r
-};\r
-\r
-//\r
-// Boot Option from variable Menu\r
-//\r
-BM_MENU_OPTION BootOptionMenu = {\r
- BM_MENU_OPTION_SIGNATURE,\r
- { NULL, NULL},\r
- 0\r
-};\r
-\r
-//\r
-// Driver Option from variable menu\r
-//\r
-BM_MENU_OPTION DriverOptionMenu = {\r
- BM_MENU_OPTION_SIGNATURE,\r
- { NULL, NULL},\r
- 0\r
-};\r
-\r
-//\r
-// Legacy FD Info from LegacyBios.GetBbsInfo()\r
-//\r
-BM_MENU_OPTION LegacyFDMenu = {\r
- BM_MENU_OPTION_SIGNATURE,\r
- { NULL, NULL},\r
- 0\r
-};\r
-\r
-//\r
-// Legacy HD Info from LegacyBios.GetBbsInfo()\r
-//\r
-BM_MENU_OPTION LegacyHDMenu = {\r
- BM_MENU_OPTION_SIGNATURE,\r
- { NULL, NULL},\r
- 0\r
-};\r
-\r
-//\r
-// Legacy CD Info from LegacyBios.GetBbsInfo()\r
-//\r
-BM_MENU_OPTION LegacyCDMenu = {\r
- BM_MENU_OPTION_SIGNATURE,\r
- { NULL, NULL},\r
- 0\r
-};\r
-\r
-//\r
-// Legacy NET Info from LegacyBios.GetBbsInfo()\r
-//\r
-BM_MENU_OPTION LegacyNETMenu = {\r
- BM_MENU_OPTION_SIGNATURE,\r
- { NULL, NULL},\r
- 0\r
-};\r
-\r
-//\r
-// Legacy NET Info from LegacyBios.GetBbsInfo()\r
-//\r
-BM_MENU_OPTION LegacyBEVMenu = {\r
- BM_MENU_OPTION_SIGNATURE,\r
- { NULL, NULL},\r
- 0\r
-};\r
-\r
-//\r
-// Files and sub-directories in current directory menu\r
-//\r
-BM_MENU_OPTION DirectoryMenu = {\r
- BM_MENU_OPTION_SIGNATURE,\r
- { NULL, NULL},\r
- 0\r
-};\r
-\r
-//\r
-// Handles in current system selection menu\r
-//\r
-BM_MENU_OPTION DriverMenu = {\r
- BM_MENU_OPTION_SIGNATURE,\r
- { NULL, NULL},\r
- 0\r
-};\r
-\r
-BM_MENU_OPTION TerminalMenu = {\r
- BM_MENU_OPTION_SIGNATURE,\r
- { NULL, NULL},\r
- 0\r
-};\r
-\r
-//\r
-// Value and string token correspondency for BaudRate\r
-//\r
-COM_ATTR BaudRateList[19] = {\r
- {\r
- 115200,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_0)\r
- },\r
- {\r
- 57600,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_1)\r
- },\r
- {\r
- 38400,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_2)\r
- },\r
- {\r
- 19200,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_3)\r
- },\r
- {\r
- 9600,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_4)\r
- },\r
- {\r
- 7200,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_5)\r
- },\r
- {\r
- 4800,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_6)\r
- },\r
- {\r
- 3600,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_7)\r
- },\r
- {\r
- 2400,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_8)\r
- },\r
- {\r
- 2000,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_9)\r
- },\r
- {\r
- 1800,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_10)\r
- },\r
- {\r
- 1200,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_11)\r
- },\r
- {\r
- 600,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_12)\r
- },\r
- {\r
- 300,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_13)\r
- },\r
- {\r
- 150,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_14)\r
- },\r
- {\r
- 134,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_15)\r
- },\r
- {\r
- 110,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_16)\r
- },\r
- {\r
- 75,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_17)\r
- },\r
- {\r
- 50,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_18)\r
- }\r
-};\r
-\r
-//\r
-// Value and string token correspondency for DataBits\r
-//\r
-COM_ATTR DataBitsList[4] = {\r
- {\r
- 5,\r
- STRING_TOKEN(STR_COM_DATA_BITS_0)\r
- },\r
- {\r
- 6,\r
- STRING_TOKEN(STR_COM_DATA_BITS_1)\r
- },\r
- {\r
- 7,\r
- STRING_TOKEN(STR_COM_DATA_BITS_2)\r
- },\r
- {\r
- 8,\r
- STRING_TOKEN(STR_COM_DATA_BITS_3)\r
- }\r
-};\r
-\r
-//\r
-// Value and string token correspondency for Parity\r
-//\r
-COM_ATTR ParityList[5] = {\r
- {\r
- NoParity,\r
- STRING_TOKEN(STR_COM_PAR_0)\r
- },\r
- {\r
- EvenParity,\r
- STRING_TOKEN(STR_COM_PAR_1)\r
- },\r
- {\r
- OddParity,\r
- STRING_TOKEN(STR_COM_PAR_2)\r
- },\r
- {\r
- MarkParity,\r
- STRING_TOKEN(STR_COM_PAR_3)\r
- },\r
- {\r
- SpaceParity,\r
- STRING_TOKEN(STR_COM_PAR_4)\r
- }\r
-};\r
-\r
-//\r
-// Value and string token correspondency for Baudreate\r
-//\r
-COM_ATTR StopBitsList[3] = {\r
- {\r
- OneStopBit,\r
- STRING_TOKEN(STR_COM_STOP_BITS_0)\r
- },\r
- {\r
- OneFiveStopBits,\r
- STRING_TOKEN(STR_COM_STOP_BITS_1)\r
- },\r
- {\r
- TwoStopBits,\r
- STRING_TOKEN(STR_COM_STOP_BITS_2)\r
- }\r
-};\r
-\r
-//\r
-// Guid for messaging path, used in Serial port setting.\r
-//\r
-EFI_GUID Guid[4] = {\r
- DEVICE_PATH_MESSAGING_PC_ANSI,\r
- DEVICE_PATH_MESSAGING_VT_100,\r
- DEVICE_PATH_MESSAGING_VT_100_PLUS,\r
- DEVICE_PATH_MESSAGING_VT_UTF8\r
-};\r
+++ /dev/null
-// *++\r
-//\r
-// Copyright (c) 2006, Intel Corporation \r
-// All rights reserved. This program and the accompanying materials \r
-// are licensed and made available under the terms and conditions of the BSD License \r
-// which accompanies this distribution. The full text of the license may be found at \r
-// http://opensource.org/licenses/bsd-license.php \r
-// \r
-// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-// \r
-// Module Name:\r
-//\r
-// FE.vfr \r
-// \r
-// Abstract:\r
-// \r
-// File Explorer Formset\r
-// \r
-// Revision History: \r
-// \r
-// --*/\r
-\r
-#include "BdsStrDefs.h" \r
-#include "FormGuid.h"\r
-\r
-#pragma pack(1)\r
-typedef struct {\r
- UINT16 DescriptionData[75];\r
- UINT16 OptionalData[127];\r
- UINT8 Active;\r
- UINT8 ForceReconnect; \r
-} FILE_EXPLORER_NV_DATA;\r
-#pragma pack()\r
-\r
-#define FORM_FILE_EXPLORER_ID 0x001E\r
-#define FORM_BOOT_ADD_DESCRIPTION_ID 0x001F\r
-#define FORM_DRIVER_ADD_FILE_DESCRIPTION_ID 0x0020\r
-#define KEY_VALUE_SAVE_AND_EXIT 0x0090\r
-#define KEY_VALUE_NO_SAVE_AND_EXIT 0x0091\r
-\r
-\r
-\r
-formset \r
- guid = FILE_EXPLORE_FORMSET_GUID,\r
- title = STRING_TOKEN(STR_FILE_EXPLORER_TITLE),\r
- help = STRING_TOKEN(STR_NULL_STRING),\r
- class = 0,\r
- subclass = 0,\r
-\r
- form formid = FORM_FILE_EXPLORER_ID,\r
- title = STRING_TOKEN(STR_FILE_EXPLORER_TITLE);\r
-\r
- label FORM_FILE_EXPLORER_ID;\r
- endform;\r
- \r
- form formid = FORM_BOOT_ADD_DESCRIPTION_ID,\r
- title = STRING_TOKEN(STR_FORM_BOOT_ADD_DESC_TITLE);\r
- \r
- label FORM_BOOT_ADD_DESCRIPTION_ID;\r
-\r
- subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
- \r
- string varid = FILE_EXPLORER_NV_DATA.DescriptionData,\r
- prompt = STRING_TOKEN(STR_LOAD_OPTION_DESC),\r
- help = STRING_TOKEN(STR_NULL_STRING),\r
- minsize = 6,\r
- maxsize = 75,\r
- endstring;\r
-\r
- string varid = FILE_EXPLORER_NV_DATA.OptionalData,\r
- prompt = STRING_TOKEN(STR_OPTIONAL_DATA),\r
- help = STRING_TOKEN(STR_NULL_STRING),\r
- minsize = 0,\r
- maxsize = 120,\r
- endstring;\r
-\r
- text \r
- help = STRING_TOKEN(STR_SAVE_AND_EXIT), \r
- text = STRING_TOKEN(STR_SAVE_AND_EXIT), \r
- text = STRING_TOKEN(STR_NULL_STRING),\r
- flags = INTERACTIVE | NV_ACCESS,\r
- key = KEY_VALUE_SAVE_AND_EXIT;\r
- \r
- text \r
- help = STRING_TOKEN(STR_NO_SAVE_AND_EXIT), \r
- text = STRING_TOKEN(STR_NO_SAVE_AND_EXIT), \r
- text = STRING_TOKEN(STR_NULL_STRING),\r
- flags = INTERACTIVE | NV_ACCESS,\r
- key = KEY_VALUE_NO_SAVE_AND_EXIT;\r
- \r
- endform;\r
-\r
- form formid = FORM_DRIVER_ADD_FILE_DESCRIPTION_ID,\r
- title = STRING_TOKEN(STR_FORM_DRV_ADD_DESC_TITLE);\r
- \r
- label FORM_DRIVER_ADD_FILE_DESCRIPTION_ID;\r
- \r
- subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
-\r
- string varid = FILE_EXPLORER_NV_DATA.DescriptionData,\r
- prompt = STRING_TOKEN(STR_LOAD_OPTION_DESC),\r
- help = STRING_TOKEN(STR_NULL_STRING),\r
- minsize = 6,\r
- maxsize = 75,\r
- endstring;\r
-\r
- string varid = FILE_EXPLORER_NV_DATA.OptionalData,\r
- prompt = STRING_TOKEN(STR_OPTIONAL_DATA),\r
- help = STRING_TOKEN(STR_NULL_STRING),\r
- minsize = 0,\r
- maxsize = 120,\r
- endstring; \r
- \r
- checkbox varid = FILE_EXPLORER_NV_DATA.ForceReconnect,\r
- prompt = STRING_TOKEN(STR_LOAD_OPTION_FORCE_RECON),\r
- help = STRING_TOKEN(STR_LOAD_OPTION_FORCE_RECON), \r
- flags = 1,\r
- key = 0,\r
- endcheckbox;\r
-\r
- text \r
- help = STRING_TOKEN(STR_SAVE_AND_EXIT), \r
- text = STRING_TOKEN(STR_SAVE_AND_EXIT), \r
- text = STRING_TOKEN(STR_NULL_STRING),\r
- flags = INTERACTIVE | NV_ACCESS,\r
- key = KEY_VALUE_SAVE_AND_EXIT;\r
- \r
- text \r
- help = STRING_TOKEN(STR_NO_SAVE_AND_EXIT), \r
- text = STRING_TOKEN(STR_NO_SAVE_AND_EXIT), \r
- text = STRING_TOKEN(STR_NULL_STRING),\r
- flags = INTERACTIVE | NV_ACCESS,\r
- key = KEY_VALUE_NO_SAVE_AND_EXIT;\r
- \r
- endform;\r
- \r
-endformset;
\ No newline at end of file
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- FileExplorer.c\r
- \r
-AgBStract:\r
-\r
- File explorer related functions.\r
-\r
---*/\r
-\r
-#include "Generic/Bds.h"\r
-#include "BootMaint.h"\r
-#include "BdsPlatform.h"\r
-\r
-VOID\r
-UpdateFileExplorePage (\r
- IN BMM_CALLBACK_DATA *CallbackData,\r
- BM_MENU_OPTION *MenuOption\r
- )\r
-/*++\r
-Routine Description:\r
- Update the File Explore page.\r
-\r
-Arguments:\r
- MenuOption - Pointer to menu options to display.\r
-\r
-Returns:\r
- None.\r
-\r
---*/\r
-{\r
- UINT8 *Location;\r
- UINTN Index;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_FILE_CONTEXT *NewFileContext;\r
- FORM_ID FormId;\r
-\r
- NewMenuEntry = NULL;\r
- NewFileContext = NULL;\r
- FormId = 0;\r
-\r
- //\r
- // Clean up file explore page.\r
- //\r
- RefreshUpdateData (FALSE, 0, FALSE, 0, 0xff);\r
-\r
- //\r
- // Remove all op-codes from dynamic page\r
- //\r
- CallbackData->Hii->UpdateForm (\r
- CallbackData->Hii,\r
- CallbackData->FeHiiHandle,\r
- FORM_FILE_EXPLORER_ID,\r
- FALSE,\r
- UpdateData\r
- );\r
-\r
- RefreshUpdateData (TRUE, (EFI_PHYSICAL_ADDRESS) (UINTN) CallbackData->FeCallbackHandle, FALSE, 0, 0);\r
-\r
- Location = (UINT8 *) &UpdateData->Data;\r
-\r
- for (Index = 0; Index < MenuOption->MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (MenuOption, Index);\r
- NewFileContext = (BM_FILE_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
- if (NewFileContext->IsBootLegacy) {\r
- continue;\r
- }\r
-\r
- if ((NewFileContext->IsDir) || (BOOT_FROM_FILE_STATE == CallbackData->FeCurrentState)) {\r
- //\r
- // Create Text opcode for directory, also create Text opcode for file in BOOT_FROM_FILE_STATE.\r
- //\r
- CreateTextOpCode (\r
- NewMenuEntry->DisplayStringToken,\r
- STR_NULL_STRING,\r
- STR_NULL_STRING,\r
- EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,\r
- (UINT16) (FILE_OPTION_OFFSET + Index),\r
- Location\r
- );\r
- } else {\r
- //\r
- // Create Goto opcode for file in ADD_BOOT_OPTION_STATE or ADD_DRIVER_OPTION_STATE.\r
- //\r
- if (ADD_BOOT_OPTION_STATE == CallbackData->FeCurrentState) {\r
- FormId = FORM_BOOT_ADD_DESCRIPTION_ID;\r
- } else if (ADD_DRIVER_OPTION_STATE == CallbackData->FeCurrentState) {\r
- FormId = FORM_DRIVER_ADD_FILE_DESCRIPTION_ID;\r
- }\r
-\r
- CreateGotoOpCode (\r
- FormId,\r
- NewMenuEntry->DisplayStringToken,\r
- STRING_TOKEN (STR_NULL_STRING),\r
- EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,\r
- (UINT16) (FILE_OPTION_OFFSET + Index),\r
- Location\r
- );\r
- }\r
-\r
- UpdateData->DataCount++;\r
- Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;\r
- }\r
-\r
- CallbackData->Hii->UpdateForm (\r
- CallbackData->Hii,\r
- CallbackData->FeHiiHandle,\r
- FORM_FILE_EXPLORER_ID,\r
- TRUE,\r
- UpdateData\r
- );\r
-}\r
-\r
-BOOLEAN\r
-UpdateFileExplorer (\r
- IN BMM_CALLBACK_DATA *CallbackData,\r
- IN UINT16 KeyValue\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Update the file explower page with the refershed file system.\r
-\r
-Arguments:\r
- CallbackData - BMM context data\r
- KeyValue - Key value to identify the type of data to expect.\r
-\r
-Returns:\r
- TRUE - Inform the caller to create a callback packet to exit file explorer.\r
- FALSE - Indicate that there is no need to exit file explorer.\r
-\r
---*/\r
-{\r
- UINT16 FileOptionMask;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_FILE_CONTEXT *NewFileContext;\r
- FORM_ID FormId;\r
- BOOLEAN ExitFileExplorer;\r
- EFI_STATUS Status;\r
- \r
- NewMenuEntry = NULL;\r
- NewFileContext = NULL;\r
- ExitFileExplorer = FALSE;\r
-\r
- FileOptionMask = (UINT16) (FILE_OPTION_MASK & KeyValue);\r
-\r
- if (UNKNOWN_CONTEXT == CallbackData->FeDisplayContext) {\r
- //\r
- // First in, display file system.\r
- //\r
- BOpt_FreeMenu (&FsOptionMenu);\r
- BOpt_FindFileSystem (CallbackData);\r
- CreateMenuStringToken (CallbackData, CallbackData->FeHiiHandle, &FsOptionMenu);\r
-\r
- UpdateFileExplorePage (CallbackData, &FsOptionMenu);\r
-\r
- CallbackData->FeDisplayContext = FILE_SYSTEM;\r
- } else {\r
- if (FILE_SYSTEM == CallbackData->FeDisplayContext) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&FsOptionMenu, FileOptionMask);\r
- } else if (DIRECTORY == CallbackData->FeDisplayContext) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&DirectoryMenu, FileOptionMask);\r
- }\r
-\r
- CallbackData->FeDisplayContext = DIRECTORY;\r
-\r
- NewFileContext = (BM_FILE_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
- if (NewFileContext->IsDir ) {\r
- RemoveEntryList (&NewMenuEntry->Link);\r
- BOpt_FreeMenu (&DirectoryMenu);\r
- Status = BOpt_FindFiles (CallbackData, NewMenuEntry);\r
- if (EFI_ERROR (Status)) {\r
- ExitFileExplorer = TRUE;\r
- goto exit;\r
- }\r
- CreateMenuStringToken (CallbackData, CallbackData->FeHiiHandle, &DirectoryMenu);\r
- BOpt_DestroyMenuEntry (NewMenuEntry);\r
-\r
- UpdateFileExplorePage (CallbackData, &DirectoryMenu);\r
-\r
- } else {\r
- switch (CallbackData->FeCurrentState) {\r
- case BOOT_FROM_FILE_STATE:\r
- //\r
- // Here boot from file\r
- //\r
- BootThisFile (NewFileContext);\r
- ExitFileExplorer = TRUE;\r
- break;\r
-\r
- case ADD_BOOT_OPTION_STATE:\r
- case ADD_DRIVER_OPTION_STATE:\r
- if (ADD_BOOT_OPTION_STATE == CallbackData->FeCurrentState) {\r
- FormId = FORM_BOOT_ADD_DESCRIPTION_ID;\r
- } else {\r
- FormId = FORM_DRIVER_ADD_FILE_DESCRIPTION_ID;\r
- }\r
-\r
- CallbackData->MenuEntry = NewMenuEntry;\r
- CallbackData->LoadContext->FilePathList = ((BM_FILE_CONTEXT *) (CallbackData->MenuEntry->VariableContext))->DevicePath;\r
-\r
- //\r
- // Clean up file explore page.\r
- //\r
- RefreshUpdateData (FALSE, 0, FALSE, 0, 1);\r
-\r
- //\r
- // Remove the Subtitle op-code.\r
- //\r
- CallbackData->Hii->UpdateForm (\r
- CallbackData->Hii,\r
- CallbackData->FeHiiHandle,\r
- FormId,\r
- FALSE,\r
- UpdateData\r
- );\r
-\r
- //\r
- // Create Subtitle op-code for the display string of the option.\r
- //\r
- RefreshUpdateData (TRUE, (EFI_PHYSICAL_ADDRESS) (UINTN) CallbackData->FeCallbackHandle, FALSE, 0, 1);\r
-\r
- CreateSubTitleOpCode (\r
- NewMenuEntry->DisplayStringToken,\r
- &UpdateData->Data\r
- );\r
-\r
- CallbackData->Hii->UpdateForm (\r
- CallbackData->Hii,\r
- CallbackData->FeHiiHandle,\r
- FormId,\r
- TRUE,\r
- UpdateData\r
- );\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
- }\r
- }\r
-exit:\r
- return ExitFileExplorer;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-FileExplorerCallback (\r
- IN EFI_FORM_CALLBACK_PROTOCOL *This,\r
- IN UINT16 KeyValue,\r
- IN EFI_IFR_DATA_ARRAY *Data,\r
- OUT EFI_HII_CALLBACK_PACKET **Packet\r
- )\r
-/*++\r
-Routine Description:\r
- Callback Function for file exploration and file interaction.\r
-\r
-Arguments:\r
- This - File explorer callback protocol pointer. \r
- KeyValue - Key value to identify the type of data to expect.\r
- Data - A pointer to the data being sent to the original exporting driver.\r
- Packet - A pointer to a packet of information which a driver passes back to the browser.\r
-\r
-Returns:\r
- EFI_SUCCESS - Callback ended successfully.\r
- Others - Contain some errors.\r
- \r
---*/\r
-{\r
- BMM_CALLBACK_DATA *Private;\r
- FILE_EXPLORER_NV_DATA *NvRamMap;\r
- EFI_STATUS Status;\r
-\r
- Status = EFI_SUCCESS;\r
- Private = FE_CALLBACK_DATA_FROM_THIS (This);\r
- UpdateData->FormCallbackHandle = (EFI_PHYSICAL_ADDRESS) (UINTN) Private->FeCallbackHandle;\r
- NvRamMap = (FILE_EXPLORER_NV_DATA *) Data->NvRamMap;\r
-\r
- if (KEY_VALUE_SAVE_AND_EXIT == KeyValue) {\r
- //\r
- // Apply changes and exit formset.\r
- //\r
- if (ADD_BOOT_OPTION_STATE == Private->FeCurrentState) {\r
- Status = Var_UpdateBootOption (Private, NvRamMap);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- BOpt_GetBootOptions (Private);\r
- CreateMenuStringToken (Private, Private->FeHiiHandle, &BootOptionMenu);\r
- } else if (ADD_DRIVER_OPTION_STATE == Private->FeCurrentState) {\r
- Status = Var_UpdateDriverOption (\r
- Private,\r
- Private->FeHiiHandle,\r
- NvRamMap->DescriptionData,\r
- NvRamMap->OptionalData,\r
- NvRamMap->ForceReconnect\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- BOpt_GetDriverOptions (Private);\r
- CreateMenuStringToken (Private, Private->FeHiiHandle, &DriverOptionMenu);\r
- }\r
-\r
- CreateCallbackPacket (Packet, EXIT_REQUIRED | NV_NOT_CHANGED);\r
- } else if (KEY_VALUE_NO_SAVE_AND_EXIT == KeyValue) {\r
- //\r
- // Discard changes and exit formset.\r
- //\r
- NvRamMap->OptionalData[0] = 0x0000;\r
- NvRamMap->DescriptionData[0] = 0x0000;\r
- CreateCallbackPacket (Packet, EXIT_REQUIRED | NV_NOT_CHANGED);\r
- } else if (KeyValue < FILE_OPTION_OFFSET) {\r
- //\r
- // Exit File Explorer formset.\r
- //\r
- CreateCallbackPacket (Packet, EXIT_REQUIRED);\r
- } else {\r
- if (UpdateFileExplorer (Private, KeyValue)) {\r
- CreateCallbackPacket (Packet, EXIT_REQUIRED);\r
- }\r
- }\r
-\r
- return Status;\r
-}\r
+++ /dev/null
-// *++\r
-//\r
-// Copyright (c) 2006, Intel Corporation\r
-// All rights reserved. This program and the accompanying materials\r
-// are licensed and made available under the terms and conditions of the BSD License\r
-// which accompanies this distribution. The full text of the license may be found at\r
-// http://opensource.org/licenses/bsd-license.php\r
-//\r
-// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-//\r
-// Module Name:\r
-//\r
-// FormGuid.h\r
-//\r
-// Abstract:\r
-//\r
-// Formset guids for Boot Maintenance Manager\r
-//\r
-// Revision History:\r
-//\r
-// --*/\r
-//\r
-#define MAIN_FORMSET_GUID \\r
- { \\r
- 0x642237c7, 0x35d4, 0x472d, { 0x83, 0x65, 0x12, 0xe0, 0xcc, 0xf2, 0x7a, 0x22 } \\r
- }\r
-\r
-#define FILE_EXPLORE_FORMSET_GUID \\r
- { \\r
- 0x1f2d63e1, 0xfebd, 0x4dc7, { 0x9c, 0xc5, 0xba, 0x2b, 0x1c, 0xef, 0x9c, 0x5b } \\r
- }\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- UpdatePage.c\r
- \r
-AgBStract:\r
-\r
- Dynamically Update the pages\r
-\r
---*/\r
-\r
-#include "Generic/Bds.h"\r
-#include "BootMaint.h"\r
-#include "BdsPlatform.h"\r
-\r
-EFI_GUID gTerminalDriverGuid = {\r
- 0x10634d8e, 0x1c05, 0x46cb, {0xbb, 0xc, 0x5a, 0xfd, 0xc8, 0x29, 0xa8, 0xc8}\r
-};\r
-\r
-VOID\r
-RefreshUpdateData (\r
- IN BOOLEAN FormSetUpdate,\r
- IN EFI_PHYSICAL_ADDRESS FormCallbackHandle,\r
- IN BOOLEAN FormUpdate,\r
- IN STRING_REF FormTitle,\r
- IN UINT16 DataCount\r
- )\r
-/*++\r
-Routine Description:\r
- Refresh the global UpdateData structure.\r
-\r
-Arguments:\r
- FormSetUpdate - If TRUE, next variable is significant\r
- FormCallbackHandle - If not 0, will update FormSet with this info\r
- FormUpdate - If TRUE, next variable is significant\r
- FormTitle - If not 0, will update Form with this info\r
- DataCount - The number of Data entries in this structure\r
-\r
-Returns:\r
- None.\r
---*/\r
-{\r
- UpdateData->FormSetUpdate = FormSetUpdate;\r
- if (FormSetUpdate) {\r
- ASSERT (0 != FormCallbackHandle);\r
- UpdateData->FormCallbackHandle = FormCallbackHandle;\r
- }\r
-\r
- UpdateData->FormUpdate = FALSE;\r
- UpdateData->FormTitle = FormTitle;\r
- UpdateData->DataCount = DataCount;\r
-}\r
-\r
-VOID\r
-UpdatePageStart (\r
- IN BMM_CALLBACK_DATA *CallbackData,\r
- IN OUT UINT8 **CurrentLocation\r
- )\r
-{\r
- RefreshUpdateData (TRUE, (EFI_PHYSICAL_ADDRESS) (UINTN) CallbackData->BmmCallbackHandle, FALSE, 0, 0);\r
-\r
- if (!(CallbackData->BmmAskSaveOrNot)) {\r
- //\r
- // Add a "Go back to main page" tag in front of the form when there are no\r
- // "Apply changes" and "Discard changes" tags in the end of the form.\r
- //\r
- CreateGotoOpCode (\r
- FORM_MAIN_ID,\r
- STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
- STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
- EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,\r
- FORM_MAIN_ID,\r
- *CurrentLocation\r
- );\r
-\r
- UpdateData->DataCount++;\r
-\r
- *CurrentLocation = *CurrentLocation + ((EFI_IFR_OP_HEADER *) (*CurrentLocation))->Length;\r
- }\r
-\r
-}\r
-\r
-VOID\r
-UpdatePageEnd (\r
- IN BMM_CALLBACK_DATA *CallbackData,\r
- IN UINT8 *CurrentLocation\r
- )\r
-{\r
- //\r
- // Create the "Apply changes" and "Discard changes" tags.\r
- //\r
- if (CallbackData->BmmAskSaveOrNot) {\r
- CreateGotoOpCode (\r
- FORM_MAIN_ID,\r
- STRING_TOKEN (STR_SAVE_AND_EXIT),\r
- STRING_TOKEN (STR_NULL_STRING),\r
- EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,\r
- KEY_VALUE_SAVE_AND_EXIT,\r
- CurrentLocation\r
- );\r
-\r
- UpdateData->DataCount++;\r
-\r
- CurrentLocation = CurrentLocation + ((EFI_IFR_OP_HEADER *) CurrentLocation)->Length;\r
-\r
- CreateGotoOpCode (\r
- FORM_MAIN_ID,\r
- STRING_TOKEN (STR_NO_SAVE_AND_EXIT),\r
- STRING_TOKEN (STR_NULL_STRING),\r
- EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,\r
- KEY_VALUE_NO_SAVE_AND_EXIT,\r
- CurrentLocation\r
- );\r
-\r
- UpdateData->DataCount++;\r
- }\r
- //\r
- // Ensure user can return to the main page.\r
- //\r
- if (0 == UpdateData->DataCount) {\r
- CreateGotoOpCode (\r
- FORM_MAIN_ID,\r
- STRING_TOKEN (STR_NO_SAVE_AND_EXIT),\r
- STRING_TOKEN (STR_NULL_STRING),\r
- EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,\r
- KEY_VALUE_NO_SAVE_AND_EXIT,\r
- CurrentLocation\r
- );\r
-\r
- UpdateData->DataCount++;\r
- }\r
-\r
- CallbackData->Hii->UpdateForm (\r
- CallbackData->Hii,\r
- CallbackData->BmmHiiHandle,\r
- CallbackData->BmmCurrentPageId,\r
- TRUE,\r
- UpdateData\r
- );\r
-}\r
-\r
-VOID\r
-CleanUpPage (\r
- IN EFI_FORM_LABEL LabelId,\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- RefreshUpdateData (FALSE, 0, FALSE, 0, 0xff);\r
-\r
- //\r
- // Remove all op-codes from dynamic page\r
- //\r
- CallbackData->Hii->UpdateForm (\r
- CallbackData->Hii,\r
- CallbackData->BmmHiiHandle,\r
- LabelId,\r
- FALSE,\r
- UpdateData\r
- );\r
-}\r
-\r
-EFI_STATUS\r
-BootThisFile (\r
- IN BM_FILE_CONTEXT *FileContext\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN ExitDataSize;\r
- CHAR16 *ExitData;\r
- BDS_COMMON_OPTION *Option;\r
-\r
- Status = gBS->AllocatePool (EfiBootServicesData, sizeof (BDS_COMMON_OPTION), (VOID**) &Option);\r
- Option->Description = FileContext->FileName;\r
- Option->DevicePath = FileContext->DevicePath;\r
- Option->LoadOptionsSize = 0;\r
- Option->LoadOptions = NULL;\r
-\r
- //\r
- // Since current no boot from removable media directly is allowed */\r
- //\r
- gST->ConOut->ClearScreen (gST->ConOut);\r
-\r
- ExitDataSize = 0;\r
-\r
- Status = BdsLibBootViaBootOption (Option, Option->DevicePath, &ExitDataSize, &ExitData);\r
-\r
- return Status;\r
-\r
-}\r
-\r
-VOID\r
-UpdateConCOMPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- UINT16 Index;\r
- UINT8 *Location;\r
- EFI_STATUS Status;\r
- VOID *Interface;\r
-\r
- Location = (UINT8 *) &UpdateData->Data;\r
- CallbackData->BmmAskSaveOrNot = FALSE;\r
-\r
- UpdatePageStart (CallbackData, &Location);\r
-\r
- Status = EfiLibLocateProtocol (&gTerminalDriverGuid, &Interface);\r
- if (!EFI_ERROR (Status)) {\r
- for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
- \r
- CreateGotoOpCode (\r
- FORM_CON_COM_SETUP_ID,\r
- NewMenuEntry->DisplayStringToken,\r
- STRING_TOKEN (STR_NULL_STRING),\r
- EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,\r
- (UINT16) (TERMINAL_OPTION_OFFSET + Index),\r
- Location\r
- );\r
- Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;\r
- UpdateData->DataCount++;\r
- }\r
- }\r
-\r
- UpdatePageEnd (CallbackData, Location);\r
-}\r
-\r
-VOID\r
-UpdateBootDelPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- UINT16 Index;\r
- UINT8 *Location;\r
-\r
- Location = (UINT8 *) &UpdateData->Data;\r
- CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
- UpdatePageStart (CallbackData, &Location);\r
- CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);\r
-\r
- for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- if (NewLoadContext->IsLegacy) {\r
- continue;\r
- }\r
-\r
- NewLoadContext->Deleted = FALSE;\r
- CallbackData->BmmFakeNvData->BootOptionDel[Index] = 0x00;\r
-\r
- CreateCheckBoxOpCode (\r
- (UINT16) (BOOT_OPTION_DEL_QUESTION_ID + Index),\r
- (UINT8) 1,\r
- NewMenuEntry->DisplayStringToken,\r
- NewMenuEntry->HelpStringToken,\r
- EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,\r
- (UINT16) BOOT_OPTION_DEL_QUESTION_ID,\r
- Location\r
- );\r
-\r
- Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;\r
- UpdateData->DataCount++;\r
- }\r
-\r
- UpdatePageEnd (CallbackData, Location);\r
-}\r
-\r
-VOID\r
-UpdateDrvAddHandlePage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- UINT16 Index;\r
- UINT8 *Location;\r
-\r
- Location = (UINT8 *) &UpdateData->Data;\r
- CallbackData->BmmAskSaveOrNot = FALSE;\r
-\r
- UpdatePageStart (CallbackData, &Location);\r
-\r
- for (Index = 0; Index < DriverMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index);\r
-\r
- CreateGotoOpCode (\r
- FORM_DRV_ADD_HANDLE_DESC_ID,\r
- NewMenuEntry->DisplayStringToken,\r
- STRING_TOKEN (STR_NULL_STRING),\r
- EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,\r
- (UINT16) (HANDLE_OPTION_OFFSET + Index),\r
- Location\r
- );\r
-\r
- Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;\r
- UpdateData->DataCount++;\r
- }\r
-\r
- UpdatePageEnd (CallbackData, Location);\r
-}\r
-\r
-VOID\r
-UpdateDrvDelPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- UINT16 Index;\r
- UINT8 *Location;\r
-\r
- Location = (UINT8 *) &UpdateData->Data;\r
- CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
- UpdatePageStart (CallbackData, &Location);\r
-\r
- CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &DriverOptionMenu);\r
-\r
- for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
-\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewLoadContext->Deleted = FALSE;\r
- CallbackData->BmmFakeNvData->DriverOptionDel[Index] = 0x00;\r
-\r
- CreateCheckBoxOpCode (\r
- (UINT16) (DRIVER_OPTION_DEL_QUESTION_ID + Index),\r
- (UINT8) 1,\r
- NewMenuEntry->DisplayStringToken,\r
- NewMenuEntry->HelpStringToken,\r
- EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,\r
- (UINT16) DRIVER_OPTION_DEL_QUESTION_ID,\r
- Location\r
- );\r
-\r
- Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;\r
- UpdateData->DataCount++;\r
- }\r
-\r
- UpdatePageEnd (CallbackData, Location);\r
-}\r
-\r
-VOID\r
-UpdateDriverAddHandleDescPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- UINT8 *Location;\r
-\r
- Location = (UINT8 *) &UpdateData->Data;\r
- CallbackData->BmmFakeNvData->DriverAddActive = 0x01;\r
- CallbackData->BmmFakeNvData->DriverAddForceReconnect = 0x00;\r
- CallbackData->BmmAskSaveOrNot = TRUE;\r
- NewMenuEntry = CallbackData->MenuEntry;\r
-\r
- UpdatePageStart (CallbackData, &Location);\r
-\r
- UpdateData->DataCount += (UINT16) 4;\r
-\r
- CreateSubTitleOpCode (\r
- NewMenuEntry->DisplayStringToken,\r
- Location\r
- );\r
-\r
- Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;\r
-\r
- CreateStringOpCode (\r
- DRV_ADD_HANDLE_DESC_QUESTION_ID,\r
- (UINT8) 150,\r
- STRING_TOKEN (STR_LOAD_OPTION_DESC),\r
- STRING_TOKEN (STR_NULL_STRING),\r
- 6,\r
- 75,\r
- EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,\r
- KEY_VALUE_DRIVER_ADD_DESC_DATA,\r
- Location\r
- );\r
-\r
- Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;\r
-\r
- CreateCheckBoxOpCode (\r
- DRV_ADD_RECON_QUESTION_ID,\r
- (UINT8) 1,\r
- STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
- STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
- EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,\r
- DRV_ADD_RECON_QUESTION_ID,\r
- Location\r
- );\r
- Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;\r
-\r
- CreateStringOpCode (\r
- DRIVER_ADD_OPTION_QUESTION_ID,\r
- (UINT8) 150,\r
- STRING_TOKEN (STR_OPTIONAL_DATA),\r
- STRING_TOKEN (STR_NULL_STRING),\r
- 6,\r
- 75,\r
- EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,\r
- KEY_VALUE_DRIVER_ADD_OPT_DATA,\r
- Location\r
- );\r
-\r
- Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;\r
- UpdatePageEnd (CallbackData, Location);\r
-}\r
-\r
-VOID\r
-UpdateConsolePage (\r
- IN UINT16 UpdatePageId,\r
- IN BM_MENU_OPTION *ConsoleMenu,\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_CONSOLE_CONTEXT *NewConsoleContext;\r
- BM_TERMINAL_CONTEXT *NewTerminalContext;\r
- UINT16 Index;\r
- UINT16 Index2;\r
- UINT8 *Location;\r
- UINT8 CheckFlags;\r
- EFI_STATUS Status;\r
- VOID *Interface;\r
-\r
- Location = (UINT8 *) &UpdateData->Data;\r
- CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
- UpdatePageStart (CallbackData, &Location);\r
-\r
- for (Index = 0; Index < ConsoleMenu->MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
- NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
- CheckFlags = EFI_IFR_FLAG_INTERACTIVE;\r
- if (NewConsoleContext->IsActive) {\r
- CheckFlags |= EFI_IFR_FLAG_DEFAULT;\r
- CallbackData->BmmFakeNvData->ConsoleCheck[Index] = TRUE;\r
- } else {\r
- CallbackData->BmmFakeNvData->ConsoleCheck[Index] = FALSE;\r
- }\r
-\r
- CreateCheckBoxOpCode (\r
- (UINT16) (CON_DEVICE_QUESTION_ID + Index),\r
- (UINT8) 1,\r
- NewMenuEntry->DisplayStringToken,\r
- NewMenuEntry->HelpStringToken,\r
- CheckFlags,\r
- (UINT16) (CONSOLE_OPTION_OFFSET + Index),\r
- Location\r
- );\r
- Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;\r
- UpdateData->DataCount++;\r
- }\r
-\r
- Status = EfiLibLocateProtocol (&gTerminalDriverGuid, &Interface);\r
- if (!EFI_ERROR (Status)) {\r
- for (Index2 = 0; Index2 < TerminalMenu.MenuNumber; Index2++) {\r
- CheckFlags = EFI_IFR_FLAG_INTERACTIVE;\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index2);\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
- if ((NewTerminalContext->IsConIn && (UpdatePageId == FORM_CON_IN_ID)) ||\r
- (NewTerminalContext->IsConOut && (UpdatePageId == FORM_CON_OUT_ID)) ||\r
- (NewTerminalContext->IsStdErr && (UpdatePageId == FORM_CON_ERR_ID))\r
- ) {\r
- CheckFlags |= EFI_IFR_FLAG_DEFAULT;\r
- CallbackData->BmmFakeNvData->ConsoleCheck[Index] = TRUE;\r
- } else {\r
- CallbackData->BmmFakeNvData->ConsoleCheck[Index] = FALSE;\r
- }\r
-\r
- CreateCheckBoxOpCode (\r
- (UINT16) (CON_DEVICE_QUESTION_ID + Index),\r
- (UINT8) 1,\r
- NewMenuEntry->DisplayStringToken,\r
- NewMenuEntry->HelpStringToken,\r
- CheckFlags,\r
- (UINT16) (CONSOLE_OPTION_OFFSET + Index),\r
- Location\r
- );\r
- Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;\r
- UpdateData->DataCount++;\r
- Index++;\r
- }\r
- }\r
-\r
- UpdatePageEnd (CallbackData, Location);\r
-}\r
-\r
-VOID\r
-UpdateOrderPage (\r
- IN UINT16 UpdatePageId,\r
- IN BM_MENU_OPTION *OptionMenu,\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- UINT16 Index;\r
- UINT8 *Location;\r
- IFR_OPTION *IfrOptionList;\r
-\r
- Location = (UINT8 *) &UpdateData->Data;\r
- CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
- UpdatePageStart (CallbackData, &Location);\r
-\r
- CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);\r
-\r
- ZeroMem (CallbackData->BmmFakeNvData->OptionOrder, 100);\r
-\r
- IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * OptionMenu->MenuNumber);\r
- if (NULL == IfrOptionList) {\r
- return ;\r
- }\r
-\r
- for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
- IfrOptionList[Index].StringToken = NewMenuEntry->DisplayStringToken;\r
- IfrOptionList[Index].Value = (UINT16) (NewMenuEntry->OptionNumber + 1);\r
- IfrOptionList[Index].OptionString = NULL;\r
- CallbackData->BmmFakeNvData->OptionOrder[Index] = (UINT8) (IfrOptionList[Index].Value);\r
- }\r
-\r
- if (OptionMenu->MenuNumber > 0) {\r
- CreateOrderedListOpCode (\r
- (UINT16) OPTION_ORDER_QUESTION_ID,\r
- (UINT8) 100,\r
- STRING_TOKEN (STR_CHANGE_ORDER),\r
- STRING_TOKEN (STR_CHANGE_ORDER),\r
- IfrOptionList,\r
- OptionMenu->MenuNumber,\r
- Location\r
- );\r
-\r
- for (Index = 0; Index < OptionMenu->MenuNumber + 2; Index++) {\r
- Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;\r
- }\r
-\r
- UpdateData->DataCount = (UINT16) (UpdateData->DataCount + OptionMenu->MenuNumber + 2);\r
- }\r
-\r
- SafeFreePool (IfrOptionList);\r
-\r
- UpdatePageEnd (CallbackData, Location);\r
-\r
- CopyMem (\r
- CallbackData->BmmOldFakeNVData.OptionOrder,\r
- CallbackData->BmmFakeNvData->OptionOrder,\r
- 100\r
- );\r
-}\r
-\r
-VOID\r
-UpdateBootNextPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- UINT8 *Location;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- IFR_OPTION *IfrOptionList;\r
- UINTN NumberOfOptions;\r
- UINT16 Index;\r
-\r
- Location = (UINT8 *) &UpdateData->Data;\r
- IfrOptionList = NULL;\r
- NumberOfOptions = BootOptionMenu.MenuNumber;\r
- CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
- UpdatePageStart (CallbackData, &Location);\r
- CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);\r
-\r
- if (NumberOfOptions > 0) {\r
- UpdateData->DataCount = (UINT8) (UpdateData->DataCount + NumberOfOptions);\r
- IfrOptionList = AllocateZeroPool ((NumberOfOptions + 1) * sizeof (IFR_OPTION));\r
-\r
- ASSERT (IfrOptionList);\r
-\r
- CallbackData->BmmFakeNvData->BootNext = (UINT16) (BootOptionMenu.MenuNumber);\r
-\r
- for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- if (NewLoadContext->IsBootNext) {\r
- IfrOptionList[Index].Flags = EFI_IFR_FLAG_DEFAULT | EFI_IFR_FLAG_INTERACTIVE;\r
- CallbackData->BmmFakeNvData->BootNext = Index;\r
- } else {\r
- IfrOptionList[Index].Flags = EFI_IFR_FLAG_INTERACTIVE;\r
- }\r
-\r
- IfrOptionList[Index].Key = (UINT16) KEY_VALUE_MAIN_BOOT_NEXT;\r
- IfrOptionList[Index].Value = Index;\r
- IfrOptionList[Index].StringToken = NewMenuEntry->DisplayStringToken;\r
- IfrOptionList[Index].OptionString = NULL;\r
- }\r
-\r
- IfrOptionList[Index].Key = (UINT16) KEY_VALUE_MAIN_BOOT_NEXT;\r
- IfrOptionList[Index].Value = Index;\r
- IfrOptionList[Index].StringToken = STRING_TOKEN (STR_NONE);\r
- IfrOptionList[Index].Flags = EFI_IFR_FLAG_INTERACTIVE;\r
- if (CallbackData->BmmFakeNvData->BootNext == Index) {\r
- IfrOptionList[Index].Flags |= EFI_IFR_FLAG_DEFAULT;\r
- }\r
-\r
- IfrOptionList[Index].OptionString = NULL;\r
-\r
- CreateOneOfOpCode (\r
- (UINT16) BOOT_NEXT_QUESTION_ID,\r
- (UINT8) 2,\r
- STRING_TOKEN (STR_BOOT_NEXT),\r
- STRING_TOKEN (STR_BOOT_NEXT_HELP),\r
- IfrOptionList,\r
- (UINTN) (NumberOfOptions + 1),\r
- Location\r
- );\r
- Location = Location + (NumberOfOptions + 2) * ((EFI_IFR_OP_HEADER *) Location)->Length;\r
- Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;\r
-\r
- UpdateData->DataCount += 3;\r
- SafeFreePool (IfrOptionList);\r
- IfrOptionList = NULL;\r
- }\r
-\r
- UpdatePageEnd (CallbackData, Location);\r
-}\r
-\r
-VOID\r
-UpdateTimeOutPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- UINT8 *Location;\r
- UINT16 BootTimeOut;\r
-\r
- Location = (UINT8 *) &UpdateData->Data;\r
- CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
- UpdatePageStart (CallbackData, &Location);\r
-\r
- BootTimeOut = BdsLibGetTimeout ();\r
-\r
- CreateNumericOpCode (\r
- (UINT16) BOOT_TIME_OUT_QUESTION_ID,\r
- (UINT8) 2,\r
- STRING_TOKEN (STR_NUM_AUTO_BOOT),\r
- STRING_TOKEN (STR_HLP_AUTO_BOOT),\r
- 0,\r
- 65535,\r
- 0,\r
- 10,\r
- 0,\r
- 0,\r
- Location\r
- );\r
-\r
- CallbackData->BmmFakeNvData->BootTimeOut = (UINT16) BootTimeOut;\r
- UpdateData->DataCount++;\r
- Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;\r
-\r
- UpdatePageEnd (CallbackData, Location);\r
-}\r
-\r
-VOID\r
-UpdateTerminalPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- UINT16 Index;\r
- UINT8 *Location;\r
- UINT8 CheckFlags;\r
- IFR_OPTION *IfrOptionList;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_TERMINAL_CONTEXT *NewTerminalContext;\r
-\r
- ZeroMem (UpdateData, UPDATE_DATA_SIZE);\r
- Location = (UINT8 *) &UpdateData->Data;\r
- UpdatePageStart (CallbackData, &Location);\r
-\r
- NewMenuEntry = BOpt_GetMenuEntry (\r
- &TerminalMenu,\r
- CallbackData->CurrentTerminal\r
- );\r
-\r
- if (!NewMenuEntry) {\r
- return ;\r
- }\r
-\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
- IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * 19);\r
- if (!IfrOptionList) {\r
- return ;\r
- }\r
-\r
- for (Index = 0; Index < 19; Index++) {\r
- CheckFlags = EFI_IFR_FLAG_INTERACTIVE;\r
- if (NewTerminalContext->BaudRate == (UINT64) (BaudRateList[Index].Value)) {\r
- CheckFlags |= EFI_IFR_FLAG_DEFAULT;\r
- NewTerminalContext->BaudRateIndex = (UINT8) Index;\r
- CallbackData->BmmFakeNvData->COMBaudRate = NewTerminalContext->BaudRateIndex;\r
- }\r
-\r
- IfrOptionList[Index].Flags = CheckFlags;\r
- IfrOptionList[Index].Key = KEY_VALUE_COM_SET_BAUD_RATE;\r
- IfrOptionList[Index].StringToken = BaudRateList[Index].StringToken;\r
- IfrOptionList[Index].Value = Index;\r
- }\r
-\r
- CreateOneOfOpCode (\r
- (UINT16) COM_BAUD_RATE_QUESTION_ID,\r
- (UINT8) 1,\r
- STRING_TOKEN (STR_COM_BAUD_RATE),\r
- STRING_TOKEN (STR_COM_BAUD_RATE),\r
- IfrOptionList,\r
- 19,\r
- Location\r
- );\r
-\r
- Location = Location + (Index + 1) * ((EFI_IFR_OP_HEADER *) Location)->Length;\r
- Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;\r
- UpdateData->DataCount = (UINT8) (UpdateData->DataCount + Index);\r
- UpdateData->DataCount += 2;\r
-\r
- SafeFreePool (IfrOptionList);\r
-\r
- IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * 4);\r
- if (!IfrOptionList) {\r
- return ;\r
- }\r
-\r
- for (Index = 0; Index < 4; Index++) {\r
- CheckFlags = EFI_IFR_FLAG_INTERACTIVE;\r
-\r
- if (NewTerminalContext->DataBits == DataBitsList[Index].Value) {\r
- NewTerminalContext->DataBitsIndex = (UINT8) Index;\r
- CallbackData->BmmFakeNvData->COMDataRate = NewTerminalContext->DataBitsIndex;\r
- CheckFlags |= EFI_IFR_FLAG_DEFAULT;\r
- }\r
-\r
- IfrOptionList[Index].Flags = CheckFlags;\r
- IfrOptionList[Index].Key = KEY_VALUE_COM_SET_DATA_BITS;\r
- IfrOptionList[Index].StringToken = DataBitsList[Index].StringToken;\r
- IfrOptionList[Index].Value = Index;\r
- }\r
-\r
- CreateOneOfOpCode (\r
- (UINT16) COM_DATA_RATE_QUESTION_ID,\r
- (UINT8) 1,\r
- STRING_TOKEN (STR_COM_DATA_BITS),\r
- STRING_TOKEN (STR_COM_DATA_BITS),\r
- IfrOptionList,\r
- 4,\r
- Location\r
- );\r
-\r
- Location = Location + (Index + 1) * ((EFI_IFR_OP_HEADER *) Location)->Length;\r
- Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;\r
- UpdateData->DataCount = (UINT8) (UpdateData->DataCount + Index);\r
- UpdateData->DataCount += 2;\r
-\r
- SafeFreePool (IfrOptionList);\r
-\r
- IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * 5);\r
- if (!IfrOptionList) {\r
- return ;\r
- }\r
-\r
- for (Index = 0; Index < 5; Index++) {\r
- CheckFlags = EFI_IFR_FLAG_INTERACTIVE;\r
- if (NewTerminalContext->Parity == ParityList[Index].Value) {\r
- CheckFlags |= EFI_IFR_FLAG_DEFAULT;\r
- NewTerminalContext->ParityIndex = (UINT8) Index;\r
- CallbackData->BmmFakeNvData->COMParity = NewTerminalContext->ParityIndex;\r
- }\r
-\r
- IfrOptionList[Index].Flags = CheckFlags;\r
- IfrOptionList[Index].Key = KEY_VALUE_COM_SET_PARITY;\r
- IfrOptionList[Index].StringToken = ParityList[Index].StringToken;\r
- IfrOptionList[Index].Value = Index;\r
- }\r
-\r
- CreateOneOfOpCode (\r
- (UINT16) COM_PARITY_QUESTION_ID,\r
- (UINT8) 1,\r
- STRING_TOKEN (STR_COM_PARITY),\r
- STRING_TOKEN (STR_COM_PARITY),\r
- IfrOptionList,\r
- 5,\r
- Location\r
- );\r
-\r
- Location = Location + (Index + 1) * ((EFI_IFR_OP_HEADER *) Location)->Length;\r
- Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;\r
- UpdateData->DataCount = (UINT8) (UpdateData->DataCount + Index);\r
- UpdateData->DataCount += 2;\r
-\r
- SafeFreePool (IfrOptionList);\r
-\r
- IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * 3);\r
- if (!IfrOptionList) {\r
- return ;\r
- }\r
-\r
- for (Index = 0; Index < 3; Index++) {\r
- CheckFlags = EFI_IFR_FLAG_INTERACTIVE;\r
- if (NewTerminalContext->StopBits == StopBitsList[Index].Value) {\r
- CheckFlags |= EFI_IFR_FLAG_DEFAULT;\r
- NewTerminalContext->StopBitsIndex = (UINT8) Index;\r
- CallbackData->BmmFakeNvData->COMStopBits = NewTerminalContext->StopBitsIndex;\r
- }\r
-\r
- IfrOptionList[Index].Flags = CheckFlags;\r
- IfrOptionList[Index].Key = KEY_VALUE_COM_SET_STOP_BITS;\r
- IfrOptionList[Index].StringToken = StopBitsList[Index].StringToken;\r
- IfrOptionList[Index].Value = Index;\r
- }\r
-\r
- CreateOneOfOpCode (\r
- (UINT16) COM_STOP_BITS_QUESTION_ID,\r
- (UINT8) 1,\r
- STRING_TOKEN (STR_COM_STOP_BITS),\r
- STRING_TOKEN (STR_COM_STOP_BITS),\r
- IfrOptionList,\r
- 3,\r
- Location\r
- );\r
-\r
- Location = Location + (Index + 1) * ((EFI_IFR_OP_HEADER *) Location)->Length;\r
- Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;\r
- UpdateData->DataCount = (UINT8) (UpdateData->DataCount + Index);\r
- UpdateData->DataCount += 2;\r
-\r
- SafeFreePool (IfrOptionList);\r
-\r
- IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * 4);\r
- if (!IfrOptionList) {\r
- return ;\r
- }\r
-\r
- for (Index = 0; Index < 4; Index++) {\r
- CheckFlags = EFI_IFR_FLAG_INTERACTIVE;\r
- if (NewTerminalContext->TerminalType == Index) {\r
- CheckFlags |= EFI_IFR_FLAG_DEFAULT;\r
- CallbackData->BmmFakeNvData->COMTerminalType = NewTerminalContext->TerminalType;\r
- }\r
-\r
- IfrOptionList[Index].Flags = CheckFlags;\r
- IfrOptionList[Index].Key = KEY_VALUE_COM_SET_TERMI_TYPE;\r
- IfrOptionList[Index].StringToken = (STRING_REF) TerminalType[Index];\r
- IfrOptionList[Index].Value = Index;\r
- }\r
-\r
- CreateOneOfOpCode (\r
- (UINT16) COM_TERMINAL_QUESTION_ID,\r
- (UINT8) 1,\r
- STRING_TOKEN (STR_COM_TERMI_TYPE),\r
- STRING_TOKEN (STR_COM_TERMI_TYPE),\r
- IfrOptionList,\r
- 4,\r
- Location\r
- );\r
-\r
- Location = Location + (Index + 1) * ((EFI_IFR_OP_HEADER *) Location)->Length;\r
- Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;\r
- UpdateData->DataCount = (UINT8) (UpdateData->DataCount + Index);\r
- UpdateData->DataCount += 2;\r
-\r
- SafeFreePool (IfrOptionList);\r
-\r
- CreateGotoOpCode (\r
- FORM_MAIN_ID,\r
- STRING_TOKEN (STR_SAVE_AND_EXIT),\r
- STRING_TOKEN (STR_NULL_STRING),\r
- EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,\r
- KEY_VALUE_SAVE_AND_EXIT,\r
- Location\r
- );\r
-\r
- Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;\r
- UpdateData->DataCount++;\r
-\r
- CreateGotoOpCode (\r
- FORM_MAIN_ID,\r
- STRING_TOKEN (STR_NO_SAVE_AND_EXIT),\r
- STRING_TOKEN (STR_NULL_STRING),\r
- EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,\r
- KEY_VALUE_NO_SAVE_AND_EXIT,\r
- Location\r
- );\r
-\r
- UpdateData->DataCount++;\r
-\r
- CallbackData->Hii->UpdateForm (\r
- CallbackData->Hii,\r
- CallbackData->BmmHiiHandle,\r
- (EFI_FORM_LABEL) FORM_CON_COM_SETUP_ID,\r
- TRUE,\r
- UpdateData\r
- );\r
-\r
-}\r
-\r
-VOID\r
-UpdatePageBody (\r
- IN UINT16 UpdatePageId,\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- CleanUpPage (UpdatePageId, CallbackData);\r
- switch (UpdatePageId) {\r
- case FORM_CON_IN_ID:\r
- UpdateConsolePage (UpdatePageId, &ConsoleInpMenu, CallbackData);\r
- break;\r
-\r
- case FORM_CON_OUT_ID:\r
- UpdateConsolePage (UpdatePageId, &ConsoleOutMenu, CallbackData);\r
- break;\r
-\r
- case FORM_CON_ERR_ID:\r
- UpdateConsolePage (UpdatePageId, &ConsoleErrMenu, CallbackData);\r
- break;\r
-\r
- case FORM_BOOT_CHG_ID:\r
- UpdateOrderPage (UpdatePageId, &BootOptionMenu, CallbackData);\r
- break;\r
-\r
- case FORM_DRV_CHG_ID:\r
- UpdateOrderPage (UpdatePageId, &DriverOptionMenu, CallbackData);\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
-}\r
-\r
-VOID *\r
-GetLegacyBootOptionVar (\r
- IN UINTN DeviceType,\r
- OUT UINTN *OptionIndex,\r
- OUT UINTN *OptionSize\r
- )\r
-{\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- VOID *OptionBuffer;\r
- UINTN OrderSize;\r
- UINTN Index;\r
- UINT32 Attribute;\r
- UINT16 *OrderBuffer;\r
- CHAR16 StrTemp[100];\r
- UINT16 FilePathSize;\r
- CHAR16 *Description;\r
- UINT8 *Ptr;\r
- UINT8 *OptionalData;\r
-\r
- //\r
- // Get Boot Option number from the size of BootOrder\r
- //\r
- OrderBuffer = BdsLibGetVariableAndSize (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- &OrderSize\r
- );\r
-\r
- for (Index = 0; Index < OrderSize / sizeof (UINT16); Index++) {\r
- UnicodeSPrint (StrTemp, 100, L"Boot%04x", OrderBuffer[Index]);\r
- OptionBuffer = BdsLibGetVariableAndSize (\r
- StrTemp,\r
- &gEfiGlobalVariableGuid,\r
- OptionSize\r
- );\r
- if (NULL == OptionBuffer) {\r
- continue;\r
- }\r
-\r
- Ptr = (UINT8 *) OptionBuffer;\r
- Attribute = *(UINT32 *) Ptr;\r
- Ptr += sizeof (UINT32);\r
-\r
- FilePathSize = *(UINT16 *) Ptr;\r
- Ptr += sizeof (UINT16);\r
-\r
- Description = (CHAR16 *) Ptr;\r
- Ptr += StrSize ((CHAR16 *) Ptr);\r
-\r
- //\r
- // Now Ptr point to Device Path\r
- //\r
- DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr;\r
- Ptr += FilePathSize;\r
-\r
- //\r
- // Now Ptr point to Optional Data\r
- //\r
- OptionalData = Ptr;\r
-\r
- if ((DeviceType == ((BBS_TABLE *) OptionalData)->DeviceType) &&\r
- (BBS_DEVICE_PATH == DevicePath->Type) &&\r
- (BBS_BBS_DP == DevicePath->SubType)\r
- ) {\r
- *OptionIndex = OrderBuffer[Index];\r
- SafeFreePool (OrderBuffer);\r
- return OptionBuffer;\r
- } else {\r
- SafeFreePool (OptionBuffer);\r
- }\r
- }\r
-\r
- SafeFreePool (OrderBuffer);\r
- return NULL;\r
-}\r
-\r
-VOID\r
-UpdateSetLegacyDeviceOrderPage (\r
- IN UINT16 UpdatePageId,\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_LEGACY_DEV_ORDER_CONTEXT *DevOrder;\r
- BM_MENU_OPTION *OptionMenu;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- IFR_OPTION *IfrOptionList;\r
- STRING_REF StrRef;\r
- STRING_REF StrRefHelp;\r
- BBS_TYPE BbsType;\r
- UINTN VarSize;\r
- UINTN Pos;\r
- UINTN Bit;\r
- UINT16 Index;\r
- UINT16 Index2;\r
- UINT16 Key;\r
- CHAR16 String[100];\r
- CHAR16 *TypeStr;\r
- CHAR16 *TypeStrHelp;\r
- UINT16 VarDevOrder;\r
- UINT8 *Location;\r
- UINT8 *VarData;\r
- UINT8 *OriginalPtr;\r
- UINT8 *LegacyOrder;\r
- UINT8 *OldData;\r
- UINT8 *DisMap;\r
-\r
- OptionMenu = NULL;\r
- Key = 0;\r
- StrRef = 0;\r
- StrRefHelp = 0;\r
- TypeStr = NULL;\r
- TypeStrHelp = NULL;\r
- BbsType = BBS_FLOPPY;\r
- LegacyOrder = NULL;\r
- OldData = NULL;\r
- DisMap = NULL;\r
-\r
- Location = (UINT8 *) &UpdateData->Data;\r
- CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
- UpdatePageStart (CallbackData, &Location);\r
-\r
- DisMap = CallbackData->BmmOldFakeNVData.DisableMap;\r
-\r
- SetMem (DisMap, 32, 0);\r
- //\r
- // Create oneof option list\r
- //\r
- switch (UpdatePageId) {\r
- case FORM_SET_FD_ORDER_ID:\r
- OptionMenu = (BM_MENU_OPTION *) &LegacyFDMenu;\r
- Key = LEGACY_FD_QUESTION_ID;\r
- TypeStr = StrFloppy;\r
- TypeStrHelp = StrFloppyHelp;\r
- BbsType = BBS_FLOPPY;\r
- LegacyOrder = CallbackData->BmmFakeNvData->LegacyFD;\r
- OldData = CallbackData->BmmOldFakeNVData.LegacyFD;\r
- break;\r
-\r
- case FORM_SET_HD_ORDER_ID:\r
- OptionMenu = (BM_MENU_OPTION *) &LegacyHDMenu;\r
- Key = LEGACY_HD_QUESTION_ID;\r
- TypeStr = StrHardDisk;\r
- TypeStrHelp = StrHardDiskHelp;\r
- BbsType = BBS_HARDDISK;\r
- LegacyOrder = CallbackData->BmmFakeNvData->LegacyHD;\r
- OldData = CallbackData->BmmOldFakeNVData.LegacyHD;\r
- break;\r
-\r
- case FORM_SET_CD_ORDER_ID:\r
- OptionMenu = (BM_MENU_OPTION *) &LegacyCDMenu;\r
- Key = LEGACY_CD_QUESTION_ID;\r
- TypeStr = StrCDROM;\r
- TypeStrHelp = StrCDROMHelp;\r
- BbsType = BBS_CDROM;\r
- LegacyOrder = CallbackData->BmmFakeNvData->LegacyCD;\r
- OldData = CallbackData->BmmOldFakeNVData.LegacyCD;\r
- break;\r
-\r
- case FORM_SET_NET_ORDER_ID:\r
- OptionMenu = (BM_MENU_OPTION *) &LegacyNETMenu;\r
- Key = LEGACY_NET_QUESTION_ID;\r
- TypeStr = StrNET;\r
- TypeStrHelp = StrNETHelp;\r
- BbsType = BBS_EMBED_NETWORK;\r
- LegacyOrder = CallbackData->BmmFakeNvData->LegacyNET;\r
- OldData = CallbackData->BmmOldFakeNVData.LegacyNET;\r
- break;\r
-\r
- case FORM_SET_BEV_ORDER_ID:\r
- OptionMenu = (BM_MENU_OPTION *) &LegacyBEVMenu;\r
- Key = LEGACY_BEV_QUESTION_ID;\r
- TypeStr = StrBEV;\r
- TypeStrHelp = StrBEVHelp;\r
- BbsType = BBS_BEV_DEVICE;\r
- LegacyOrder = CallbackData->BmmFakeNvData->LegacyBEV;\r
- OldData = CallbackData->BmmOldFakeNVData.LegacyBEV;\r
- break;\r
-\r
- }\r
-\r
- CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);\r
-\r
- IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * (OptionMenu->MenuNumber + 1));\r
- if (NULL == IfrOptionList) {\r
- return ;\r
- }\r
-\r
- for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
- IfrOptionList[Index].Flags = EFI_IFR_FLAG_INTERACTIVE;\r
- if (0 == Index) {\r
- IfrOptionList[Index].Flags |= EFI_IFR_FLAG_DEFAULT;\r
- }\r
-\r
- IfrOptionList[Index].Key = Key;\r
- IfrOptionList[Index].StringToken = NewMenuEntry->DisplayStringToken;\r
- IfrOptionList[Index].Value = (UINT16) ((BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext)->Index;\r
- IfrOptionList[Index].OptionString = NULL;\r
- }\r
- //\r
- // for item "Disabled"\r
- //\r
- IfrOptionList[Index].Flags = EFI_IFR_FLAG_INTERACTIVE;\r
- IfrOptionList[Index].Key = Key;\r
- IfrOptionList[Index].StringToken = STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE);\r
- IfrOptionList[Index].Value = 0xFF;\r
- IfrOptionList[Index].OptionString = NULL;\r
-\r
- //\r
- // Get Device Order from variable\r
- //\r
- VarData = BdsLibGetVariableAndSize (\r
- VarLegacyDevOrder,\r
- &EfiLegacyDevOrderGuid,\r
- &VarSize\r
- );\r
-\r
- if (NULL != VarData) {\r
- OriginalPtr = VarData;\r
- DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;\r
- while (VarData < VarData + VarSize) {\r
- if (DevOrder->BbsType == BbsType) {\r
- break;\r
- }\r
-\r
- VarData += sizeof (BBS_TYPE);\r
- VarData += *(UINT16 *) VarData;\r
- DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;\r
- }\r
- //\r
- // Create oneof tag here for FD/HD/CD #1 #2\r
- //\r
- for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
- for (Index2 = 0; Index2 <= OptionMenu->MenuNumber; Index2++) {\r
- IfrOptionList[Index2].Key = (UINT16) (Key + Index);\r
- }\r
- //\r
- // Create the string for oneof tag\r
- //\r
- UnicodeSPrint (String, sizeof (String), TypeStr, Index);\r
- StrRef = 0;\r
- CallbackData->Hii->NewString (\r
- CallbackData->Hii,\r
- NULL,\r
- CallbackData->BmmHiiHandle,\r
- &StrRef,\r
- String\r
- );\r
-\r
- UnicodeSPrint (String, sizeof (String), TypeStrHelp, Index);\r
- StrRefHelp = 0;\r
- CallbackData->Hii->NewString (\r
- CallbackData->Hii,\r
- NULL,\r
- CallbackData->BmmHiiHandle,\r
- &StrRefHelp,\r
- String\r
- );\r
-\r
- CreateOneOfOpCode (\r
- (UINT16) (Key + Index),\r
- (UINT8) 1,\r
- StrRef,\r
- StrRefHelp,\r
- IfrOptionList,\r
- OptionMenu->MenuNumber + 1,\r
- Location\r
- );\r
-\r
- VarDevOrder = *(UINT16 *) ((UINT8 *) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16) + Index * sizeof (UINT16));\r
-\r
- if (0xFF00 == (VarDevOrder & 0xFF00)) {\r
- LegacyOrder[Index] = 0xFF;\r
- Pos = (VarDevOrder & 0xFF) / 8;\r
- Bit = 7 - ((VarDevOrder & 0xFF) % 8);\r
- DisMap[Pos] |= (UINT8) (1 << Bit);\r
- } else {\r
- LegacyOrder[Index] = (UINT8) (VarDevOrder & 0xFF);\r
- }\r
-\r
- Location = Location + (OptionMenu->MenuNumber + 2) * ((EFI_IFR_OP_HEADER *) Location)->Length;\r
- Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;\r
- UpdateData->DataCount = (UINT16) (UpdateData->DataCount + (OptionMenu->MenuNumber + 3));\r
- }\r
- }\r
-\r
- CopyMem (\r
- OldData,\r
- LegacyOrder,\r
- 100\r
- );\r
-\r
- if (IfrOptionList != NULL) {\r
- SafeFreePool (IfrOptionList);\r
- IfrOptionList = NULL;\r
- }\r
-\r
- UpdatePageEnd (CallbackData, Location);\r
-}\r
-\r
-VOID\r
-UpdatePageId (\r
- BMM_CALLBACK_DATA *Private,\r
- UINT16 NewPageId\r
- )\r
-{\r
- UINT16 FileOptionMask;\r
-\r
- FileOptionMask = (UINT16) (FILE_OPTION_MASK & NewPageId);\r
-\r
- if ((NewPageId < FILE_OPTION_OFFSET) && (NewPageId >= HANDLE_OPTION_OFFSET)) {\r
- //\r
- // If we select a handle to add driver option, advance to the add handle description page.\r
- //\r
- NewPageId = FORM_DRV_ADD_HANDLE_DESC_ID;\r
- } else if ((NewPageId == KEY_VALUE_SAVE_AND_EXIT) || (NewPageId == KEY_VALUE_NO_SAVE_AND_EXIT)) {\r
- //\r
- // Return to main page after "Save Changes" or "Discard Changes".\r
- //\r
- NewPageId = FORM_MAIN_ID;\r
- }\r
-\r
- if ((NewPageId > 0) && (NewPageId < MAXIMUM_FORM_ID)) {\r
- Private->BmmPreviousPageId = Private->BmmCurrentPageId;\r
- Private->BmmCurrentPageId = NewPageId;\r
- }\r
-}\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- Variable.c\r
-\r
-Abstract:\r
-\r
- Variable operation that will be used by BootMaint\r
-\r
---*/\r
-\r
-#include "Generic/Bds.h"\r
-#include "BootMaint.h"\r
-#include "BdsPlatform.h"\r
-\r
-EFI_STATUS\r
-Var_DelBootOption (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Delete Boot Option that represent a Deleted state in BootOptionMenu.\r
- After deleting this boot option, call Var_ChangeBootOrder to\r
- make sure BootOrder is in valid state.\r
- \r
-Arguments:\r
- LoadOption -- Pointer to the boot option that to be deleted\r
-\r
-Returns:\r
- EFI_SUCCESS\r
- Others\r
- \r
---*/\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
-\r
- UINT16 BootString[10];\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- UINTN Index2;\r
-\r
- Status = EFI_SUCCESS;\r
- Index2 = 0;\r
- for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, (Index - Index2));\r
- if (NULL == NewMenuEntry) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- if (!NewLoadContext->Deleted) {\r
- continue;\r
- }\r
-\r
- UnicodeSPrint (\r
- BootString,\r
- sizeof (BootString),\r
- L"Boot%04x",\r
- NewMenuEntry->OptionNumber\r
- );\r
-\r
- EfiLibDeleteVariable (BootString, &gEfiGlobalVariableGuid);\r
- Index2++;\r
- //\r
- // If current Load Option is the same as BootNext,\r
- // must delete BootNext in order to make sure\r
- // there will be no panic on next boot\r
- //\r
- if (NewLoadContext->IsBootNext) {\r
- EfiLibDeleteVariable (L"BootNext", &gEfiGlobalVariableGuid);\r
- }\r
-\r
- RemoveEntryList (&NewMenuEntry->Link);\r
- BOpt_DestroyMenuEntry (NewMenuEntry);\r
- NewMenuEntry = NULL;\r
- }\r
-\r
- BootOptionMenu.MenuNumber -= Index2;\r
-\r
- Status = Var_ChangeBootOrder ();\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-Var_ChangeBootOrder (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- After any operation on Boot####, there will be a discrepancy in BootOrder.\r
- Since some are missing but in BootOrder, while some are present but are \r
- not reflected by BootOrder. Then a function rebuild BootOrder from \r
- scratch by content from BootOptionMenu is needed.\r
- \r
-Arguments:\r
-\r
-Returns:\r
- EFI_SUCCESS\r
- Others\r
- \r
---*/\r
-{\r
-\r
- EFI_STATUS Status;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- UINT16 *BootOrderList;\r
- UINT16 *BootOrderListPtr;\r
- UINTN BootOrderListSize;\r
- UINTN Index;\r
-\r
- BootOrderList = NULL;\r
- BootOrderListSize = 0;\r
-\r
- //\r
- // First check whether BootOrder is present in current configuration\r
- //\r
- BootOrderList = BdsLibGetVariableAndSize (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- &BootOrderListSize\r
- );\r
-\r
- //\r
- // If exists, delete it to hold new BootOrder\r
- //\r
- if (BootOrderList) {\r
- EfiLibDeleteVariable (L"BootOrder", &gEfiGlobalVariableGuid);\r
- SafeFreePool (BootOrderList);\r
- BootOrderList = NULL;\r
- }\r
- //\r
- // Maybe here should be some check method to ensure that\r
- // no new added boot options will be added\r
- // but the setup engine now will give only one callback\r
- // that is to say, user are granted only one chance to\r
- // decide whether the boot option will be added or not\r
- // there should be no indictor to show whether this\r
- // is a "new" boot option\r
- //\r
- BootOrderListSize = BootOptionMenu.MenuNumber;\r
-\r
- if (BootOrderListSize > 0) {\r
- BootOrderList = AllocateZeroPool (BootOrderListSize * sizeof (UINT16));\r
- ASSERT (BootOrderList != NULL);\r
- BootOrderListPtr = BootOrderList;\r
-\r
- //\r
- // Get all current used Boot#### from BootOptionMenu.\r
- // OptionNumber in each BM_LOAD_OPTION is really its\r
- // #### value.\r
- //\r
- for (Index = 0; Index < BootOrderListSize; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
- *BootOrderList = (UINT16) NewMenuEntry->OptionNumber;\r
- BootOrderList++;\r
- }\r
-\r
- BootOrderList = BootOrderListPtr;\r
-\r
- //\r
- // After building the BootOrderList, write it back\r
- //\r
- Status = gRT->SetVariable (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- BootOrderListSize * sizeof (UINT16),\r
- BootOrderList\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- }\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-Var_DelDriverOption (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Delete Load Option that represent a Deleted state in BootOptionMenu.\r
- After deleting this Driver option, call Var_ChangeDriverOrder to\r
- make sure DriverOrder is in valid state.\r
- \r
-Arguments:\r
- LoadOption -- Pointer to the Driver option that to be deleted\r
-\r
-Returns:\r
- EFI_SUCCESS\r
- Others\r
- \r
---*/\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
-\r
- UINT16 DriverString[12];\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- UINTN Index2;\r
-\r
- Status = EFI_SUCCESS;\r
- Index2 = 0;\r
- for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, (Index - Index2));\r
- if (NULL == NewMenuEntry) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- if (!NewLoadContext->Deleted) {\r
- continue;\r
- }\r
-\r
- UnicodeSPrint (\r
- DriverString,\r
- sizeof (DriverString),\r
- L"Driver%04x",\r
- NewMenuEntry->OptionNumber\r
- );\r
-\r
- EfiLibDeleteVariable (DriverString, &gEfiGlobalVariableGuid);\r
- Index2++;\r
-\r
- RemoveEntryList (&NewMenuEntry->Link);\r
- BOpt_DestroyMenuEntry (NewMenuEntry);\r
- NewMenuEntry = NULL;\r
- }\r
-\r
- DriverOptionMenu.MenuNumber -= Index2;\r
-\r
- Status = Var_ChangeDriverOrder ();\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-Var_ChangeDriverOrder (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- After any operation on Driver####, there will be a discrepancy in \r
- DriverOrder. Since some are missing but in DriverOrder, while some \r
- are present but are not reflected by DriverOrder. Then a function \r
- rebuild DriverOrder from scratch by content from DriverOptionMenu is \r
- needed.\r
- \r
-Arguments:\r
-\r
-Returns:\r
- EFI_SUCCESS\r
- Others\r
- \r
---*/\r
-{\r
- EFI_STATUS Status;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- UINT16 *DriverOrderList;\r
- UINT16 *DriverOrderListPtr;\r
- UINTN DriverOrderListSize;\r
- UINTN Index;\r
-\r
- DriverOrderList = NULL;\r
- DriverOrderListSize = 0;\r
-\r
- //\r
- // First check whether DriverOrder is present in current configuration\r
- //\r
- DriverOrderList = BdsLibGetVariableAndSize (\r
- L"DriverOrder",\r
- &gEfiGlobalVariableGuid,\r
- &DriverOrderListSize\r
- );\r
-\r
- //\r
- // If exists, delete it to hold new DriverOrder\r
- //\r
- if (DriverOrderList) {\r
- EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
- SafeFreePool (DriverOrderList);\r
- DriverOrderList = NULL;\r
- }\r
-\r
- DriverOrderListSize = DriverOptionMenu.MenuNumber;\r
-\r
- if (DriverOrderListSize > 0) {\r
- DriverOrderList = AllocateZeroPool (DriverOrderListSize * sizeof (UINT16));\r
- ASSERT (DriverOrderList != NULL);\r
- DriverOrderListPtr = DriverOrderList;\r
-\r
- //\r
- // Get all current used Driver#### from DriverOptionMenu.\r
- // OptionNumber in each BM_LOAD_OPTION is really its\r
- // #### value.\r
- //\r
- for (Index = 0; Index < DriverOrderListSize; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
- *DriverOrderList = (UINT16) NewMenuEntry->OptionNumber;\r
- DriverOrderList++;\r
- }\r
-\r
- DriverOrderList = DriverOrderListPtr;\r
-\r
- //\r
- // After building the DriverOrderList, write it back\r
- //\r
- Status = gRT->SetVariable (\r
- L"DriverOrder",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- DriverOrderListSize * sizeof (UINT16),\r
- DriverOrderList\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- }\r
- return EFI_SUCCESS;\r
-}\r
-\r
-VOID\r
-Var_UpdateAllConsoleOption (\r
- VOID\r
- )\r
-{\r
- EFI_DEVICE_PATH_PROTOCOL *OutDevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *InpDevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *ErrDevicePath;\r
- EFI_STATUS Status;\r
-\r
- OutDevicePath = EfiLibGetVariable (L"ConOut", &gEfiGlobalVariableGuid);\r
- InpDevicePath = EfiLibGetVariable (L"ConIn", &gEfiGlobalVariableGuid);\r
- ErrDevicePath = EfiLibGetVariable (L"ErrOut", &gEfiGlobalVariableGuid);\r
- if (OutDevicePath) {\r
- ChangeVariableDevicePath (OutDevicePath);\r
- Status = gRT->SetVariable (\r
- L"ConOut",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- GetDevicePathSize (OutDevicePath),\r
- OutDevicePath\r
- );\r
- ASSERT (!EFI_ERROR (Status));\r
- }\r
-\r
- if (InpDevicePath) {\r
- ChangeVariableDevicePath (InpDevicePath);\r
- Status = gRT->SetVariable (\r
- L"ConIn",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- GetDevicePathSize (InpDevicePath),\r
- InpDevicePath\r
- );\r
- ASSERT (!EFI_ERROR (Status));\r
- }\r
-\r
- if (ErrDevicePath) {\r
- ChangeVariableDevicePath (ErrDevicePath);\r
- Status = gRT->SetVariable (\r
- L"ErrOut",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- GetDevicePathSize (ErrDevicePath),\r
- ErrDevicePath\r
- );\r
- ASSERT (!EFI_ERROR (Status));\r
- }\r
-}\r
-\r
-EFI_STATUS\r
-Var_UpdateConsoleOption (\r
- IN UINT16 *ConsoleName,\r
- IN BM_MENU_OPTION *ConsoleMenu,\r
- IN UINT16 UpdatePageId\r
- )\r
-{\r
- EFI_DEVICE_PATH_PROTOCOL *ConDevicePath;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_CONSOLE_CONTEXT *NewConsoleContext;\r
- BM_TERMINAL_CONTEXT *NewTerminalContext;\r
- EFI_STATUS Status;\r
- VENDOR_DEVICE_PATH Vendor;\r
- EFI_DEVICE_PATH_PROTOCOL *TerminalDevicePath;\r
- UINTN Index;\r
- UINT16 *Temp;\r
-\r
- ConDevicePath = EfiLibGetVariable (ConsoleName, &gEfiGlobalVariableGuid);\r
- if (ConDevicePath != NULL) {\r
- EfiLibDeleteVariable (ConsoleName, &gEfiGlobalVariableGuid);\r
- SafeFreePool (ConDevicePath);\r
- ConDevicePath = NULL;\r
- };\r
-\r
- //\r
- // First add all console input device to it from console input menu\r
- //\r
- for (Index = 0; Index < ConsoleMenu->MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
- if (NULL == NewMenuEntry) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
- if (NewConsoleContext->IsActive) {\r
- ConDevicePath = AppendDevicePathInstance (\r
- ConDevicePath,\r
- NewConsoleContext->DevicePath\r
- );\r
- }\r
- }\r
-\r
- for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
- if (NULL == NewMenuEntry) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- if ((NewTerminalContext->IsConIn && (UpdatePageId == FORM_CON_IN_ID)) ||\r
- (NewTerminalContext->IsConOut && (UpdatePageId == FORM_CON_OUT_ID)) ||\r
- (NewTerminalContext->IsStdErr && (UpdatePageId == FORM_CON_ERR_ID))\r
- ) {\r
- Vendor.Header.Type = MESSAGING_DEVICE_PATH;\r
- Vendor.Header.SubType = MSG_VENDOR_DP;\r
- CopyMem (\r
- &Vendor.Guid,\r
- &Guid[NewTerminalContext->TerminalType],\r
- sizeof (EFI_GUID)\r
- );\r
- SetDevicePathNodeLength (&Vendor.Header, sizeof (VENDOR_DEVICE_PATH));\r
- TerminalDevicePath = AppendDevicePathNode (\r
- NewTerminalContext->DevicePath,\r
- (EFI_DEVICE_PATH_PROTOCOL *) &Vendor\r
- );\r
- ASSERT (TerminalDevicePath != NULL);\r
- ChangeTerminalDevicePath (TerminalDevicePath, TRUE);\r
- Temp = DevicePathToStr (TerminalDevicePath);\r
- ConDevicePath = AppendDevicePathInstance (\r
- ConDevicePath,\r
- TerminalDevicePath\r
- );\r
- }\r
- }\r
-\r
- if (ConDevicePath) {\r
- Status = gRT->SetVariable (\r
- ConsoleName,\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- GetDevicePathSize (ConDevicePath),\r
- ConDevicePath\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- }\r
-\r
- return EFI_SUCCESS;\r
-\r
-}\r
-\r
-EFI_STATUS\r
-Var_UpdateConsoleInpOption (\r
- VOID\r
- )\r
-{\r
- return Var_UpdateConsoleOption (L"ConIn", &ConsoleInpMenu, FORM_CON_IN_ID);\r
-}\r
-\r
-EFI_STATUS\r
-Var_UpdateConsoleOutOption (\r
- VOID\r
- )\r
-{\r
- return Var_UpdateConsoleOption (L"ConOut", &ConsoleOutMenu, FORM_CON_OUT_ID);\r
-}\r
-\r
-EFI_STATUS\r
-Var_UpdateErrorOutOption (\r
- VOID\r
- )\r
-{\r
- return Var_UpdateConsoleOption (L"ErrOut", &ConsoleErrMenu, FORM_CON_ERR_ID);\r
-}\r
-\r
-EFI_STATUS\r
-Var_UpdateDriverOption (\r
- IN BMM_CALLBACK_DATA *CallbackData,\r
- IN EFI_HII_HANDLE HiiHandle,\r
- IN UINT16 *DescriptionData,\r
- IN UINT16 *OptionalData,\r
- IN UINT8 ForceReconnect\r
- )\r
-{\r
- UINT16 Index;\r
- UINT16 *DriverOrderList;\r
- UINT16 *NewDriverOrderList;\r
- UINT16 DriverString[12];\r
- UINTN DriverOrderListSize;\r
- VOID *Buffer;\r
- UINTN BufferSize;\r
- UINT8 *Ptr;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- BOOLEAN OptionalDataExist;\r
- EFI_STATUS Status;\r
-\r
- OptionalDataExist = FALSE;\r
-\r
- Index = BOpt_GetDriverOptionNumber ();\r
- UnicodeSPrint (\r
- DriverString,\r
- sizeof (DriverString),\r
- L"Driver%04x",\r
- Index\r
- );\r
-\r
- if (*DescriptionData == 0x0000) {\r
- StrCpy (DescriptionData, DriverString);\r
- }\r
-\r
- BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (DescriptionData) + GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
- if (*OptionalData != 0x0000) {\r
- OptionalDataExist = TRUE;\r
- BufferSize += StrSize (OptionalData);\r
- }\r
-\r
- Buffer = AllocateZeroPool (BufferSize);\r
- if (NULL == Buffer) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
- if (NULL == NewMenuEntry) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewLoadContext->Deleted = FALSE;\r
- NewLoadContext->LoadOptionSize = BufferSize;\r
- Ptr = (UINT8 *) Buffer;\r
- NewLoadContext->LoadOption = Ptr;\r
- *((UINT32 *) Ptr) = LOAD_OPTION_ACTIVE | (ForceReconnect << 1);\r
- NewLoadContext->Attributes = *((UINT32 *) Ptr);\r
- NewLoadContext->IsActive = TRUE;\r
- NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
-\r
- Ptr += sizeof (UINT32);\r
- *((UINT16 *) Ptr) = (UINT16) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
- NewLoadContext->FilePathListLength = *((UINT16 *) Ptr);\r
-\r
- Ptr += sizeof (UINT16);\r
- CopyMem (\r
- Ptr,\r
- DescriptionData,\r
- StrSize (DescriptionData)\r
- );\r
-\r
- NewLoadContext->Description = AllocateZeroPool (StrSize (DescriptionData));\r
- ASSERT (NewLoadContext->Description != NULL);\r
- NewMenuEntry->DisplayString = NewLoadContext->Description;\r
- CopyMem (\r
- NewLoadContext->Description,\r
- (VOID *) Ptr,\r
- StrSize (DescriptionData)\r
- );\r
-\r
- Ptr += StrSize (DescriptionData);\r
- CopyMem (\r
- Ptr,\r
- CallbackData->LoadContext->FilePathList,\r
- GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
- );\r
-\r
- NewLoadContext->FilePathList = AllocateZeroPool (GetDevicePathSize (CallbackData->LoadContext->FilePathList));\r
- ASSERT (NewLoadContext->FilePathList != NULL);\r
-\r
- CopyMem (\r
- NewLoadContext->FilePathList,\r
- (VOID *) Ptr,\r
- GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
- );\r
-\r
- NewMenuEntry->HelpString = DevicePathToStr (NewLoadContext->FilePathList);\r
- NewMenuEntry->OptionNumber = Index;\r
- NewMenuEntry->DisplayStringToken = GetStringTokenFromDepository (\r
- CallbackData,\r
- DriverOptionStrDepository\r
- );\r
- CallbackData->Hii->NewString (\r
- CallbackData->Hii,\r
- NULL,\r
- HiiHandle,\r
- &NewMenuEntry->DisplayStringToken,\r
- NewMenuEntry->DisplayString\r
- );\r
-\r
- NewMenuEntry->HelpStringToken = GetStringTokenFromDepository (\r
- CallbackData,\r
- DriverOptionHelpStrDepository\r
- );\r
- CallbackData->Hii->NewString (\r
- CallbackData->Hii,\r
- NULL,\r
- HiiHandle,\r
- &NewMenuEntry->HelpStringToken,\r
- NewMenuEntry->HelpString\r
- );\r
-\r
- if (OptionalDataExist) {\r
- Ptr += (UINT8) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
- CopyMem (\r
- Ptr,\r
- OptionalData,\r
- StrSize (OptionalData)\r
- );\r
- }\r
-\r
- Status = gRT->SetVariable (\r
- DriverString,\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- BufferSize,\r
- Buffer\r
- );\r
- DriverOrderList = BdsLibGetVariableAndSize (\r
- L"DriverOrder",\r
- &gEfiGlobalVariableGuid,\r
- &DriverOrderListSize\r
- );\r
- NewDriverOrderList = AllocateZeroPool (DriverOrderListSize + sizeof (UINT16));\r
- ASSERT (NewDriverOrderList != NULL);\r
- CopyMem (NewDriverOrderList, DriverOrderList, DriverOrderListSize);\r
- NewDriverOrderList[DriverOrderListSize / sizeof (UINT16)] = Index;\r
- if (DriverOrderList != NULL) {\r
- EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
- }\r
-\r
- Status = gRT->SetVariable (\r
- L"DriverOrder",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- DriverOrderListSize + sizeof (UINT16),\r
- NewDriverOrderList\r
- );\r
- SafeFreePool (DriverOrderList);\r
- DriverOrderList = NULL;\r
- SafeFreePool (NewDriverOrderList);\r
- NewDriverOrderList = NULL;\r
- InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link);\r
- DriverOptionMenu.MenuNumber++;\r
-\r
- *DescriptionData = 0x0000;\r
- *OptionalData = 0x0000;\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-Var_UpdateBootOption (\r
- IN BMM_CALLBACK_DATA *CallbackData,\r
- IN FILE_EXPLORER_NV_DATA *NvRamMap\r
- )\r
-{\r
- UINT16 *BootOrderList;\r
- UINT16 *NewBootOrderList;\r
- UINTN BootOrderListSize;\r
- UINT16 BootString[10];\r
- VOID *Buffer;\r
- UINTN BufferSize;\r
- UINT8 *Ptr;\r
- UINT16 Index;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- BOOLEAN OptionalDataExist;\r
- EFI_STATUS Status;\r
-\r
- OptionalDataExist = FALSE;\r
-\r
- Index = BOpt_GetBootOptionNumber ();\r
- UnicodeSPrint (BootString, sizeof (BootString), L"Boot%04x", Index);\r
-\r
- if (NvRamMap->DescriptionData[0] == 0x0000) {\r
- StrCpy (NvRamMap->DescriptionData, BootString);\r
- }\r
-\r
- BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (NvRamMap->DescriptionData) + GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
- if (NvRamMap->OptionalData[0] != 0x0000) {\r
- OptionalDataExist = TRUE;\r
- BufferSize += StrSize (NvRamMap->OptionalData);\r
- }\r
-\r
- Buffer = AllocateZeroPool (BufferSize);\r
- if (NULL == Buffer) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
- if (NULL == NewMenuEntry) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewLoadContext->Deleted = FALSE;\r
- NewLoadContext->LoadOptionSize = BufferSize;\r
- Ptr = (UINT8 *) Buffer;\r
- NewLoadContext->LoadOption = Ptr;\r
- *((UINT32 *) Ptr) = LOAD_OPTION_ACTIVE;\r
- NewLoadContext->Attributes = *((UINT32 *) Ptr);\r
- NewLoadContext->IsActive = TRUE;\r
- NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
-\r
- Ptr += sizeof (UINT32);\r
- *((UINT16 *) Ptr) = (UINT16) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
- NewLoadContext->FilePathListLength = *((UINT16 *) Ptr);\r
- Ptr += sizeof (UINT16);\r
-\r
- CopyMem (\r
- Ptr,\r
- NvRamMap->DescriptionData,\r
- StrSize (NvRamMap->DescriptionData)\r
- );\r
-\r
- NewLoadContext->Description = AllocateZeroPool (StrSize (NvRamMap->DescriptionData));\r
- ASSERT (NewLoadContext->Description != NULL);\r
-\r
- NewMenuEntry->DisplayString = NewLoadContext->Description;\r
- CopyMem (\r
- NewLoadContext->Description,\r
- (VOID *) Ptr,\r
- StrSize (NvRamMap->DescriptionData)\r
- );\r
-\r
- Ptr += StrSize (NvRamMap->DescriptionData);\r
- CopyMem (\r
- Ptr,\r
- CallbackData->LoadContext->FilePathList,\r
- GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
- );\r
-\r
- NewLoadContext->FilePathList = AllocateZeroPool (GetDevicePathSize (CallbackData->LoadContext->FilePathList));\r
- ASSERT (NewLoadContext->FilePathList != NULL);\r
-\r
- CopyMem (\r
- NewLoadContext->FilePathList,\r
- (VOID *) Ptr,\r
- GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
- );\r
-\r
- NewMenuEntry->HelpString = DevicePathToStr (NewLoadContext->FilePathList);\r
- NewMenuEntry->OptionNumber = Index;\r
- NewMenuEntry->DisplayStringToken = GetStringTokenFromDepository (\r
- CallbackData,\r
- BootOptionStrDepository\r
- );\r
- CallbackData->Hii->NewString (\r
- CallbackData->Hii,\r
- NULL,\r
- CallbackData->FeHiiHandle,\r
- &NewMenuEntry->DisplayStringToken,\r
- NewMenuEntry->DisplayString\r
- );\r
-\r
- NewMenuEntry->HelpStringToken = GetStringTokenFromDepository (\r
- CallbackData,\r
- BootOptionHelpStrDepository\r
- );\r
-\r
- CallbackData->Hii->NewString (\r
- CallbackData->Hii,\r
- NULL,\r
- CallbackData->FeHiiHandle,\r
- &NewMenuEntry->HelpStringToken,\r
- NewMenuEntry->HelpString\r
- );\r
-\r
- if (OptionalDataExist) {\r
- Ptr += (UINT8) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
- CopyMem (Ptr, NvRamMap->OptionalData, StrSize (NvRamMap->OptionalData));\r
- }\r
-\r
- Status = gRT->SetVariable (\r
- BootString,\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- BufferSize,\r
- Buffer\r
- );\r
-\r
- BootOrderList = BdsLibGetVariableAndSize (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- &BootOrderListSize\r
- );\r
-\r
- NewBootOrderList = AllocateZeroPool (BootOrderListSize + sizeof (UINT16));\r
- ASSERT (NewBootOrderList != NULL);\r
- CopyMem (NewBootOrderList, BootOrderList, BootOrderListSize);\r
- NewBootOrderList[BootOrderListSize / sizeof (UINT16)] = Index;\r
-\r
- if (BootOrderList != NULL) {\r
- EfiLibDeleteVariable (L"BootOrder", &gEfiGlobalVariableGuid);\r
- }\r
-\r
- Status = gRT->SetVariable (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- BootOrderListSize + sizeof (UINT16),\r
- NewBootOrderList\r
- );\r
-\r
- SafeFreePool (BootOrderList);\r
- BootOrderList = NULL;\r
- SafeFreePool (NewBootOrderList);\r
- NewBootOrderList = NULL;\r
- InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link);\r
- BootOptionMenu.MenuNumber++;\r
-\r
- NvRamMap->DescriptionData[0] = 0x0000;\r
- NvRamMap->OptionalData[0] = 0x0000;\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-Var_UpdateBootNext (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- BMM_FAKE_NV_DATA *CurrentFakeNVMap;\r
- UINT16 Index;\r
- EFI_STATUS Status;\r
-\r
- Status = EFI_SUCCESS;\r
- CurrentFakeNVMap = CallbackData->BmmFakeNvData;\r
- for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
- if (NULL == NewMenuEntry) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewLoadContext->IsBootNext = FALSE;\r
- }\r
-\r
- if (CurrentFakeNVMap->BootNext == BootOptionMenu.MenuNumber) {\r
- EfiLibDeleteVariable (L"BootNext", &gEfiGlobalVariableGuid);\r
- return EFI_SUCCESS;\r
- }\r
-\r
- NewMenuEntry = BOpt_GetMenuEntry (\r
- &BootOptionMenu,\r
- CurrentFakeNVMap->BootNext\r
- );\r
- if (NULL == NewMenuEntry) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- Status = gRT->SetVariable (\r
- L"BootNext",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- sizeof (UINT16),\r
- &NewMenuEntry->OptionNumber\r
- );\r
- NewLoadContext->IsBootNext = TRUE;\r
- CallbackData->BmmOldFakeNVData.BootNext = CurrentFakeNVMap->BootNext;\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-Var_UpdateBootOrder (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINT16 Index;\r
- UINT16 *BootOrderList;\r
- UINT16 *NewBootOrderList;\r
- UINTN BootOrderListSize;\r
- UINT8 *Map;\r
-\r
- BootOrderList = NULL;\r
- BootOrderListSize = 0;\r
-\r
- //\r
- // First check whether BootOrder is present in current configuration\r
- //\r
- BootOrderList = BdsLibGetVariableAndSize (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- &BootOrderListSize\r
- );\r
-\r
- NewBootOrderList = AllocateZeroPool (BootOrderListSize);\r
- if (!NewBootOrderList) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- Map = AllocateZeroPool (BootOrderListSize / sizeof (UINT16));\r
- if (!Map) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- //\r
- // If exists, delete it to hold new BootOrder\r
- //\r
- if (BootOrderList) {\r
- EfiLibDeleteVariable (L"BootOrder", &gEfiGlobalVariableGuid);\r
- }\r
-\r
- for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
- NewBootOrderList[Index] = CallbackData->BmmFakeNvData->OptionOrder[Index] - 1;\r
- }\r
-\r
- Status = gRT->SetVariable (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- BootOrderListSize,\r
- NewBootOrderList\r
- );\r
- SafeFreePool (BootOrderList);\r
- SafeFreePool (NewBootOrderList);\r
- SafeFreePool (Map);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- BOpt_FreeMenu (&BootOptionMenu);\r
- BOpt_GetBootOptions (CallbackData);\r
-\r
- return EFI_SUCCESS;\r
-\r
-}\r
-\r
-EFI_STATUS\r
-Var_UpdateDriverOrder (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINT16 Index;\r
- UINT16 *DriverOrderList;\r
- UINT16 *NewDriverOrderList;\r
- UINTN DriverOrderListSize;\r
-\r
- DriverOrderList = NULL;\r
- DriverOrderListSize = 0;\r
-\r
- //\r
- // First check whether DriverOrder is present in current configuration\r
- //\r
- DriverOrderList = BdsLibGetVariableAndSize (\r
- L"DriverOrder",\r
- &gEfiGlobalVariableGuid,\r
- &DriverOrderListSize\r
- );\r
-\r
- NewDriverOrderList = AllocateZeroPool (DriverOrderListSize);\r
-\r
- if (!NewDriverOrderList) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- //\r
- // If exists, delete it to hold new DriverOrder\r
- //\r
- if (DriverOrderList) {\r
- EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
- }\r
-\r
- for (Index = 0; Index < DriverOrderListSize; Index++) {\r
- NewDriverOrderList[Index] = CallbackData->BmmFakeNvData->OptionOrder[Index] - 1;\r
- }\r
-\r
- Status = gRT->SetVariable (\r
- L"DriverOrder",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- DriverOrderListSize,\r
- NewDriverOrderList\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- SafeFreePool (DriverOrderList);\r
-\r
- BOpt_FreeMenu (&DriverOptionMenu);\r
- BOpt_GetDriverOptions (CallbackData);\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-Var_UpdateBBSOption (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- UINTN Index;\r
- UINTN Index2;\r
- VOID *BootOptionVar;\r
- CHAR16 VarName[100];\r
- UINTN OptionSize;\r
- UINT16 FilePathSize;\r
- UINT8 *Ptr;\r
- EFI_STATUS Status;\r
- CHAR16 DescString[100];\r
- UINTN NewOptionSize;\r
- UINT8 *NewOptionPtr;\r
- UINT8 *TempPtr;\r
- UINT32 *Attribute;\r
-\r
- BM_MENU_OPTION *OptionMenu;\r
- BM_LEGACY_DEVICE_CONTEXT *LegacyDeviceContext;\r
- UINT8 *LegacyDev;\r
- UINT8 *VarData;\r
- UINTN VarSize;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LEGACY_DEV_ORDER_CONTEXT *DevOrder;\r
- UINT8 *OriginalPtr;\r
- UINT8 *DisMap;\r
- UINTN Pos;\r
- UINTN Bit;\r
- UINT16 *NewOrder;\r
- UINT16 Tmp;\r
-\r
- LegacyDeviceContext = NULL;\r
- DisMap = NULL;\r
- NewOrder = NULL;\r
-\r
- if (FORM_SET_FD_ORDER_ID == CallbackData->BmmPreviousPageId) {\r
- OptionMenu = (BM_MENU_OPTION *) &LegacyFDMenu;\r
- LegacyDev = CallbackData->BmmFakeNvData->LegacyFD;\r
- CallbackData->BbsType = BBS_FLOPPY;\r
- } else {\r
- if (FORM_SET_HD_ORDER_ID == CallbackData->BmmPreviousPageId) {\r
- OptionMenu = (BM_MENU_OPTION *) &LegacyHDMenu;\r
- LegacyDev = CallbackData->BmmFakeNvData->LegacyHD;\r
- CallbackData->BbsType = BBS_HARDDISK;\r
- } else {\r
- if (FORM_SET_CD_ORDER_ID == CallbackData->BmmPreviousPageId) {\r
- OptionMenu = (BM_MENU_OPTION *) &LegacyCDMenu;\r
- LegacyDev = CallbackData->BmmFakeNvData->LegacyCD;\r
- CallbackData->BbsType = BBS_CDROM;\r
- } else {\r
- if (FORM_SET_NET_ORDER_ID == CallbackData->BmmPreviousPageId) {\r
- OptionMenu = (BM_MENU_OPTION *) &LegacyNETMenu;\r
- LegacyDev = CallbackData->BmmFakeNvData->LegacyNET;\r
- CallbackData->BbsType = BBS_EMBED_NETWORK;\r
- } else {\r
- OptionMenu = (BM_MENU_OPTION *) &LegacyBEVMenu;\r
- LegacyDev = CallbackData->BmmFakeNvData->LegacyBEV;\r
- CallbackData->BbsType = BBS_BEV_DEVICE;\r
- }\r
- }\r
- }\r
- }\r
-\r
- DisMap = CallbackData->BmmOldFakeNVData.DisableMap;\r
- Status = EFI_SUCCESS;\r
-\r
- //\r
- // Find the first device's context\r
- // If all devices are disabled( 0xFF == LegacyDev[0]), LegacyDeviceContext can be set to any VariableContext\r
- // because we just use it to fill the desc string, and user can not see the string in UI\r
- //\r
- for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
- LegacyDeviceContext = (BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext;\r
- if (0xFF != LegacyDev[0] && LegacyDev[0] == LegacyDeviceContext->Index) {\r
- DEBUG ((EFI_D_ERROR, "DescStr: %s\n", LegacyDeviceContext->Description));\r
- break;\r
- }\r
- }\r
- //\r
- // Update the Variable "LegacyDevOrder"\r
- //\r
- VarData = (UINT8 *) BdsLibGetVariableAndSize (\r
- VarLegacyDevOrder,\r
- &EfiLegacyDevOrderGuid,\r
- &VarSize\r
- );\r
-\r
- if (NULL == VarData) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- OriginalPtr = VarData;\r
- DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;\r
-\r
- while (VarData < VarData + VarSize) {\r
- if (DevOrder->BbsType == CallbackData->BbsType) {\r
- break;\r
- }\r
-\r
- VarData += sizeof (BBS_TYPE);\r
- VarData += *(UINT16 *) VarData;\r
- DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;\r
- }\r
-\r
- if (VarData >= VarData + VarSize) {\r
- SafeFreePool (OriginalPtr);\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- NewOrder = (UINT16 *) AllocateZeroPool (DevOrder->Length - sizeof (UINT16));\r
- if (NULL == NewOrder) {\r
- SafeFreePool (VarData);\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
- if (0xFF == LegacyDev[Index]) {\r
- break;\r
- }\r
-\r
- NewOrder[Index] = LegacyDev[Index];\r
- }\r
- //\r
- // Only the enable/disable state of each boot device with same device type can be changed,\r
- // so we can count on the index information in DevOrder.\r
- // DisMap bit array is the only reliable source to check a device's en/dis state,\r
- // so we use DisMap to set en/dis state of each item in NewOrder array\r
- //\r
- for (Index2 = 0; Index2 < OptionMenu->MenuNumber; Index2++) {\r
- Tmp = *(UINT16 *) ((UINT8 *) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16) + Index2 * sizeof (UINT16));\r
- Tmp &= 0xFF;\r
- Pos = Tmp / 8;\r
- Bit = 7 - (Tmp % 8);\r
- if (DisMap[Pos] & (1 << Bit)) {\r
- NewOrder[Index] = (UINT16) (0xFF00 | Tmp);\r
- Index++;\r
- }\r
- }\r
-\r
- CopyMem (\r
- (UINT8 *) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16),\r
- NewOrder,\r
- DevOrder->Length - sizeof (UINT16)\r
- );\r
- SafeFreePool (NewOrder);\r
-\r
- Status = gRT->SetVariable (\r
- VarLegacyDevOrder,\r
- &EfiLegacyDevOrderGuid,\r
- VAR_FLAG,\r
- VarSize,\r
- OriginalPtr\r
- );\r
-\r
- SafeFreePool (OriginalPtr);\r
-\r
- //\r
- // Update Optional Data of Boot####\r
- //\r
- BootOptionVar = GetLegacyBootOptionVar (CallbackData->BbsType, &Index, &OptionSize);\r
-\r
- if (NULL != BootOptionVar) {\r
- CopyMem (\r
- DescString,\r
- LegacyDeviceContext->Description,\r
- StrSize (LegacyDeviceContext->Description)\r
- );\r
-\r
- NewOptionSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (DescString) + sizeof (BBS_TABLE) + sizeof (UINT16);\r
-\r
- UnicodeSPrint (VarName, 100, L"Boot%04x", Index);\r
-\r
- Ptr = BootOptionVar;\r
-\r
- Attribute = (UINT32 *) Ptr;\r
- *Attribute |= LOAD_OPTION_ACTIVE;\r
- if (0xFF == LegacyDev[0]) {\r
- //\r
- // Disable this legacy boot option\r
- //\r
- *Attribute &= ~LOAD_OPTION_ACTIVE;\r
- }\r
-\r
- Ptr += sizeof (UINT32);\r
-\r
- FilePathSize = *(UINT16 *) Ptr;\r
- Ptr += sizeof (UINT16);\r
-\r
- NewOptionSize += FilePathSize;\r
-\r
- NewOptionPtr = AllocateZeroPool (NewOptionSize);\r
- if (NULL == NewOptionPtr) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- TempPtr = NewOptionPtr;\r
-\r
- //\r
- // Copy previous option data to new option except the description string\r
- //\r
- CopyMem (\r
- TempPtr,\r
- BootOptionVar,\r
- sizeof (UINT32) + sizeof (UINT16)\r
- );\r
-\r
- TempPtr += (sizeof (UINT32) + sizeof (UINT16));\r
-\r
- CopyMem (\r
- TempPtr,\r
- DescString,\r
- StrSize (DescString)\r
- );\r
-\r
- TempPtr += StrSize (DescString);\r
-\r
- //\r
- // Description = (CHAR16 *)Ptr;\r
- //\r
- Ptr += StrSize ((CHAR16 *) Ptr);\r
-\r
- CopyMem (\r
- TempPtr,\r
- Ptr,\r
- FilePathSize\r
- );\r
-\r
- TempPtr += FilePathSize;\r
-\r
- //\r
- // DevicePath = (EFI_DEVICE_PATH_PROTOCOL *)Ptr;\r
- //\r
- Ptr += FilePathSize;\r
-\r
- //\r
- // Now Ptr point to optional data, i.e. Bbs Table\r
- //\r
- CopyMem (\r
- TempPtr,\r
- LegacyDeviceContext->BbsTable,\r
- sizeof (BBS_TABLE)\r
- );\r
-\r
- TempPtr += sizeof (BBS_TABLE);\r
- *((UINT16 *) TempPtr) = (UINT16) LegacyDeviceContext->Index;\r
-\r
- Status = gRT->SetVariable (\r
- VarName,\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- NewOptionSize,\r
- NewOptionPtr\r
- );\r
-\r
- SafeFreePool (NewOptionPtr);\r
- SafeFreePool (BootOptionVar);\r
- }\r
-\r
- BOpt_GetBootOptions (CallbackData);\r
- return Status;\r
-}\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name: \r
-\r
- BootManager.c\r
-\r
-Abstract:\r
-\r
- The platform boot manager reference implement\r
-\r
---*/\r
-#include "BootManager.h"\r
-\r
-UINT16 mKeyInput;\r
-LIST_ENTRY *mBootOptionsList;\r
-BDS_COMMON_OPTION *gOption;\r
-EFI_HII_HANDLE gBootManagerHandle;\r
-EFI_HANDLE BootManagerCallbackHandle;\r
-EFI_FORM_CALLBACK_PROTOCOL BootManagerCallback;\r
-EFI_GUID gBmGuid = BOOT_MANAGER_GUID;\r
-\r
-extern EFI_FORM_BROWSER_PROTOCOL *gBrowser;\r
-extern UINT8 BootManagerVfrBin[];\r
-extern UINT8 BdsStrings[];\r
-extern BOOLEAN gConnectAllHappened;\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-BootManagerCallbackRoutine (\r
- IN EFI_FORM_CALLBACK_PROTOCOL *This,\r
- IN UINT16 KeyValue,\r
- IN EFI_IFR_DATA_ARRAY *DataArray,\r
- OUT EFI_HII_CALLBACK_PACKET **Packet\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This is the function that is called to provide results data to the driver. This data\r
- consists of a unique key which is used to identify what data is either being passed back\r
- or being asked for. \r
-\r
-Arguments:\r
-\r
- KeyValue - A unique value which is sent to the original exporting driver so that it\r
- can identify the type of data to expect. The format of the data tends to\r
- vary based on the op-code that geerated the callback.\r
-\r
- Data - A pointer to the data being sent to the original exporting driver.\r
-\r
-Returns: \r
-\r
---*/\r
-{\r
- BDS_COMMON_OPTION *Option;\r
- LIST_ENTRY *Link;\r
- UINT16 KeyCount;\r
- EFI_HII_CALLBACK_PACKET *DataPacket;\r
-\r
- //\r
- // Initialize the key count\r
- //\r
- KeyCount = 0;\r
-\r
- for (Link = mBootOptionsList->ForwardLink; Link != mBootOptionsList; Link = Link->ForwardLink) {\r
- Option = CR (Link, BDS_COMMON_OPTION, Link, BDS_LOAD_OPTION_SIGNATURE);\r
-\r
- KeyCount++;\r
-\r
- gOption = Option;\r
-\r
- //\r
- // Is this device the one chosen?\r
- //\r
- if (KeyCount == KeyValue) {\r
- //\r
- // Assigning the returned Key to a global allows the original routine to know what was chosen\r
- //\r
- mKeyInput = KeyValue;\r
-\r
- *Packet = AllocateZeroPool (sizeof (EFI_HII_CALLBACK_PACKET) + 2);\r
- ASSERT (*Packet != NULL);\r
-\r
- //\r
- // Assign the buffer address to DataPacket\r
- //\r
- DataPacket = *Packet;\r
-\r
- DataPacket->DataArray.EntryCount = 1;\r
- DataPacket->DataArray.NvRamMap = NULL;\r
- ((EFI_IFR_DATA_ENTRY *) (((EFI_IFR_DATA_ARRAY *)DataPacket) + 1))->Flags = EXIT_REQUIRED | NV_NOT_CHANGED;\r
- return EFI_SUCCESS;\r
- } else {\r
- continue;\r
- }\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-VOID\r
-CallBootManager (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Hook to enable UI timeout override behavior.\r
-\r
-Arguments:\r
- BdsDeviceList - Device List that BDS needs to connect.\r
-\r
- Entry - Pointer to current Boot Entry.\r
-\r
-Returns:\r
- NONE\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_HII_PACKAGES *PackageList;\r
- BDS_COMMON_OPTION *Option;\r
- LIST_ENTRY *Link;\r
- EFI_HII_UPDATE_DATA *UpdateData;\r
- CHAR16 *ExitData;\r
- UINTN ExitDataSize;\r
- STRING_REF Token;\r
- STRING_REF LastToken;\r
- EFI_INPUT_KEY Key;\r
- UINT8 *Location;\r
- EFI_GUID BmGuid;\r
- LIST_ENTRY BdsBootOptionList;\r
- BOOLEAN BootMngrMenuResetRequired;\r
-\r
- gOption = NULL;\r
- InitializeListHead (&BdsBootOptionList);\r
-\r
- //\r
- // Connect all prior to entering the platform setup menu.\r
- //\r
- if (!gConnectAllHappened) {\r
- BdsLibConnectAllDriversToAllControllers ();\r
- gConnectAllHappened = TRUE;\r
- }\r
- //\r
- // BugBug: Here we can not remove the legacy refresh macro, so we need\r
- // get the boot order every time from "BootOrder" variable.\r
- // Recreate the boot option list base on the BootOrder variable\r
- //\r
- BdsLibEnumerateAllBootOption (&BdsBootOptionList);\r
-\r
- //\r
- // This GUID must be the same as what is defined in BootManagerVfr.vfr\r
- //\r
- BmGuid = gBmGuid;\r
-\r
- mBootOptionsList = &BdsBootOptionList;\r
-\r
- //\r
- // Post our VFR to the HII database\r
- //\r
- PackageList = PreparePackages (2, &BmGuid, BootManagerVfrBin, BdsStrings);\r
- Status = Hii->NewPack (Hii, PackageList, &gBootManagerHandle);\r
- gBS->FreePool (PackageList);\r
-\r
- //\r
- // This example does not implement worker functions\r
- // for the NV accessor functions. Only a callback evaluator\r
- //\r
- BootManagerCallback.NvRead = NULL;\r
- BootManagerCallback.NvWrite = NULL;\r
- BootManagerCallback.Callback = BootManagerCallbackRoutine;\r
-\r
- //\r
- // Install protocol interface\r
- //\r
- BootManagerCallbackHandle = NULL;\r
- Status = gBS->InstallProtocolInterface (\r
- &BootManagerCallbackHandle,\r
- &gEfiFormCallbackProtocolGuid,\r
- EFI_NATIVE_INTERFACE,\r
- &BootManagerCallback\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- LastToken = 0;\r
- Hii->NewString (Hii, NULL, gBootManagerHandle, &LastToken, L" ");\r
-\r
- //\r
- // Allocate space for creation of UpdateData Buffer\r
- //\r
- UpdateData = AllocateZeroPool (0x1000);\r
- ASSERT (UpdateData != NULL);\r
-\r
- //\r
- // Flag update pending in FormSet\r
- //\r
- UpdateData->FormSetUpdate = TRUE;\r
- //\r
- // Register CallbackHandle data for FormSet\r
- //\r
- UpdateData->FormCallbackHandle = (EFI_PHYSICAL_ADDRESS) (UINTN) BootManagerCallbackHandle;\r
- UpdateData->FormUpdate = FALSE;\r
- UpdateData->FormTitle = 0;\r
- UpdateData->DataCount = 1;\r
-\r
- //\r
- // Create blank space. Since when we update the contents of IFR data at a label, it is\r
- // inserted at the location of the label. So if you want to add a string with an empty\r
- // space afterwards, you need to add the space first and then the string like below.\r
- //\r
- Status = CreateSubTitleOpCode (\r
- LastToken, // Token Value for the string\r
- &UpdateData->Data // Buffer containing created op-code\r
- );\r
-\r
- Hii->UpdateForm (Hii, gBootManagerHandle, (EFI_FORM_LABEL) 0x0000, TRUE, UpdateData);\r
-\r
- //\r
- // Create "Boot Option Menu" title\r
- //\r
- Status = CreateSubTitleOpCode (\r
- STRING_TOKEN (STR_BOOT_OPTION_BANNER), // Token Value for the string\r
- &UpdateData->Data // Buffer containing created op-code\r
- );\r
-\r
- Hii->UpdateForm (Hii, gBootManagerHandle, (EFI_FORM_LABEL) 0x0000, TRUE, UpdateData);\r
-\r
- Token = LastToken;\r
- mKeyInput = 0;\r
-\r
- UpdateData->DataCount = 0;\r
- Location = (UINT8 *) &UpdateData->Data;\r
-\r
- for (Link = BdsBootOptionList.ForwardLink; Link != &BdsBootOptionList; Link = Link->ForwardLink) {\r
- Option = CR (Link, BDS_COMMON_OPTION, Link, BDS_LOAD_OPTION_SIGNATURE);\r
-\r
- //\r
- // At this stage we are creating a menu entry, thus the Keys are reproduceable\r
- //\r
- mKeyInput++;\r
- Token++;\r
-\r
- Status = Hii->NewString (Hii, NULL, gBootManagerHandle, &Token, Option->Description);\r
-\r
- //\r
- // If we got an error it is almost certainly due to the token value being invalid.\r
- // Therefore we will set the Token to 0 to automatically add a token.\r
- //\r
- if (EFI_ERROR (Status)) {\r
- Token = 0;\r
- Status = Hii->NewString (Hii, NULL, gBootManagerHandle, &Token, Option->Description);\r
- }\r
-\r
- Status = CreateGotoOpCode (\r
- 0x1000, // Form ID\r
- Token, // Token Value for the string\r
- 0, // Help String (none)\r
- EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS, // The Op-Code flags\r
- mKeyInput, // The Key to get a callback on\r
- Location // Buffer containing created op-code\r
- );\r
-\r
- UpdateData->DataCount++;\r
- Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;\r
-\r
- }\r
-\r
- Hii->UpdateForm (Hii, gBootManagerHandle, (EFI_FORM_LABEL) 0x0001, TRUE, UpdateData);\r
-\r
- UpdateData->DataCount = 1;\r
-\r
- //\r
- // Create "Boot Option Menu" title\r
- //\r
- Status = CreateSubTitleOpCode (\r
- STRING_TOKEN (STR_HELP_FOOTER), // Token Value for the string\r
- &UpdateData->Data // Buffer containing created op-code\r
- );\r
-\r
- Hii->UpdateForm (Hii, gBootManagerHandle, (EFI_FORM_LABEL) 0x0002, TRUE, UpdateData);\r
-\r
- Status = CreateSubTitleOpCode (\r
- LastToken, // Token Value for the string\r
- &UpdateData->Data // Buffer containing created op-code\r
- );\r
-\r
- Hii->UpdateForm (Hii, gBootManagerHandle, (EFI_FORM_LABEL) 0x0002, TRUE, UpdateData);\r
-\r
- gBS->FreePool (UpdateData);\r
-\r
- ASSERT (gBrowser);\r
-\r
- BootMngrMenuResetRequired = FALSE;\r
- gBrowser->SendForm (\r
- gBrowser, \r
- TRUE, \r
- &gBootManagerHandle, \r
- 1, \r
- NULL, \r
- NULL, \r
- NULL, \r
- NULL, \r
- &BootMngrMenuResetRequired\r
- );\r
-\r
- if (BootMngrMenuResetRequired) {\r
- EnableResetRequired ();\r
- }\r
-\r
- Hii->ResetStrings (Hii, gBootManagerHandle);\r
-\r
- if (gOption == NULL) {\r
- return ;\r
- }\r
- \r
- //\r
- //Will leave browser, check any reset required change is applied? if yes, reset system\r
- //\r
- SetupResetReminder ();\r
- \r
- //\r
- // BugBug: This code looks repeated from the BDS. Need to save code space.\r
- //\r
-\r
- //\r
- // parse the selected option\r
- //\r
- Status = BdsLibBootViaBootOption (gOption, gOption->DevicePath, &ExitDataSize, &ExitData);\r
-\r
- if (!EFI_ERROR (Status)) {\r
- PlatformBdsBootSuccess (gOption);\r
- } else {\r
- PlatformBdsBootFail (gOption, Status, ExitData, ExitDataSize);\r
- gST->ConOut->OutputString (\r
- gST->ConOut,\r
- GetStringById (STRING_TOKEN (STR_ANY_KEY_CONTINUE))\r
- );\r
-\r
- //\r
- // BdsLibUiWaitForSingleEvent (gST->ConIn->WaitForKey, 0);\r
- //\r
-\r
- gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
- }\r
-}\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name: \r
-\r
- BootManager.h\r
-\r
-Abstract:\r
-\r
- The platform boot manager reference implement\r
-\r
-Revision History\r
-\r
---*/\r
-\r
-#ifndef _EFI_BOOT_MANAGER_H\r
-#define _EFI_BOOT_MANAGER_H\r
-\r
-#include "Generic/Bds.h"\r
-#include "BdsPlatform.h"\r
-#include "Generic/String.h"\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-BootManagerCallbackRoutine (\r
- IN EFI_FORM_CALLBACK_PROTOCOL *This,\r
- IN UINT16 KeyValue,\r
- IN EFI_IFR_DATA_ARRAY *DataArray,\r
- OUT EFI_HII_CALLBACK_PACKET **Packet\r
- );\r
-\r
-VOID\r
-CallBootManager (\r
- VOID\r
-);\r
-\r
-#define BOOT_MANAGER_GUID \\r
- { \\r
- 0x847bc3fe, 0xb974, 0x446d, {0x94, 0x49, 0x5a, 0xd5, 0x41, 0x2e, 0x99, 0x3b } \\r
- }\r
-\r
-#endif\r
+++ /dev/null
-// *++\r
-//\r
-// Copyright (c) 2006, Intel Corporation \r
-// All rights reserved. This program and the accompanying materials \r
-// are licensed and made available under the terms and conditions of the BSD License \r
-// which accompanies this distribution. The full text of the license may be found at \r
-// http://opensource.org/licenses/bsd-license.php \r
-// \r
-// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-// \r
-// Module Name:\r
-//\r
-// BootManager.vfr \r
-// \r
-// Abstract:\r
-// \r
-// Browser formset.\r
-// \r
-// Revision History: \r
-// \r
-// --*/\r
-\r
-#include "BdsStrDefs.h"\r
-\r
-#define FORMSET_GUID { 0x847bc3fe, 0xb974, 0x446d, { 0x94, 0x49, 0x5a, 0xd5, 0x41, 0x2e, 0x99, 0x3b } } \r
-\r
-#define BOOT_MANAGER_HEADER 0x00\r
-#define BOOT_MANAGER_LABEL 0x01\r
-#define BOOT_MANAGER_TAIL 0x02\r
-\r
-\r
-#define BOOT_MANAGER_CLASS 0x00\r
-#define BOOT_MANAGER_SUBCLASS 0x01\r
-\r
-formset \r
- guid = FORMSET_GUID,\r
- title = STRING_TOKEN(STR_BM_BANNER), \r
- help = STRING_TOKEN(STR_LAST_STRING),\r
- class = BOOT_MANAGER_CLASS, \r
- subclass = BOOT_MANAGER_SUBCLASS,\r
-\r
- form formid = 0x1000,\r
- title = STRING_TOKEN(STR_BM_BANNER);\r
-\r
- label BOOT_MANAGER_HEADER;\r
- label BOOT_MANAGER_LABEL;\r
- //\r
- // This is where we will dynamically add choices for the Boot Manager\r
- //\r
-\r
- label BOOT_MANAGER_TAIL;\r
- endform;\r
-\r
-endformset;\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- Capsules.c\r
-\r
-Abstract:\r
-\r
- BDS routines to handle capsules.\r
-\r
---*/\r
-\r
-\r
-#include <Common/FlashMap.h>\r
-\r
-VOID\r
-BdsLockFv (\r
- IN EFI_CPU_IO_PROTOCOL *CpuIo,\r
- IN EFI_FLASH_SUBAREA_ENTRY *FlashEntry\r
- );\r
-\r
-VOID\r
-BdsLockFv (\r
- IN EFI_CPU_IO_PROTOCOL *CpuIo,\r
- IN EFI_FLASH_SUBAREA_ENTRY *FlashEntry\r
- )\r
-{\r
- EFI_FV_BLOCK_MAP_ENTRY *BlockMap;\r
- EFI_FIRMWARE_VOLUME_HEADER *FvHeader;\r
- UINT64 BaseAddress;\r
- UINT8 Data;\r
- UINT32 BlockLength;\r
- UINTN Index;\r
-\r
- BaseAddress = FlashEntry->Base - 0x400000 + 2;\r
- FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) ((UINTN) (FlashEntry->Base));\r
- BlockMap = &(FvHeader->FvBlockMap[0]);\r
-\r
- while ((BlockMap->NumBlocks != 0) && (BlockMap->BlockLength != 0)) {\r
- BlockLength = BlockMap->BlockLength;\r
- for (Index = 0; Index < BlockMap->NumBlocks; Index++) {\r
- CpuIo->Mem.Read (\r
- CpuIo,\r
- EfiCpuIoWidthUint8,\r
- BaseAddress,\r
- 1,\r
- &Data\r
- );\r
- Data = (UINT8) (Data | 0x3);\r
- CpuIo->Mem.Write (\r
- CpuIo,\r
- EfiCpuIoWidthUint8,\r
- BaseAddress,\r
- 1,\r
- &Data\r
- );\r
- BaseAddress += BlockLength;\r
- }\r
-\r
- BlockMap++;\r
- }\r
-}\r
-\r
-VOID\r
-BdsLockNonUpdatableFlash (\r
- VOID\r
- )\r
-{\r
- EFI_FLASH_MAP_ENTRY_DATA *FlashMapEntryData;\r
- EFI_PEI_HOB_POINTERS GuidHob;\r
- EFI_STATUS Status;\r
- EFI_CPU_IO_PROTOCOL *CpuIo;\r
-\r
- Status = gBS->LocateProtocol (&gEfiCpuIoProtocolGuid, NULL, (VOID**)&CpuIo);\r
- ASSERT_EFI_ERROR (Status);\r
- \r
- GuidHob.Raw = GetHobList ();\r
- while ((GuidHob.Raw = GetNextGuidHob (&gEfiFlashMapHobGuid, GuidHob.Raw)) != NULL) {\r
- FlashMapEntryData = (EFI_FLASH_MAP_ENTRY_DATA *) GET_GUID_HOB_DATA (GuidHob.Guid);\r
-\r
- //\r
- // Get the variable store area\r
- //\r
- if ((FlashMapEntryData->AreaType == EFI_FLASH_AREA_RECOVERY_BIOS) ||\r
- (FlashMapEntryData->AreaType == EFI_FLASH_AREA_MAIN_BIOS)\r
- ) {\r
- BdsLockFv (CpuIo, &(FlashMapEntryData->Entries[0]));\r
- }\r
- GuidHob.Raw = GET_NEXT_HOB (GuidHob);\r
- }\r
-\r
- return ;\r
-}\r
-\r
-EFI_STATUS\r
-ProcessCapsules (\r
- EFI_BOOT_MODE BootMode\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This routine is called to see if there are any capsules we need to process.\r
- If the boot mode is not UPDATE, then we do nothing. Otherwise find the\r
- capsule HOBS and produce firmware volumes for them via the DXE service.\r
- Then call the dispatcher to dispatch drivers from them. Finally, check\r
- the status of the updates.\r
-\r
-Arguments:\r
-\r
- BootMode - the current boot mode\r
-\r
-Returns:\r
- \r
- EFI_INVALID_PARAMETER - boot mode is not correct for an update\r
-\r
-Note:\r
- \r
- This function should be called by BDS in case we need to do some\r
- sort of processing even if there is no capsule to process. We\r
- need to do this if an earlier update went awry and we need to\r
- clear the capsule variable so on the next reset PEI does not see it and \r
- think there is a capsule available.\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_HOB_CAPSULE_VOLUME *CvHob;\r
- EFI_PHYSICAL_ADDRESS BaseAddress;\r
- UINT64 Length;\r
- EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;\r
- EFI_HANDLE FvProtocolHandle;\r
-\r
- //\r
- // We don't do anything else if the boot mode is not flash-update\r
- //\r
- if (BootMode != BOOT_ON_FLASH_UPDATE) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
- //\r
- // Only one capsule HOB allowed.\r
- //\r
- CvHob = GetFirstHob (EFI_HOB_TYPE_CV);\r
- if (CvHob == NULL) {\r
- //\r
- // We didn't find a hob, so had no errors.\r
- //\r
- BdsLockNonUpdatableFlash ();\r
- return EFI_SUCCESS;\r
- }\r
- \r
- BaseAddress = CvHob->BaseAddress;\r
- Length = CvHob->Length;\r
-\r
- Status = EFI_SUCCESS;\r
- //\r
- // Now walk the capsule and call the core to process each\r
- // firmware volume in it.\r
- //\r
- while (Length != 0) {\r
- //\r
- // Point to the next firmware volume header, and then\r
- // call the DXE service to process it.\r
- //\r
- FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) BaseAddress;\r
- if (FwVolHeader->FvLength > Length) {\r
- //\r
- // Notes: need to stuff this status somewhere so that the\r
- // error can be detected at OS runtime\r
- //\r
- Status = EFI_VOLUME_CORRUPTED;\r
- break;\r
- }\r
-\r
- Status = gDS->ProcessFirmwareVolume (\r
- (VOID *) (UINTN) BaseAddress,\r
- (UINTN) FwVolHeader->FvLength,\r
- &FvProtocolHandle\r
- );\r
- if (EFI_ERROR (Status)) {\r
- break;\r
- }\r
- //\r
- // Call the dispatcher to dispatch any drivers from the produced firmware volume\r
- //\r
- gDS->Dispatch ();\r
- //\r
- // On to the next FV in the capsule\r
- //\r
- Length -= FwVolHeader->FvLength;\r
- BaseAddress = (EFI_PHYSICAL_ADDRESS) ((UINTN) BaseAddress + FwVolHeader->FvLength);\r
- //\r
- // Notes: when capsule spec is finalized, if the requirement is made to\r
- // have each FV in a capsule aligned, then we will need to align the\r
- // BaseAddress and Length here.\r
- //\r
- }\r
- \r
-\r
- BdsLockNonUpdatableFlash ();\r
-\r
- return Status;\r
-}\r
-\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name: \r
-\r
- DeviceManager.c\r
-\r
-Abstract:\r
-\r
- The platform device manager reference implement\r
-\r
---*/\r
-#include "DeviceManager.h"\r
-\r
-STATIC UINT16 mTokenCount;\r
-EFI_FRONTPAGE_CALLBACK_INFO FPCallbackInfo;\r
-extern UINTN gCallbackKey;\r
-extern EFI_FORM_BROWSER_PROTOCOL *gBrowser;\r
-extern EFI_GUID gBdsStringPackGuid;\r
-extern BOOLEAN gConnectAllHappened;\r
-\r
-STRING_REF gStringTokenTable[] = {\r
- STR_VIDEO_DEVICE,\r
- STR_NETWORK_DEVICE,\r
- STR_INPUT_DEVICE,\r
- STR_ON_BOARD_DEVICE,\r
- STR_OTHER_DEVICE,\r
- STR_EMPTY_STRING,\r
- 0xFFFF\r
-};\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-DeviceManagerCallbackRoutine (\r
- IN EFI_FORM_CALLBACK_PROTOCOL *This,\r
- IN UINT16 KeyValue,\r
- IN EFI_IFR_DATA_ARRAY *DataArray,\r
- OUT EFI_HII_CALLBACK_PACKET **Packet\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This is the function that is called to provide results data to the driver. This data\r
- consists of a unique key which is used to identify what data is either being passed back\r
- or being asked for. \r
-\r
-Arguments:\r
-\r
- KeyValue - A unique value which is sent to the original exporting driver so that it\r
- can identify the type of data to expect. The format of the data tends to\r
- vary based on the op-code that geerated the callback.\r
-\r
- Data - A pointer to the data being sent to the original exporting driver.\r
-\r
-Returns: \r
-\r
---*/\r
-{\r
- //\r
- // The KeyValue corresponds in this case to the handle which was requested to be displayed\r
- //\r
- EFI_FRONTPAGE_CALLBACK_INFO *CallbackInfo;\r
-\r
- CallbackInfo = EFI_FP_CALLBACK_DATA_FROM_THIS (This);\r
- switch (KeyValue) {\r
- case 0x2000:\r
- CallbackInfo->Data.VideoBIOS = (UINT8) (UINTN) (((EFI_IFR_DATA_ENTRY *)(DataArray + 1))->Data);\r
- gRT->SetVariable (\r
- L"VBIOS",\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
- sizeof (UINT8),\r
- &CallbackInfo->Data.VideoBIOS\r
- );\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
-\r
- gCallbackKey = KeyValue;\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-InitializeDeviceManager (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Initialize HII information for the FrontPage\r
-\r
-Arguments:\r
- None\r
- \r
-Returns:\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_HII_PACKAGES *PackageList;\r
- EFI_HII_UPDATE_DATA *UpdateData;\r
-\r
- //\r
- // Allocate space for creation of UpdateData Buffer\r
- //\r
- UpdateData = AllocateZeroPool (0x1000);\r
- ASSERT (UpdateData != NULL);\r
-\r
- PackageList = PreparePackages (1, &gBdsStringPackGuid, DeviceManagerVfrBin);\r
- Status = Hii->NewPack (Hii, PackageList, &FPCallbackInfo.DevMgrHiiHandle);\r
- gBS->FreePool (PackageList);\r
-\r
- //\r
- // This example does not implement worker functions for the NV accessor functions. Only a callback evaluator\r
- //\r
- FPCallbackInfo.Signature = EFI_FP_CALLBACK_DATA_SIGNATURE;\r
- FPCallbackInfo.DevMgrCallback.NvRead = NULL;\r
- FPCallbackInfo.DevMgrCallback.NvWrite = NULL;\r
- FPCallbackInfo.DevMgrCallback.Callback = DeviceManagerCallbackRoutine;\r
-\r
- //\r
- // Install protocol interface\r
- //\r
- FPCallbackInfo.CallbackHandle = NULL;\r
-\r
- Status = gBS->InstallProtocolInterface (\r
- &FPCallbackInfo.CallbackHandle,\r
- &gEfiFormCallbackProtocolGuid,\r
- EFI_NATIVE_INTERFACE,\r
- &FPCallbackInfo.DevMgrCallback\r
- );\r
-\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- //\r
- // Flag update pending in FormSet\r
- //\r
- UpdateData->FormSetUpdate = TRUE;\r
- //\r
- // Register CallbackHandle data for FormSet\r
- //\r
- UpdateData->FormCallbackHandle = (EFI_PHYSICAL_ADDRESS) (UINTN) FPCallbackInfo.CallbackHandle;\r
- //\r
- // Simply registering the callback handle\r
- //\r
- Hii->UpdateForm (Hii, FPCallbackInfo.DevMgrHiiHandle, (EFI_FORM_LABEL) 0x0000, TRUE, UpdateData);\r
-\r
- gBS->FreePool (UpdateData);\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-CallDeviceManager (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Call the browser and display the device manager\r
-\r
-Arguments:\r
- \r
- None\r
- \r
-Returns:\r
- EFI_SUCCESS - Operation is successful.\r
- EFI_INVALID_PARAMETER - If the inputs to SendForm function is not valid.\r
- \r
---*/\r
-{\r
- EFI_STATUS Status;\r
- UINTN BufferSize;\r
- UINTN Count;\r
- EFI_HII_HANDLE Index;\r
- UINT8 *Buffer;\r
- EFI_IFR_FORM_SET *FormSetData;\r
- CHAR16 *String;\r
- UINTN StringLength;\r
- EFI_HII_UPDATE_DATA *UpdateData;\r
- STRING_REF Token;\r
- STRING_REF TokenHelp;\r
- IFR_OPTION *IfrOptionList;\r
- UINT8 *VideoOption;\r
- UINTN VideoOptionSize;\r
- EFI_HII_HANDLE *HiiHandles;\r
- UINT16 HandleBufferLength;\r
- BOOLEAN BootDeviceMngrMenuResetRequired;\r
-\r
- IfrOptionList = NULL;\r
- VideoOption = NULL;\r
- HiiHandles = NULL;\r
- HandleBufferLength = 0;\r
-\r
- //\r
- // Connect all prior to entering the platform setup menu.\r
- //\r
- if (!gConnectAllHappened) {\r
- BdsLibConnectAllDriversToAllControllers ();\r
- gConnectAllHappened = TRUE;\r
- }\r
- //\r
- // Allocate space for creation of UpdateData Buffer\r
- //\r
- UpdateData = AllocateZeroPool (0x1000);\r
- ASSERT (UpdateData != NULL);\r
-\r
- Status = EFI_SUCCESS;\r
- Buffer = NULL;\r
- FormSetData = NULL;\r
- gCallbackKey = 0;\r
- if (mTokenCount == 0) {\r
- Hii->NewString (Hii, NULL, FPCallbackInfo.DevMgrHiiHandle, &mTokenCount, L" ");\r
- }\r
-\r
- Token = mTokenCount;\r
- TokenHelp = (UINT16) (Token + 1);\r
-\r
- //\r
- // Reset the menu\r
- //\r
- for (Index = 0, Count = 1; Count < 0x10000; Count <<= 1, Index++) {\r
- //\r
- // We will strip off all previous menu entries\r
- //\r
- UpdateData->DataCount = 0xFF;\r
-\r
- //\r
- // Erase entries on this label\r
- //\r
- Hii->UpdateForm (Hii, FPCallbackInfo.DevMgrHiiHandle, (EFI_FORM_LABEL) Count, FALSE, UpdateData);\r
-\r
- //\r
- // Did we reach the end of the Token Table?\r
- //\r
- if (gStringTokenTable[Index] == 0xFFFF) {\r
- break;\r
- }\r
-\r
- CreateSubTitleOpCode (gStringTokenTable[Index], &UpdateData->Data);\r
- //\r
- // Add a single menu item - in this case a subtitle for the device type\r
- //\r
- UpdateData->DataCount = 1;\r
-\r
- //\r
- // Add default title for this label\r
- //\r
- Hii->UpdateForm (Hii, FPCallbackInfo.DevMgrHiiHandle, (EFI_FORM_LABEL) Count, TRUE, UpdateData);\r
- }\r
- //\r
- // Add a space and an exit string. Remember since we add things at the label and push other things beyond the\r
- // label down, we add this in reverse order\r
- //\r
- CreateSubTitleOpCode (STRING_TOKEN (STR_EXIT_STRING), &UpdateData->Data);\r
- Hii->UpdateForm (Hii, FPCallbackInfo.DevMgrHiiHandle, (EFI_FORM_LABEL) Count, TRUE, UpdateData);\r
- CreateSubTitleOpCode (STR_EMPTY_STRING, &UpdateData->Data);\r
- Hii->UpdateForm (Hii, FPCallbackInfo.DevMgrHiiHandle, (EFI_FORM_LABEL) Count, TRUE, UpdateData);\r
-\r
- //\r
- // Get all the Hii handles\r
- //\r
- Status = BdsLibGetHiiHandles (Hii, &HandleBufferLength, &HiiHandles);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- for (Index = 1, BufferSize = 0; Index < HandleBufferLength; Index++) {\r
- //\r
- // Am not initializing Buffer since the first thing checked is the size\r
- // this way I can get the real buffersize in the smallest code size\r
- //\r
- Status = Hii->GetForms (Hii, Index, 0, &BufferSize, Buffer);\r
-\r
- if (Status != EFI_NOT_FOUND) {\r
- //\r
- // BufferSize should have the real size of the forms now\r
- //\r
- Buffer = AllocateZeroPool (BufferSize);\r
- ASSERT (Buffer != NULL);\r
-\r
- //\r
- // Am not initializing Buffer since the first thing checked is the size\r
- // this way I can get the real buffersize in the smallest code size\r
- //\r
- Status = Hii->GetForms (Hii, Index, 0, &BufferSize, Buffer);\r
-\r
- //\r
- // Skip EFI_HII_PACK_HEADER, advance to EFI_IFR_FORM_SET data.\r
- //\r
- FormSetData = (EFI_IFR_FORM_SET *) (Buffer + sizeof (EFI_HII_PACK_HEADER));\r
-\r
- //\r
- // If this formset belongs in the device manager, add it to the menu\r
- //\r
- if (FormSetData->Class != EFI_NON_DEVICE_CLASS) {\r
-\r
- StringLength = 0x1000;\r
- String = AllocateZeroPool (StringLength);\r
- ASSERT (String != NULL);\r
-\r
- Status = Hii->GetString (Hii, Index, FormSetData->FormSetTitle, TRUE, NULL, &StringLength, String);\r
- Status = Hii->NewString (Hii, NULL, FPCallbackInfo.DevMgrHiiHandle, &Token, String);\r
-\r
- //\r
- // If token value exceeded real token value - we need to add a new token values\r
- //\r
- if (Status == EFI_INVALID_PARAMETER) {\r
- Token = 0;\r
- TokenHelp = 0;\r
- Status = Hii->NewString (Hii, NULL, FPCallbackInfo.DevMgrHiiHandle, &Token, String);\r
- }\r
-\r
- StringLength = 0x1000;\r
- if (FormSetData->Help == 0) {\r
- TokenHelp = 0;\r
- } else {\r
- Status = Hii->GetString (Hii, Index, FormSetData->Help, TRUE, NULL, &StringLength, String);\r
- if (StringLength == 0x02) {\r
- TokenHelp = 0;\r
- } else {\r
- Status = Hii->NewString (Hii, NULL, FPCallbackInfo.DevMgrHiiHandle, &TokenHelp, String);\r
- if (Status == EFI_INVALID_PARAMETER) {\r
- TokenHelp = 0;\r
- Status = Hii->NewString (Hii, NULL, FPCallbackInfo.DevMgrHiiHandle, &TokenHelp, String);\r
- }\r
- }\r
- }\r
-\r
- gBS->FreePool (String);\r
-\r
- CreateGotoOpCode (\r
- 0x1000, // Device Manager Page\r
- Token, // Description String Token\r
- TokenHelp, // Description Help String Token\r
- EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS, // Flag designating callback is active\r
- (UINT16) Index, // Callback key value\r
- &UpdateData->Data // Buffer to fill with op-code\r
- );\r
-\r
- //\r
- // In the off-chance that we have lots of extra tokens allocated to the DeviceManager\r
- // this ensures we are fairly re-using the tokens instead of constantly growing the token\r
- // storage for this one handle. If we incremented the token value beyond what it normally\r
- // would use, we will fall back into the error path which seeds the token value with a 0\r
- // so that we can correctly add a token value.\r
- //\r
- if (TokenHelp == 0) {\r
- //\r
- // Since we didn't add help, only advance Token by 1\r
- //\r
- Token++;\r
- } else {\r
- Token = (UINT16) (Token + 2);\r
- TokenHelp = (UINT16) (TokenHelp + 2);\r
- }\r
- //\r
- // This for loop basically will take the Class value which is a bitmask and\r
- // update the form for every active bit. There will be a label at each bit\r
- // location. So if someone had a device which a class of EFI_DISK_DEVICE_CLASS |\r
- // EFI_ON_BOARD_DEVICE_CLASS, this routine will unwind that mask and drop the menu entry\r
- // on each corresponding label.\r
- //\r
- for (Count = 1; Count < 0x10000; Count <<= 1) {\r
- //\r
- // This is an active bit, so update the form\r
- //\r
- if (FormSetData->Class & Count) {\r
- Hii->UpdateForm (\r
- Hii,\r
- FPCallbackInfo.DevMgrHiiHandle,\r
- (EFI_FORM_LABEL) (FormSetData->Class & Count),\r
- TRUE,\r
- UpdateData\r
- );\r
- }\r
- }\r
- }\r
-\r
- BufferSize = 0;\r
- //\r
- // Reset Buffer pointer to original location\r
- //\r
- gBS->FreePool (Buffer);\r
- }\r
- }\r
- //\r
- // Add oneof for video BIOS selection\r
- //\r
- VideoOption = BdsLibGetVariableAndSize (\r
- L"VBIOS",\r
- &gEfiGlobalVariableGuid,\r
- &VideoOptionSize\r
- );\r
- if (NULL == VideoOption) {\r
- FPCallbackInfo.Data.VideoBIOS = 0;\r
- } else {\r
- FPCallbackInfo.Data.VideoBIOS = VideoOption[0];\r
- gBS->FreePool (VideoOption);\r
- }\r
-\r
- ASSERT (FPCallbackInfo.Data.VideoBIOS <= 1);\r
-\r
- Status = gBS->AllocatePool (EfiBootServicesData, 2 * sizeof (IFR_OPTION), (VOID**) &IfrOptionList);\r
- if (IfrOptionList != NULL) {\r
- IfrOptionList[0].Flags = EFI_IFR_FLAG_INTERACTIVE;\r
- IfrOptionList[0].Key = SET_VIDEO_BIOS_TYPE_QUESTION_ID + 0x2000;\r
- IfrOptionList[0].StringToken = STRING_TOKEN (STR_ONE_OF_PCI);\r
- IfrOptionList[0].Value = 0;\r
- IfrOptionList[0].OptionString = NULL;\r
- IfrOptionList[1].Flags = EFI_IFR_FLAG_INTERACTIVE;\r
- IfrOptionList[1].Key = SET_VIDEO_BIOS_TYPE_QUESTION_ID + 0x2000;\r
- IfrOptionList[1].StringToken = STRING_TOKEN (STR_ONE_OF_AGP);\r
- IfrOptionList[1].Value = 1;\r
- IfrOptionList[1].OptionString = NULL;\r
- IfrOptionList[FPCallbackInfo.Data.VideoBIOS].Flags |= EFI_IFR_FLAG_DEFAULT;\r
-\r
- CreateOneOfOpCode (\r
- SET_VIDEO_BIOS_TYPE_QUESTION_ID,\r
- (UINT8) 1,\r
- STRING_TOKEN (STR_ONE_OF_VBIOS),\r
- STRING_TOKEN (STR_ONE_OF_VBIOS_HELP),\r
- IfrOptionList,\r
- 2,\r
- &UpdateData->Data\r
- );\r
-\r
- UpdateData->DataCount = 4;\r
- Hii->UpdateForm (Hii, FPCallbackInfo.DevMgrHiiHandle, (EFI_FORM_LABEL) EFI_VBIOS_CLASS, TRUE, UpdateData);\r
- gBS->FreePool (IfrOptionList);\r
- }\r
-\r
- BootDeviceMngrMenuResetRequired = FALSE;\r
- Status = gBrowser->SendForm (\r
- gBrowser,\r
- TRUE, // Use the database\r
- &FPCallbackInfo.DevMgrHiiHandle, // The HII Handle\r
- 1,\r
- NULL,\r
- FPCallbackInfo.CallbackHandle,\r
- (UINT8 *) &FPCallbackInfo.Data,\r
- NULL,\r
- &BootDeviceMngrMenuResetRequired\r
- );\r
-\r
- if (BootDeviceMngrMenuResetRequired) {\r
- EnableResetRequired ();\r
- }\r
-\r
- Hii->ResetStrings (Hii, FPCallbackInfo.DevMgrHiiHandle);\r
-\r
- //\r
- // We will have returned from processing a callback - user either hit ESC to exit, or selected\r
- // a target to display\r
- //\r
- if (gCallbackKey != 0 && gCallbackKey < 0x2000) {\r
- BootDeviceMngrMenuResetRequired = FALSE;\r
- Status = gBrowser->SendForm (\r
- gBrowser,\r
- TRUE, // Use the database\r
- (EFI_HII_HANDLE *) &gCallbackKey, // The HII Handle\r
- 1,\r
- NULL,\r
- NULL, // This is the handle that the interface to the callback was installed on\r
- NULL,\r
- NULL,\r
- &BootDeviceMngrMenuResetRequired\r
- );\r
-\r
- if (BootDeviceMngrMenuResetRequired) {\r
- EnableResetRequired ();\r
- }\r
- //\r
- // Force return to Device Manager\r
- //\r
- gCallbackKey = 4;\r
- }\r
-\r
- if (gCallbackKey >= 0x2000) {\r
- gCallbackKey = 4;\r
- }\r
-\r
- gBS->FreePool (UpdateData);\r
- gBS->FreePool (HiiHandles);\r
-\r
- return Status;\r
-}\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name: \r
-\r
- DeviceManager.c\r
-\r
-Abstract:\r
-\r
- The platform device manager reference implement\r
-\r
-Revision History\r
-\r
---*/\r
-\r
-#ifndef _DEVICE_MANAGER_H\r
-#define _DEVICE_MANAGER_H\r
-\r
-#include "Generic/FrontPage.h"\r
-\r
-#define EFI_NON_DEVICE_CLASS 0x00 // Useful when you do not want something in the Device Manager\r
-#define EFI_DISK_DEVICE_CLASS 0x01\r
-#define EFI_VIDEO_DEVICE_CLASS 0x02\r
-#define EFI_NETWORK_DEVICE_CLASS 0x04\r
-#define EFI_INPUT_DEVICE_CLASS 0x08\r
-#define EFI_ON_BOARD_DEVICE_CLASS 0x10\r
-#define EFI_OTHER_DEVICE_CLASS 0x20\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-DeviceManagerCallbackRoutine (\r
- IN EFI_FORM_CALLBACK_PROTOCOL *This,\r
- IN UINT16 KeyValue,\r
- IN EFI_IFR_DATA_ARRAY *DataArray,\r
- OUT EFI_HII_CALLBACK_PACKET **Packet\r
- )\r
-;\r
-\r
-EFI_STATUS\r
-InitializeDeviceManager (\r
- VOID\r
- )\r
-;\r
-\r
-EFI_STATUS\r
-CallDeviceManager (\r
- VOID\r
- )\r
-;\r
-\r
-#endif\r
+++ /dev/null
-// *++\r
-//\r
-// Copyright (c) 2006, Intel Corporation \r
-// All rights reserved. This program and the accompanying materials \r
-// are licensed and made available under the terms and conditions of the BSD License \r
-// which accompanies this distribution. The full text of the license may be found at \r
-// http://opensource.org/licenses/bsd-license.php \r
-// \r
-// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-// \r
-// Module Name:\r
-//\r
-// DeviceManagerVfr.vfr \r
-// \r
-// Abstract:\r
-// \r
-// Device Manager formset.\r
-// \r
-// Revision History: \r
-// \r
-// --*/\r
-\r
-#include "BdsStrDefs.h"\r
-\r
-#define FORMSET_GUID { 0x3ebfa8e6, 0x511d, 0x4b5b, { 0xa9, 0x5f, 0xfb, 0x38, 0x26, 0xf, 0x1c, 0x27 } }\r
-\r
-#define EFI_DISK_DEVICE_CLASS 0x01\r
-#define EFI_VIDEO_DEVICE_CLASS 0x02\r
-#define EFI_NETWORK_DEVICE_CLASS 0x04\r
-#define EFI_INPUT_DEVICE_CLASS 0x08\r
-#define EFI_ON_BOARD_DEVICE_CLASS 0x10\r
-#define EFI_OTHER_DEVICE_CLASS 0x20\r
-#define EFI_VBIOS_CLASS 0x40\r
-\r
-#define DEVICE_MANAGER_CLASS 0x0000\r
-#define FRONT_PAGE_SUBCLASS 0x0003\r
-\r
-formset \r
- guid = FORMSET_GUID,\r
- title = STRING_TOKEN(STR_DEVICE_MANAGER_TITLE), \r
- help = STRING_TOKEN(STR_EMPTY_STRING),\r
- class = DEVICE_MANAGER_CLASS, \r
- subclass = FRONT_PAGE_SUBCLASS,\r
-\r
- form formid = 0x1000,\r
- title = STRING_TOKEN(STR_DEVICE_MANAGER_TITLE);\r
-\r
- //\r
- // This is where devices get added to the device manager hierarchy\r
- //\r
- subtitle text = STRING_TOKEN(STR_DISK_DEVICE);\r
- label EFI_DISK_DEVICE_CLASS;\r
-\r
- subtitle text = STRING_TOKEN(STR_VIDEO_DEVICE);\r
- label EFI_VIDEO_DEVICE_CLASS;\r
-\r
- subtitle text = STRING_TOKEN(STR_NETWORK_DEVICE);\r
- label EFI_NETWORK_DEVICE_CLASS;\r
-\r
- subtitle text = STRING_TOKEN(STR_INPUT_DEVICE);\r
- label EFI_INPUT_DEVICE_CLASS;\r
-\r
- subtitle text = STRING_TOKEN(STR_ON_BOARD_DEVICE);\r
- label EFI_ON_BOARD_DEVICE_CLASS;\r
-\r
- subtitle text = STRING_TOKEN(STR_OTHER_DEVICE);\r
- label EFI_OTHER_DEVICE_CLASS;\r
- \r
- subtitle text = STRING_TOKEN(STR_EMPTY_STRING);\r
- label EFI_VBIOS_CLASS;\r
- \r
- endform;\r
-endformset;\r
-\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- FrontPage.c\r
-\r
-Abstract:\r
-\r
- FrontPage routines to handle the callbacks and browser calls\r
- \r
---*/\r
-\r
-#include "Bds.h"\r
-#include "BdsPlatform.h"\r
-#include "FrontPage.h"\r
-#include "String.h"\r
-\r
-EFI_GUID mProcessorSubClass = EFI_PROCESSOR_SUBCLASS_GUID;\r
-EFI_GUID mMemorySubClass = EFI_MEMORY_SUBCLASS_GUID;\r
-EFI_GUID mMiscSubClass = EFI_MISC_SUBCLASS_GUID;\r
-\r
-UINT16 mLastSelection;\r
-EFI_HII_HANDLE gFrontPageHandle;\r
-EFI_HANDLE FrontPageCallbackHandle;\r
-EFI_FORM_CALLBACK_PROTOCOL FrontPageCallback;\r
-EFI_FORM_BROWSER_PROTOCOL *gBrowser;\r
-UINTN gCallbackKey;\r
-BOOLEAN gConnectAllHappened = FALSE;\r
-\r
-extern EFI_HII_HANDLE gFrontPageHandle;\r
-extern EFI_GUID gBdsStringPackGuid;\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-FrontPageCallbackRoutine (\r
- IN EFI_FORM_CALLBACK_PROTOCOL *This,\r
- IN UINT16 KeyValue,\r
- IN EFI_IFR_DATA_ARRAY *DataArray,\r
- OUT EFI_HII_CALLBACK_PACKET **Packet\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This is the function that is called to provide results data to the driver. This data\r
- consists of a unique key which is used to identify what data is either being passed back\r
- or being asked for. \r
-\r
-Arguments:\r
-\r
- KeyValue - A unique value which is sent to the original exporting driver so that it\r
- can identify the type of data to expect. The format of the data tends to\r
- vary based on the op-code that geerated the callback.\r
-\r
- Data - A pointer to the data being sent to the original exporting driver.\r
-\r
-Returns: \r
-\r
---*/\r
-{\r
- CHAR16 *LanguageString;\r
- UINTN Count;\r
- CHAR16 UnicodeLang[3];\r
- CHAR8 Lang[3];\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- CHAR16 *TmpStr;\r
- EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground;\r
- EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background;\r
- EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color;\r
-\r
- SetMem (&Foreground, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff);\r
- SetMem (&Background, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0x0);\r
- SetMem (&Color, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff);\r
-\r
- Count = 0;\r
-\r
- //\r
- // The first 4 entries in the Front Page are to be GUARANTEED to remain constant so IHV's can\r
- // describe to their customers in documentation how to find their setup information (namely\r
- // under the device manager and specific buckets)\r
- //\r
- switch (KeyValue) {\r
- case 0x0001:\r
- //\r
- // This is the continue - clear the screen and return an error to get out of FrontPage loop\r
- //\r
- gCallbackKey = 1;\r
- break;\r
-\r
- case 0x1234:\r
- //\r
- // Collect the languages from what our current Language support is based on our VFR\r
- //\r
- Hii->GetPrimaryLanguages (Hii, gFrontPageHandle, &LanguageString);\r
-\r
- //\r
- // Based on the DataArray->Data->Data value, we can determine\r
- // which language was chosen by the user\r
- //\r
- for (Index = 0; Count != (UINTN) (((EFI_IFR_DATA_ENTRY *) (DataArray + 1))->Data); Index += 3) {\r
- Count++;\r
- }\r
- //\r
- // Preserve the choice the user made\r
- //\r
- mLastSelection = (UINT16) Count;\r
-\r
- //\r
- // The Language (in Unicode format) the user chose\r
- //\r
- CopyMem (UnicodeLang, &LanguageString[Index], 6);\r
-\r
- //\r
- // Convert Unicode to ASCII (Since the ISO standard assumes ASCII equivalent abbreviations\r
- // we can be safe in converting this Unicode stream to ASCII without any loss in meaning.\r
- //\r
- for (Index = 0; Index < 3; Index++) {\r
- Lang[Index] = (CHAR8) UnicodeLang[Index];\r
- }\r
-\r
- Status = gRT->SetVariable (\r
- L"Lang",\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
- 3,\r
- Lang\r
- );\r
-\r
- gBS->FreePool (LanguageString);\r
- gCallbackKey = 2;\r
- break;\r
-\r
- case 0x1064:\r
- //\r
- // Boot Manager\r
- //\r
- gCallbackKey = 3;\r
- break;\r
-\r
- case 0x8567:\r
- //\r
- // Device Manager\r
- //\r
- gCallbackKey = 4;\r
- break;\r
-\r
- case 0x9876:\r
- //\r
- // Boot Maintenance Manager\r
- //\r
- gCallbackKey = 5;\r
- break;\r
-\r
- case 0xFFFE:\r
-\r
- break;\r
-\r
- case 0xFFFF:\r
- //\r
- // FrontPage TimeOut Callback\r
- //\r
- TmpStr = GetStringById (STRING_TOKEN (STR_START_BOOT_OPTION));\r
- if (TmpStr != NULL) {\r
- PlatformBdsShowProgress (\r
- Foreground,\r
- Background,\r
- TmpStr,\r
- Color,\r
- (UINTN) (((EFI_IFR_DATA_ENTRY *) (DataArray+1))->Data),\r
- 0\r
- );\r
- gBS->FreePool (TmpStr);\r
- }\r
- break;\r
-\r
- default:\r
- gCallbackKey = 0;\r
- break;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-InitializeFrontPage (\r
- BOOLEAN ReInitializeStrings\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Initialize HII information for the FrontPage\r
-\r
-Arguments:\r
- None\r
- \r
-Returns:\r
- EFI_SUCCESS - The operation is successful.\r
- EFI_DEVICE_ERROR - If the dynamic opcode creation failed.\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_HII_PACKAGES *PackageList;\r
- EFI_HII_UPDATE_DATA *UpdateData;\r
- IFR_OPTION *OptionList;\r
- CHAR16 *LanguageString;\r
- UINTN OptionCount;\r
- UINTN Index;\r
- STRING_REF Token;\r
- UINT16 Key;\r
- CHAR8 AsciiLang[4];\r
- CHAR16 UnicodeLang[4];\r
- CHAR16 Lang[4];\r
- CHAR16 *StringBuffer;\r
- UINTN BufferSize;\r
- UINT8 *TempBuffer;\r
-\r
- UpdateData = NULL;\r
- OptionList = NULL;\r
-\r
- if (ReInitializeStrings) {\r
- //\r
- // BugBug: Dont' use a goto\r
- //\r
- goto ReInitStrings;\r
- }\r
- //\r
- // Go ahead and initialize the Device Manager\r
- //\r
- InitializeDeviceManager ();\r
-\r
- //\r
- // BugBug: if FrontPageVfrBin is generated by a tool, why are we patching it here\r
- //\r
- TempBuffer = (UINT8 *) FrontPageVfrBin;\r
- TempBuffer = TempBuffer + sizeof (EFI_HII_PACK_HEADER);\r
- TempBuffer = (UINT8 *) &((EFI_IFR_FORM_SET *) TempBuffer)->NvDataSize;\r
- *TempBuffer = 1;\r
-\r
- gCallbackKey = 0;\r
-\r
- PackageList = PreparePackages (1, &gBdsStringPackGuid, FrontPageVfrBin);\r
-\r
- Status = Hii->NewPack (Hii, PackageList, &gFrontPageHandle);\r
-\r
- gBS->FreePool (PackageList);\r
-\r
- //\r
- // There will be only one FormConfig in the system\r
- // If there is another out there, someone is trying to install us\r
- // again. Fail that scenario.\r
- //\r
- Status = gBS->LocateProtocol (\r
- &gEfiFormBrowserProtocolGuid,\r
- NULL,\r
- (VOID**)&gBrowser\r
- );\r
-\r
- //\r
- // This example does not implement worker functions\r
- // for the NV accessor functions. Only a callback evaluator\r
- //\r
- FrontPageCallback.NvRead = NULL;\r
- FrontPageCallback.NvWrite = NULL;\r
- FrontPageCallback.Callback = FrontPageCallbackRoutine;\r
-\r
- //\r
- // Install protocol interface\r
- //\r
- FrontPageCallbackHandle = NULL;\r
- Status = gBS->InstallProtocolInterface (\r
- &FrontPageCallbackHandle,\r
- &gEfiFormCallbackProtocolGuid,\r
- EFI_NATIVE_INTERFACE,\r
- &FrontPageCallback\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
-ReInitStrings:\r
- //\r
- // BugBug: This logic is in BdsInitLanguage. It should not be in two places!\r
- //\r
- BufferSize = 4;\r
- Status = gRT->GetVariable (\r
- L"Lang",\r
- &gEfiGlobalVariableGuid,\r
- NULL,\r
- &BufferSize,\r
- AsciiLang\r
- );\r
-\r
- for (Index = 0; Index < 3; Index++) {\r
- UnicodeLang[Index] = (CHAR16) AsciiLang[Index];\r
- }\r
-\r
- UnicodeLang[3] = 0;\r
-\r
- //\r
- // Allocate space for creation of UpdateData Buffer\r
- //\r
- UpdateData = AllocateZeroPool (0x1000);\r
- ASSERT (UpdateData != NULL);\r
-\r
- OptionList = AllocateZeroPool (0x1000);\r
- ASSERT (OptionList != NULL);\r
-\r
- //\r
- // Flag update pending in FormSet\r
- //\r
- UpdateData->FormSetUpdate = TRUE;\r
- //\r
- // Register CallbackHandle data for FormSet\r
- //\r
- UpdateData->FormCallbackHandle = (EFI_PHYSICAL_ADDRESS) (UINTN) FrontPageCallbackHandle;\r
- UpdateData->FormUpdate = FALSE;\r
- UpdateData->FormTitle = 0;\r
- UpdateData->DataCount = 1;\r
-\r
- //\r
- // Collect the languages from what our current Language support is based on our VFR\r
- //\r
- Hii->GetPrimaryLanguages (Hii, gFrontPageHandle, &LanguageString);\r
-\r
- OptionCount = 0;\r
-\r
- //\r
- // Try for a 512 byte Buffer\r
- //\r
- BufferSize = 0x200;\r
-\r
- //\r
- // Allocate memory for our Form binary\r
- //\r
- StringBuffer = AllocateZeroPool (BufferSize);\r
- ASSERT (StringBuffer != NULL);\r
-\r
- for (Index = 0; LanguageString[Index] != 0; Index += 3) {\r
- Token = 0;\r
- CopyMem (Lang, &LanguageString[Index], 6);\r
- Lang[3] = 0;\r
-\r
- if (!StrCmp (Lang, UnicodeLang)) {\r
- mLastSelection = (UINT16) OptionCount;\r
- }\r
-\r
- Status = Hii->GetString (Hii, gStringPackHandle, 1, TRUE, Lang, &BufferSize, StringBuffer);\r
- Hii->NewString (Hii, NULL, gStringPackHandle, &Token, StringBuffer);\r
- CopyMem (&OptionList[OptionCount].StringToken, &Token, sizeof (UINT16));\r
- CopyMem (&OptionList[OptionCount].Value, &OptionCount, sizeof (UINT16));\r
- Key = 0x1234;\r
- CopyMem (&OptionList[OptionCount].Key, &Key, sizeof (UINT16));\r
- OptionList[OptionCount].Flags = EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS;\r
- OptionCount++;\r
- }\r
-\r
- gBS->FreePool (LanguageString);\r
-\r
- if (ReInitializeStrings) {\r
- gBS->FreePool (StringBuffer);\r
- gBS->FreePool (OptionList);\r
- return EFI_SUCCESS;\r
- }\r
-\r
- Status = CreateOneOfOpCode (\r
- FRONT_PAGE_QUESTION_ID, // Question ID\r
- FRONT_PAGE_DATA_WIDTH, // Data Width\r
- (STRING_REF) STRING_TOKEN (STR_LANGUAGE_SELECT), // Prompt Token\r
- (STRING_REF) STRING_TOKEN (STR_LANGUAGE_SELECT_HELP), // Help Token\r
- OptionList, // List of Options\r
- OptionCount, // Number of Options\r
- &UpdateData->Data // Data Buffer\r
- );\r
-\r
- //\r
- // Assign the number of options and the oneof and endoneof op-codes to count\r
- //\r
- UpdateData->DataCount = (UINT8) (OptionCount + 2);\r
-\r
- Hii->UpdateForm (Hii, gFrontPageHandle, (EFI_FORM_LABEL) 0x0002, TRUE, UpdateData);\r
-\r
- gBS->FreePool (UpdateData);\r
- //\r
- // gBS->FreePool (OptionList);\r
- //\r
- gBS->FreePool (StringBuffer);\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-CallFrontPage (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Call the browser and display the front page\r
-\r
-Arguments:\r
- \r
- None\r
- \r
-Returns:\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- UINT8 FakeNvRamMap[1];\r
- BOOLEAN FrontPageMenuResetRequired;\r
-\r
- //\r
- // Begin waiting for USER INPUT\r
- //\r
- REPORT_STATUS_CODE (\r
- EFI_PROGRESS_CODE,\r
- (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_PC_INPUT_WAIT)\r
- );\r
-\r
- FakeNvRamMap[0] = (UINT8) mLastSelection;\r
- FrontPageMenuResetRequired = FALSE;\r
- Status = gBrowser->SendForm (\r
- gBrowser,\r
- TRUE, // Use the database\r
- &gFrontPageHandle, // The HII Handle\r
- 1,\r
- NULL,\r
- FrontPageCallbackHandle, // This is the handle that the interface to the callback was installed on\r
- FakeNvRamMap,\r
- NULL,\r
- &FrontPageMenuResetRequired\r
- );\r
- //\r
- // Check whether user change any option setting which needs a reset to be effective\r
- // \r
- if (FrontPageMenuResetRequired) {\r
- EnableResetRequired ();\r
- }\r
-\r
- Hii->ResetStrings (Hii, gFrontPageHandle);\r
-\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-GetStringFromToken (\r
- IN EFI_GUID *ProducerGuid,\r
- IN STRING_REF Token,\r
- OUT CHAR16 **String\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Acquire the string associated with the ProducerGuid and return it.\r
-\r
-Arguments:\r
- \r
- ProducerGuid - The Guid to search the HII database for\r
- Token - The token value of the string to extract\r
- String - The string that is extracted\r
- \r
-Returns:\r
-\r
- EFI_SUCCESS - The function returns EFI_SUCCESS always.\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- UINT16 HandleBufferLength;\r
- EFI_HII_HANDLE *HiiHandleBuffer;\r
- UINTN StringBufferLength;\r
- UINTN NumberOfHiiHandles;\r
- UINTN Index;\r
- UINT16 Length;\r
- EFI_GUID HiiGuid;\r
-\r
- //\r
- // Initialize params.\r
- //\r
- HandleBufferLength = 0;\r
- HiiHandleBuffer = NULL;\r
-\r
- //\r
- // Get all the Hii handles\r
- //\r
- Status = BdsLibGetHiiHandles (Hii, &HandleBufferLength, &HiiHandleBuffer);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- //\r
- // Get the Hii Handle that matches the StructureNode->ProducerName\r
- //\r
- NumberOfHiiHandles = HandleBufferLength / sizeof (EFI_HII_HANDLE);\r
- for (Index = 0; Index < NumberOfHiiHandles; Index++) {\r
- Length = 0;\r
- Status = ExtractDataFromHiiHandle (\r
- HiiHandleBuffer[Index],\r
- &Length,\r
- NULL,\r
- &HiiGuid\r
- );\r
- if (CompareGuid (ProducerGuid, &HiiGuid)) {\r
- break;\r
- }\r
- }\r
- //\r
- // Find the string based on the current language\r
- //\r
- StringBufferLength = 0x100;\r
- *String = AllocateZeroPool (0x100);\r
- Status = Hii->GetString (\r
- Hii,\r
- HiiHandleBuffer[Index],\r
- Token,\r
- FALSE,\r
- NULL,\r
- &StringBufferLength,\r
- *String\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- gBS->FreePool (*String);\r
- *String = GetStringById (STRING_TOKEN (STR_MISSING_STRING));\r
- }\r
-\r
- gBS->FreePool (HiiHandleBuffer);\r
- return EFI_SUCCESS;\r
-}\r
-\r
-VOID\r
-ConvertProcessorToString (\r
- IN EFI_PROCESSOR_CORE_FREQUENCY_DATA *ProcessorFrequency,\r
- OUT CHAR16 **String\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Convert Processor Frequency Data to a string\r
-\r
-Arguments:\r
- \r
- ProcessorFrequency - The frequency data to process\r
- String - The string that is created\r
- \r
-Returns:\r
-\r
---*/\r
-{\r
- CHAR16 *StringBuffer;\r
- UINTN Index;\r
- UINT32 FreqMhz;\r
-\r
- if (ProcessorFrequency->Exponent >= 6) {\r
- FreqMhz = ProcessorFrequency->Value;\r
- for (Index = 0; Index < (UINTN) (ProcessorFrequency->Exponent - 6); Index++) {\r
- FreqMhz *= 10;\r
- }\r
- } else {\r
- FreqMhz = 0;\r
- }\r
-\r
- StringBuffer = AllocateZeroPool (0x20);\r
- ASSERT (StringBuffer != NULL);\r
- Index = UnicodeValueToString (StringBuffer, LEFT_JUSTIFY, FreqMhz / 1000, 3);\r
- StrCat (StringBuffer, L".");\r
- UnicodeValueToString (StringBuffer + Index + 1, PREFIX_ZERO, (FreqMhz % 1000) / 10, 2);\r
- StrCat (StringBuffer, L" GHz");\r
-\r
- *String = (CHAR16 *) StringBuffer;\r
-\r
- return ;\r
-}\r
-\r
-VOID\r
-ConvertMemorySizeToString (\r
- IN UINT32 MemorySize,\r
- OUT CHAR16 **String\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Convert Memory Size to a string\r
-\r
-Arguments:\r
- \r
- MemorySize - The size of the memory to process\r
- String - The string that is created\r
- \r
-Returns:\r
-\r
---*/\r
-{\r
- CHAR16 *StringBuffer;\r
-\r
- StringBuffer = AllocateZeroPool (0x20);\r
- ASSERT (StringBuffer != NULL);\r
- UnicodeValueToString (StringBuffer, LEFT_JUSTIFY, MemorySize, 6);\r
- StrCat (StringBuffer, L" MB RAM");\r
-\r
- *String = (CHAR16 *) StringBuffer;\r
-\r
- return ;\r
-}\r
-\r
-VOID\r
-UpdateFrontPageStrings (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Update the banner information for the Front Page based on DataHub information\r
-\r
-Arguments:\r
- \r
- None\r
- \r
-Returns:\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- STRING_REF TokenToUpdate;\r
- CHAR16 *NewString;\r
- UINT64 MonotonicCount;\r
- EFI_DATA_HUB_PROTOCOL *DataHub;\r
- EFI_DATA_RECORD_HEADER *Record;\r
- EFI_SUBCLASS_TYPE1_HEADER *DataHeader;\r
- EFI_MISC_BIOS_VENDOR_DATA *BiosVendor;\r
- EFI_MISC_SYSTEM_MANUFACTURER_DATA *SystemManufacturer;\r
- EFI_PROCESSOR_VERSION_DATA *ProcessorVersion;\r
- EFI_PROCESSOR_CORE_FREQUENCY_DATA *ProcessorFrequency;\r
- EFI_MEMORY_ARRAY_START_ADDRESS_DATA *MemoryArray;\r
- CHAR8 LangCode[3];\r
- CHAR16 Lang[3];\r
- UINTN Size;\r
- UINTN Index;\r
- BOOLEAN Find[5];\r
-\r
- ZeroMem (Find, sizeof (Find));\r
-\r
- //\r
- // Update Front Page strings\r
- //\r
- Status = gBS->LocateProtocol (\r
- &gEfiDataHubProtocolGuid,\r
- NULL,\r
- (VOID**)&DataHub\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- Size = 3;\r
-\r
- Status = gRT->GetVariable (\r
- L"Lang",\r
- &gEfiGlobalVariableGuid,\r
- NULL,\r
- &Size,\r
- LangCode\r
- );\r
-\r
- for (Index = 0; Index < 3; Index++) {\r
- Lang[Index] = (CHAR16) LangCode[Index];\r
- }\r
-\r
- MonotonicCount = 0;\r
- Record = NULL;\r
- do {\r
- Status = DataHub->GetNextRecord (DataHub, &MonotonicCount, NULL, &Record);\r
- if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) {\r
- DataHeader = (EFI_SUBCLASS_TYPE1_HEADER *) (Record + 1);\r
- if (CompareGuid (&Record->DataRecordGuid, &mMiscSubClass) &&\r
- (DataHeader->RecordType == EFI_MISC_BIOS_VENDOR_RECORD_NUMBER)\r
- ) {\r
- BiosVendor = (EFI_MISC_BIOS_VENDOR_DATA *) (DataHeader + 1);\r
- GetStringFromToken (&Record->ProducerName, BiosVendor->BiosVersion, &NewString);\r
- TokenToUpdate = (STRING_REF) STR_FRONT_PAGE_BIOS_VERSION;\r
- Hii->NewString (Hii, Lang, gFrontPageHandle, &TokenToUpdate, NewString);\r
- gBS->FreePool (NewString);\r
- Find[0] = TRUE;\r
- }\r
-\r
- if (CompareGuid (&Record->DataRecordGuid, &mMiscSubClass) &&\r
- (DataHeader->RecordType == EFI_MISC_SYSTEM_MANUFACTURER_RECORD_NUMBER)\r
- ) {\r
- SystemManufacturer = (EFI_MISC_SYSTEM_MANUFACTURER_DATA *) (DataHeader + 1);\r
- GetStringFromToken (&Record->ProducerName, SystemManufacturer->SystemProductName, &NewString);\r
- TokenToUpdate = (STRING_REF) STR_FRONT_PAGE_COMPUTER_MODEL;\r
- Hii->NewString (Hii, Lang, gFrontPageHandle, &TokenToUpdate, NewString);\r
- gBS->FreePool (NewString);\r
- Find[1] = TRUE;\r
- }\r
-\r
- if (CompareGuid (&Record->DataRecordGuid, &mProcessorSubClass) &&\r
- (DataHeader->RecordType == ProcessorVersionRecordType)\r
- ) {\r
- ProcessorVersion = (EFI_PROCESSOR_VERSION_DATA *) (DataHeader + 1);\r
- GetStringFromToken (&Record->ProducerName, *ProcessorVersion, &NewString);\r
- TokenToUpdate = (STRING_REF) STR_FRONT_PAGE_CPU_MODEL;\r
- Hii->NewString (Hii, Lang, gFrontPageHandle, &TokenToUpdate, NewString);\r
- gBS->FreePool (NewString);\r
- Find[2] = TRUE;\r
- }\r
-\r
- if (CompareGuid (&Record->DataRecordGuid, &mProcessorSubClass) &&\r
- (DataHeader->RecordType == ProcessorCoreFrequencyRecordType)\r
- ) {\r
- ProcessorFrequency = (EFI_PROCESSOR_CORE_FREQUENCY_DATA *) (DataHeader + 1);\r
- ConvertProcessorToString (ProcessorFrequency, &NewString);\r
- TokenToUpdate = (STRING_REF) STR_FRONT_PAGE_CPU_SPEED;\r
- Hii->NewString (Hii, Lang, gFrontPageHandle, &TokenToUpdate, NewString);\r
- gBS->FreePool (NewString);\r
- Find[3] = TRUE;\r
- }\r
-\r
- if (CompareGuid (&Record->DataRecordGuid, &mMemorySubClass) &&\r
- (DataHeader->RecordType == EFI_MEMORY_ARRAY_START_ADDRESS_RECORD_NUMBER)\r
- ) {\r
- MemoryArray = (EFI_MEMORY_ARRAY_START_ADDRESS_DATA *) (DataHeader + 1);\r
- ConvertMemorySizeToString((UINT32)(RShiftU64((MemoryArray->MemoryArrayEndAddress - \r
- MemoryArray->MemoryArrayStartAddress + 1), 20)),\r
- &NewString);\r
- TokenToUpdate = (STRING_REF) STR_FRONT_PAGE_MEMORY_SIZE;\r
- Hii->NewString (Hii, Lang, gFrontPageHandle, &TokenToUpdate, NewString);\r
- gBS->FreePool (NewString);\r
- Find[4] = TRUE;\r
- }\r
- }\r
- } while (!EFI_ERROR (Status) && (MonotonicCount != 0) && !(Find[0] && Find[1] && Find[2] && Find[3] && Find[4]));\r
-\r
- return ;\r
-}\r
-\r
-VOID\r
-PlatformBdsEnterFrontPage (\r
- IN UINT16 TimeoutDefault,\r
- IN BOOLEAN ConnectAllHappened\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- This function is the main entry of the platform setup entry.\r
- The function will present the main menu of the system setup, \r
- this is the platform reference part and can be customize.\r
- \r
-Arguments:\r
- TimeoutDefault - The fault time out value before the system\r
- continue to boot.\r
- ConnectAllHappened - The indicater to check if the connect all have\r
- already happended.\r
- \r
-Returns:\r
- None\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_HII_UPDATE_DATA *UpdateData;\r
- EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl;\r
-\r
- //\r
- // Indicate if we need connect all in the platform setup\r
- //\r
- if (ConnectAllHappened) {\r
- gConnectAllHappened = TRUE;\r
- }\r
- //\r
- // Allocate space for creation of Buffer\r
- //\r
- UpdateData = AllocateZeroPool (0x1000);\r
- ASSERT (UpdateData != NULL);\r
-\r
- UpdateData->FormSetUpdate = FALSE;\r
- UpdateData->FormCallbackHandle = 0;\r
- UpdateData->FormUpdate = FALSE;\r
- UpdateData->FormTitle = 0;\r
- UpdateData->DataCount = 1;\r
-\r
- //\r
- // Remove Banner Op-code if any at this label\r
- //\r
- Hii->UpdateForm (Hii, gFrontPageHandle, (EFI_FORM_LABEL) 0xFFFF, FALSE, UpdateData);\r
-\r
- //\r
- // Create Banner Op-code which reflects correct timeout value\r
- //\r
- CreateBannerOpCode (\r
- STRING_TOKEN (STR_TIME_OUT_PROMPT),\r
- TimeoutDefault,\r
- (UINT8) EFI_IFR_BANNER_TIMEOUT,\r
- &UpdateData->Data\r
- );\r
-\r
- //\r
- // Add Banner Op-code at this label\r
- //\r
- Hii->UpdateForm (Hii, gFrontPageHandle, (EFI_FORM_LABEL) 0xFFFF, TRUE, UpdateData);\r
-\r
- do {\r
-\r
- InitializeFrontPage (TRUE);\r
-\r
- //\r
- // Update Front Page strings\r
- //\r
- UpdateFrontPageStrings ();\r
-\r
- gCallbackKey = 0;\r
- PERF_START (0, "BdsTimeOut", "BDS", 0);\r
- Status = CallFrontPage ();\r
- PERF_END (0, "BdsTimeOut", "BDS", 0);\r
-\r
- //\r
- // If gCallbackKey is greater than 1 and less or equal to 5,\r
- // it will lauch configuration utilities.\r
- // 2 = set language\r
- // 3 = boot manager\r
- // 4 = device manager\r
- // 5 = boot maintainenance manager\r
- //\r
- if ((gCallbackKey > 0x0001) && (gCallbackKey <= 0x0005)) {\r
- REPORT_STATUS_CODE (\r
- EFI_PROGRESS_CODE,\r
- (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_PC_USER_SETUP)\r
- );\r
- }\r
- //\r
- // Based on the key that was set, we can determine what to do\r
- //\r
- switch (gCallbackKey) {\r
- //\r
- // The first 4 entries in the Front Page are to be GUARANTEED to remain constant so IHV's can\r
- // describe to their customers in documentation how to find their setup information (namely\r
- // under the device manager and specific buckets)\r
- //\r
- // These entries consist of the Continue, Select language, Boot Manager, and Device Manager\r
- //\r
- case 0x0001:\r
- //\r
- // User hit continue\r
- //\r
- break;\r
-\r
- case 0x0002:\r
- //\r
- // User made a language setting change - display front page again\r
- //\r
- break;\r
-\r
- case 0x0003:\r
- //\r
- // User chose to run the Boot Manager\r
- //\r
- CallBootManager ();\r
- break;\r
-\r
- case 0x0004:\r
- //\r
- // Display the Device Manager\r
- //\r
- do {\r
- CallDeviceManager();\r
- } while (gCallbackKey == 4);\r
- break;\r
-\r
- case 0x0005:\r
- //\r
- // Display the Boot Maintenance Manager\r
- //\r
- BdsStartBootMaint ();\r
- break;\r
- }\r
-\r
- } while ((Status == EFI_SUCCESS) && (gCallbackKey != 1));\r
-\r
- //\r
- //Will leave browser, check any reset required change is applied? if yes, reset system\r
- //\r
- SetupResetReminder ();\r
- \r
- //\r
- // Automatically load current entry\r
- // Note: The following lines of code only execute when Auto boot\r
- // takes affect\r
- //\r
- Status = gBS->LocateProtocol (&gEfiConsoleControlProtocolGuid, NULL, (VOID**)&ConsoleControl);\r
- ConsoleControl->SetMode (ConsoleControl, EfiConsoleControlScreenText);\r
-\r
-}\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- FrontPage.h\r
-\r
-Abstract:\r
-\r
- FrontPage routines to handle the callbacks and browser calls\r
-\r
-Revision History\r
-\r
---*/\r
-\r
-#ifndef _FRONT_PAGE_H\r
-#define _FRONT_PAGE_H\r
-\r
-#include "Generic/DeviceMngr/DeviceManager.h"\r
-#include "Generic/BootMaint/BootMaint.h"\r
-#include "Generic/BootMngr/BootManager.h"\r
-\r
-//\r
-// This is the VFR compiler generated header file which defines the\r
-// string identifiers.\r
-//\r
-#include "BdsStrDefs.h"\r
-#define EFI_DISK_DEVICE_CLASS 0x01\r
-#define EFI_VIDEO_DEVICE_CLASS 0x02\r
-#define EFI_NETWORK_DEVICE_CLASS 0x04\r
-#define EFI_INPUT_DEVICE_CLASS 0x08\r
-#define EFI_ON_BOARD_DEVICE_CLASS 0x10\r
-#define EFI_OTHER_DEVICE_CLASS 0x20\r
-#define EFI_VBIOS_CLASS 0x40\r
-\r
-#define SET_VIDEO_BIOS_TYPE_QUESTION_ID 0x00\r
-\r
-#pragma pack(1)\r
-typedef struct {\r
- UINT8 VideoBIOS;\r
-} MyDevMgrIfrNVData;\r
-#pragma pack()\r
-\r
-#define EFI_FP_CALLBACK_DATA_SIGNATURE EFI_SIGNATURE_32 ('F', 'P', 'C', 'B')\r
-#define EFI_FP_CALLBACK_DATA_FROM_THIS(a) \\r
- CR (a, \\r
- EFI_FRONTPAGE_CALLBACK_INFO, \\r
- DevMgrCallback, \\r
- EFI_FP_CALLBACK_DATA_SIGNATURE \\r
- )\r
-\r
-typedef struct {\r
- UINTN Signature;\r
- MyDevMgrIfrNVData Data;\r
- EFI_HII_HANDLE DevMgrHiiHandle;\r
- EFI_HANDLE CallbackHandle;\r
- EFI_FORM_CALLBACK_PROTOCOL DevMgrCallback;\r
-} EFI_FRONTPAGE_CALLBACK_INFO;\r
-\r
-//\r
-// These are the VFR compiler generated data representing our VFR data.\r
-//\r
-// BugBug: we should put g in front of these tool generated globals.\r
-// maybe even gVrf would be a better prefix\r
-//\r
-extern UINT8 FrontPageVfrBin[];\r
-extern UINT8 FrontPageStringsStr[];\r
-extern UINT8 DeviceManagerVfrBin[];\r
-extern UINT8 DeviceManagerStringsStr[];\r
-\r
-#define FRONT_PAGE_QUESTION_ID 0x0000\r
-#define FRONT_PAGE_DATA_WIDTH 0x01\r
-\r
-EFI_STATUS\r
-InitializeFrontPage (\r
- IN BOOLEAN ReInitializeStrings\r
- );\r
-\r
-BOOLEAN\r
-TimeCompare (\r
- IN EFI_TIME *FirstTime,\r
- IN EFI_TIME *SecondTime\r
- );\r
-\r
-VOID\r
-PlatformBdsEnterFrontPage (\r
- IN UINT16 TimeoutDefault,\r
- IN BOOLEAN ConnectAllHappened\r
- );\r
-\r
-#endif // _FRONT_PAGE_H_\r
-\r
+++ /dev/null
-// *++\r
-//\r
-// Copyright (c) 2006, Intel Corporation \r
-// All rights reserved. This program and the accompanying materials \r
-// are licensed and made available under the terms and conditions of the BSD License \r
-// which accompanies this distribution. The full text of the license may be found at \r
-// http://opensource.org/licenses/bsd-license.php \r
-// \r
-// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-// \r
-// Module Name:\r
-//\r
-// FrontPageVfr.vfr \r
-// \r
-// Abstract:\r
-// \r
-// Browser formset.\r
-// \r
-// Revision History: \r
-// \r
-// --*/\r
-\r
-#include "BdsStrDefs.h"\r
-\r
-#define FORMSET_GUID { 0x9e0c30bc, 0x3f06, 0x4ba6, { 0x82, 0x88, 0x9, 0x17, 0x9b, 0x85, 0x5d, 0xbe } }\r
-\r
-#define FRONT_PAGE_ITEM_ONE 0x0001\r
-#define FRONT_PAGE_ITEM_TWO 0x0002\r
-#define FRONT_PAGE_ITEM_THREE 0x0003\r
-#define FRONT_PAGE_ITEM_FOUR 0x0004\r
-#define FRONT_PAGE_ITEM_FIVE 0x0005\r
-\r
-#define FRONT_PAGE_TIMEOUT 0xFFFF\r
-#define FRONT_PAGE_CLASS 0x0000\r
-#define FRONT_PAGE_SUBCLASS 0x0002\r
-\r
-formset \r
- guid = FORMSET_GUID,\r
- title = STRING_TOKEN(STR_FRONT_PAGE_TITLE), \r
- help = STRING_TOKEN(STR_NULL_STRING),\r
- class = FRONT_PAGE_CLASS, \r
- subclass = FRONT_PAGE_SUBCLASS,\r
-\r
- form formid = 0x1000,\r
- title = STRING_TOKEN(STR_FRONT_PAGE_TITLE);\r
-\r
- banner \r
- title = STRING_TOKEN(STR_FRONT_PAGE_COMPUTER_MODEL),\r
- line 0,\r
- align left;\r
- \r
- banner \r
- title = STRING_TOKEN(STR_FRONT_PAGE_CPU_MODEL),\r
- line 1,\r
- align left;\r
- \r
- banner \r
- title = STRING_TOKEN(STR_FRONT_PAGE_CPU_SPEED),\r
- line 1,\r
- align right;\r
- \r
- banner \r
- title = STRING_TOKEN(STR_FRONT_PAGE_BIOS_VERSION),\r
- line 2,\r
- align left;\r
- \r
- banner \r
- title = STRING_TOKEN(STR_FRONT_PAGE_MEMORY_SIZE),\r
- line 2,\r
- align right;\r
-\r
-// banner \r
-// title = STRING_TOKEN(STR_FRONT_PAGE_BANNER_0_LEFT),\r
-// line 0,\r
-// align left;\r
- \r
-// banner \r
-// title = STRING_TOKEN(STR_FRONT_PAGE_BANNER_0_RIGHT),\r
-// line 0,\r
-// align right;\r
- \r
-// banner \r
-// title = STRING_TOKEN(STR_FRONT_PAGE_BANNER_1_LEFT),\r
-// line 1,\r
-// align left;\r
- \r
-// banner \r
-// title = STRING_TOKEN(STR_FRONT_PAGE_BANNER_1_RIGHT),\r
-// line 1,\r
-// align right;\r
- \r
-// banner \r
-// title = STRING_TOKEN(STR_FRONT_PAGE_BANNER_2_LEFT),\r
-// line 2,\r
-// align left;\r
- \r
-// banner \r
-// title = STRING_TOKEN(STR_FRONT_PAGE_BANNER_3_LEFT),\r
-// line 3,\r
-// align left;\r
-\r
- goto FRONT_PAGE_ITEM_ONE, \r
- prompt = STRING_TOKEN(STR_CONTINUE_PROMPT), \r
- help = STRING_TOKEN(STR_CONTINUE_HELP),\r
- flags = INTERACTIVE | NV_ACCESS, \r
- key = 0x0001;\r
-\r
- label FRONT_PAGE_ITEM_TWO;\r
- //\r
- // This is where we will dynamically add a OneOf type op-code to select Languages from the\r
- // currently available choices\r
- //\r
-\r
- goto FRONT_PAGE_ITEM_THREE, \r
- prompt = STRING_TOKEN(STR_BOOT_MANAGER), \r
- help = STRING_TOKEN(STR_BOOT_MANAGER_HELP),\r
- flags = INTERACTIVE | NV_ACCESS, \r
- key = 0x1064;\r
-\r
- goto FRONT_PAGE_ITEM_FOUR, \r
- prompt = STRING_TOKEN(STR_DEVICE_MANAGER), \r
- help = STRING_TOKEN(STR_DEVICE_MANAGER_HELP),\r
- flags = INTERACTIVE | NV_ACCESS, \r
- key = 0x8567;\r
-\r
- goto FRONT_PAGE_ITEM_FIVE, \r
- prompt = STRING_TOKEN(STR_BOOT_MAINT_MANAGER), \r
- help = STRING_TOKEN(STR_BOOT_MAINT_MANAGER_HELP),\r
- flags = INTERACTIVE | NV_ACCESS, \r
- key = 0x9876;\r
-\r
- label FRONT_PAGE_TIMEOUT;\r
-// If one wanted to hard-code a value one could do it below, but our implementation follows EFI architecture\r
-// and honors the TimeOut NV variable\r
-//\r
-// banner\r
-// title = STRING_TOKEN(STR_TIME_OUT_PROMPT),\r
-// timeout = 0x000A;\r
- \r
- endform;\r
-\r
- form formid = FRONT_PAGE_ITEM_ONE,\r
- title = STRING_TOKEN(STR_FRONT_PAGE_TITLE); \r
- endform;\r
-\r
- form formid = FRONT_PAGE_ITEM_THREE,\r
- title = STRING_TOKEN(STR_FRONT_PAGE_TITLE); \r
- endform;\r
-\r
- form formid = FRONT_PAGE_ITEM_FOUR,\r
- title = STRING_TOKEN(STR_FRONT_PAGE_TITLE); \r
- endform;\r
-\r
- form formid = FRONT_PAGE_ITEM_FIVE,\r
- title = STRING_TOKEN(STR_FRONT_PAGE_TITLE); \r
- endform;\r
-\r
-endformset;\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- language.c\r
-\r
-Abstract:\r
-\r
- Language settings\r
- \r
-Revision History\r
-\r
---*/\r
-\r
-#include "String.h"\r
-#include "Language.h"\r
-\r
-#define NARROW_GLYPH_NUMBER 8\r
-#define WIDE_GLYPH_NUMBER 75\r
-\r
-//\r
-// Default language code, currently is English\r
-//\r
-CHAR8 *mDefaultLangCode = "eng";\r
-\r
-typedef struct {\r
- EFI_HII_FONT_PACK FixedLength;\r
- EFI_NARROW_GLYPH NarrowArray[NARROW_GLYPH_NUMBER];\r
- EFI_WIDE_GLYPH WideArray[WIDE_GLYPH_NUMBER];\r
-} FONT_PACK;\r
-\r
-FONT_PACK mFontPack = {\r
- {\r
- {\r
- sizeof (EFI_HII_FONT_PACK) + (NARROW_GLYPH_NUMBER * sizeof (EFI_NARROW_GLYPH)) + (WIDE_GLYPH_NUMBER * sizeof (EFI_WIDE_GLYPH)),\r
- EFI_HII_FONT\r
- },\r
- NARROW_GLYPH_NUMBER,\r
- WIDE_GLYPH_NUMBER\r
- },\r
- { // Narrow Glyphs\r
- {\r
- 0x05d0,\r
- 0x00,\r
- {\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x4E,\r
- 0x6E,\r
- 0x62,\r
- 0x32,\r
- 0x32,\r
- 0x3C,\r
- 0x68,\r
- 0x4C,\r
- 0x4C,\r
- 0x46,\r
- 0x76,\r
- 0x72,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00\r
- }\r
- },\r
- {\r
- 0x05d1,\r
- 0x00,\r
- {\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x78,\r
- 0x7C,\r
- 0x0C,\r
- 0x0C,\r
- 0x0C,\r
- 0x0C,\r
- 0x0C,\r
- 0x0C,\r
- 0x0C,\r
- 0x0C,\r
- 0x7E,\r
- 0x7E,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00\r
- }\r
- },\r
- {\r
- 0x05d2,\r
- 0x00,\r
- {\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x78,\r
- 0x7C,\r
- 0x0C,\r
- 0x0C,\r
- 0x0C,\r
- 0x0C,\r
- 0x0C,\r
- 0x0C,\r
- 0x1C,\r
- 0x3E,\r
- 0x66,\r
- 0x66,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00\r
- }\r
- },\r
- {\r
- 0x05d3,\r
- 0x00,\r
- {\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x7E,\r
- 0x7E,\r
- 0x0C,\r
- 0x0C,\r
- 0x0C,\r
- 0x0C,\r
- 0x0C,\r
- 0x0C,\r
- 0x0C,\r
- 0x0C,\r
- 0x0C,\r
- 0x0C,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00\r
- }\r
- },\r
- {\r
- 0x05d4,\r
- 0x00,\r
- {\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x7C,\r
- 0x7E,\r
- 0x06,\r
- 0x06,\r
- 0x06,\r
- 0x06,\r
- 0x66,\r
- 0x66,\r
- 0x66,\r
- 0x66,\r
- 0x66,\r
- 0x66,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00\r
- }\r
- },\r
- {\r
- 0x05d5,\r
- 0x00,\r
- {\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x3C,\r
- 0x3C,\r
- 0x0C,\r
- 0x0C,\r
- 0x0C,\r
- 0x0C,\r
- 0x0C,\r
- 0x0C,\r
- 0x0C,\r
- 0x0C,\r
- 0x0C,\r
- 0x0C,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00\r
- }\r
- },\r
- {\r
- 0x05d6,\r
- 0x00,\r
- {\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x38,\r
- 0x38,\r
- 0x1E,\r
- 0x1E,\r
- 0x18,\r
- 0x18,\r
- 0x18,\r
- 0x18,\r
- 0x18,\r
- 0x18,\r
- 0x18,\r
- 0x18,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00\r
- }\r
- },\r
- {\r
- 0x0000,\r
- 0x00,\r
- {\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00\r
- }\r
- }\r
- },\r
- { // Wide Glyphs\r
- {\r
- 0x0020,\r
- 0x00,\r
- {\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00\r
- },\r
- {\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00,\r
- 0x00\r
- },\r
- {\r
- 0x00,\r
- 0x00,\r
- 0x00\r
- }\r
- }, //\r
- }\r
-};\r
-\r
-VOID\r
-ExportFonts (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Routine to export glyphs to the HII database. This is in addition to whatever is defined in the Graphics Console driver.\r
-\r
-Arguments:\r
- None\r
- \r
-Returns:\r
-\r
---*/\r
-{\r
- EFI_HII_HANDLE HiiHandle;\r
- EFI_HII_PACKAGES *PackageList;\r
-\r
- PackageList = PreparePackages (1, NULL, &mFontPack);\r
- //\r
- // Register our Fonts into the global database\r
- //\r
- HiiHandle = 0;\r
- Hii->NewPack (Hii, PackageList, &HiiHandle);\r
-\r
- gBS->FreePool (PackageList);\r
-}\r
-\r
-VOID\r
-InitializeLanguage (\r
- BOOLEAN LangCodesSettingRequired\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Determine the current language that will be used \r
- based on language related EFI Variables\r
-\r
-Arguments:\r
- LangCodesSettingRequired - If required to set LangCode variable\r
- \r
-Returns:\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- UINTN Size;\r
- CHAR8 LangCode[ISO_639_2_ENTRY_SIZE];\r
- CHAR8 *LangCodes;\r
- CHAR16 *LanguageString;\r
-\r
- LanguageString = NULL;\r
- LangCodes = NULL;\r
-\r
- ExportFonts ();\r
-\r
- //\r
- // Collect the languages from what our current Language support is based on our VFR\r
- //\r
- Hii->GetPrimaryLanguages (Hii, gStringPackHandle, &LanguageString);\r
-\r
- LangCodes = AllocatePool (StrLen (LanguageString));\r
- ASSERT (LangCodes);\r
-\r
- //\r
- // Convert LanguageString from Unicode to EFI defined ASCII LangCodes\r
- //\r
- for (Index = 0; LanguageString[Index] != 0x0000; Index++) {\r
- LangCodes[Index] = (CHAR8) LanguageString[Index];\r
- }\r
-\r
- LangCodes[Index] = 0;\r
-\r
- if (LangCodesSettingRequired) {\r
- Status = gRT->SetVariable (\r
- L"LangCodes",\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
- AsciiStrLen (LangCodes),\r
- LangCodes\r
- );\r
- }\r
- //\r
- // Find current LangCode from Lang NV Variable\r
- //\r
- Size = ISO_639_2_ENTRY_SIZE;\r
- Status = gRT->GetVariable (\r
- L"Lang",\r
- &gEfiGlobalVariableGuid,\r
- NULL,\r
- &Size,\r
- &LangCode\r
- );\r
-\r
- if (!EFI_ERROR (Status)) {\r
- Status = EFI_NOT_FOUND;\r
- for (Index = 0; LangCodes[Index] != 0; Index += ISO_639_2_ENTRY_SIZE) {\r
- if (CompareMem (&LangCodes[Index], LangCode, ISO_639_2_ENTRY_SIZE) == 0) {\r
- Status = EFI_SUCCESS;\r
- break;\r
- }\r
- }\r
- }\r
- //\r
- // If we cannot get language code from Lang variable,\r
- // or LangCode cannot be found from language table,\r
- // set the mDefaultLangCode to Lang variable.\r
- //\r
- if (EFI_ERROR (Status)) {\r
- Status = gRT->SetVariable (\r
- L"Lang",\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
- ISO_639_2_ENTRY_SIZE,\r
- mDefaultLangCode\r
- );\r
- }\r
-\r
- if (LangCodes) {\r
- gBS->FreePool (LangCodes);\r
- }\r
-\r
- if (LanguageString != NULL) {\r
- gBS->FreePool (LanguageString);\r
- }\r
-\r
-}\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- Language.h\r
-\r
-Abstract:\r
- \r
- Language setting\r
-\r
-Revision History\r
-\r
---*/\r
-\r
-#ifndef _LANGUAGE_H\r
-#define _LANGUAGE_H\r
-\r
-#ifndef ISO_639_2_ENTRY_SIZE\r
-#define ISO_639_2_ENTRY_SIZE 3\r
-#endif\r
-\r
-VOID\r
-InitializeLanguage (\r
- BOOLEAN LangCodesSettingRequired\r
- );\r
-\r
-#endif // _LANGUAGE_H_\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- MemoryTest.c\r
-\r
-Abstract:\r
-\r
- Perform the platform memory test\r
-\r
---*/\r
-\r
-#include "Bds.h"\r
-#include "BdsPlatform.h"\r
-#include "String.h"\r
-\r
-//\r
-// BDS Platform Functions\r
-//\r
-EFI_STATUS\r
-PlatformBdsShowProgress (\r
- IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL TitleForeground,\r
- IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL TitleBackground,\r
- IN CHAR16 *Title,\r
- IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL ProgressColor,\r
- IN UINTN Progress,\r
- IN UINTN PreviousValue\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Show progress bar with title above it. It only works in UGA mode.\r
-\r
-Arguments:\r
- \r
- TitleForeground - Foreground color for Title.\r
- TitleBackground - Background color for Title.\r
- Title - Title above progress bar.\r
- ProgressColor - Progress bar color.\r
- Progress - Progress (0-100)\r
-\r
-Returns: \r
- \r
- EFI_STATUS - Success update the progress bar\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
- EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
- UINT32 SizeOfX;\r
- UINT32 SizeOfY;\r
- UINT32 ColorDepth;\r
- UINT32 RefreshRate;\r
- EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color;\r
- UINTN BlockHeight;\r
- UINTN BlockWidth;\r
- UINTN BlockNum;\r
- UINTN PosX;\r
- UINTN PosY;\r
- UINTN Index;\r
-\r
- if (Progress > 100) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- UgaDraw = NULL;\r
- Status = gBS->HandleProtocol (\r
- gST->ConsoleOutHandle,\r
- &gEfiGraphicsOutputProtocolGuid,\r
- (VOID**)&GraphicsOutput\r
- );\r
- if (EFI_ERROR (Status)) {\r
- GraphicsOutput = NULL;\r
-\r
- Status = gBS->HandleProtocol (\r
- gST->ConsoleOutHandle,\r
- &gEfiUgaDrawProtocolGuid,\r
- (VOID**)&UgaDraw\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return EFI_UNSUPPORTED;\r
- }\r
- }\r
-\r
- if (GraphicsOutput != NULL) {\r
- SizeOfX = GraphicsOutput->Mode->Info->HorizontalResolution;\r
- SizeOfY = GraphicsOutput->Mode->Info->VerticalResolution;\r
- } else {\r
- Status = UgaDraw->GetMode (\r
- UgaDraw,\r
- &SizeOfX,\r
- &SizeOfY,\r
- &ColorDepth,\r
- &RefreshRate\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return EFI_UNSUPPORTED;\r
- }\r
- }\r
-\r
- BlockWidth = SizeOfX / 100;\r
- BlockHeight = SizeOfY / 50;\r
-\r
- BlockNum = Progress;\r
-\r
- PosX = 0;\r
- PosY = SizeOfY * 48 / 50;\r
-\r
- if (BlockNum == 0) {\r
- //\r
- // Clear progress area\r
- //\r
- SetMem (&Color, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0x0);\r
-\r
- if (GraphicsOutput != NULL) {\r
- Status = GraphicsOutput->Blt (\r
- GraphicsOutput,\r
- &Color,\r
- EfiBltVideoFill,\r
- 0,\r
- 0,\r
- 0,\r
- PosY - GLYPH_HEIGHT - 1,\r
- SizeOfX,\r
- SizeOfY - (PosY - GLYPH_HEIGHT - 1),\r
- SizeOfX * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
- );\r
- } else {\r
- Status = UgaDraw->Blt (\r
- UgaDraw,\r
- (EFI_UGA_PIXEL *) &Color,\r
- EfiUgaVideoFill,\r
- 0,\r
- 0,\r
- 0,\r
- PosY - GLYPH_HEIGHT - 1,\r
- SizeOfX,\r
- SizeOfY - (PosY - GLYPH_HEIGHT - 1),\r
- SizeOfX * sizeof (EFI_UGA_PIXEL)\r
- );\r
- }\r
- }\r
- //\r
- // Show progress by drawing blocks\r
- //\r
- for (Index = PreviousValue; Index < BlockNum; Index++) {\r
- PosX = Index * BlockWidth;\r
- if (GraphicsOutput != NULL) {\r
- Status = GraphicsOutput->Blt (\r
- GraphicsOutput,\r
- &ProgressColor,\r
- EfiBltVideoFill,\r
- 0,\r
- 0,\r
- PosX,\r
- PosY,\r
- BlockWidth - 1,\r
- BlockHeight,\r
- (BlockWidth) * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
- );\r
- } else {\r
- Status = UgaDraw->Blt (\r
- UgaDraw,\r
- (EFI_UGA_PIXEL *) &ProgressColor,\r
- EfiUgaVideoFill,\r
- 0,\r
- 0,\r
- PosX,\r
- PosY,\r
- BlockWidth - 1,\r
- BlockHeight,\r
- (BlockWidth) * sizeof (EFI_UGA_PIXEL)\r
- );\r
- }\r
- }\r
-\r
- PrintXY (\r
- (SizeOfX - StrLen (Title) * GLYPH_WIDTH) / 2,\r
- PosY - GLYPH_HEIGHT - 1,\r
- &TitleForeground,\r
- &TitleBackground,\r
- Title\r
- );\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-BdsMemoryTest (\r
- IN EXTENDMEM_COVERAGE_LEVEL Level\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Perform the memory test base on the memory test intensive level, \r
- and update the memory resource.\r
-\r
-Arguments:\r
- \r
- Level - The memory test intensive level.\r
-\r
-Returns: \r
- \r
- EFI_STATUS - Success test all the system memory and update\r
- the memory resource\r
- \r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_STATUS InitStatus;\r
- EFI_STATUS KeyStatus;\r
- EFI_STATUS ReturnStatus;\r
- BOOLEAN RequireSoftECCInit;\r
- EFI_GENERIC_MEMORY_TEST_PROTOCOL *GenMemoryTest;\r
- UINT64 TestedMemorySize;\r
- UINT64 TotalMemorySize;\r
- UINTN TestPercent;\r
- UINT64 PreviousValue;\r
- BOOLEAN ErrorOut;\r
- BOOLEAN TestAbort;\r
- EFI_INPUT_KEY Key;\r
- CHAR16 StrPercent[16];\r
- CHAR16 *StrTotalMemory;\r
- CHAR16 *Pos;\r
- CHAR16 *TmpStr;\r
- EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground;\r
- EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background;\r
- EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color;\r
- UINT8 Value;\r
- UINTN DataSize;\r
-\r
- ReturnStatus = EFI_SUCCESS;\r
- ZeroMem (&Key, sizeof (EFI_INPUT_KEY));\r
-\r
- Pos = AllocatePool (128);\r
-\r
- if (Pos == NULL) {\r
- return ReturnStatus;\r
- }\r
-\r
- StrTotalMemory = Pos;\r
-\r
- TestedMemorySize = 0;\r
- TotalMemorySize = 0;\r
- PreviousValue = 0;\r
- ErrorOut = FALSE;\r
- TestAbort = FALSE;\r
-\r
- SetMem (&Foreground, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff);\r
- SetMem (&Background, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0x0);\r
- SetMem (&Color, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff);\r
-\r
- RequireSoftECCInit = FALSE;\r
-\r
- gST->ConOut->ClearScreen (gST->ConOut);\r
- gST->ConOut->SetAttribute (gST->ConOut, EFI_YELLOW | EFI_BRIGHT);\r
- gST->ConOut->EnableCursor (gST->ConOut, FALSE);\r
-\r
- Status = gBS->LocateProtocol (\r
- &gEfiGenericMemTestProtocolGuid,\r
- NULL,\r
- (VOID**)&GenMemoryTest\r
- );\r
- if (EFI_ERROR (Status)) {\r
- gBS->FreePool (Pos);\r
- return EFI_SUCCESS;\r
- }\r
-\r
- InitStatus = GenMemoryTest->MemoryTestInit (\r
- GenMemoryTest,\r
- Level,\r
- &RequireSoftECCInit\r
- );\r
- if (InitStatus == EFI_NO_MEDIA) {\r
- //\r
- // The PEI codes also have the relevant memory test code to check the memory,\r
- // it can select to test some range of the memory or all of them. If PEI code\r
- // checks all the memory, this BDS memory test will has no not-test memory to\r
- // do the test, and then the status of EFI_NO_MEDIA will be returned by\r
- // "MemoryTestInit". So it does not need to test memory again, just return.\r
- //\r
- gBS->FreePool (Pos);\r
- return EFI_SUCCESS;\r
- }\r
-\r
- gST->ConOut->SetCursorPosition (gST->ConOut, 0, 2);\r
- TmpStr = GetStringById (STRING_TOKEN (STR_ESC_TO_SKIP_MEM_TEST));\r
-\r
- if (TmpStr != NULL) {\r
- gST->ConOut->OutputString (gST->ConOut, TmpStr);\r
- gBS->FreePool (TmpStr);\r
- }\r
-\r
- do {\r
- Status = GenMemoryTest->PerformMemoryTest (\r
- GenMemoryTest,\r
- &TestedMemorySize,\r
- &TotalMemorySize,\r
- &ErrorOut,\r
- TestAbort\r
- );\r
- if (ErrorOut && (Status == EFI_DEVICE_ERROR)) {\r
- TmpStr = GetStringById (STRING_TOKEN (STR_SYSTEM_MEM_ERROR));\r
- if (TmpStr != NULL) {\r
- PrintXY (10, 10, NULL, NULL, TmpStr);\r
- gST->ConOut->SetCursorPosition (gST->ConOut, 0, 4);\r
- gST->ConOut->OutputString (gST->ConOut, TmpStr);\r
- gBS->FreePool (TmpStr);\r
- }\r
-\r
- ASSERT (0);\r
- }\r
-\r
- TestPercent = (UINTN) DivU64x32 (\r
- DivU64x32 (MultU64x32 (TestedMemorySize, 100), 16),\r
- (UINTN)DivU64x32 (TotalMemorySize, 16)\r
- );\r
- if (TestPercent != PreviousValue) {\r
- UnicodeValueToString (StrPercent, 0, TestPercent, 0);\r
- gST->ConOut->SetCursorPosition (gST->ConOut, 0, 0);\r
- TmpStr = GetStringById (STRING_TOKEN (STR_MEMORY_TEST_PERCENT));\r
- if (TmpStr != NULL) {\r
- BdsLibOutputStrings (gST->ConOut, StrPercent, TmpStr, NULL);\r
- gBS->FreePool (TmpStr);\r
- }\r
-\r
- TmpStr = GetStringById (STRING_TOKEN (STR_PERFORM_MEM_TEST));\r
- if (TmpStr != NULL) {\r
- PlatformBdsShowProgress (\r
- Foreground,\r
- Background,\r
- TmpStr,\r
- Color,\r
- TestPercent,\r
- (UINTN) PreviousValue\r
- );\r
- gBS->FreePool (TmpStr);\r
- }\r
- }\r
-\r
- PreviousValue = TestPercent;\r
-\r
- KeyStatus = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
- if (Key.ScanCode == SCAN_ESC) {\r
- if (!RequireSoftECCInit) {\r
- TmpStr = GetStringById (STRING_TOKEN (STR_PERFORM_MEM_TEST));\r
- if (TmpStr != NULL) {\r
- PlatformBdsShowProgress (\r
- Foreground,\r
- Background,\r
- TmpStr,\r
- Color,\r
- 100,\r
- (UINTN) PreviousValue\r
- );\r
- gBS->FreePool (TmpStr);\r
- }\r
-\r
- gST->ConOut->SetCursorPosition (gST->ConOut, 0, 0);\r
- gST->ConOut->OutputString (gST->ConOut, L"100");\r
- Status = GenMemoryTest->Finished (GenMemoryTest);\r
- goto Done;\r
- }\r
-\r
- TestAbort = TRUE;\r
- }\r
- } while (Status != EFI_NOT_FOUND);\r
-\r
- Status = GenMemoryTest->Finished (GenMemoryTest);\r
-\r
-Done:\r
- UnicodeValueToString (StrTotalMemory, COMMA_TYPE, (UINTN) TotalMemorySize, 0);\r
- if (StrTotalMemory[0] == L',') {\r
- StrTotalMemory++;\r
- }\r
-\r
- TmpStr = GetStringById (STRING_TOKEN (STR_MEM_TEST_COMPLETED));\r
- if (TmpStr != NULL) {\r
- StrCat (StrTotalMemory, TmpStr);\r
- gBS->FreePool (TmpStr);\r
- }\r
-\r
- gST->ConOut->ClearScreen (gST->ConOut);\r
- gST->ConOut->SetAttribute (gST->ConOut, EFI_YELLOW | EFI_BRIGHT);\r
- gST->ConOut->EnableCursor (gST->ConOut, FALSE);\r
- gST->ConOut->OutputString (gST->ConOut, StrTotalMemory);\r
- PlatformBdsShowProgress (\r
- Foreground,\r
- Background,\r
- StrTotalMemory,\r
- Color,\r
- 100,\r
- (UINTN) PreviousValue\r
- );\r
-\r
- gBS->FreePool (Pos);\r
-\r
- DataSize = sizeof (Value);\r
- Status = gRT->GetVariable (\r
- L"BootState",\r
- &gEfiBootStateGuid,\r
- NULL,\r
- &DataSize,\r
- &Value\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- Value = 1;\r
- gRT->SetVariable (\r
- L"BootState",\r
- &gEfiBootStateGuid,\r
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
- sizeof (Value),\r
- &Value\r
- );\r
- }\r
-\r
- return ReturnStatus;\r
-}\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- string.c\r
-\r
-Abstract:\r
-\r
- String support\r
-\r
-Revision History\r
-\r
---*/\r
-\r
-#include "Bds.h"\r
-#include "String.h"\r
-#include "Language.h"\r
-\r
-extern UINT8 BdsStrings[];\r
-\r
-EFI_GUID gBdsStringPackGuid = { 0x7bac95d3, 0xddf, 0x42f3, {0x9e, 0x24, 0x7c, 0x64, 0x49, 0x40, 0x37, 0x9a} };\r
-\r
-EFI_HII_HANDLE gStringPackHandle;\r
-EFI_HII_PROTOCOL *Hii;\r
-\r
-EFI_STATUS\r
-InitializeStringSupport (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Initialize HII global accessor for string support\r
-\r
-Arguments:\r
- None\r
-\r
-Returns:\r
- String from ID.\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_HII_PACKAGES *PackageList;\r
- //\r
- // There should only ever be one HII protocol\r
- //\r
- Status = gBS->LocateProtocol (\r
- &gEfiHiiProtocolGuid,\r
- NULL,\r
- (VOID**)&Hii\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- PackageList = PreparePackages (1, &gBdsStringPackGuid, BdsStrings);\r
- Status = Hii->NewPack (Hii, PackageList, &gStringPackHandle);\r
- gBS->FreePool (PackageList);\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-CHAR16 *\r
-GetStringById (\r
- IN STRING_REF Id\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Get string by string id from HII Interface\r
-\r
-Arguments:\r
-\r
- Id - String ID.\r
- \r
-Returns:\r
-\r
- CHAR16 * - String from ID.\r
- NULL - If error occurs.\r
-\r
---*/\r
-{\r
- CHAR16 *String;\r
- UINTN StringLength;\r
- EFI_STATUS Status;\r
-\r
- //\r
- // Set default string size assumption at no more than 256 bytes\r
- //\r
- StringLength = 0x100;\r
-\r
- String = AllocateZeroPool (StringLength);\r
- if (String == NULL) {\r
- //\r
- // If this happens, we are oh-so-dead, but return a NULL in any case.\r
- //\r
- return NULL;\r
- }\r
- //\r
- // Get the current string for the current Language\r
- //\r
- Status = Hii->GetString (Hii, gStringPackHandle, Id, FALSE, NULL, &StringLength, String);\r
- if (EFI_ERROR (Status)) {\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- //\r
- // Free the old pool\r
- //\r
- gBS->FreePool (String);\r
-\r
- //\r
- // Allocate new pool with correct value\r
- //\r
- String = AllocatePool (StringLength);\r
- ASSERT (String != NULL);\r
-\r
- Status = Hii->GetString (Hii, gStringPackHandle, Id, FALSE, NULL, &StringLength, String);\r
- if (!EFI_ERROR (Status)) {\r
- return String;\r
- }\r
- }\r
-\r
- return NULL;\r
- }\r
-\r
- return String;\r
-}\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- string.h\r
-\r
-Abstract:\r
- \r
- String support\r
-\r
-Revision History\r
-\r
---*/\r
-\r
-#ifndef _STRING_H_\r
-#define _STRING_H_\r
-\r
-//\r
-// This is the VFR compiler generated header file which defines the\r
-// string identifiers.\r
-//\r
-#include "BdsStrDefs.h"\r
-\r
-//\r
-// String Definition Guid for BDS Platform\r
-//\r
-#define EFI_BDS_PLATFORM_GUID \\r
- { \\r
- 0x7777E939, 0xD57E, 0x4DCB, {0xA0, 0x8E, 0x64, 0xD7, 0x98, 0x57, 0x1E, 0x0F } \\r
- }\r
-\r
-extern EFI_HII_HANDLE gStringPackHandle;\r
-extern EFI_HII_PROTOCOL *Hii;\r
-\r
-CHAR16 *\r
-GetStringById (\r
- IN STRING_REF Id\r
- );\r
-\r
-EFI_STATUS\r
-InitializeStringSupport (\r
- VOID\r
- );\r
-\r
-EFI_STATUS\r
-CallFrontPage (\r
- VOID\r
- );\r
-\r
-#endif // _STRING_H_\r
-<?xml version="1.0" encoding="UTF-8"?>\r
-<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0">\r
- <MsaHeader>\r
- <ModuleName>Bds</ModuleName>\r
- <ModuleType>DXE_DRIVER</ModuleType>\r
- <GuidValue>f392b762-8985-11db-be87-0040d02b1835</GuidValue>\r
- <Version>1.0</Version>\r
- <Abstract>Platfrom BDS driver</Abstract>\r
- <Description>\r
- Do platform action customized by IBV/OEM.\r
- </Description>\r
- <Copyright>Copyright (c) 2006, Intel Corporation</Copyright>\r
- <License>All rights reserved. This program and the accompanying materials\r
- are licensed and made available under the terms and conditions of the BSD License\r
- which accompanies this distribution. The full text of the license may be found at\r
- http://opensource.org/licenses/bsd-license.php\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.</License>\r
- <Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052</Specification>\r
- </MsaHeader>\r
- <ModuleDefinitions>\r
- <SupportedArchitectures>IA32 X64 IPF EBC</SupportedArchitectures>\r
- <BinaryModule>false</BinaryModule>\r
- <OutputFileBasename>Bds</OutputFileBasename>\r
- </ModuleDefinitions>\r
- <LibraryClassDefinitions>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>DebugLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>UefiLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>UefiDriverEntryPoint</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>BaseLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>EdkGraphicsLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>DxeServicesTableLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>PerformanceLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>PrintLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>EdkIfrSupportLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>ReportStatusCodeLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>HobLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>EdkGenericBdsLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>MemoryAllocationLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>BaseMemoryLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>UefiBootServicesTableLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>UefiRuntimeServicesTableLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>DevicePathLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>HiiLib</Keyword>\r
- </LibraryClass>\r
- </LibraryClassDefinitions>\r
- <SourceFiles>\r
- <Filename>PlatformData.c</Filename>\r
- <Filename>BdsPlatform.h</Filename>\r
- <Filename>BdsPlatform.c</Filename>\r
- <Filename>Generic/Bds.h</Filename>\r
- <Filename>Generic/BdsEntry.c</Filename>\r
- <Filename>Generic/FrontPage.h</Filename>\r
- <Filename>Generic/FrontPage.c</Filename>\r
- <Filename>Generic/FrontPageStrings.uni</Filename>\r
- <Filename>Generic/FrontPageVfr.Vfr</Filename>\r
- <Filename>Generic/Language.h</Filename>\r
- <Filename>Generic/Language.c</Filename>\r
- <Filename>Generic/String.h</Filename>\r
- <Filename>Generic/String.c</Filename>\r
- <Filename>Generic/Strings.uni</Filename>\r
- <Filename>Generic/Capsules.c</Filename>\r
- <Filename>Generic/MemoryTest.c</Filename>\r
- <Filename>Generic/BootMaint/BmString.uni</Filename>\r
- <Filename>Generic/BootMaint/Bm.vfr</Filename>\r
- <Filename>Generic/BootMaint/BBSsupport.h</Filename>\r
- <Filename>Generic/BootMaint/BootMaint.h</Filename>\r
- <Filename>Generic/BootMaint/FormGuid.h</Filename>\r
- <Filename>Generic/BootMaint/BmLib.c</Filename>\r
- <Filename>Generic/BootMaint/BootOption.c</Filename>\r
- <Filename>Generic/BootMaint/ConsoleOption.c</Filename>\r
- <Filename>Generic/BootMaint/Data.c</Filename>\r
- <Filename>Generic/BootMaint/Variable.c</Filename>\r
- <Filename>Generic/BootMaint/UpdatePage.c</Filename>\r
- <Filename>Generic/BootMaint/BBSsupport.c</Filename>\r
- <Filename>Generic/BootMaint/BootMaint.c</Filename>\r
- <Filename>Generic/BootMaint/FileExplorer.c</Filename>\r
- <Filename>Generic/BootMaint/FE.vfr</Filename>\r
- <Filename>Generic/BootMngr/BootManager.h</Filename>\r
- <Filename>Generic/BootMngr/BootManager.c</Filename>\r
- <Filename>Generic/BootMngr/BootManagerStrings.uni</Filename>\r
- <Filename>Generic/BootMngr/BootManagerVfr.Vfr</Filename>\r
- <Filename>Generic/DeviceMngr/DeviceManager.h</Filename>\r
- <Filename>Generic/DeviceMngr/DeviceManager.c</Filename>\r
- <Filename>Generic/DeviceMngr/DeviceManagerStrings.uni</Filename>\r
- <Filename>Generic/DeviceMngr/DeviceManagerVfr.Vfr</Filename>\r
- <Filename>Generic/Bds.dxs</Filename>\r
- </SourceFiles>\r
- <PackageDependencies>\r
- <Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>\r
- <Package PackageGuid="68169ab0-d41b-4009-9060-292c253ac43d"/>\r
- <Package PackageGuid="f2805c44-8985-11db-9e98-0040d02b1835"/>\r
- </PackageDependencies>\r
- <Protocols>\r
- <Protocol Usage="ALWAYS_PRODUCED">\r
- <ProtocolCName>gEfiBdsArchProtocolGuid</ProtocolCName>\r
- </Protocol>\r
- <Protocol Usage="ALWAYS_CONSUMED">\r
- <ProtocolCName>gEfiLegacyBiosProtocolGuid</ProtocolCName>\r
- </Protocol>\r
- <Protocol Usage="ALWAYS_CONSUMED">\r
- <ProtocolCName>gEfiUgaSplashProtocolGuid</ProtocolCName>\r
- </Protocol>\r
- <Protocol Usage="ALWAYS_CONSUMED">\r
- <ProtocolCName>gEfiHiiProtocolGuid</ProtocolCName>\r
- </Protocol>\r
- <Protocol Usage="ALWAYS_CONSUMED">\r
- <ProtocolCName>gEfiFormCallbackProtocolGuid</ProtocolCName>\r
- </Protocol>\r
- <Protocol Usage="ALWAYS_CONSUMED">\r
- <ProtocolCName>gEfiDataHubProtocolGuid</ProtocolCName>\r
- </Protocol>\r
- <Protocol Usage="ALWAYS_CONSUMED">\r
- <ProtocolCName>gEfiFormBrowserProtocolGuid</ProtocolCName>\r
- </Protocol>\r
- <Protocol Usage="ALWAYS_CONSUMED">\r
- <ProtocolCName>gEfiConsoleControlProtocolGuid</ProtocolCName>\r
- </Protocol>\r
- <Protocol Usage="ALWAYS_CONSUMED">\r
- <ProtocolCName>gEfiCpuIoProtocolGuid</ProtocolCName>\r
- </Protocol>\r
- <Protocol Usage="ALWAYS_CONSUMED">\r
- <ProtocolCName>gEfiUgaDrawProtocolGuid</ProtocolCName>\r
- </Protocol>\r
- <Protocol Usage="ALWAYS_CONSUMED">\r
- <ProtocolCName>gEfiLoadFileProtocolGuid</ProtocolCName>\r
- </Protocol>\r
- <Protocol Usage="ALWAYS_CONSUMED">\r
- <ProtocolCName>gEfiSimpleFileSystemProtocolGuid</ProtocolCName>\r
- </Protocol>\r
- <Protocol Usage="ALWAYS_CONSUMED">\r
- <ProtocolCName>gEfiDevicePathProtocolGuid</ProtocolCName>\r
- </Protocol>\r
- <Protocol Usage="ALWAYS_CONSUMED">\r
- <ProtocolCName>gEfiBlockIoProtocolGuid</ProtocolCName>\r
- </Protocol>\r
- <Protocol Usage="ALWAYS_CONSUMED">\r
- <ProtocolCName>gEfiSerialIoProtocolGuid</ProtocolCName>\r
- </Protocol>\r
- <Protocol Usage="ALWAYS_CONSUMED">\r
- <ProtocolCName>gEfiGenericMemTestProtocolGuid</ProtocolCName>\r
- </Protocol>\r
- <Protocol Usage="SOMETIMES_CONSUMED">\r
- <ProtocolCName>gEfiCpuArchProtocolGuid</ProtocolCName>\r
- </Protocol>\r
- <Protocol Usage="SOMETIMES_CONSUMED">\r
- <ProtocolCName>gEfiDriverBindingProtocolGuid</ProtocolCName>\r
- </Protocol>\r
- </Protocols>\r
- <DataHubs>\r
- <DataHubRecord Usage="SOMETIMES_CONSUMED">\r
- <DataHubCName>BiosVendor</DataHubCName>\r
- </DataHubRecord>\r
- <DataHubRecord Usage="SOMETIMES_CONSUMED">\r
- <DataHubCName>SystemManufacturer</DataHubCName>\r
- </DataHubRecord>\r
- <DataHubRecord Usage="SOMETIMES_CONSUMED">\r
- <DataHubCName>ProcessorVersion</DataHubCName>\r
- </DataHubRecord>\r
- <DataHubRecord Usage="SOMETIMES_CONSUMED">\r
- <DataHubCName>ProcessorFrequency</DataHubCName>\r
- </DataHubRecord>\r
- <DataHubRecord Usage="SOMETIMES_CONSUMED">\r
- <DataHubCName>MemoryArray</DataHubCName>\r
- </DataHubRecord>\r
- <DataHubRecord Usage="SOMETIMES_CONSUMED">\r
- <DataHubCName>SerialIoDevice</DataHubCName>\r
- </DataHubRecord>\r
- <DataHubRecord Usage="SOMETIMES_CONSUMED">\r
- <DataHubCName>SerialIoPort</DataHubCName>\r
- </DataHubRecord>\r
- </DataHubs>\r
- <Guids>\r
- <GuidCNames Usage="ALWAYS_CONSUMED">\r
- <GuidCName>gEfiBootStateGuid</GuidCName>\r
- </GuidCNames>\r
- <GuidCNames Usage="ALWAYS_CONSUMED">\r
- <GuidCName>gEfiGlobalVariableGuid</GuidCName>\r
- </GuidCNames>\r
- <GuidCNames Usage="ALWAYS_CONSUMED">\r
- <GuidCName>gEfiFlashMapHobGuid</GuidCName>\r
- </GuidCNames>\r
- <GuidCNames Usage="ALWAYS_CONSUMED">\r
- <GuidCName>gEfiFileSystemVolumeLabelInfoIdGuid</GuidCName>\r
- </GuidCNames>\r
- <GuidCNames Usage="ALWAYS_CONSUMED">\r
- <GuidCName>gEfiFileInfoGuid</GuidCName>\r
- </GuidCNames>\r
- </Guids>\r
- <Externs>\r
- <Specification>EFI_SPECIFICATION_VERSION 0x00020000</Specification>\r
- <Specification>EDK_RELEASE_VERSION 0x00020000</Specification>\r
- <Extern>\r
- <ModuleEntryPoint>BdsInitialize</ModuleEntryPoint>\r
- </Extern>\r
- </Externs>\r
-</ModuleSurfaceArea>
+<?xml version="1.0" encoding="UTF-8"?>
+<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <MsaHeader>
+ <ModuleName>Bds</ModuleName>
+ <ModuleType>DXE_DRIVER</ModuleType>
+ <GuidValue>f392b762-8985-11db-be87-0040d02b1835</GuidValue>
+ <Version>1.0</Version>
+ <Abstract>Platfrom BDS driver</Abstract>
+ <Description>Do platform action customized by IBV/OEM.</Description>
+ <Copyright>Copyright (c) 2006, Intel Corporation</Copyright>
+ <License>All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.</License>
+ <Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052</Specification>
+ </MsaHeader>
+ <ModuleDefinitions>
+ <SupportedArchitectures>IA32 X64 IPF EBC</SupportedArchitectures>
+ <BinaryModule>false</BinaryModule>
+ <OutputFileBasename>Bds</OutputFileBasename>
+ </ModuleDefinitions>
+ <LibraryClassDefinitions>
+ <LibraryClass Usage="ALWAYS_CONSUMED">
+ <Keyword>DebugLib</Keyword>
+ </LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">
+ <Keyword>UefiLib</Keyword>
+ </LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">
+ <Keyword>UefiDriverEntryPoint</Keyword>
+ </LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">
+ <Keyword>BaseLib</Keyword>
+ </LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">
+ <Keyword>EdkGraphicsLib</Keyword>
+ </LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">
+ <Keyword>DxeServicesTableLib</Keyword>
+ </LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">
+ <Keyword>PerformanceLib</Keyword>
+ </LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">
+ <Keyword>PrintLib</Keyword>
+ </LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">
+ <Keyword>EdkIfrSupportLib</Keyword>
+ </LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">
+ <Keyword>ReportStatusCodeLib</Keyword>
+ </LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">
+ <Keyword>HobLib</Keyword>
+ </LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">
+ <Keyword>EdkGenericBdsLib</Keyword>
+ </LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">
+ <Keyword>MemoryAllocationLib</Keyword>
+ </LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">
+ <Keyword>BaseMemoryLib</Keyword>
+ </LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">
+ <Keyword>UefiBootServicesTableLib</Keyword>
+ </LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">
+ <Keyword>UefiRuntimeServicesTableLib</Keyword>
+ </LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">
+ <Keyword>DevicePathLib</Keyword>
+ </LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">
+ <Keyword>HiiLib</Keyword>
+ </LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">
+ <Keyword>EdkGenericPlatformBdsLib</Keyword>
+ </LibraryClass>
+ </LibraryClassDefinitions>
+ <SourceFiles>
+ <Filename>PlatformData.c</Filename>
+ <Filename>BdsPlatform.h</Filename>
+ <Filename>BdsPlatform.c</Filename>
+ <Filename>Bds.dxs</Filename>
+ </SourceFiles>
+ <PackageDependencies>
+ <Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
+ <Package PackageGuid="68169ab0-d41b-4009-9060-292c253ac43d"/>
+ <Package PackageGuid="f2805c44-8985-11db-9e98-0040d02b1835"/>
+ </PackageDependencies>
+ <Protocols>
+ <Protocol Usage="ALWAYS_PRODUCED">
+ <ProtocolCName>gEfiBdsArchProtocolGuid</ProtocolCName>
+ </Protocol>
+ <Protocol Usage="ALWAYS_CONSUMED">
+ <ProtocolCName>gEfiLegacyBiosProtocolGuid</ProtocolCName>
+ </Protocol>
+ <Protocol Usage="ALWAYS_CONSUMED">
+ <ProtocolCName>gEfiUgaSplashProtocolGuid</ProtocolCName>
+ </Protocol>
+ <Protocol Usage="ALWAYS_CONSUMED">
+ <ProtocolCName>gEfiHiiProtocolGuid</ProtocolCName>
+ </Protocol>
+ <Protocol Usage="ALWAYS_CONSUMED">
+ <ProtocolCName>gEfiFormCallbackProtocolGuid</ProtocolCName>
+ </Protocol>
+ <Protocol Usage="ALWAYS_CONSUMED">
+ <ProtocolCName>gEfiDataHubProtocolGuid</ProtocolCName>
+ </Protocol>
+ <Protocol Usage="ALWAYS_CONSUMED">
+ <ProtocolCName>gEfiFormBrowserProtocolGuid</ProtocolCName>
+ </Protocol>
+ <Protocol Usage="ALWAYS_CONSUMED">
+ <ProtocolCName>gEfiConsoleControlProtocolGuid</ProtocolCName>
+ </Protocol>
+ <Protocol Usage="ALWAYS_CONSUMED">
+ <ProtocolCName>gEfiCpuIoProtocolGuid</ProtocolCName>
+ </Protocol>
+ <Protocol Usage="ALWAYS_CONSUMED">
+ <ProtocolCName>gEfiUgaDrawProtocolGuid</ProtocolCName>
+ </Protocol>
+ <Protocol Usage="ALWAYS_CONSUMED">
+ <ProtocolCName>gEfiLoadFileProtocolGuid</ProtocolCName>
+ </Protocol>
+ <Protocol Usage="ALWAYS_CONSUMED">
+ <ProtocolCName>gEfiSimpleFileSystemProtocolGuid</ProtocolCName>
+ </Protocol>
+ <Protocol Usage="ALWAYS_CONSUMED">
+ <ProtocolCName>gEfiDevicePathProtocolGuid</ProtocolCName>
+ </Protocol>
+ <Protocol Usage="ALWAYS_CONSUMED">
+ <ProtocolCName>gEfiBlockIoProtocolGuid</ProtocolCName>
+ </Protocol>
+ <Protocol Usage="ALWAYS_CONSUMED">
+ <ProtocolCName>gEfiSerialIoProtocolGuid</ProtocolCName>
+ </Protocol>
+ <Protocol Usage="ALWAYS_CONSUMED">
+ <ProtocolCName>gEfiGenericMemTestProtocolGuid</ProtocolCName>
+ </Protocol>
+ <Protocol Usage="SOMETIMES_CONSUMED">
+ <ProtocolCName>gEfiCpuArchProtocolGuid</ProtocolCName>
+ </Protocol>
+ <Protocol Usage="SOMETIMES_CONSUMED">
+ <ProtocolCName>gEfiDriverBindingProtocolGuid</ProtocolCName>
+ </Protocol>
+ <Protocol Usage="ALWAYS_CONSUMED">
+ <ProtocolCName>gEfiUnixThunkProtocolGuid</ProtocolCName>
+ </Protocol>
+ <Protocol Usage="ALWAYS_CONSUMED">
+ <ProtocolCName>gEfiUnixIoProtocolGuid</ProtocolCName>
+ </Protocol>
+ <Protocol Usage="ALWAYS_CONSUMED">
+ <ProtocolCName>gEfiUnixUgaIoProtocolGuid</ProtocolCName>
+ </Protocol>
+ </Protocols>
+ <DataHubs>
+ <DataHubRecord Usage="SOMETIMES_CONSUMED">
+ <DataHubCName>BiosVendor</DataHubCName>
+ </DataHubRecord>
+ <DataHubRecord Usage="SOMETIMES_CONSUMED">
+ <DataHubCName>SystemManufacturer</DataHubCName>
+ </DataHubRecord>
+ <DataHubRecord Usage="SOMETIMES_CONSUMED">
+ <DataHubCName>ProcessorVersion</DataHubCName>
+ </DataHubRecord>
+ <DataHubRecord Usage="SOMETIMES_CONSUMED">
+ <DataHubCName>ProcessorFrequency</DataHubCName>
+ </DataHubRecord>
+ <DataHubRecord Usage="SOMETIMES_CONSUMED">
+ <DataHubCName>MemoryArray</DataHubCName>
+ </DataHubRecord>
+ <DataHubRecord Usage="SOMETIMES_CONSUMED">
+ <DataHubCName>SerialIoDevice</DataHubCName>
+ </DataHubRecord>
+ <DataHubRecord Usage="SOMETIMES_CONSUMED">
+ <DataHubCName>SerialIoPort</DataHubCName>
+ </DataHubRecord>
+ </DataHubs>
+ <Guids>
+ <GuidCNames Usage="ALWAYS_CONSUMED">
+ <GuidCName>gEfiBootStateGuid</GuidCName>
+ </GuidCNames>
+ <GuidCNames Usage="ALWAYS_CONSUMED">
+ <GuidCName>gEfiGlobalVariableGuid</GuidCName>
+ </GuidCNames>
+ <GuidCNames Usage="ALWAYS_CONSUMED">
+ <GuidCName>gEfiFlashMapHobGuid</GuidCName>
+ </GuidCNames>
+ <GuidCNames Usage="ALWAYS_CONSUMED">
+ <GuidCName>gEfiFileSystemVolumeLabelInfoIdGuid</GuidCName>
+ </GuidCNames>
+ <GuidCNames Usage="ALWAYS_CONSUMED">
+ <GuidCName>gEfiFileInfoGuid</GuidCName>
+ </GuidCNames>
+ </Guids>
+ <Externs>
+ <Specification>EFI_SPECIFICATION_VERSION 0x00020000</Specification>
+ <Specification>EDK_RELEASE_VERSION 0x00020000</Specification>
+ <Extern>
+ <ModuleEntryPoint>BdsInitialize</ModuleEntryPoint>
+ </Extern>
+ </Externs>
+</ModuleSurfaceArea>
\ No newline at end of file
\r
--*/\r
\r
-#include "Generic/Bds.h"\r
#include "BdsPlatform.h"\r
\r
//\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- BdsLib.h\r
-\r
-Abstract:\r
-\r
- BDS library definition, include the file and data structure\r
-\r
---*/\r
-\r
-#ifndef _BDS_LIB_H_\r
-#define _BDS_LIB_H_\r
-\r
-extern EFI_HANDLE mBdsImageHandle;\r
-\r
-//\r
-// Constants which are variable names used to access variables\r
-//\r
-#define VarLegacyDevOrder L"LegacyDevOrder"\r
-\r
-//\r
-// Data structures and defines\r
-//\r
-#define FRONT_PAGE_QUESTION_ID 0x0000\r
-#define FRONT_PAGE_DATA_WIDTH 0x01\r
-\r
-//\r
-// ConnectType\r
-//\r
-#define CONSOLE_OUT 0x00000001\r
-#define STD_ERROR 0x00000002\r
-#define CONSOLE_IN 0x00000004\r
-#define CONSOLE_ALL (CONSOLE_OUT | CONSOLE_IN | STD_ERROR)\r
-\r
-//\r
-// Load Option Attributes defined in EFI Specification\r
-//\r
-#define LOAD_OPTION_ACTIVE 0x00000001\r
-#define LOAD_OPTION_FORCE_RECONNECT 0x00000002\r
-#define IS_LOAD_OPTION_TYPE(_c, _Mask) (BOOLEAN) (((_c) & (_Mask)) != 0)\r
-\r
-//\r
-// Define Maxmim characters that will be accepted\r
-//\r
-#define MAX_CHAR 480\r
-#define MAX_CHAR_SIZE (MAX_CHAR * 2)\r
-\r
-#define MIN_ALIGNMENT_SIZE 4\r
-#define ALIGN_SIZE(a) ((a % MIN_ALIGNMENT_SIZE) ? MIN_ALIGNMENT_SIZE - (a % MIN_ALIGNMENT_SIZE) : 0)\r
-\r
-//\r
-// Define maximum characters for boot option variable "BootXXXX"\r
-//\r
-#define BOOT_OPTION_MAX_CHAR 10\r
-\r
-//\r
-// This data structure is the part of BDS_CONNECT_ENTRY that we can hard code.\r
-//\r
-#define BDS_LOAD_OPTION_SIGNATURE EFI_SIGNATURE_32 ('B', 'd', 'C', 'O')\r
-\r
-typedef struct {\r
-\r
- UINTN Signature;\r
- LIST_ENTRY Link;\r
-\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
-\r
- CHAR16 *OptionName;\r
- UINTN OptionNumber;\r
- UINT16 BootCurrent;\r
- UINT32 Attribute;\r
- CHAR16 *Description;\r
- VOID *LoadOptions;\r
- UINT32 LoadOptionsSize;\r
-\r
-} BDS_COMMON_OPTION;\r
-\r
-typedef struct {\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- UINTN ConnectType;\r
-} BDS_CONSOLE_CONNECT_ENTRY;\r
-\r
-//\r
-// Lib Functions\r
-//\r
-\r
-//\r
-// Bds boot relate lib functions\r
-//\r
-EFI_STATUS\r
-BdsLibUpdateBootOrderList (\r
- IN LIST_ENTRY *BdsOptionList,\r
- IN CHAR16 *VariableName\r
- );\r
-\r
-VOID\r
-BdsLibBootNext (\r
- VOID\r
- );\r
-\r
-EFI_STATUS\r
-BdsLibBootViaBootOption (\r
- IN BDS_COMMON_OPTION * Option,\r
- IN EFI_DEVICE_PATH_PROTOCOL * DevicePath,\r
- OUT UINTN *ExitDataSize,\r
- OUT CHAR16 **ExitData OPTIONAL\r
- );\r
-\r
-EFI_STATUS\r
-BdsLibEnumerateAllBootOption (\r
- IN OUT LIST_ENTRY *BdsBootOptionList\r
- );\r
-\r
-VOID\r
-BdsLibBuildOptionFromHandle (\r
- IN EFI_HANDLE Handle,\r
- IN LIST_ENTRY *BdsBootOptionList\r
- );\r
-\r
-VOID\r
-BdsLibBuildOptionFromShell (\r
- IN EFI_HANDLE Handle,\r
- IN LIST_ENTRY *BdsBootOptionList\r
- );\r
-\r
-//\r
-// Bds misc lib functions\r
-//\r
-UINT16\r
-BdsLibGetTimeout (\r
- VOID\r
- );\r
-\r
-EFI_STATUS\r
-BdsLibGetBootMode (\r
- OUT EFI_BOOT_MODE *BootMode\r
- );\r
-\r
-VOID\r
-BdsLibLoadDrivers (\r
- IN LIST_ENTRY *BdsDriverLists\r
- );\r
-\r
-EFI_STATUS\r
-BdsLibBuildOptionFromVar (\r
- IN LIST_ENTRY *BdsCommonOptionList,\r
- IN CHAR16 *VariableName\r
- );\r
-\r
-VOID *\r
-BdsLibGetVariableAndSize (\r
- IN CHAR16 *Name,\r
- IN EFI_GUID *VendorGuid,\r
- OUT UINTN *VariableSize\r
- );\r
-\r
-EFI_STATUS\r
-BdsLibOutputStrings (\r
- IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *ConOut,\r
- ...\r
- );\r
-\r
-BDS_COMMON_OPTION *\r
-BdsLibVariableToOption (\r
- IN OUT LIST_ENTRY *BdsCommonOptionList,\r
- IN CHAR16 *VariableName\r
- );\r
-\r
-EFI_STATUS\r
-BdsLibRegisterNewOption (\r
- IN LIST_ENTRY *BdsOptionList,\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
- IN CHAR16 *String,\r
- IN CHAR16 *VariableName\r
- );\r
-\r
-//\r
-// Bds connect or disconnect driver lib funcion\r
-//\r
-VOID\r
-BdsLibConnectAllDriversToAllControllers (\r
- VOID\r
- );\r
-\r
-VOID\r
-BdsLibConnectAll (\r
- VOID\r
- );\r
-\r
-EFI_STATUS\r
-BdsLibConnectDevicePath (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePathToConnect\r
- );\r
-\r
-EFI_STATUS\r
-BdsLibConnectAllEfi (\r
- VOID\r
- );\r
-\r
-EFI_STATUS\r
-BdsLibDisconnectAllEfi (\r
- VOID\r
- );\r
-\r
-//\r
-// Bds console relate lib functions\r
-//\r
-VOID\r
-BdsLibConnectAllConsoles (\r
- VOID\r
- );\r
-\r
-EFI_STATUS\r
-BdsLibConnectAllDefaultConsoles (\r
- VOID\r
- );\r
-\r
-EFI_STATUS\r
-BdsLibUpdateConsoleVariable (\r
- IN CHAR16 *ConVarName,\r
- IN EFI_DEVICE_PATH_PROTOCOL *CustomizedConDevicePath,\r
- IN EFI_DEVICE_PATH_PROTOCOL *ExclusiveDevicePath\r
- );\r
-\r
-EFI_STATUS\r
-BdsLibConnectConsoleVariable (\r
- IN CHAR16 *ConVarName\r
- );\r
-\r
-//\r
-// Bds device path relate lib functions\r
-//\r
-EFI_DEVICE_PATH_PROTOCOL *\r
-BdsLibUnpackDevicePath (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevPath\r
- );\r
-\r
-VOID\r
-BdsLibSafeFreePool (\r
- IN VOID *Buffer\r
- );\r
-\r
-EFI_DEVICE_PATH_PROTOCOL *\r
-BdsLibDelPartMatchInstance (\r
- IN EFI_DEVICE_PATH_PROTOCOL *Multi,\r
- IN EFI_DEVICE_PATH_PROTOCOL *Single\r
- );\r
-\r
-BOOLEAN\r
-BdsLibMatchDevicePaths (\r
- IN EFI_DEVICE_PATH_PROTOCOL *Multi,\r
- IN EFI_DEVICE_PATH_PROTOCOL *Single\r
- );\r
-\r
-CHAR16 *\r
-DevicePathToStr (\r
- EFI_DEVICE_PATH_PROTOCOL *DevPath\r
- );\r
-\r
-VOID *\r
-EfiLibGetVariable (\r
- IN CHAR16 *Name,\r
- IN EFI_GUID *VendorGuid\r
- );\r
-\r
-//\r
-// Internal definitions\r
-//\r
-typedef struct {\r
- CHAR16 *str;\r
- UINTN len;\r
- UINTN maxlen;\r
-} POOL_PRINT;\r
-\r
-typedef struct {\r
- UINT8 Type;\r
- UINT8 SubType;\r
- VOID (*Function) (POOL_PRINT *, VOID *);\r
-} DEVICE_PATH_STRING_TABLE;\r
-\r
-//\r
-// Internal functions\r
-//\r
-EFI_STATUS\r
-BdsBootByDiskSignatureAndPartition (\r
- IN BDS_COMMON_OPTION * Option,\r
- IN HARDDRIVE_DEVICE_PATH * HardDriveDevicePath,\r
- IN UINT32 LoadOptionsSize,\r
- IN VOID *LoadOptions,\r
- OUT UINTN *ExitDataSize,\r
- OUT CHAR16 **ExitData OPTIONAL\r
- );\r
-\r
-//\r
-// Notes: EFI 64 shadow all option rom\r
-//\r
-#ifdef EFI64\r
-#define EFI64_SHADOW_ALL_LEGACY_ROM() ShadowAllOptionRom ();\r
-VOID\r
-ShadowAllOptionRom();\r
-#else\r
-#define EFI64_SHADOW_ALL_LEGACY_ROM()\r
-#endif\r
-\r
-//\r
-// BBS support macros and functions\r
-//\r
-#ifdef EFI32\r
-#define REFRESH_LEGACY_BOOT_OPTIONS \\r
- BdsDeleteAllInvalidLegacyBootOptions ();\\r
- BdsAddNonExistingLegacyBootOptions (); \\r
- BdsUpdateLegacyDevOrder ()\r
-#else\r
-#define REFRESH_LEGACY_BOOT_OPTIONS\r
-#endif\r
-\r
-EFI_STATUS\r
-BdsDeleteAllInvalidLegacyBootOptions (\r
- VOID\r
- );\r
-\r
-EFI_STATUS\r
-BdsAddNonExistingLegacyBootOptions (\r
- VOID\r
- );\r
-\r
-EFI_STATUS\r
-BdsUpdateLegacyDevOrder (\r
- VOID\r
- );\r
-\r
-EFI_STATUS\r
-BdsRefreshBbsTableForBoot (\r
- IN BDS_COMMON_OPTION *Entry\r
- );\r
-\r
-EFI_STATUS\r
-BdsDeleteBootOption (\r
- IN UINTN OptionNumber,\r
- IN OUT UINT16 *BootOrder,\r
- IN OUT UINTN *BootOrderSize\r
- );\r
-\r
-//\r
-//The interface functions relate with Setup Browser Reset Reminder feature\r
-//\r
-VOID\r
-EnableResetReminderFeature (\r
- VOID\r
- );\r
-\r
-VOID\r
-DisableResetReminderFeature (\r
- VOID\r
- );\r
-\r
-VOID\r
-EnableResetRequired (\r
- VOID\r
- );\r
-\r
-VOID\r
-DisableResetRequired (\r
- VOID\r
- );\r
-\r
-BOOLEAN\r
-IsResetReminderFeatureEnable (\r
- VOID\r
- );\r
-\r
-BOOLEAN\r
-IsResetRequired (\r
- VOID\r
- );\r
-\r
-VOID\r
-SetupResetReminder (\r
- VOID\r
- );\r
- \r
-EFI_STATUS\r
-BdsLibGetHiiHandles (\r
- IN EFI_HII_PROTOCOL *Hii,\r
- IN OUT UINT16 *HandleBufferLength,\r
- OUT EFI_HII_HANDLE **HiiHandles\r
- );\r
-\r
-#endif // _BDS_LIB_H_\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- BdsBoot.c\r
-\r
-Abstract:\r
-\r
- BDS Lib functions which relate with create or process the boot\r
- option.\r
-\r
---*/\r
-#include "Performance.h"\r
-\r
-BOOLEAN mEnumBootDevice = FALSE;\r
-\r
-EFI_STATUS\r
-BdsLibDoLegacyBoot (\r
- IN BDS_COMMON_OPTION *Option\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Boot the legacy system with the boot option\r
-\r
-Arguments:\r
-\r
- Option - The legacy boot option which have BBS device path\r
-\r
-Returns:\r
-\r
- EFI_UNSUPPORTED - There is no legacybios protocol, do not support\r
- legacy boot.\r
- \r
- EFI_STATUS - Return the status of LegacyBios->LegacyBoot ().\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_LEGACY_BIOS_PROTOCOL *LegacyBios;\r
-\r
- Status = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL,
- (void **)&LegacyBios);\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // If no LegacyBios protocol we do not support legacy boot\r
- //\r
- return EFI_UNSUPPORTED;\r
- }\r
- //\r
- // Notes: if we seperate the int 19, then we don't need to refresh BBS\r
- //\r
- BdsRefreshBbsTableForBoot (Option);\r
-\r
- //\r
- // Write boot to OS performance data to a file\r
- //\r
- PERF_CODE (\r
- WriteBootToOsPerformanceData ();\r
- );\r
-\r
-\r
- DEBUG ((EFI_D_INFO | EFI_D_LOAD, "Legacy Boot: %S\n", Option->Description));\r
- return LegacyBios->LegacyBoot (\r
- LegacyBios,\r
- (BBS_BBS_DEVICE_PATH *) Option->DevicePath,\r
- Option->LoadOptionsSize,\r
- Option->LoadOptions\r
- );\r
-}\r
-\r
-EFI_STATUS\r
-BdsLibBootViaBootOption (\r
- IN BDS_COMMON_OPTION * Option,\r
- IN EFI_DEVICE_PATH_PROTOCOL * DevicePath,\r
- OUT UINTN *ExitDataSize,\r
- OUT CHAR16 **ExitData OPTIONAL\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Process the boot option follow the EFI 1.1 specification and \r
- special treat the legacy boot option with BBS_DEVICE_PATH.\r
-\r
-Arguments:\r
-\r
- Option - The boot option need to be processed\r
- \r
- DevicePath - The device path which describe where to load \r
- the boot image or the legcy BBS device path \r
- to boot the legacy OS\r
-\r
- ExitDataSize - Returned directly from gBS->StartImage ()\r
-\r
- ExitData - Returned directly from gBS->StartImage ()\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - Status from gBS->StartImage (),\r
- or BdsBootByDiskSignatureAndPartition ()\r
-\r
- EFI_NOT_FOUND - If the Device Path is not found in the system\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_HANDLE Handle;\r
- EFI_HANDLE ImageHandle;\r
- EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *FilePath;\r
- EFI_LOADED_IMAGE_PROTOCOL *ImageInfo;\r
- EFI_ACPI_S3_SAVE_PROTOCOL *AcpiS3Save;\r
- EFI_BLOCK_IO_PROTOCOL *BlkIo;\r
- VOID *Buffer;\r
-\r
- *ExitDataSize = 0;\r
- *ExitData = NULL;\r
-\r
- //\r
- // Notes: put EFI64 ROM Shadow Solution\r
- //\r
- EFI64_SHADOW_ALL_LEGACY_ROM ();\r
-\r
- //\r
- // Notes: this code can be remove after the s3 script table\r
- // hook on the event EFI_EVENT_SIGNAL_READY_TO_BOOT or\r
- // EFI_EVENT_SIGNAL_LEGACY_BOOT\r
- //\r
- Status = gBS->LocateProtocol (&gEfiAcpiS3SaveProtocolGuid, NULL,
- (VOID **)&AcpiS3Save);\r
- if (!EFI_ERROR (Status)) {\r
- AcpiS3Save->S3Save (AcpiS3Save, NULL);\r
- }\r
- //\r
- // If it's Device Path that starts with a hard drive path,\r
- // this routine will do the booting.\r
- //\r
- Status = BdsBootByDiskSignatureAndPartition (\r
- Option,\r
- (HARDDRIVE_DEVICE_PATH *) DevicePath,\r
- Option->LoadOptionsSize,\r
- Option->LoadOptions,\r
- ExitDataSize,\r
- ExitData\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- //\r
- // If we found a disk signature and partition device path return success\r
- //\r
- return EFI_SUCCESS;\r
- }\r
-\r
- EfiSignalEventReadyToBoot ();\r
-\r
- //\r
- // Set Boot Current\r
- //\r
- gRT->SetVariable (\r
- L"BootCurrent",\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
- sizeof (UINT16),\r
- &Option->BootCurrent\r
- );\r
-\r
- if ((DevicePathType (Option->DevicePath) == BBS_DEVICE_PATH) &&\r
- (DevicePathSubType (Option->DevicePath) == BBS_BBS_DP)\r
- ) {\r
- //\r
- // Check to see if we should legacy BOOT. If yes then do the legacy boot\r
- //\r
- return BdsLibDoLegacyBoot (Option);\r
- }\r
-\r
- DEBUG ((EFI_D_INFO | EFI_D_LOAD, "Booting EFI 1.1 way %S\n", Option->Description));\r
-\r
- Status = gBS->LoadImage (\r
- TRUE,\r
- mBdsImageHandle,\r
- DevicePath,\r
- NULL,\r
- 0,\r
- &ImageHandle\r
- );\r
-\r
- //\r
- // If we didn't find an image, we may need to load the default\r
- // boot behavior for the device.\r
- //\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // Find a Simple File System protocol on the device path. If the remaining\r
- // device path is set to end then no Files are being specified, so try\r
- // the removable media file name.\r
- //\r
- TempDevicePath = DevicePath;\r
- Status = gBS->LocateDevicePath (\r
- &gEfiSimpleFileSystemProtocolGuid,\r
- &TempDevicePath,\r
- &Handle\r
- );\r
- if (!EFI_ERROR (Status) && IsDevicePathEnd (TempDevicePath)) {\r
- FilePath = FileDevicePath (Handle, EFI_REMOVABLE_MEDIA_FILE_NAME);\r
- if (FilePath) {\r
- //\r
- // Issue a dummy read to the device to check for media change.\r
- // When the removable media is changed, any Block IO read/write will\r
- // cause the BlockIo protocol be reinstalled and EFI_MEDIA_CHANGED is\r
- // returned. After the Block IO protocol is reinstalled, subsequent\r
- // Block IO read/write will success.\r
- //\r
- Status = gBS->HandleProtocol (\r
- Handle,\r
- &gEfiBlockIoProtocolGuid,\r
- (VOID **) &BlkIo\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- Buffer = AllocatePool (BlkIo->Media->BlockSize);\r
- if (Buffer != NULL) {\r
- BlkIo->ReadBlocks (\r
- BlkIo,\r
- BlkIo->Media->MediaId,\r
- 0,\r
- BlkIo->Media->BlockSize,\r
- Buffer\r
- );\r
- gBS->FreePool (Buffer);\r
- }\r
- }\r
-\r
- Status = gBS->LoadImage (\r
- TRUE,\r
- mBdsImageHandle,\r
- FilePath,\r
- NULL,\r
- 0,\r
- &ImageHandle\r
- );\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // The DevicePath failed, and it's not a valid\r
- // removable media device.\r
- //\r
- goto Done;\r
- }\r
- }\r
- } else {\r
- Status = EFI_NOT_FOUND;\r
- }\r
- }\r
-\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // It there is any error from the Boot attempt exit now.\r
- //\r
- goto Done;\r
- }\r
- //\r
- // Provide the image with it's load options\r
- //\r
- Status = gBS->HandleProtocol (ImageHandle, &gEfiLoadedImageProtocolGuid,
- (VOID **) &ImageInfo);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- if (Option->LoadOptionsSize != 0) {\r
- ImageInfo->LoadOptionsSize = Option->LoadOptionsSize;\r
- ImageInfo->LoadOptions = Option->LoadOptions;\r
- }\r
- //\r
- // Before calling the image, enable the Watchdog Timer for\r
- // the 5 Minute period\r
- //\r
- gBS->SetWatchdogTimer (5 * 60, 0x0000, 0x00, NULL);\r
-\r
- Status = gBS->StartImage (ImageHandle, ExitDataSize, ExitData);\r
- DEBUG ((EFI_D_INFO | EFI_D_LOAD, "Image Return Status = %r\n", Status));\r
-\r
- //\r
- // Clear the Watchdog Timer after the image returns\r
- //\r
- gBS->SetWatchdogTimer (0x0000, 0x0000, 0x0000, NULL);\r
-\r
-Done:\r
- //\r
- // Clear Boot Current\r
- //\r
- gRT->SetVariable (\r
- L"BootCurrent",\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
- 0,\r
- &Option->BootCurrent\r
- );\r
-\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-BdsBootByDiskSignatureAndPartition (\r
- IN BDS_COMMON_OPTION * Option,\r
- IN HARDDRIVE_DEVICE_PATH * HardDriveDevicePath,\r
- IN UINT32 LoadOptionsSize,\r
- IN VOID *LoadOptions,\r
- OUT UINTN *ExitDataSize,\r
- OUT CHAR16 **ExitData OPTIONAL\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Check to see if a hard ware device path was passed in. If it was then search\r
- all the block IO devices for the passed in hard drive device path. \r
- \r
-Arguments:\r
-\r
- Option - The current processing boot option.\r
-\r
- HardDriveDevicePath - EFI Device Path to boot, if it starts with a hard\r
- drive device path.\r
-\r
- LoadOptionsSize - Passed into gBS->StartImage ()\r
- via the loaded image protocol.\r
-\r
- LoadOptions - Passed into gBS->StartImage ()\r
- via the loaded image protocol.\r
-\r
- ExitDataSize - returned directly from gBS->StartImage ()\r
-\r
- ExitData - returned directly from gBS->StartImage ()\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - Status from gBS->StartImage (),\r
- or BootByDiskSignatureAndPartition ()\r
- \r
- EFI_NOT_FOUND - If the Device Path is not found in the system\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- UINTN BlockIoHandleCount;\r
- EFI_HANDLE *BlockIoBuffer;\r
- EFI_DEVICE_PATH_PROTOCOL *BlockIoDevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *BlockIoHdDevicePath;\r
- HARDDRIVE_DEVICE_PATH *TmpHdPath;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;\r
- UINTN Index;\r
- BOOLEAN DevicePathMatch;\r
- HARDDRIVE_DEVICE_PATH *TempPath;\r
-\r
- *ExitDataSize = 0;\r
- *ExitData = NULL;\r
-\r
- if ( !((DevicePathType (&HardDriveDevicePath->Header) == MEDIA_DEVICE_PATH) &&\r
- (DevicePathSubType (&HardDriveDevicePath->Header) == MEDIA_HARDDRIVE_DP))\r
- ) {\r
- //\r
- // If the HardDriveDevicePath does not start with a Hard Drive Device Path\r
- // exit.\r
- //\r
- return EFI_NOT_FOUND;\r
- }\r
- //\r
- // The boot device have already been connected\r
- //\r
- Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiBlockIoProtocolGuid, NULL, &BlockIoHandleCount, &BlockIoBuffer);\r
- if (EFI_ERROR (Status) || BlockIoHandleCount == 0) {\r
- //\r
- // If there was an error or there are no device handles that support\r
- // the BLOCK_IO Protocol, then return.\r
- //\r
- return EFI_NOT_FOUND;\r
- }\r
- //\r
- // Loop through all the device handles that support the BLOCK_IO Protocol\r
- //\r
- for (Index = 0; Index < BlockIoHandleCount; Index++) {\r
-\r
- Status = gBS->HandleProtocol (BlockIoBuffer[Index], &gEfiDevicePathProtocolGuid, (VOID *) &BlockIoDevicePath);\r
- if (EFI_ERROR (Status) || BlockIoDevicePath == NULL) {\r
- continue;\r
- }\r
- //\r
- // Make PreviousDevicePath == the device path node before the end node\r
- //\r
- DevicePath = BlockIoDevicePath;\r
- BlockIoHdDevicePath = NULL;\r
-\r
- //\r
- // find HardDriver device path node\r
- //\r
- while (!IsDevicePathEnd (DevicePath)) {\r
- if ((DevicePathType (DevicePath) == MEDIA_DEVICE_PATH) && \r
- (DevicePathSubType (DevicePath) == MEDIA_HARDDRIVE_DP)\r
- ) {\r
- BlockIoHdDevicePath = DevicePath;\r
- break;\r
- }\r
-\r
- DevicePath = NextDevicePathNode (DevicePath);\r
- }\r
-\r
- if (BlockIoHdDevicePath == NULL) {\r
- continue;\r
- }\r
- //\r
- // See if the harddrive device path in blockio matches the orig Hard Drive Node\r
- //\r
- DevicePathMatch = FALSE;\r
-\r
- TmpHdPath = (HARDDRIVE_DEVICE_PATH *) BlockIoHdDevicePath;\r
- TempPath = (HARDDRIVE_DEVICE_PATH *) BdsLibUnpackDevicePath ((EFI_DEVICE_PATH_PROTOCOL *) HardDriveDevicePath);\r
-\r
- //\r
- // Only several fields will be checked. NOT whole NODE\r
- //\r
- if ( TmpHdPath->PartitionNumber == TempPath->PartitionNumber &&\r
- TmpHdPath->MBRType == TempPath->MBRType &&\r
- TmpHdPath->SignatureType == TempPath->SignatureType &&\r
- CompareGuid ((EFI_GUID *) TmpHdPath->Signature, (EFI_GUID *) TempPath->Signature)) {\r
- //\r
- // Get the matched device path\r
- //\r
- DevicePathMatch = TRUE;\r
- }\r
- //\r
- // Only do the boot, when devicepath match\r
- //\r
- if (DevicePathMatch) {\r
- //\r
- // Combine the Block IO and Hard Drive Device path together and try\r
- // to boot from it.\r
- //\r
- DevicePath = NextDevicePathNode ((EFI_DEVICE_PATH_PROTOCOL *) HardDriveDevicePath);\r
- NewDevicePath = AppendDevicePath (BlockIoDevicePath, DevicePath);\r
-\r
- //\r
- // Recursive boot with new device path\r
- //\r
- Status = BdsLibBootViaBootOption (Option, NewDevicePath, ExitDataSize, ExitData);\r
- if (!EFI_ERROR (Status)) {\r
- break;\r
- }\r
- }\r
- }\r
-\r
- gBS->FreePool (BlockIoBuffer);\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-BdsLibDeleteOptionFromHandle (\r
- IN EFI_HANDLE Handle\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Delete the boot option associated with the handle passed in\r
-\r
-Arguments:\r
-\r
- Handle - The handle which present the device path to create boot option\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - Delete the boot option success\r
-\r
- EFI_NOT_FOUND - If the Device Path is not found in the system\r
-\r
- EFI_OUT_OF_RESOURCES - Lack of memory resource\r
-\r
- Other - Error return value from SetVariable()\r
-\r
---*/\r
-{\r
- UINT16 *BootOrder;\r
- UINT8 *BootOptionVar;\r
- UINTN BootOrderSize;\r
- UINTN BootOptionSize;\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- UINT16 BootOption[BOOT_OPTION_MAX_CHAR];\r
- UINTN DevicePathSize;\r
- UINTN OptionDevicePathSize;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *OptionDevicePath;\r
- UINT8 *TempPtr;\r
- CHAR16 *Description;\r
-\r
- Status = EFI_SUCCESS;\r
- BootOrder = NULL;\r
- BootOrderSize = 0;\r
-\r
- BootOrder = BdsLibGetVariableAndSize (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- &BootOrderSize\r
- );\r
- if (NULL == BootOrder) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- DevicePath = DevicePathFromHandle (Handle);\r
- if (DevicePath == NULL) {\r
- return EFI_NOT_FOUND;\r
- }\r
- DevicePathSize = GetDevicePathSize (DevicePath);\r
-\r
- Index = 0;\r
- while (Index < BootOrderSize / sizeof (UINT16)) {\r
- UnicodeSPrint (BootOption, sizeof (BootOption), L"Boot%04x", BootOrder[Index]);\r
- BootOptionVar = BdsLibGetVariableAndSize (\r
- BootOption,\r
- &gEfiGlobalVariableGuid,\r
- &BootOptionSize\r
- );\r
- if (NULL == BootOptionVar) {\r
- gBS->FreePool (BootOrder);\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- TempPtr = BootOptionVar;\r
- TempPtr += sizeof (UINT32) + sizeof (UINT16);\r
- Description = (CHAR16 *) TempPtr;\r
- TempPtr += StrSize ((CHAR16 *) TempPtr);\r
- OptionDevicePath = (EFI_DEVICE_PATH_PROTOCOL *) TempPtr;\r
- OptionDevicePathSize = GetDevicePathSize (OptionDevicePath);\r
-\r
- //\r
- // Check whether the device path match\r
- //\r
- if ((OptionDevicePathSize == DevicePathSize) &&\r
- (CompareMem (DevicePath, OptionDevicePath, DevicePathSize) == 0)) {\r
- BdsDeleteBootOption (BootOrder[Index], BootOrder, &BootOrderSize);\r
- gBS->FreePool (BootOptionVar);\r
- break;\r
- }\r
-\r
- gBS->FreePool (BootOptionVar);\r
- Index++;\r
- }\r
-\r
- Status = gRT->SetVariable (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
- BootOrderSize,\r
- BootOrder\r
- );\r
-\r
- gBS->FreePool (BootOrder);\r
-\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-BdsDeleteAllInvalidEfiBootOption (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Delete all invalid EFI boot options. The probable invalid boot option could\r
- be Removable media or Network boot device.\r
-\r
-Arguments:\r
-\r
- VOID\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - Delete all invalid boot option success\r
-\r
- EFI_NOT_FOUND - Variable "BootOrder" is not found\r
-\r
- EFI_OUT_OF_RESOURCES - Lack of memory resource\r
-\r
- Other - Error return value from SetVariable()\r
-\r
---*/\r
-{\r
- UINT16 *BootOrder;\r
- UINT8 *BootOptionVar;\r
- UINTN BootOrderSize;\r
- UINTN BootOptionSize;\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- UINTN Index2;\r
- UINT16 BootOption[BOOT_OPTION_MAX_CHAR];\r
- UINTN OptionDevicePathSize;\r
- EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *LastDeviceNode;\r
- EFI_DEVICE_PATH_PROTOCOL *OptionDevicePath;\r
- UINT8 *TempPtr;\r
- CHAR16 *Description;\r
- EFI_HANDLE Handle;\r
- BOOLEAN NeedDelete;\r
-\r
- Status = EFI_SUCCESS;\r
- BootOrder = NULL;\r
- BootOrderSize = 0;\r
-\r
- BootOrder = BdsLibGetVariableAndSize (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- &BootOrderSize\r
- );\r
- if (NULL == BootOrder) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- Index = 0;\r
- while (Index < BootOrderSize / sizeof (UINT16)) {\r
- UnicodeSPrint (BootOption, sizeof (BootOption), L"Boot%04x", BootOrder[Index]);\r
- BootOptionVar = BdsLibGetVariableAndSize (\r
- BootOption,\r
- &gEfiGlobalVariableGuid,\r
- &BootOptionSize\r
- );\r
- if (NULL == BootOptionVar) {\r
- gBS->FreePool (BootOrder);\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- TempPtr = BootOptionVar;\r
- TempPtr += sizeof (UINT32) + sizeof (UINT16);\r
- Description = (CHAR16 *) TempPtr;\r
- TempPtr += StrSize ((CHAR16 *) TempPtr);\r
- OptionDevicePath = (EFI_DEVICE_PATH_PROTOCOL *) TempPtr;\r
- OptionDevicePathSize = GetDevicePathSize (OptionDevicePath);\r
-\r
- //\r
- // Skip legacy boot option (BBS boot device)\r
- //\r
- if ((DevicePathType (OptionDevicePath) == BBS_DEVICE_PATH) &&\r
- (DevicePathSubType (OptionDevicePath) == BBS_BBS_DP)) {\r
- gBS->FreePool (BootOptionVar);\r
- Index++;\r
- continue;\r
- }\r
-\r
- TempDevicePath = OptionDevicePath;\r
- LastDeviceNode = OptionDevicePath;\r
- while (!EfiIsDevicePathEnd (TempDevicePath)) {\r
- LastDeviceNode = TempDevicePath;\r
- TempDevicePath = EfiNextDevicePathNode (TempDevicePath);\r
- }\r
- //\r
- // Skip the boot option that point to a file, since the device path in \r
- // removable media boot option doesn't contains a file name.\r
- //\r
- if (((DevicePathType (LastDeviceNode) == MEDIA_DEVICE_PATH) &&\r
- (DevicePathSubType (LastDeviceNode) == MEDIA_FILEPATH_DP)) ||\r
- //\r
- // Skip boot option for internal Shell, it's always valid\r
- //\r
- (EfiGetNameGuidFromFwVolDevicePathNode ((MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) LastDeviceNode) != NULL)) {\r
- gBS->FreePool (BootOptionVar);\r
- Index++;\r
- continue;\r
- }\r
-\r
- NeedDelete = TRUE;\r
- //\r
- // Check if it's a valid boot option for removable media\r
- //\r
- TempDevicePath = OptionDevicePath;\r
- Status = gBS->LocateDevicePath (\r
- &gEfiSimpleFileSystemProtocolGuid,\r
- &TempDevicePath,\r
- &Handle\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- NeedDelete = FALSE;\r
- }\r
- //\r
- // Check if it's a valid boot option for network boot device\r
- //\r
- TempDevicePath = OptionDevicePath;\r
- Status = gBS->LocateDevicePath (\r
- &gEfiLoadFileProtocolGuid,\r
- &TempDevicePath,\r
- &Handle\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- NeedDelete = FALSE;\r
- }\r
-\r
- if (NeedDelete) {\r
- //\r
- // Delete this invalid boot option "Boot####"\r
- //\r
- Status = gRT->SetVariable (\r
- BootOption,\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
- 0,\r
- NULL\r
- );\r
- //\r
- // Mark this boot option in boot order as deleted\r
- //\r
- BootOrder[Index] = 0xffff;\r
- }\r
-\r
- gBS->FreePool (BootOptionVar);\r
- Index++;\r
- }\r
-\r
- //\r
- // Adjust boot order array\r
- //\r
- Index2 = 0;\r
- for (Index = 0; Index < BootOrderSize / sizeof (UINT16); Index++) {\r
- if (BootOrder[Index] != 0xffff) {\r
- BootOrder[Index2] = BootOrder[Index];\r
- Index2 ++;\r
- }\r
- }\r
- Status = gRT->SetVariable (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
- Index2 * sizeof (UINT16),\r
- BootOrder\r
- );\r
-\r
- gBS->FreePool (BootOrder);\r
-\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-BdsLibEnumerateAllBootOption (\r
- IN OUT LIST_ENTRY *BdsBootOptionList\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function will enumerate all possible boot device in the system,\r
- it will only excute once of every boot.\r
-\r
-Arguments:\r
-\r
- BdsBootOptionList - The header of the link list which indexed all\r
- current boot options\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - Finished all the boot device enumerate and create\r
- the boot option base on that boot device\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- UINT16 BootOptionNumber;\r
- UINTN NumberFileSystemHandles;\r
- EFI_HANDLE *FileSystemHandles;\r
- EFI_BLOCK_IO_PROTOCOL *BlkIo;\r
- UINTN Index;\r
- UINTN NumberLoadFileHandles;\r
- EFI_HANDLE *LoadFileHandles;\r
- VOID *ProtocolInstance;\r
- EFI_FIRMWARE_VOLUME_PROTOCOL *Fv;\r
- UINTN FvHandleCount;\r
- EFI_HANDLE *FvHandleBuffer;\r
- EFI_FV_FILETYPE Type;\r
- UINTN Size;\r
- EFI_FV_FILE_ATTRIBUTES Attributes;\r
- UINT32 AuthenticationStatus;\r
- EFI_DEVICE_PATH_PROTOCOL *FilePath;\r
- EFI_HANDLE ImageHandle;\r
- EFI_LOADED_IMAGE_PROTOCOL *ImageInfo;\r
- BOOLEAN NeedDelete;\r
-\r
- BootOptionNumber = 0;\r
-\r
- //\r
- // If the boot device enumerate happened, just get the boot\r
- // device from the boot order variable\r
- //\r
- if (mEnumBootDevice) {\r
- BdsLibBuildOptionFromVar (BdsBootOptionList, L"BootOrder");\r
- return EFI_SUCCESS;\r
- }\r
- //\r
- // Notes: this dirty code is to get the legacy boot option from the\r
- // BBS table and create to variable as the EFI boot option, it should\r
- // be removed after the CSM can provide legacy boot option directly\r
- //\r
- REFRESH_LEGACY_BOOT_OPTIONS;\r
-\r
- //\r
- // Delete invalid boot option\r
- //\r
- BdsDeleteAllInvalidEfiBootOption ();\r
- //\r
- // Parse removable media\r
- //\r
- gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- &gEfiSimpleFileSystemProtocolGuid,\r
- NULL,\r
- &NumberFileSystemHandles,\r
- &FileSystemHandles\r
- );\r
- for (Index = 0; Index < NumberFileSystemHandles; Index++) {\r
- Status = gBS->HandleProtocol (\r
- FileSystemHandles[Index],\r
- &gEfiBlockIoProtocolGuid,\r
- (VOID **) &BlkIo\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- if (!BlkIo->Media->RemovableMedia) {\r
- //\r
- // If the file system handle supports a BlkIo protocol,\r
- // skip the removable media devices\r
- //\r
- continue;\r
- }\r
- }\r
-\r
- //\r
- // Do the removable Media thing. \EFI\BOOT\boot{machinename}.EFI\r
- // machinename is ia32, ia64, x64, ...\r
- //\r
- FilePath = FileDevicePath (FileSystemHandles[Index], EFI_REMOVABLE_MEDIA_FILE_NAME);\r
- NeedDelete = TRUE;\r
- Status = gBS->LoadImage (\r
- TRUE,\r
- mBdsImageHandle,\r
- FilePath,\r
- NULL,\r
- 0,\r
- &ImageHandle\r
- );\r
- if (!EFI_ERROR(Status)) {\r
- //\r
- // Verify the image is a EFI application (and not a driver)\r
- //\r
- Status = gBS->HandleProtocol (ImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **) &ImageInfo);\r
- ASSERT (!EFI_ERROR(Status));\r
-\r
- if (ImageInfo->ImageCodeType == EfiLoaderCode) {\r
- NeedDelete = FALSE;\r
- }\r
- }\r
-\r
- if (NeedDelete) {\r
- //\r
- // No such file or the file is not a EFI application, delete this boot option\r
- //\r
- BdsLibDeleteOptionFromHandle (FileSystemHandles[Index]);\r
- } else {\r
- BdsLibBuildOptionFromHandle (FileSystemHandles[Index], BdsBootOptionList);\r
- BootOptionNumber++;\r
- }\r
- }\r
-\r
- if (NumberFileSystemHandles) {\r
- gBS->FreePool (FileSystemHandles);\r
- }\r
- //\r
- // Parse Network Boot Device\r
- //\r
- gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- &gEfiSimpleNetworkProtocolGuid,\r
- NULL,\r
- &NumberLoadFileHandles,\r
- &LoadFileHandles\r
- );\r
- for (Index = 0; Index < NumberLoadFileHandles; Index++) {\r
- Status = gBS->HandleProtocol (\r
- LoadFileHandles[Index],\r
- &gEfiLoadFileProtocolGuid,\r
- (VOID **) &ProtocolInstance\r
- );\r
- if (EFI_ERROR (Status)) {\r
- continue;\r
- }\r
-\r
- BdsLibBuildOptionFromHandle (LoadFileHandles[Index], BdsBootOptionList);\r
- BootOptionNumber++;\r
- }\r
-\r
- if (NumberLoadFileHandles) {\r
- gBS->FreePool (LoadFileHandles);\r
- }\r
- //\r
- // Check if we have on flash shell\r
- //\r
- gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- &gEfiFirmwareVolumeProtocolGuid,\r
- NULL,\r
- &FvHandleCount,\r
- &FvHandleBuffer\r
- );\r
- for (Index = 0; Index < FvHandleCount; Index++) {\r
- gBS->HandleProtocol (\r
- FvHandleBuffer[Index],\r
- &gEfiFirmwareVolumeProtocolGuid,\r
- (VOID **) &Fv\r
- );\r
-\r
- Status = Fv->ReadFile (\r
- Fv,\r
- &gEfiShellFileGuid,\r
- NULL,\r
- &Size,\r
- &Type,\r
- &Attributes,\r
- &AuthenticationStatus\r
- );\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // Skip if no shell file in the FV\r
- //\r
- continue;\r
- }\r
- //\r
- // Build the shell boot option\r
- //\r
- BdsLibBuildOptionFromShell (FvHandleBuffer[Index], BdsBootOptionList);\r
- BootOptionNumber++;\r
- }\r
-\r
- if (FvHandleCount) {\r
- gBS->FreePool (FvHandleBuffer);\r
- }\r
- //\r
- // Make sure every boot only have one time\r
- // boot device enumerate\r
- //\r
- BdsLibBuildOptionFromVar (BdsBootOptionList, L"BootOrder");\r
- mEnumBootDevice = TRUE;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-VOID\r
-BdsLibBuildOptionFromHandle (\r
- IN EFI_HANDLE Handle,\r
- IN LIST_ENTRY *BdsBootOptionList\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Build the boot option with the handle parsed in\r
- \r
-Arguments:\r
-\r
- Handle - The handle which present the device path to create boot option\r
- \r
- BdsBootOptionList - The header of the link list which indexed all current\r
- boot options\r
-\r
-Returns:\r
-\r
- VOID\r
-\r
---*/\r
-{\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- CHAR16 *TempString;\r
-\r
- DevicePath = DevicePathFromHandle (Handle);\r
- TempString = DevicePathToStr (DevicePath);\r
-\r
- //\r
- // Create and register new boot option\r
- //\r
- BdsLibRegisterNewOption (BdsBootOptionList, DevicePath, TempString, L"BootOrder");\r
-}\r
-\r
-VOID\r
-BdsLibBuildOptionFromShell (\r
- IN EFI_HANDLE Handle,\r
- IN OUT LIST_ENTRY *BdsBootOptionList\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Build the on flash shell boot option with the handle parsed in\r
- \r
-Arguments:\r
-\r
- Handle - The handle which present the device path to create on flash shell\r
- boot option\r
- \r
- BdsBootOptionList - The header of the link list which indexed all current\r
- boot options\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-{\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- MEDIA_FW_VOL_FILEPATH_DEVICE_PATH ShellNode;\r
-\r
- DevicePath = DevicePathFromHandle (Handle);\r
-\r
- //\r
- // Build the shell device path\r
- //\r
- EfiInitializeFwVolDevicepathNode (&ShellNode, &gEfiShellFileGuid);\r
- DevicePath = AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *) &ShellNode);\r
-\r
- //\r
- // Create and register the shell boot option\r
- //\r
- BdsLibRegisterNewOption (BdsBootOptionList, DevicePath, L"Internal EFI Shell", L"BootOrder");\r
-\r
-}\r
-\r
-VOID\r
-BdsLibBootNext (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Boot from the EFI1.1 spec defined "BootNext" variable\r
- \r
-Arguments:\r
-\r
- None\r
- \r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-{\r
- UINT16 *BootNext;\r
- UINTN BootNextSize;\r
- CHAR16 Buffer[20];\r
- BDS_COMMON_OPTION *BootOption;\r
- LIST_ENTRY TempList;\r
- UINTN ExitDataSize;\r
- CHAR16 *ExitData;\r
-\r
- //\r
- // Init the boot option name buffer and temp link list\r
- //\r
- InitializeListHead (&TempList);\r
- ZeroMem (Buffer, sizeof (Buffer));\r
-\r
- BootNext = BdsLibGetVariableAndSize (\r
- L"BootNext",\r
- &gEfiGlobalVariableGuid,\r
- &BootNextSize\r
- );\r
-\r
- //\r
- // Clear the boot next variable first\r
- //\r
- if (BootNext != NULL) {\r
- gRT->SetVariable (\r
- L"BootNext",\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
- 0,\r
- BootNext\r
- );\r
-\r
- //\r
- // Start to build the boot option and try to boot\r
- //\r
- UnicodeSPrint (Buffer, sizeof (Buffer), L"Boot%04x", *BootNext);\r
- BootOption = BdsLibVariableToOption (&TempList, Buffer);\r
- BdsLibConnectDevicePath (BootOption->DevicePath);\r
- BdsLibBootViaBootOption (BootOption, BootOption->DevicePath, &ExitDataSize, &ExitData);\r
- }\r
-\r
-}\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- BdsBoot.c\r
-\r
-Abstract:\r
-\r
- BDS Lib functions which relate with create or process the boot\r
- option.\r
-\r
---*/\r
-#include "Performance.h"\r
-\r
-BOOLEAN mEnumBootDevice = FALSE;\r
-\r
-EFI_STATUS\r
-BdsLibDoLegacyBoot (\r
- IN BDS_COMMON_OPTION *Option\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Boot the legacy system with the boot option\r
-\r
-Arguments:\r
-\r
- Option - The legacy boot option which have BBS device path\r
-\r
-Returns:\r
-\r
- EFI_UNSUPPORTED - There is no legacybios protocol, do not support\r
- legacy boot.\r
- \r
- EFI_STATUS - Return the status of LegacyBios->LegacyBoot ().\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_LEGACY_BIOS_PROTOCOL *LegacyBios;\r
-\r
- Status = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL,
- (void **)&LegacyBios);\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // If no LegacyBios protocol we do not support legacy boot\r
- //\r
- return EFI_UNSUPPORTED;\r
- }\r
- //\r
- // Notes: if we seperate the int 19, then we don't need to refresh BBS\r
- //\r
- BdsRefreshBbsTableForBoot (Option);\r
-\r
- //\r
- // Write boot to OS performance data to a file\r
- //\r
- PERF_CODE (\r
- WriteBootToOsPerformanceData ();\r
- );\r
-\r
-\r
- DEBUG ((EFI_D_INFO | EFI_D_LOAD, "Legacy Boot: %S\n", Option->Description));\r
- return LegacyBios->LegacyBoot (\r
- LegacyBios,\r
- (BBS_BBS_DEVICE_PATH *) Option->DevicePath,\r
- Option->LoadOptionsSize,\r
- Option->LoadOptions\r
- );\r
-}\r
-\r
-EFI_STATUS\r
-BdsLibBootViaBootOption (\r
- IN BDS_COMMON_OPTION * Option,\r
- IN EFI_DEVICE_PATH_PROTOCOL * DevicePath,\r
- OUT UINTN *ExitDataSize,\r
- OUT CHAR16 **ExitData OPTIONAL\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Process the boot option follow the EFI 1.1 specification and \r
- special treat the legacy boot option with BBS_DEVICE_PATH.\r
-\r
-Arguments:\r
-\r
- Option - The boot option need to be processed\r
- \r
- DevicePath - The device path which describe where to load \r
- the boot image or the legcy BBS device path \r
- to boot the legacy OS\r
-\r
- ExitDataSize - Returned directly from gBS->StartImage ()\r
-\r
- ExitData - Returned directly from gBS->StartImage ()\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - Status from gBS->StartImage (),\r
- or BdsBootByDiskSignatureAndPartition ()\r
-\r
- EFI_NOT_FOUND - If the Device Path is not found in the system\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_HANDLE Handle;\r
- EFI_HANDLE ImageHandle;\r
- EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *FilePath;\r
- EFI_LOADED_IMAGE_PROTOCOL *ImageInfo;\r
- EFI_ACPI_S3_SAVE_PROTOCOL *AcpiS3Save;\r
-\r
- *ExitDataSize = 0;\r
- *ExitData = NULL;\r
-\r
- //\r
- // Notes: put EFI64 ROM Shadow Solution\r
- //\r
- EFI64_SHADOW_ALL_LEGACY_ROM ();\r
-\r
- //\r
- // Notes: this code can be remove after the s3 script table\r
- // hook on the event EFI_EVENT_SIGNAL_READY_TO_BOOT or\r
- // EFI_EVENT_SIGNAL_LEGACY_BOOT\r
- //\r
- Status = gBS->LocateProtocol (&gEfiAcpiS3SaveProtocolGuid, NULL,
- (VOID **)&AcpiS3Save);\r
- if (!EFI_ERROR (Status)) {\r
- AcpiS3Save->S3Save (AcpiS3Save, NULL);\r
- }\r
- //\r
- // If it's Device Path that starts with a hard drive path,\r
- // this routine will do the booting.\r
- //\r
- Status = BdsBootByDiskSignatureAndPartition (\r
- Option,\r
- (HARDDRIVE_DEVICE_PATH *) DevicePath,\r
- Option->LoadOptionsSize,\r
- Option->LoadOptions,\r
- ExitDataSize,\r
- ExitData\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- //\r
- // If we found a disk signature and partition device path return success\r
- //\r
- return EFI_SUCCESS;\r
- }\r
-\r
- EfiSignalEventReadyToBoot ();\r
-\r
- //\r
- // Set Boot Current\r
- //\r
- gRT->SetVariable (\r
- L"BootCurrent",\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
- sizeof (UINT16),\r
- &Option->BootCurrent\r
- );\r
-\r
- if ((DevicePathType (Option->DevicePath) == BBS_DEVICE_PATH) &&\r
- (DevicePathSubType (Option->DevicePath) == BBS_BBS_DP)\r
- ) {\r
- //\r
- // Check to see if we should legacy BOOT. If yes then do the legacy boot\r
- //\r
- return BdsLibDoLegacyBoot (Option);\r
- }\r
-\r
- DEBUG ((EFI_D_INFO | EFI_D_LOAD, "Booting EFI 1.1 way %S\n", Option->Description));\r
-\r
- Status = gBS->LoadImage (\r
- TRUE,\r
- mBdsImageHandle,\r
- DevicePath,\r
- NULL,\r
- 0,\r
- &ImageHandle\r
- );\r
-\r
- //\r
- // If we didn't find an image, we may need to load the default\r
- // boot behavior for the device.\r
- //\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // Find a Simple File System protocol on the device path. If the remaining\r
- // device path is set to end then no Files are being specified, so try\r
- // the removable media file name.\r
- //\r
- TempDevicePath = DevicePath;\r
- Status = gBS->LocateDevicePath (\r
- &gEfiSimpleFileSystemProtocolGuid,\r
- &TempDevicePath,\r
- &Handle\r
- );\r
- if (!EFI_ERROR (Status) && IsDevicePathEnd (TempDevicePath)) {\r
- FilePath = FileDevicePath (Handle, EFI_REMOVABLE_MEDIA_FILE_NAME);\r
- if (FilePath) {\r
- Status = gBS->LoadImage (\r
- TRUE,\r
- mBdsImageHandle,\r
- FilePath,\r
- NULL,\r
- 0,\r
- &ImageHandle\r
- );\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // The DevicePath failed, and it's not a valid\r
- // removable media device.\r
- //\r
- goto Done;\r
- }\r
- }\r
- } else {\r
- Status = EFI_NOT_FOUND;\r
- }\r
- }\r
-\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // It there is any error from the Boot attempt exit now.\r
- //\r
- goto Done;\r
- }\r
- //\r
- // Provide the image with it's load options\r
- //\r
- Status = gBS->HandleProtocol (ImageHandle, &gEfiLoadedImageProtocolGuid,
- (VOID **) &ImageInfo);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- if (Option->LoadOptionsSize != 0) {\r
- ImageInfo->LoadOptionsSize = Option->LoadOptionsSize;\r
- ImageInfo->LoadOptions = Option->LoadOptions;\r
- }\r
- //\r
- // Before calling the image, enable the Watchdog Timer for\r
- // the 5 Minute period\r
- //\r
- gBS->SetWatchdogTimer (5 * 60, 0x0000, 0x00, NULL);\r
-\r
- Status = gBS->StartImage (ImageHandle, ExitDataSize, ExitData);\r
- DEBUG ((EFI_D_INFO | EFI_D_LOAD, "Image Return Status = %r\n", Status));\r
-\r
- //\r
- // Clear the Watchdog Timer after the image returns\r
- //\r
- gBS->SetWatchdogTimer (0x0000, 0x0000, 0x0000, NULL);\r
-\r
-Done:\r
- //\r
- // Clear Boot Current\r
- //\r
- gRT->SetVariable (\r
- L"BootCurrent",\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
- 0,\r
- &Option->BootCurrent\r
- );\r
-\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-BdsBootByDiskSignatureAndPartition (\r
- IN BDS_COMMON_OPTION * Option,\r
- IN HARDDRIVE_DEVICE_PATH * HardDriveDevicePath,\r
- IN UINT32 LoadOptionsSize,\r
- IN VOID *LoadOptions,\r
- OUT UINTN *ExitDataSize,\r
- OUT CHAR16 **ExitData OPTIONAL\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Check to see if a hard ware device path was passed in. If it was then search\r
- all the block IO devices for the passed in hard drive device path. \r
- \r
-Arguments:\r
-\r
- Option - The current processing boot option.\r
-\r
- HardDriveDevicePath - EFI Device Path to boot, if it starts with a hard\r
- drive device path.\r
-\r
- LoadOptionsSize - Passed into gBS->StartImage ()\r
- via the loaded image protocol.\r
-\r
- LoadOptions - Passed into gBS->StartImage ()\r
- via the loaded image protocol.\r
-\r
- ExitDataSize - returned directly from gBS->StartImage ()\r
-\r
- ExitData - returned directly from gBS->StartImage ()\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - Status from gBS->StartImage (),\r
- or BootByDiskSignatureAndPartition ()\r
- \r
- EFI_NOT_FOUND - If the Device Path is not found in the system\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- UINTN BlockIoHandleCount;\r
- EFI_HANDLE *BlockIoBuffer;\r
- EFI_DEVICE_PATH_PROTOCOL *BlockIoDevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *BlockIoHdDevicePath;\r
- HARDDRIVE_DEVICE_PATH *TmpHdPath;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;\r
- UINTN Index;\r
- BOOLEAN DevicePathMatch;\r
- HARDDRIVE_DEVICE_PATH *TempPath;\r
-\r
- *ExitDataSize = 0;\r
- *ExitData = NULL;\r
-\r
- if ( !((DevicePathType (&HardDriveDevicePath->Header) == MEDIA_DEVICE_PATH) &&\r
- (DevicePathSubType (&HardDriveDevicePath->Header) == MEDIA_HARDDRIVE_DP))\r
- ) {\r
- //\r
- // If the HardDriveDevicePath does not start with a Hard Drive Device Path\r
- // exit.\r
- //\r
- return EFI_NOT_FOUND;\r
- }\r
- //\r
- // The boot device have already been connected\r
- //\r
- Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiBlockIoProtocolGuid, NULL, &BlockIoHandleCount, &BlockIoBuffer);\r
- if (EFI_ERROR (Status) || BlockIoHandleCount == 0) {\r
- //\r
- // If there was an error or there are no device handles that support\r
- // the BLOCK_IO Protocol, then return.\r
- //\r
- return EFI_NOT_FOUND;\r
- }\r
- //\r
- // Loop through all the device handles that support the BLOCK_IO Protocol\r
- //\r
- for (Index = 0; Index < BlockIoHandleCount; Index++) {\r
-\r
- Status = gBS->HandleProtocol (BlockIoBuffer[Index], &gEfiDevicePathProtocolGuid, (VOID *) &BlockIoDevicePath);\r
- if (EFI_ERROR (Status) || BlockIoDevicePath == NULL) {\r
- continue;\r
- }\r
- //\r
- // Make PreviousDevicePath == the device path node before the end node\r
- //\r
- DevicePath = BlockIoDevicePath;\r
- BlockIoHdDevicePath = NULL;\r
-\r
- //\r
- // find HardDriver device path node\r
- //\r
- while (!IsDevicePathEnd (DevicePath)) {\r
- if ((DevicePathType (DevicePath) == MEDIA_DEVICE_PATH) && \r
- (DevicePathSubType (DevicePath) == MEDIA_HARDDRIVE_DP)\r
- ) {\r
- BlockIoHdDevicePath = DevicePath;\r
- break;\r
- }\r
-\r
- DevicePath = NextDevicePathNode (DevicePath);\r
- }\r
-\r
- if (BlockIoHdDevicePath == NULL) {\r
- continue;\r
- }\r
- //\r
- // See if the harddrive device path in blockio matches the orig Hard Drive Node\r
- //\r
- DevicePathMatch = FALSE;\r
-\r
- TmpHdPath = (HARDDRIVE_DEVICE_PATH *) BlockIoHdDevicePath;\r
- TempPath = (HARDDRIVE_DEVICE_PATH *) BdsLibUnpackDevicePath ((EFI_DEVICE_PATH_PROTOCOL *) HardDriveDevicePath);\r
-\r
- //\r
- // Only several fields will be checked. NOT whole NODE\r
- //\r
- if ( TmpHdPath->PartitionNumber == TempPath->PartitionNumber &&\r
- TmpHdPath->MBRType == TempPath->MBRType &&\r
- TmpHdPath->SignatureType == TempPath->SignatureType &&\r
- CompareGuid ((EFI_GUID *) TmpHdPath->Signature, (EFI_GUID *) TempPath->Signature)) {\r
- //\r
- // Get the matched device path\r
- //\r
- DevicePathMatch = TRUE;\r
- }\r
- //\r
- // Only do the boot, when devicepath match\r
- //\r
- if (DevicePathMatch) {\r
- //\r
- // Combine the Block IO and Hard Drive Device path together and try\r
- // to boot from it.\r
- //\r
- DevicePath = NextDevicePathNode ((EFI_DEVICE_PATH_PROTOCOL *) HardDriveDevicePath);\r
- NewDevicePath = AppendDevicePath (BlockIoDevicePath, DevicePath);\r
-\r
- //\r
- // Recursive boot with new device path\r
- //\r
- Status = BdsLibBootViaBootOption (Option, NewDevicePath, ExitDataSize, ExitData);\r
- if (!EFI_ERROR (Status)) {\r
- break;\r
- }\r
- }\r
- }\r
-\r
- gBS->FreePool (BlockIoBuffer);\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-BdsLibEnumerateAllBootOption (\r
- IN OUT LIST_ENTRY *BdsBootOptionList\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function will enumerate all possible boot device in the system,\r
- it will only excute once of every boot.\r
-\r
-Arguments:\r
-\r
- BdsBootOptionList - The header of the link list which indexed all\r
- current boot options\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - Finished all the boot device enumerate and create\r
- the boot option base on that boot device\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- UINT16 BootOptionNumber;\r
- UINTN NumberFileSystemHandles;\r
- EFI_HANDLE *FileSystemHandles;\r
- UINTN NumberBlkIoHandles;\r
- EFI_HANDLE *BlkIoHandles;\r
- EFI_BLOCK_IO_PROTOCOL *BlkIo;\r
- UINTN Index;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- UINTN NumberLoadFileHandles;\r
- EFI_HANDLE *LoadFileHandles;\r
- VOID *ProtocolInstance;\r
- EFI_FIRMWARE_VOLUME_PROTOCOL *Fv;\r
- UINTN FvHandleCount;\r
- EFI_HANDLE *FvHandleBuffer;\r
- EFI_FV_FILETYPE Type;\r
- UINTN Size;\r
- EFI_FV_FILE_ATTRIBUTES Attributes;\r
- UINT32 AuthenticationStatus;\r
-\r
- BootOptionNumber = 0;\r
-\r
- //\r
- // If the boot device enumerate happened, just get the boot\r
- // device from the boot order variable\r
- //\r
- if (mEnumBootDevice) {\r
- BdsLibBuildOptionFromVar (BdsBootOptionList, L"BootOrder");\r
- return EFI_SUCCESS;\r
- }\r
- //\r
- // Notes: this dirty code is to get the legacy boot option from the\r
- // BBS table and create to variable as the EFI boot option, it should\r
- // be removed after the CSM can provide legacy boot option directly\r
- //\r
- REFRESH_LEGACY_BOOT_OPTIONS;\r
-\r
- //\r
- // Check all the block IO to create boot option\r
- //\r
- gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- &gEfiBlockIoProtocolGuid,\r
- NULL,\r
- &NumberBlkIoHandles,\r
- &BlkIoHandles\r
- );\r
- for (Index = 0; Index < NumberBlkIoHandles; Index++) {\r
- Status = gBS->HandleProtocol (\r
- BlkIoHandles[Index],\r
- &gEfiBlockIoProtocolGuid,\r
- (VOID **) &BlkIo\r
- );\r
- if (EFI_ERROR (Status)) {\r
- continue;\r
- }\r
-\r
- if (!BlkIo->Media->RemovableMedia) {\r
- //\r
- // Skip fixed Media device on first loop interration\r
- //\r
- continue;\r
- }\r
-\r
- DevicePath = DevicePathFromHandle (BlkIoHandles[Index]);\r
- if ((DevicePathType (DevicePath) == MEDIA_DEVICE_PATH) && \r
- (DevicePathSubType (DevicePath) == MEDIA_HARDDRIVE_DP)\r
- ) {\r
- //\r
- // Build the boot option\r
- //\r
- BdsLibBuildOptionFromHandle (BlkIoHandles[Index], BdsBootOptionList);\r
- BootOptionNumber++;\r
- }\r
- }\r
-\r
- if (NumberBlkIoHandles) {\r
- gBS->FreePool (BlkIoHandles);\r
- }\r
- //\r
- // Parse Fixed Disk Devices.\r
- //\r
- gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- &gEfiSimpleFileSystemProtocolGuid,\r
- NULL,\r
- &NumberFileSystemHandles,\r
- &FileSystemHandles\r
- );\r
- for (Index = 0; Index < NumberFileSystemHandles; Index++) {\r
- Status = gBS->HandleProtocol (\r
- FileSystemHandles[Index],\r
- &gEfiBlockIoProtocolGuid,\r
- (VOID **) &BlkIo\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- if (BlkIo->Media->RemovableMedia) {\r
- //\r
- // If the file system handle supports a BlkIo protocol,\r
- // skip the removable media devices\r
- //\r
- continue;\r
- }\r
- }\r
-\r
- DevicePath = DevicePathFromHandle (FileSystemHandles[Index]);\r
- if ((DevicePathType (DevicePath) == MEDIA_DEVICE_PATH) && \r
- (DevicePathSubType (DevicePath) == MEDIA_HARDDRIVE_DP)\r
- ) {\r
- //\r
- // If the FileSystem protocol does not contain a BlkIo protocol,\r
- // then build it\r
- //\r
- BdsLibBuildOptionFromHandle (FileSystemHandles[Index], BdsBootOptionList);\r
- BootOptionNumber++;\r
- }\r
- }\r
-\r
- if (NumberFileSystemHandles) {\r
- gBS->FreePool (FileSystemHandles);\r
- }\r
- //\r
- // Parse Network Boot Device\r
- //\r
- gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- &gEfiSimpleNetworkProtocolGuid,\r
- NULL,\r
- &NumberLoadFileHandles,\r
- &LoadFileHandles\r
- );\r
- for (Index = 0; Index < NumberLoadFileHandles; Index++) {\r
- Status = gBS->HandleProtocol (\r
- LoadFileHandles[Index],\r
- &gEfiLoadFileProtocolGuid,\r
- (VOID **) &ProtocolInstance\r
- );\r
- if (EFI_ERROR (Status)) {\r
- continue;\r
- }\r
-\r
- BdsLibBuildOptionFromHandle (LoadFileHandles[Index], BdsBootOptionList);\r
- BootOptionNumber++;\r
- }\r
-\r
- if (NumberLoadFileHandles) {\r
- gBS->FreePool (LoadFileHandles);\r
- }\r
- //\r
- // Check if we have on flash shell\r
- //\r
- gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- &gEfiFirmwareVolumeProtocolGuid,\r
- NULL,\r
- &FvHandleCount,\r
- &FvHandleBuffer\r
- );\r
- for (Index = 0; Index < FvHandleCount; Index++) {\r
- gBS->HandleProtocol (\r
- FvHandleBuffer[Index],\r
- &gEfiFirmwareVolumeProtocolGuid,\r
- (VOID **) &Fv\r
- );\r
-\r
- Status = Fv->ReadFile (\r
- Fv,\r
- &gEfiShellFileGuid,\r
- NULL,\r
- &Size,\r
- &Type,\r
- &Attributes,\r
- &AuthenticationStatus\r
- );\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // Skip if no shell file in the FV\r
- //\r
- continue;\r
- }\r
- //\r
- // Build the shell boot option\r
- //\r
- BdsLibBuildOptionFromShell (FvHandleBuffer[Index], BdsBootOptionList);\r
- BootOptionNumber++;\r
- }\r
-\r
- if (FvHandleCount) {\r
- gBS->FreePool (FvHandleBuffer);\r
- }\r
- //\r
- // Make sure every boot only have one time\r
- // boot device enumerate\r
- //\r
- BdsLibBuildOptionFromVar (BdsBootOptionList, L"BootOrder");\r
- mEnumBootDevice = TRUE;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-VOID\r
-BdsLibBuildOptionFromHandle (\r
- IN EFI_HANDLE Handle,\r
- IN LIST_ENTRY *BdsBootOptionList\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Build the boot option with the handle parsed in\r
- \r
-Arguments:\r
-\r
- Handle - The handle which present the device path to create boot option\r
- \r
- BdsBootOptionList - The header of the link list which indexed all current\r
- boot options\r
-\r
-Returns:\r
-\r
- VOID\r
-\r
---*/\r
-{\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- CHAR16 *TempString;\r
-\r
- DevicePath = DevicePathFromHandle (Handle);\r
- TempString = DevicePathToStr (DevicePath);\r
-\r
- //\r
- // Create and register new boot option\r
- //\r
- BdsLibRegisterNewOption (BdsBootOptionList, DevicePath, TempString, L"BootOrder");\r
-}\r
-\r
-VOID\r
-BdsLibBuildOptionFromShell (\r
- IN EFI_HANDLE Handle,\r
- IN OUT LIST_ENTRY *BdsBootOptionList\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Build the on flash shell boot option with the handle parsed in\r
- \r
-Arguments:\r
-\r
- Handle - The handle which present the device path to create on flash shell\r
- boot option\r
- \r
- BdsBootOptionList - The header of the link list which indexed all current\r
- boot options\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-{\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- MEDIA_FW_VOL_FILEPATH_DEVICE_PATH ShellNode;\r
-\r
- DevicePath = DevicePathFromHandle (Handle);\r
-\r
- //\r
- // Build the shell device path\r
- //\r
- EfiInitializeFwVolDevicepathNode (&ShellNode, &gEfiShellFileGuid);\r
- DevicePath = AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *) &ShellNode);\r
-\r
- //\r
- // Create and register the shell boot option\r
- //\r
- BdsLibRegisterNewOption (BdsBootOptionList, DevicePath, L"Internal EFI Shell", L"BootOrder");\r
-\r
-}\r
-\r
-VOID\r
-BdsLibBootNext (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Boot from the EFI1.1 spec defined "BootNext" variable\r
- \r
-Arguments:\r
-\r
- None\r
- \r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-{\r
- UINT16 *BootNext;\r
- UINTN BootNextSize;\r
- CHAR16 Buffer[20];\r
- BDS_COMMON_OPTION *BootOption;\r
- LIST_ENTRY TempList;\r
- UINTN ExitDataSize;\r
- CHAR16 *ExitData;\r
-\r
- //\r
- // Init the boot option name buffer and temp link list\r
- //\r
- InitializeListHead (&TempList);\r
- ZeroMem (Buffer, sizeof (Buffer));\r
-\r
- BootNext = BdsLibGetVariableAndSize (\r
- L"BootNext",\r
- &gEfiGlobalVariableGuid,\r
- &BootNextSize\r
- );\r
-\r
- //\r
- // Clear the boot next variable first\r
- //\r
- if (BootNext != NULL) {\r
- gRT->SetVariable (\r
- L"BootNext",\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
- 0,\r
- BootNext\r
- );\r
-\r
- //\r
- // Start to build the boot option and try to boot\r
- //\r
- UnicodeSPrint (Buffer, sizeof (Buffer), L"Boot%04x", *BootNext);\r
- BootOption = BdsLibVariableToOption (&TempList, Buffer);\r
- BdsLibConnectDevicePath (BootOption->DevicePath);\r
- BdsLibBootViaBootOption (BootOption, BootOption->DevicePath, &ExitDataSize, &ExitData);\r
- }\r
-\r
-}\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- BdsConnect.c\r
-\r
-Abstract:\r
-\r
- BDS Lib functions which relate with connect the device\r
-\r
---*/\r
-\r
-VOID\r
-BdsLibConnectAll (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- This function will connect all the system driver to controller\r
- first, and then special connect the default console, this make\r
- sure all the system controller avialbe and the platform default\r
- console connected.\r
- \r
-Arguments:\r
-\r
- None\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-{\r
- //\r
- // Connect the platform console first\r
- //\r
- BdsLibConnectAllDefaultConsoles ();\r
-\r
- //\r
- // Generic way to connect all the drivers\r
- //\r
- BdsLibConnectAllDriversToAllControllers ();\r
-\r
- //\r
- // Here we have the assumption that we have already had\r
- // platform default console\r
- //\r
- BdsLibConnectAllDefaultConsoles ();\r
-}\r
-\r
-VOID\r
-BdsLibGenericConnectAll (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- This function will connect all the system drivers to all controllers\r
- first, and then connect all the console devices the system current \r
- have. After this we should get all the device work and console avariable\r
- if the system have console device.\r
- \r
-Arguments:\r
-\r
- None\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-{\r
- //\r
- // Most generic way to connect all the drivers\r
- //\r
- BdsLibConnectAllDriversToAllControllers ();\r
- BdsLibConnectAllConsoles ();\r
-}\r
-\r
-EFI_STATUS\r
-BdsLibConnectDevicePath (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePathToConnect\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- This function will create all handles associate with every device\r
- path node. If the handle associate with one device path node can not\r
- be created success, then still give one chance to do the dispatch,\r
- which load the missing drivers if possible.\r
- \r
-Arguments:\r
-\r
- DevicePathToConnect - The device path which will be connected, it can\r
- be a multi-instance device path\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - All handles associate with every device path \r
- node have been created\r
- \r
- EFI_OUT_OF_RESOURCES - There is no resource to create new handles\r
- \r
- EFI_NOT_FOUND - Create the handle associate with one device \r
- path node failed\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *CopyOfDevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *Instance;\r
- EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *Next;\r
- EFI_HANDLE Handle;\r
- EFI_HANDLE PreviousHandle;\r
- UINTN Size;\r
-\r
- if (DevicePathToConnect == NULL) {\r
- return EFI_SUCCESS;\r
- }\r
-\r
- DevicePath = DuplicateDevicePath (DevicePathToConnect);\r
- CopyOfDevicePath = DevicePath;\r
- if (DevicePath == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- do {\r
- //\r
- // The outer loop handles multi instance device paths.\r
- // Only console variables contain multiple instance device paths.\r
- //\r
- // After this call DevicePath points to the next Instance\r
- //\r
- Instance = GetNextDevicePathInstance (&DevicePath, &Size);\r
- Next = Instance;\r
- while (!IsDevicePathEndType (Next)) {\r
- Next = NextDevicePathNode (Next);\r
- }\r
-\r
- SetDevicePathEndNode (Next);\r
-\r
- //\r
- // Start the real work of connect with RemainingDevicePath\r
- //\r
- PreviousHandle = NULL;\r
- do {\r
- //\r
- // Find the handle that best matches the Device Path. If it is only a\r
- // partial match the remaining part of the device path is returned in\r
- // RemainingDevicePath.\r
- //\r
- RemainingDevicePath = Instance;\r
- Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &RemainingDevicePath, &Handle);\r
-\r
- if (!EFI_ERROR (Status)) {\r
- if (Handle == PreviousHandle) {\r
- //\r
- // If no forward progress is made try invoking the Dispatcher.\r
- // A new FV may have been added to the system an new drivers\r
- // may now be found.\r
- // Status == EFI_SUCCESS means a driver was dispatched\r
- // Status == EFI_NOT_FOUND means no new drivers were dispatched\r
- //\r
- Status = gDS->Dispatch ();\r
- }\r
-\r
- if (!EFI_ERROR (Status)) {\r
- PreviousHandle = Handle;\r
- //\r
- // Connect all drivers that apply to Handle and RemainingDevicePath,\r
- // the Recursive flag is FALSE so only one level will be expanded.\r
- //\r
- // Do not check the connect status here, if the connect controller fail,\r
- // then still give the chance to do dispatch, because partial\r
- // RemainingDevicepath may be in the new FV\r
- //\r
- // 1. If the connect fail, RemainingDevicepath and handle will not\r
- // change, so next time will do the dispatch, then dispatch's status\r
- // will take effect\r
- // 2. If the connect success, the RemainingDevicepath and handle will\r
- // change, then avoid the dispatch, we have chance to continue the\r
- // next connection\r
- //\r
- gBS->ConnectController (Handle, NULL, RemainingDevicePath, FALSE);\r
- }\r
- }\r
- //\r
- // Loop until RemainingDevicePath is an empty device path\r
- //\r
- } while (!EFI_ERROR (Status) && !IsDevicePathEnd (RemainingDevicePath));\r
-\r
- } while (DevicePath != NULL);\r
-\r
- if (CopyOfDevicePath != NULL) {\r
- gBS->FreePool (CopyOfDevicePath);\r
- }\r
- //\r
- // All handle with DevicePath exists in the handle database\r
- //\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-BdsLibConnectAllEfi (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function will connect all current system handles recursively. The\r
- connection will finish until every handle's child handle created if it have.\r
- \r
-Arguments:\r
-\r
- None\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - All handles and it's child handle have been connected\r
- \r
- EFI_STATUS - Return the status of gBS->LocateHandleBuffer(). \r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- UINTN HandleCount;\r
- EFI_HANDLE *HandleBuffer;\r
- UINTN Index;\r
-\r
- Status = gBS->LocateHandleBuffer (\r
- AllHandles,\r
- NULL,\r
- NULL,\r
- &HandleCount,\r
- &HandleBuffer\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- for (Index = 0; Index < HandleCount; Index++) {\r
- Status = gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);\r
- }\r
-\r
- gBS->FreePool (HandleBuffer);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-BdsLibDisconnectAllEfi (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function will disconnect all current system handles. The disconnection\r
- will finish until every handle have been disconnected.\r
- \r
-Arguments:\r
-\r
- None\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - All handles have been disconnected\r
- \r
- EFI_STATUS - Return the status of gBS->LocateHandleBuffer(). \r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- UINTN HandleCount;\r
- EFI_HANDLE *HandleBuffer;\r
- UINTN Index;\r
-\r
- //\r
- // Disconnect all\r
- //\r
- Status = gBS->LocateHandleBuffer (\r
- AllHandles,\r
- NULL,\r
- NULL,\r
- &HandleCount,\r
- &HandleBuffer\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- for (Index = 0; Index < HandleCount; Index++) {\r
- Status = gBS->DisconnectController (HandleBuffer[Index], NULL, NULL);\r
- }\r
-\r
- gBS->FreePool (HandleBuffer);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-VOID\r
-BdsLibConnectAllDriversToAllControllers (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Connects all drivers to all controllers. \r
- This function make sure all the current system driver will manage\r
- the correspoinding controllers if have. And at the same time, make\r
- sure all the system controllers have driver to manage it if have. \r
- \r
-Arguments:\r
- \r
- None\r
- \r
-Returns:\r
- \r
- None\r
- \r
---*/\r
-{\r
- EFI_STATUS Status;\r
-\r
- do {\r
- //\r
- // Connect All EFI 1.10 drivers following EFI 1.10 algorithm\r
- //\r
- BdsLibConnectAllEfi ();\r
-\r
- //\r
- // Check to see if it's possible to dispatch an more DXE drivers.\r
- // The BdsLibConnectAllEfi () may have made new DXE drivers show up.\r
- // If anything is Dispatched Status == EFI_SUCCESS and we will try\r
- // the connect again.\r
- //\r
- Status = gDS->Dispatch ();\r
-\r
- } while (!EFI_ERROR (Status));\r
-\r
-}\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- BdsConsole.c\r
-\r
-Abstract:\r
-\r
- BDS Lib functions which contain all the code to connect console device\r
-\r
---*/\r
-\r
-BOOLEAN\r
-IsNvNeed (\r
- IN CHAR16 *ConVarName\r
- )\r
-{\r
- CHAR16 *Ptr;\r
- \r
- Ptr = ConVarName;\r
- \r
- //\r
- // If the variable includes "Dev" at last, we consider\r
- // it does not support NV attribute.\r
- //\r
- while (*Ptr) {\r
- Ptr++;\r
- }\r
- \r
- if ((*(Ptr - 3) == 'D') && (*(Ptr - 2) == 'e') && (*(Ptr - 1) == 'v')) {\r
- return FALSE;\r
- } else {\r
- return TRUE;\r
- }\r
-}\r
-\r
-EFI_STATUS\r
-BdsLibUpdateConsoleVariable (\r
- IN CHAR16 *ConVarName,\r
- IN EFI_DEVICE_PATH_PROTOCOL *CustomizedConDevicePath,\r
- IN EFI_DEVICE_PATH_PROTOCOL *ExclusiveDevicePath\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function update console variable based on ConVarName, it can \r
- add or remove one specific console device path from the variable\r
-\r
-Arguments:\r
-\r
- ConVarName - Console related variable name, ConIn, ConOut, ErrOut.\r
-\r
- CustomizedConDevicePath - The console device path which will be added to\r
- the console variable ConVarName, this parameter\r
- can not be multi-instance.\r
-\r
- ExclusiveDevicePath - The console device path which will be removed\r
- from the console variable ConVarName, this\r
- parameter can not be multi-instance.\r
-\r
-Returns:\r
-\r
- EFI_UNSUPPORTED - Add or remove the same device path.\r
- \r
- EFI_SUCCESS - Success add or remove the device path from \r
- the console variable.\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_DEVICE_PATH_PROTOCOL *VarConsole;\r
- UINTN DevicePathSize;\r
- EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *TempNewDevicePath;\r
- UINT32 Attributes;\r
-\r
- VarConsole = NULL;\r
- DevicePathSize = 0;\r
- Status = EFI_UNSUPPORTED;\r
-\r
- //\r
- // Notes: check the device path point, here should check\r
- // with compare memory\r
- //\r
- if (CustomizedConDevicePath == ExclusiveDevicePath) {\r
- return EFI_UNSUPPORTED;\r
- }\r
- //\r
- // Delete the ExclusiveDevicePath from current default console\r
- //\r
- VarConsole = BdsLibGetVariableAndSize (\r
- ConVarName,\r
- &gEfiGlobalVariableGuid,\r
- &DevicePathSize\r
- );\r
- \r
- //\r
- // Initialize NewDevicePath\r
- //\r
- NewDevicePath = VarConsole;\r
- \r
- //\r
- // If ExclusiveDevicePath is even the part of the instance in VarConsole, delete it.\r
- // In the end, NewDevicePath is the final device path.\r
- //\r
- if (ExclusiveDevicePath != NULL && VarConsole != NULL) {\r
- NewDevicePath = BdsLibDelPartMatchInstance (VarConsole, ExclusiveDevicePath);\r
- }\r
- //\r
- // Try to append customized device path to NewDevicePath.\r
- //\r
- if (CustomizedConDevicePath != NULL) {\r
- if (!BdsLibMatchDevicePaths (NewDevicePath, CustomizedConDevicePath)) {\r
- //\r
- // Check if there is part of CustomizedConDevicePath in NewDevicePath, delete it.\r
- //\r
- NewDevicePath = BdsLibDelPartMatchInstance (NewDevicePath, CustomizedConDevicePath);\r
- //\r
- // In the first check, the default console variable will be null,\r
- // just append current customized device path\r
- //\r
- TempNewDevicePath = NewDevicePath;\r
- NewDevicePath = AppendDevicePathInstance (NewDevicePath, CustomizedConDevicePath);\r
- BdsLibSafeFreePool(TempNewDevicePath);\r
- }\r
- }\r
- \r
- //\r
- // The attribute for ConInDev, ConOutDev and ErrOutDev does not include NV.\r
- //\r
- if (IsNvNeed(ConVarName)) {\r
- //\r
- // ConVarName has NV attribute.\r
- //\r
- Attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE;\r
- } else {\r
- //\r
- // ConVarName does not have NV attribute.\r
- //\r
- Attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS;\r
- }\r
- \r
- //\r
- // Finally, Update the variable of the default console by NewDevicePath\r
- //\r
- gRT->SetVariable (\r
- ConVarName,\r
- &gEfiGlobalVariableGuid,\r
- Attributes,\r
- GetDevicePathSize (NewDevicePath),\r
- NewDevicePath\r
- );\r
-\r
- if (VarConsole == NewDevicePath) {\r
- BdsLibSafeFreePool(VarConsole);\r
- } else {\r
- BdsLibSafeFreePool(VarConsole);\r
- BdsLibSafeFreePool(NewDevicePath);\r
- }\r
-\r
- return EFI_SUCCESS;\r
-\r
-}\r
-\r
-EFI_STATUS\r
-BdsLibConnectConsoleVariable (\r
- IN CHAR16 *ConVarName\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Connect the console device base on the variable ConVarName, if\r
- device path of the ConVarName is multi-instance device path, if\r
- anyone of the instances is connected success, then this function\r
- will return success.\r
-\r
-Arguments:\r
-\r
- ConVarName - Console related variable name, ConIn, ConOut, ErrOut.\r
-\r
-Returns:\r
-\r
- EFI_NOT_FOUND - There is not any console devices connected success\r
- \r
- EFI_SUCCESS - Success connect any one instance of the console\r
- device path base on the variable ConVarName.\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_DEVICE_PATH_PROTOCOL *StartDevicePath;\r
- UINTN VariableSize;\r
- EFI_DEVICE_PATH_PROTOCOL *Instance;\r
- EFI_DEVICE_PATH_PROTOCOL *Next;\r
- EFI_DEVICE_PATH_PROTOCOL *CopyOfDevicePath;\r
- UINTN Size;\r
- BOOLEAN DeviceExist;\r
-\r
- Status = EFI_SUCCESS;\r
- DeviceExist = FALSE;\r
-\r
- //\r
- // Check if the console variable exist\r
- //\r
- StartDevicePath = BdsLibGetVariableAndSize (\r
- ConVarName,\r
- &gEfiGlobalVariableGuid,\r
- &VariableSize\r
- );\r
- if (StartDevicePath == NULL) {\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- CopyOfDevicePath = StartDevicePath;\r
- do {\r
- //\r
- // Check every instance of the console variable\r
- //\r
- Instance = GetNextDevicePathInstance (&CopyOfDevicePath, &Size);\r
- Next = Instance;\r
- while (!IsDevicePathEndType (Next)) {\r
- Next = NextDevicePathNode (Next);\r
- }\r
-\r
- SetDevicePathEndNode (Next);\r
-\r
- //\r
- // Connect the instance device path\r
- //\r
- Status = BdsLibConnectDevicePath (Instance);\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // Delete the instance from the console varialbe\r
- //\r
- BdsLibUpdateConsoleVariable (ConVarName, NULL, Instance);\r
- } else {\r
- DeviceExist = TRUE;\r
- }\r
- BdsLibSafeFreePool(Instance);\r
- } while (CopyOfDevicePath != NULL);\r
-\r
- gBS->FreePool (StartDevicePath);\r
-\r
- if (DeviceExist == FALSE) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-VOID\r
-BdsLibConnectAllConsoles (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function will search every simpletxt devive in current system,\r
- and make every simpletxt device as pertantial console device.\r
-\r
-Arguments:\r
-\r
- None\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- EFI_DEVICE_PATH_PROTOCOL *ConDevicePath;\r
- UINTN HandleCount;\r
- EFI_HANDLE *HandleBuffer;\r
-\r
- Index = 0;\r
- HandleCount = 0;\r
- HandleBuffer = NULL;\r
- ConDevicePath = NULL;\r
-\r
- //\r
- // Update all the console varables\r
- //\r
- Status = gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- &gEfiSimpleTextInProtocolGuid,\r
- NULL,\r
- &HandleCount,\r
- &HandleBuffer\r
- );\r
- for (Index = 0; Index < HandleCount; Index++) {\r
- Status = gBS->HandleProtocol (\r
- HandleBuffer[Index],\r
- &gEfiDevicePathProtocolGuid,\r
- (VOID **) &ConDevicePath\r
- );\r
- BdsLibUpdateConsoleVariable (L"ConIn", ConDevicePath, NULL);\r
- }\r
-\r
- BdsLibSafeFreePool(HandleBuffer);\r
-\r
- Status = gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- &gEfiSimpleTextOutProtocolGuid,\r
- NULL,\r
- &HandleCount,\r
- &HandleBuffer\r
- );\r
- for (Index = 0; Index < HandleCount; Index++) {\r
- Status = gBS->HandleProtocol (\r
- HandleBuffer[Index],\r
- &gEfiDevicePathProtocolGuid,\r
- (VOID **) &ConDevicePath\r
- );\r
- BdsLibUpdateConsoleVariable (L"ConOut", ConDevicePath, NULL);\r
- BdsLibUpdateConsoleVariable (L"ErrOut", ConDevicePath, NULL);\r
- }\r
-\r
- BdsLibSafeFreePool(HandleBuffer);\r
-\r
- //\r
- // Connect all console variables\r
- //\r
- BdsLibConnectAllDefaultConsoles ();\r
-\r
-}\r
-\r
-EFI_STATUS\r
-BdsLibConnectAllDefaultConsoles (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function will connect console device base on the console \r
- device variable ConIn, ConOut and ErrOut.\r
-\r
-Arguments:\r
-\r
- None\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - At least one of the ConIn and ConOut device have\r
- been connected success.\r
- \r
- EFI_STATUS - Return the status of BdsLibConnectConsoleVariable ().\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
-\r
- //\r
- // Connect all default console variables\r
- //\r
-\r
- //\r
- // Because possibly the platform is legacy free, in such case,\r
- // ConIn devices (Serial Port and PS2 Keyboard ) does not exist, \r
- // so we need not check the status.\r
- // \r
- BdsLibConnectConsoleVariable (L"ConIn");\r
-\r
- // \r
- // It seems impossible not to have any ConOut device on platform,\r
- // so we check the status here.\r
- //\r
- Status = BdsLibConnectConsoleVariable (L"ConOut");\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- //\r
- // Special treat the err out device, becaues the null\r
- // err out var is legal.\r
- //\r
- BdsLibConnectConsoleVariable (L"ErrOut");\r
-\r
- return EFI_SUCCESS;\r
-\r
-}\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- BdsMisc.c\r
-\r
-Abstract:\r
-\r
- Misc BDS library function\r
-\r
---*/\r
-\r
-#define MAX_STRING_LEN 200\r
-static BOOLEAN mFeaturerSwitch = TRUE;\r
-static BOOLEAN mResetRequired = FALSE;\r
-extern UINT16 gPlatformBootTimeOutDefault;\r
-\r
-UINT16\r
-BdsLibGetTimeout (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Return the default value for system Timeout variable.\r
-\r
-Arguments:\r
-\r
- None\r
-\r
-Returns:\r
- \r
- Timeout value.\r
-\r
---*/\r
-{\r
- UINT16 Timeout;\r
- UINTN Size;\r
- EFI_STATUS Status;\r
-\r
- //\r
- // Return Timeout variable or 0xffff if no valid\r
- // Timeout variable exists.\r
- //\r
- Size = sizeof (UINT16);\r
- Status = gRT->GetVariable (L"Timeout", &gEfiGlobalVariableGuid, NULL, &Size, &Timeout);\r
- if (!EFI_ERROR (Status)) {\r
- return Timeout;\r
- }\r
- //\r
- // To make the current EFI Automatic-Test activity possible, just add\r
- // following code to make AutoBoot enabled when this variable is not\r
- // present.\r
- // This code should be removed later.\r
- //\r
- Timeout = gPlatformBootTimeOutDefault;\r
-\r
- //\r
- // Notes: Platform should set default variable if non exists on all error cases!!!\r
- //\r
- Status = gRT->SetVariable (\r
- L"Timeout",\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
- sizeof (UINT16),\r
- &Timeout\r
- );\r
- return Timeout;\r
-}\r
-\r
-VOID\r
-BdsLibLoadDrivers (\r
- IN LIST_ENTRY *BdsDriverLists\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- The function will go through the driver optoin link list, load and start\r
- every driver the driver optoin device path point to.\r
-\r
-Arguments:\r
-\r
- BdsDriverLists - The header of the current driver option link list\r
-\r
-Returns:\r
- \r
- None\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- LIST_ENTRY *Link;\r
- BDS_COMMON_OPTION *Option;\r
- EFI_HANDLE ImageHandle;\r
- EFI_LOADED_IMAGE_PROTOCOL *ImageInfo;\r
- UINTN ExitDataSize;\r
- CHAR16 *ExitData;\r
- BOOLEAN ReconnectAll;\r
-\r
- ReconnectAll = FALSE;\r
-\r
- //\r
- // Process the driver option\r
- //\r
- for (Link = BdsDriverLists->ForwardLink; Link != BdsDriverLists; Link = Link->ForwardLink) {\r
- Option = CR (Link, BDS_COMMON_OPTION, Link, BDS_LOAD_OPTION_SIGNATURE);\r
- //\r
- // If a load option is not marked as LOAD_OPTION_ACTIVE,\r
- // the boot manager will not automatically load the option.\r
- //\r
- if (!IS_LOAD_OPTION_TYPE (Option->Attribute, LOAD_OPTION_ACTIVE)) {\r
- continue;\r
- }\r
- //\r
- // If a driver load option is marked as LOAD_OPTION_FORCE_RECONNECT,\r
- // then all of the EFI drivers in the system will be disconnected and\r
- // reconnected after the last driver load option is processed.\r
- //\r
- if (IS_LOAD_OPTION_TYPE (Option->Attribute, LOAD_OPTION_FORCE_RECONNECT)) {\r
- ReconnectAll = TRUE;\r
- }\r
- //\r
- // Make sure the driver path is connected.\r
- //\r
- BdsLibConnectDevicePath (Option->DevicePath);\r
-\r
- //\r
- // Load and start the image that Driver#### describes\r
- //\r
- Status = gBS->LoadImage (\r
- FALSE,\r
- mBdsImageHandle,\r
- Option->DevicePath,\r
- NULL,\r
- 0,\r
- &ImageHandle\r
- );\r
-\r
- if (!EFI_ERROR (Status)) {\r
- gBS->HandleProtocol (ImageHandle, &gEfiLoadedImageProtocolGuid,
- (VOID **)&ImageInfo);\r
-\r
- //\r
- // Verify whether this image is a driver, if not,\r
- // exit it and continue to parse next load option\r
- //\r
- if (ImageInfo->ImageCodeType != EfiBootServicesCode && ImageInfo->ImageCodeType != EfiRuntimeServicesCode) {\r
- gBS->Exit (ImageHandle, EFI_INVALID_PARAMETER, 0, NULL);\r
- continue;\r
- }\r
-\r
- if (Option->LoadOptionsSize != 0) {\r
- ImageInfo->LoadOptionsSize = Option->LoadOptionsSize;\r
- ImageInfo->LoadOptions = Option->LoadOptions;\r
- }\r
- //\r
- // Before calling the image, enable the Watchdog Timer for\r
- // the 5 Minute period\r
- //\r
- gBS->SetWatchdogTimer (5 * 60, 0x0000, 0x00, NULL);\r
-\r
- Status = gBS->StartImage (ImageHandle, &ExitDataSize, &ExitData);\r
- DEBUG ((EFI_D_INFO | EFI_D_LOAD, "Driver Return Status = %r\n", Status));\r
-\r
- //\r
- // Clear the Watchdog Timer after the image returns\r
- //\r
- gBS->SetWatchdogTimer (0x0000, 0x0000, 0x0000, NULL);\r
- }\r
- }\r
- //\r
- // Process the LOAD_OPTION_FORCE_RECONNECT driver option\r
- //\r
- if (ReconnectAll) {\r
- BdsLibDisconnectAllEfi ();\r
- BdsLibConnectAll ();\r
- }\r
-\r
-}\r
-\r
-EFI_STATUS\r
-BdsLibRegisterNewOption (\r
- IN LIST_ENTRY *BdsOptionList,\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
- IN CHAR16 *String,\r
- IN CHAR16 *VariableName\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- This function will register the new boot#### or driver#### option base on\r
- the VariableName. The new registered boot#### or driver#### will be linked\r
- to BdsOptionList and also update to the VariableName. After the boot#### or\r
- driver#### updated, the BootOrder or DriverOrder will also be updated.\r
-\r
-Arguments:\r
-\r
- BdsOptionList - The header of the boot#### or driver#### link list\r
- \r
- DevicePath - The device path which the boot####\r
- or driver#### option present\r
- \r
- String - The description of the boot#### or driver####\r
- \r
- VariableName - Indicate if the boot#### or driver#### option\r
-\r
-Returns:\r
- \r
- EFI_SUCCESS - The boot#### or driver#### have been success registered\r
- \r
- EFI_STATUS - Return the status of gRT->SetVariable ().\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- UINT16 MaxOptionNumber;\r
- UINT16 RegisterOptionNumber;\r
- UINT16 *TempOptionPtr;\r
- UINTN TempOptionSize;\r
- UINT16 *OptionOrderPtr;\r
- VOID *OptionPtr;\r
- UINTN OptionSize;\r
- UINT8 *TempPtr;\r
- EFI_DEVICE_PATH_PROTOCOL *OptionDevicePath;\r
- CHAR16 *Description;\r
- CHAR16 OptionName[10];\r
- BOOLEAN UpdateBootDevicePath;\r
-\r
- OptionPtr = NULL;\r
- OptionSize = 0;\r
- TempPtr = NULL;\r
- OptionDevicePath = NULL;\r
- Description = NULL;\r
- MaxOptionNumber = 0;\r
- OptionOrderPtr = NULL;\r
- UpdateBootDevicePath = FALSE;\r
- ZeroMem (OptionName, sizeof (OptionName));\r
-\r
- TempOptionSize = 0;\r
- TempOptionPtr = BdsLibGetVariableAndSize (\r
- VariableName,\r
- &gEfiGlobalVariableGuid,\r
- &TempOptionSize\r
- );\r
- //\r
- // Compare with current option variable\r
- //\r
- for (Index = 0; Index < TempOptionSize / sizeof (UINT16); Index++) {\r
- //\r
- // Got the max option#### number\r
- //\r
- if (MaxOptionNumber < TempOptionPtr[Index]) {\r
- MaxOptionNumber = TempOptionPtr[Index];\r
- }\r
-\r
- if (*VariableName == 'B') {\r
- UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", TempOptionPtr[Index]);\r
- } else {\r
- UnicodeSPrint (OptionName, sizeof (OptionName), L"Driver%04x", TempOptionPtr[Index]);\r
- }\r
-\r
- OptionPtr = BdsLibGetVariableAndSize (\r
- OptionName,\r
- &gEfiGlobalVariableGuid,\r
- &OptionSize\r
- );\r
- TempPtr = OptionPtr;\r
- TempPtr += sizeof (UINT32) + sizeof (UINT16);\r
- Description = (CHAR16 *) TempPtr;\r
- TempPtr += StrSize ((CHAR16 *) TempPtr);\r
- OptionDevicePath = (EFI_DEVICE_PATH_PROTOCOL *) TempPtr;\r
-\r
- //\r
- // Notes: the description may will change base on the GetStringToken\r
- //\r
- if (CompareMem (Description, String, StrSize (Description)) == 0) {\r
- if (CompareMem (OptionDevicePath, DevicePath, GetDevicePathSize (OptionDevicePath)) == 0) {\r
- //\r
- // Got the option, so just return\r
- //\r
- gBS->FreePool (OptionPtr);\r
- gBS->FreePool (TempOptionPtr);\r
- return EFI_SUCCESS;\r
- } else {\r
- //\r
- // Boot device path changed, need update.\r
- //\r
- UpdateBootDevicePath = TRUE;\r
- break;\r
- }\r
- }\r
-\r
- gBS->FreePool (OptionPtr);\r
- }\r
-\r
- OptionSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (String) + GetDevicePathSize (DevicePath);\r
- OptionPtr = AllocateZeroPool (OptionSize);\r
- TempPtr = OptionPtr;\r
- *(UINT32 *) TempPtr = LOAD_OPTION_ACTIVE;\r
- TempPtr += sizeof (UINT32);\r
- *(UINT16 *) TempPtr = (UINT16) GetDevicePathSize (DevicePath);\r
- TempPtr += sizeof (UINT16);\r
- CopyMem (TempPtr, String, StrSize (String));\r
- TempPtr += StrSize (String);\r
- CopyMem (TempPtr, DevicePath, GetDevicePathSize (DevicePath));\r
-\r
- if (UpdateBootDevicePath) {\r
- //\r
- // The number in option#### to be updated\r
- //\r
- RegisterOptionNumber = TempOptionPtr[Index];\r
- } else {\r
- //\r
- // The new option#### number\r
- //\r
- RegisterOptionNumber = MaxOptionNumber + 1;\r
- }\r
-\r
- if (*VariableName == 'B') {\r
- UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", RegisterOptionNumber);\r
- } else {\r
- UnicodeSPrint (OptionName, sizeof (OptionName), L"Driver%04x", RegisterOptionNumber);\r
- }\r
-\r
- Status = gRT->SetVariable (\r
- OptionName,\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
- OptionSize,\r
- OptionPtr\r
- );\r
- if (EFI_ERROR (Status) || UpdateBootDevicePath) {\r
- gBS->FreePool (OptionPtr);\r
- gBS->FreePool (TempOptionPtr);\r
- return Status;\r
- }\r
-\r
- gBS->FreePool (OptionPtr);\r
-\r
- //\r
- // Update the option order variable\r
- //\r
- OptionOrderPtr = AllocateZeroPool ((Index + 1) * sizeof (UINT16));\r
- CopyMem (OptionOrderPtr, TempOptionPtr, Index * sizeof (UINT16));\r
- OptionOrderPtr[Index] = RegisterOptionNumber;\r
- Status = gRT->SetVariable (\r
- VariableName,\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
- (Index + 1) * sizeof (UINT16),\r
- OptionOrderPtr\r
- );\r
- if (EFI_ERROR (Status)) {\r
- gBS->FreePool (TempOptionPtr);\r
- gBS->FreePool (OptionOrderPtr);\r
- return Status;\r
- }\r
-\r
- gBS->FreePool (TempOptionPtr);\r
- gBS->FreePool (OptionOrderPtr);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-BDS_COMMON_OPTION *\r
-BdsLibVariableToOption (\r
- IN OUT LIST_ENTRY *BdsCommonOptionList,\r
- IN CHAR16 *VariableName\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Build the boot#### or driver#### option from the VariableName, the \r
- build boot#### or driver#### will also be linked to BdsCommonOptionList\r
- \r
-Arguments:\r
-\r
- BdsCommonOptionList - The header of the boot#### or driver#### option link list\r
-\r
- VariableName - EFI Variable name indicate if it is boot#### or driver####\r
-\r
-Returns:\r
-\r
- BDS_COMMON_OPTION - Get the option just been created\r
-\r
- NULL - Failed to get the new option\r
-\r
---*/\r
-{\r
- UINT32 Attribute;\r
- UINT16 FilePathSize;\r
- UINT8 *Variable;\r
- UINT8 *TempPtr;\r
- UINTN VariableSize;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- BDS_COMMON_OPTION *Option;\r
- VOID *LoadOptions;\r
- UINT32 LoadOptionsSize;\r
- CHAR16 *Description;\r
-\r
- //\r
- // Read the variable. We will never free this data.\r
- //\r
- Variable = BdsLibGetVariableAndSize (\r
- VariableName,\r
- &gEfiGlobalVariableGuid,\r
- &VariableSize\r
- );\r
- if (Variable == NULL) {\r
- return NULL;\r
- }\r
- //\r
- // Notes: careful defined the variable of Boot#### or\r
- // Driver####, consider use some macro to abstract the code\r
- //\r
- //\r
- // Get the option attribute\r
- //\r
- TempPtr = Variable;\r
- Attribute = *(UINT32 *) Variable;\r
- TempPtr += sizeof (UINT32);\r
-\r
- //\r
- // Get the option's device path size\r
- //\r
- FilePathSize = *(UINT16 *) TempPtr;\r
- TempPtr += sizeof (UINT16);\r
-\r
- //\r
- // Get the option's description string\r
- //\r
- Description = (CHAR16 *) TempPtr;\r
-\r
- //\r
- // Get the option's description string size\r
- //\r
- TempPtr += StrSize ((CHAR16 *) TempPtr);\r
-\r
- //\r
- // Get the option's device path\r
- //\r
- DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) TempPtr;\r
- TempPtr += FilePathSize;\r
-\r
- LoadOptions = TempPtr;\r
- LoadOptionsSize = (UINT32) (VariableSize - (UINTN) (TempPtr - Variable));\r
-\r
- //\r
- // The Console variables may have multiple device paths, so make\r
- // an Entry for each one.\r
- //\r
- Option = AllocateZeroPool (sizeof (BDS_COMMON_OPTION));\r
- if (Option == NULL) {\r
- return NULL;\r
- }\r
-\r
- Option->Signature = BDS_LOAD_OPTION_SIGNATURE;\r
- Option->DevicePath = AllocateZeroPool (GetDevicePathSize (DevicePath));\r
- CopyMem (Option->DevicePath, DevicePath, GetDevicePathSize (DevicePath));\r
- Option->Attribute = Attribute;\r
- Option->Description = AllocateZeroPool (StrSize (Description));\r
- CopyMem (Option->Description, Description, StrSize (Description));\r
- Option->LoadOptions = AllocateZeroPool (LoadOptionsSize);\r
- CopyMem (Option->LoadOptions, LoadOptions, LoadOptionsSize);\r
- Option->LoadOptionsSize = LoadOptionsSize;\r
-\r
- //\r
- // Insert active entry to BdsDeviceList\r
- //\r
- if ((Option->Attribute & LOAD_OPTION_ACTIVE) == LOAD_OPTION_ACTIVE) {\r
- InsertTailList (BdsCommonOptionList, &Option->Link);\r
- gBS->FreePool (Variable);\r
- return Option;\r
- }\r
-\r
- gBS->FreePool (Variable);\r
- gBS->FreePool (Option);\r
- return NULL;\r
-\r
-}\r
-\r
-EFI_STATUS\r
-BdsLibBuildOptionFromVar (\r
- IN LIST_ENTRY *BdsCommonOptionList,\r
- IN CHAR16 *VariableName\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Process BootOrder, or DriverOrder variables, by calling\r
- BdsLibVariableToOption () for each UINT16 in the variables.\r
-\r
-Arguments:\r
-\r
- BdsCommonOptionList - The header of the option list base on variable\r
- VariableName\r
-\r
- VariableName - EFI Variable name indicate the BootOrder or DriverOrder\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - Success create the boot option or driver option list\r
-\r
- EFI_OUT_OF_RESOURCES - Failed to get the boot option or driver option list\r
-\r
---*/\r
-{\r
- UINT16 *OptionOrder;\r
- UINTN OptionOrderSize;\r
- UINTN Index;\r
- BDS_COMMON_OPTION *Option;\r
- CHAR16 OptionName[20];\r
-\r
- //\r
- // Zero Buffer in order to get all BOOT#### variables\r
- //\r
- ZeroMem (OptionName, sizeof (OptionName));\r
-\r
- //\r
- // Read the BootOrder, or DriverOrder variable.\r
- //\r
- OptionOrder = BdsLibGetVariableAndSize (\r
- VariableName,\r
- &gEfiGlobalVariableGuid,\r
- &OptionOrderSize\r
- );\r
- if (OptionOrder == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- for (Index = 0; Index < OptionOrderSize / sizeof (UINT16); Index++) {\r
- if (*VariableName == 'B') {\r
- UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", OptionOrder[Index]);\r
- } else {\r
- UnicodeSPrint (OptionName, sizeof (OptionName), L"Driver%04x", OptionOrder[Index]);\r
- }\r
- Option = BdsLibVariableToOption (BdsCommonOptionList, OptionName);\r
- Option->BootCurrent = OptionOrder[Index];\r
-\r
- }\r
-\r
- gBS->FreePool (OptionOrder);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-BdsLibGetBootMode (\r
- OUT EFI_BOOT_MODE *BootMode\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Get boot mode by looking up configuration table and parsing HOB list\r
-\r
-Arguments:\r
-\r
- BootMode - Boot mode from PEI handoff HOB.\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - Successfully get boot mode\r
- \r
- EFI_NOT_FOUND - Can not find the current system boot mode\r
-\r
---*/\r
-{\r
- EFI_HOB_HANDOFF_INFO_TABLE *HobList;\r
-\r
- HobList = GetHobList ();\r
- ASSERT (HobList->Header.HobType == EFI_HOB_TYPE_HANDOFF);\r
- *BootMode = HobList->BootMode;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-VOID *\r
-BdsLibGetVariableAndSize (\r
- IN CHAR16 *Name,\r
- IN EFI_GUID *VendorGuid,\r
- OUT UINTN *VariableSize\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Read the EFI variable (VendorGuid/Name) and return a dynamically allocated\r
- buffer, and the size of the buffer. If failure return NULL.\r
-\r
-Arguments:\r
-\r
- Name - String part of EFI variable name\r
-\r
- VendorGuid - GUID part of EFI variable name\r
-\r
- VariableSize - Returns the size of the EFI variable that was read\r
-\r
-Returns:\r
-\r
- Dynamically allocated memory that contains a copy of the EFI variable.\r
- Caller is responsible freeing the buffer.\r
-\r
- NULL - Variable was not read\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- UINTN BufferSize;\r
- VOID *Buffer;\r
-\r
- Buffer = NULL;\r
-\r
- //\r
- // Pass in a zero size buffer to find the required buffer size.\r
- //\r
- BufferSize = 0;\r
- Status = gRT->GetVariable (Name, VendorGuid, NULL, &BufferSize, Buffer);\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- //\r
- // Allocate the buffer to return\r
- //\r
- Buffer = AllocateZeroPool (BufferSize);\r
- if (Buffer == NULL) {\r
- return NULL;\r
- }\r
- //\r
- // Read variable into the allocated buffer.\r
- //\r
- Status = gRT->GetVariable (Name, VendorGuid, NULL, &BufferSize, Buffer);\r
- if (EFI_ERROR (Status)) {\r
- BufferSize = 0;\r
- }\r
- }\r
-\r
- *VariableSize = BufferSize;\r
- return Buffer;\r
-}\r
-\r
-VOID\r
-BdsLibSafeFreePool (\r
- IN VOID *Buffer\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Free pool safely.\r
-\r
-Arguments:\r
- \r
- Buffer - The allocated pool entry to free\r
-\r
-Returns:\r
-\r
- Pointer of the buffer allocated.\r
-\r
---*/\r
-{\r
- if (Buffer != NULL) {\r
- gBS->FreePool (Buffer);\r
- Buffer = NULL;\r
- }\r
-}\r
-\r
-EFI_DEVICE_PATH_PROTOCOL *\r
-BdsLibDelPartMatchInstance (\r
- IN EFI_DEVICE_PATH_PROTOCOL *Multi,\r
- IN EFI_DEVICE_PATH_PROTOCOL *Single\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Delete the instance in Multi which matches partly with Single instance\r
-\r
-Arguments:\r
-\r
- Multi - A pointer to a multi-instance device path data structure.\r
-\r
- Single - A pointer to a single-instance device path data structure.\r
-\r
-Returns:\r
-\r
- This function will remove the device path instances in Multi which partly \r
- match with the Single, and return the result device path. If there is no\r
- remaining device path as a result, this function will return NULL.\r
-\r
---*/\r
-{\r
- EFI_DEVICE_PATH_PROTOCOL *Instance;\r
- EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *TempNewDevicePath;\r
- UINTN InstanceSize;\r
- UINTN SingleDpSize; \r
- UINTN Size; \r
- \r
- NewDevicePath = NULL;\r
- TempNewDevicePath = NULL;\r
-\r
- if (Multi == NULL || Single == NULL) {\r
- return Multi;\r
- }\r
- \r
- Instance = GetNextDevicePathInstance (&Multi, &InstanceSize);\r
- SingleDpSize = GetDevicePathSize (Single) - END_DEVICE_PATH_LENGTH;\r
- InstanceSize -= END_DEVICE_PATH_LENGTH;\r
-\r
- while (Instance != NULL) {\r
-\r
- Size = (SingleDpSize < InstanceSize) ? SingleDpSize : InstanceSize; \r
- \r
- if ((CompareMem (Instance, Single, Size) != 0)) {\r
- //\r
- // Append the device path instance which does not match with Single\r
- //\r
- TempNewDevicePath = NewDevicePath;\r
- NewDevicePath = AppendDevicePathInstance (NewDevicePath, Instance);\r
- BdsLibSafeFreePool(TempNewDevicePath);\r
- }\r
- BdsLibSafeFreePool(Instance);\r
- Instance = GetNextDevicePathInstance (&Multi, &InstanceSize);\r
- InstanceSize -= END_DEVICE_PATH_LENGTH;\r
- }\r
- \r
- return NewDevicePath;\r
-}\r
-\r
-BOOLEAN\r
-BdsLibMatchDevicePaths (\r
- IN EFI_DEVICE_PATH_PROTOCOL *Multi,\r
- IN EFI_DEVICE_PATH_PROTOCOL *Single\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Function compares a device path data structure to that of all the nodes of a\r
- second device path instance.\r
-\r
-Arguments:\r
-\r
- Multi - A pointer to a multi-instance device path data structure.\r
-\r
- Single - A pointer to a single-instance device path data structure.\r
-\r
-Returns:\r
-\r
- TRUE - If the Single is contained within Multi\r
- \r
- FALSE - The Single is not match within Multi\r
- \r
-\r
---*/\r
-{\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePathInst;\r
- UINTN Size;\r
-\r
- if (!Multi || !Single) {\r
- return FALSE;\r
- }\r
-\r
- DevicePath = Multi;\r
- DevicePathInst = GetNextDevicePathInstance (&DevicePath, &Size);\r
-\r
- //\r
- // Search for the match of 'Single' in 'Multi'\r
- //\r
- while (DevicePathInst != NULL) {\r
- //\r
- // If the single device path is found in multiple device paths,\r
- // return success\r
- //\r
- if (CompareMem (Single, DevicePathInst, Size) == 0) {\r
- gBS->FreePool (DevicePathInst);\r
- return TRUE;\r
- }\r
-\r
- gBS->FreePool (DevicePathInst);\r
- DevicePathInst = GetNextDevicePathInstance (&DevicePath, &Size);\r
- }\r
-\r
- return FALSE;\r
-}\r
-\r
-EFI_STATUS\r
-BdsLibOutputStrings (\r
- IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *ConOut,\r
- ...\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function prints a series of strings.\r
-\r
-Arguments:\r
-\r
- ConOut - Pointer to EFI_SIMPLE_TEXT_OUT_PROTOCOL\r
-\r
- ... - A variable argument list containing series of strings,\r
- the last string must be NULL.\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - Success print out the string using ConOut.\r
- \r
- EFI_STATUS - Return the status of the ConOut->OutputString ().\r
-\r
---*/\r
-{\r
- VA_LIST args;\r
- EFI_STATUS Status;\r
- CHAR16 *String;\r
-\r
- Status = EFI_SUCCESS;\r
- VA_START (args, ConOut);\r
-\r
- while (!EFI_ERROR (Status)) {\r
- //\r
- // If String is NULL, then it's the end of the list\r
- //\r
- String = VA_ARG (args, CHAR16 *);\r
- if (!String) {\r
- break;\r
- }\r
-\r
- Status = ConOut->OutputString (ConOut, String);\r
-\r
- if (EFI_ERROR (Status)) {\r
- break;\r
- }\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-//\r
-// Following are BDS Lib functions which contain all the code about setup browser reset reminder feature.\r
-// Setup Browser reset reminder feature is that an reset reminder will be given before user leaves the setup browser if \r
-// user change any option setting which needs a reset to be effective, and the reset will be applied according to the user selection.\r
-//\r
-\r
-VOID\r
-EnableResetReminderFeature (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Enable the setup browser reset reminder feature.\r
- This routine is used in platform tip. If the platform policy need the feature, use the routine to enable it.\r
-\r
-Arguments:\r
-\r
- VOID\r
-\r
-Returns:\r
-\r
- VOID\r
-\r
---*/\r
-{\r
- mFeaturerSwitch = TRUE;\r
-} \r
-\r
-VOID\r
-DisableResetReminderFeature (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Disable the setup browser reset reminder feature.\r
- This routine is used in platform tip. If the platform policy do not want the feature, use the routine to disable it.\r
- \r
-Arguments:\r
-\r
- VOID\r
-\r
-Returns:\r
-\r
- VOID\r
-\r
---*/\r
-{\r
- mFeaturerSwitch = FALSE;\r
-} \r
-\r
-VOID\r
-EnableResetRequired (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Record the info that a reset is required.\r
- A module boolean variable is used to record whether a reset is required. \r
- \r
-Arguments:\r
-\r
- VOID\r
-\r
-Returns:\r
-\r
- VOID\r
-\r
---*/\r
-{\r
- mResetRequired = TRUE;\r
-} \r
-\r
-VOID\r
-DisableResetRequired (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Record the info that no reset is required.\r
- A module boolean variable is used to record whether a reset is required. \r
-\r
-Arguments:\r
-\r
- VOID\r
-\r
-Returns:\r
-\r
- VOID\r
-\r
---*/\r
-{\r
- mResetRequired = FALSE;\r
-} \r
-\r
-BOOLEAN\r
-IsResetReminderFeatureEnable (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Check whether platform policy enable the reset reminder feature. The default is enabled.\r
-\r
-Arguments:\r
-\r
- VOID\r
-\r
-Returns:\r
-\r
- VOID\r
-\r
---*/\r
-{\r
- return mFeaturerSwitch;\r
-}\r
-\r
-BOOLEAN\r
-IsResetRequired (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Check if user changed any option setting which needs a system reset to be effective.\r
- \r
-Arguments:\r
-\r
- VOID\r
-\r
-Returns:\r
-\r
- VOID\r
-\r
---*/\r
-{\r
- return mResetRequired;\r
-}\r
-\r
-VOID\r
-SetupResetReminder (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Check whether a reset is needed, and finish the reset reminder feature.\r
- If a reset is needed, Popup a menu to notice user, and finish the feature \r
- according to the user selection.\r
-\r
-Arguments:\r
-\r
- VOID\r
-\r
-Returns:\r
-\r
- VOID\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_FORM_BROWSER_PROTOCOL *Browser;\r
- EFI_INPUT_KEY Key; \r
- CHAR16 *StringBuffer1;\r
- CHAR16 *StringBuffer2; \r
-\r
-\r
- //\r
- //check any reset required change is applied? if yes, reset system\r
- //\r
- if (IsResetReminderFeatureEnable ()) {\r
- if (IsResetRequired ()) {\r
- \r
- Status = gBS->LocateProtocol (\r
- &gEfiFormBrowserProtocolGuid,\r
- NULL,\r
- (VOID **)&Browser\r
- ); \r
- \r
- StringBuffer1 = AllocateZeroPool (MAX_STRING_LEN * sizeof (CHAR16));\r
- ASSERT (StringBuffer1 != NULL);\r
- StringBuffer2 = AllocateZeroPool (MAX_STRING_LEN * sizeof (CHAR16));\r
- ASSERT (StringBuffer2 != NULL); \r
- StrCpy (StringBuffer1, L"Configuration changed. Reset to apply it Now ? ");\r
- StrCpy (StringBuffer2, L"Enter (YES) / Esc (NO)"); \r
- //\r
- // Popup a menu to notice user\r
- // \r
- do {\r
- Browser->CreatePopUp (2, TRUE, 0, NULL, &Key, StringBuffer1, StringBuffer2);\r
- } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN)); \r
- \r
- gBS->FreePool (StringBuffer1); \r
- gBS->FreePool (StringBuffer2); \r
- //\r
- // If the user hits the YES Response key, reset\r
- //\r
- if ((Key.UnicodeChar == CHAR_CARRIAGE_RETURN)) {\r
- gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);\r
- }\r
- gST->ConOut->ClearScreen (gST->ConOut);\r
- } \r
- } \r
-} \r
-\r
-EFI_STATUS\r
-BdsLibGetHiiHandles (\r
- IN EFI_HII_PROTOCOL *Hii,\r
- IN OUT UINT16 *HandleBufferLength,\r
- OUT EFI_HII_HANDLE **HiiHandleBuffer\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Determines the handles that are currently active in the database.\r
- It's the caller's responsibility to free handle buffer.\r
-\r
-Arguments:\r
-\r
- This - A pointer to the EFI_HII_PROTOCOL instance.\r
- HandleBufferLength - On input, a pointer to the length of the handle buffer. On output, \r
- the length of the handle buffer that is required for the handles found.\r
- HiiHandleBuffer - Pointer to an array of EFI_HII_PROTOCOL instances returned.\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - Get an array of EFI_HII_PROTOCOL instances successfully.\r
- EFI_INVALID_PARAMETER - Hii is NULL.\r
- EFI_NOT_FOUND - Database not found.\r
- \r
---*/\r
-{\r
- UINT16 TempBufferLength;\r
- EFI_STATUS Status;\r
- \r
- TempBufferLength = 0;\r
- \r
- //\r
- // Try to find the actual buffer size for HiiHandle Buffer.\r
- //\r
- Status = Hii->FindHandles (Hii, &TempBufferLength, *HiiHandleBuffer);\r
- \r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- *HiiHandleBuffer = AllocateZeroPool (TempBufferLength);\r
- Status = Hii->FindHandles (Hii, &TempBufferLength, *HiiHandleBuffer);\r
- //\r
- // we should not fail here.\r
- //\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
- \r
- *HandleBufferLength = TempBufferLength;\r
- \r
- return Status;\r
- \r
-}\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- BdsMisc.c\r
-\r
-Abstract:\r
-\r
- Misc BDS library function\r
-\r
---*/\r
-\r
-#define MAX_STRING_LEN 200\r
-static BOOLEAN mFeaturerSwitch = TRUE;\r
-static BOOLEAN mResetRequired = FALSE;\r
-extern UINT16 gPlatformBootTimeOutDefault;\r
-\r
-UINT16\r
-BdsLibGetTimeout (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Return the default value for system Timeout variable.\r
-\r
-Arguments:\r
-\r
- None\r
-\r
-Returns:\r
- \r
- Timeout value.\r
-\r
---*/\r
-{\r
- UINT16 Timeout;\r
- UINTN Size;\r
- EFI_STATUS Status;\r
-\r
- //\r
- // Return Timeout variable or 0xffff if no valid\r
- // Timeout variable exists.\r
- //\r
- Size = sizeof (UINT16);\r
- Status = gRT->GetVariable (L"Timeout", &gEfiGlobalVariableGuid, NULL, &Size, &Timeout);\r
- if (!EFI_ERROR (Status)) {\r
- return Timeout;\r
- }\r
- //\r
- // To make the current EFI Automatic-Test activity possible, just add\r
- // following code to make AutoBoot enabled when this variable is not\r
- // present.\r
- // This code should be removed later.\r
- //\r
- Timeout = gPlatformBootTimeOutDefault;\r
-\r
- //\r
- // Notes: Platform should set default variable if non exists on all error cases!!!\r
- //\r
- Status = gRT->SetVariable (\r
- L"Timeout",\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
- sizeof (UINT16),\r
- &Timeout\r
- );\r
- return Timeout;\r
-}\r
-\r
-VOID\r
-BdsLibLoadDrivers (\r
- IN LIST_ENTRY *BdsDriverLists\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- The function will go through the driver optoin link list, load and start\r
- every driver the driver optoin device path point to.\r
-\r
-Arguments:\r
-\r
- BdsDriverLists - The header of the current driver option link list\r
-\r
-Returns:\r
- \r
- None\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- LIST_ENTRY *Link;\r
- BDS_COMMON_OPTION *Option;\r
- EFI_HANDLE ImageHandle;\r
- EFI_LOADED_IMAGE_PROTOCOL *ImageInfo;\r
- UINTN ExitDataSize;\r
- CHAR16 *ExitData;\r
- BOOLEAN ReconnectAll;\r
-\r
- ReconnectAll = FALSE;\r
-\r
- //\r
- // Process the driver option\r
- //\r
- for (Link = BdsDriverLists->ForwardLink; Link != BdsDriverLists; Link = Link->ForwardLink) {\r
- Option = CR (Link, BDS_COMMON_OPTION, Link, BDS_LOAD_OPTION_SIGNATURE);\r
- //\r
- // If a load option is not marked as LOAD_OPTION_ACTIVE,\r
- // the boot manager will not automatically load the option.\r
- //\r
- if (!IS_LOAD_OPTION_TYPE (Option->Attribute, LOAD_OPTION_ACTIVE)) {\r
- continue;\r
- }\r
- //\r
- // If a driver load option is marked as LOAD_OPTION_FORCE_RECONNECT,\r
- // then all of the EFI drivers in the system will be disconnected and\r
- // reconnected after the last driver load option is processed.\r
- //\r
- if (IS_LOAD_OPTION_TYPE (Option->Attribute, LOAD_OPTION_FORCE_RECONNECT)) {\r
- ReconnectAll = TRUE;\r
- }\r
- //\r
- // Make sure the driver path is connected.\r
- //\r
- BdsLibConnectDevicePath (Option->DevicePath);\r
-\r
- //\r
- // Load and start the image that Driver#### describes\r
- //\r
- Status = gBS->LoadImage (\r
- FALSE,\r
- mBdsImageHandle,\r
- Option->DevicePath,\r
- NULL,\r
- 0,\r
- &ImageHandle\r
- );\r
-\r
- if (!EFI_ERROR (Status)) {\r
- gBS->HandleProtocol (ImageHandle, &gEfiLoadedImageProtocolGuid,
- (VOID **)&ImageInfo);\r
-\r
- //\r
- // Verify whether this image is a driver, if not,\r
- // exit it and continue to parse next load option\r
- //\r
- if (ImageInfo->ImageCodeType != EfiBootServicesCode && ImageInfo->ImageCodeType != EfiRuntimeServicesCode) {\r
- gBS->Exit (ImageHandle, EFI_INVALID_PARAMETER, 0, NULL);\r
- continue;\r
- }\r
-\r
- if (Option->LoadOptionsSize != 0) {\r
- ImageInfo->LoadOptionsSize = Option->LoadOptionsSize;\r
- ImageInfo->LoadOptions = Option->LoadOptions;\r
- }\r
- //\r
- // Before calling the image, enable the Watchdog Timer for\r
- // the 5 Minute period\r
- //\r
- gBS->SetWatchdogTimer (5 * 60, 0x0000, 0x00, NULL);\r
-\r
- Status = gBS->StartImage (ImageHandle, &ExitDataSize, &ExitData);\r
- DEBUG ((EFI_D_INFO | EFI_D_LOAD, "Driver Return Status = %r\n", Status));\r
-\r
- //\r
- // Clear the Watchdog Timer after the image returns\r
- //\r
- gBS->SetWatchdogTimer (0x0000, 0x0000, 0x0000, NULL);\r
- }\r
- }\r
- //\r
- // Process the LOAD_OPTION_FORCE_RECONNECT driver option\r
- //\r
- if (ReconnectAll) {\r
- BdsLibDisconnectAllEfi ();\r
- BdsLibConnectAll ();\r
- }\r
-\r
-}\r
-\r
-EFI_STATUS\r
-BdsLibRegisterNewOption (\r
- IN LIST_ENTRY *BdsOptionList,\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
- IN CHAR16 *String,\r
- IN CHAR16 *VariableName\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- This function will register the new boot#### or driver#### option base on\r
- the VariableName. The new registered boot#### or driver#### will be linked\r
- to BdsOptionList and also update to the VariableName. After the boot#### or\r
- driver#### updated, the BootOrder or DriverOrder will also be updated.\r
-\r
-Arguments:\r
-\r
- BdsOptionList - The header of the boot#### or driver#### link list\r
- \r
- DevicePath - The device path which the boot####\r
- or driver#### option present\r
- \r
- String - The description of the boot#### or driver####\r
- \r
- VariableName - Indicate if the boot#### or driver#### option\r
-\r
-Returns:\r
- \r
- EFI_SUCCESS - The boot#### or driver#### have been success registered\r
- \r
- EFI_STATUS - Return the status of gRT->SetVariable ().\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- UINT16 MaxOptionNumber;\r
- UINT16 RegisterOptionNumber;\r
- UINT16 *TempOptionPtr;\r
- UINTN TempOptionSize;\r
- UINT16 *OptionOrderPtr;\r
- VOID *OptionPtr;\r
- UINTN OptionSize;\r
- UINT8 *TempPtr;\r
- EFI_DEVICE_PATH_PROTOCOL *OptionDevicePath;\r
- CHAR16 *Description;\r
- CHAR16 OptionName[10];\r
- BOOLEAN UpdateBootDevicePath;\r
-\r
- OptionPtr = NULL;\r
- OptionSize = 0;\r
- TempPtr = NULL;\r
- OptionDevicePath = NULL;\r
- Description = NULL;\r
- MaxOptionNumber = 0;\r
- OptionOrderPtr = NULL;\r
- UpdateBootDevicePath = FALSE;\r
- ZeroMem (OptionName, sizeof (OptionName));\r
-\r
- TempOptionSize = 0;\r
- TempOptionPtr = BdsLibGetVariableAndSize (\r
- VariableName,\r
- &gEfiGlobalVariableGuid,\r
- &TempOptionSize\r
- );\r
- //\r
- // Compare with current option variable\r
- //\r
- for (Index = 0; Index < TempOptionSize / sizeof (UINT16); Index++) {\r
- //\r
- // Got the max option#### number\r
- //\r
- if (MaxOptionNumber < TempOptionPtr[Index]) {\r
- MaxOptionNumber = TempOptionPtr[Index];\r
- }\r
-\r
- if (*VariableName == 'B') {\r
- UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", TempOptionPtr[Index]);\r
- } else {\r
- UnicodeSPrint (OptionName, sizeof (OptionName), L"Driver%04x", TempOptionPtr[Index]);\r
- }\r
-\r
- OptionPtr = BdsLibGetVariableAndSize (\r
- OptionName,\r
- &gEfiGlobalVariableGuid,\r
- &OptionSize\r
- );\r
- TempPtr = OptionPtr;\r
- TempPtr += sizeof (UINT32) + sizeof (UINT16);\r
- Description = (CHAR16 *) TempPtr;\r
- TempPtr += StrSize ((CHAR16 *) TempPtr);\r
- OptionDevicePath = (EFI_DEVICE_PATH_PROTOCOL *) TempPtr;\r
-\r
- //\r
- // Notes: the description may will change base on the GetStringToken\r
- //\r
- if (CompareMem (Description, String, StrSize (Description)) == 0) {\r
- if (CompareMem (OptionDevicePath, DevicePath, GetDevicePathSize (OptionDevicePath)) == 0) {\r
- //\r
- // Got the option, so just return\r
- //\r
- gBS->FreePool (OptionPtr);\r
- gBS->FreePool (TempOptionPtr);\r
- return EFI_SUCCESS;\r
- } else {\r
- //\r
- // Boot device path changed, need update.\r
- //\r
- UpdateBootDevicePath = TRUE;\r
- break;\r
- }\r
- }\r
-\r
- gBS->FreePool (OptionPtr);\r
- }\r
-\r
- OptionSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (String) + GetDevicePathSize (DevicePath);\r
- OptionPtr = AllocateZeroPool (OptionSize);\r
- TempPtr = OptionPtr;\r
- *(UINT32 *) TempPtr = LOAD_OPTION_ACTIVE;\r
- TempPtr += sizeof (UINT32);\r
- *(UINT16 *) TempPtr = (UINT16) GetDevicePathSize (DevicePath);\r
- TempPtr += sizeof (UINT16);\r
- CopyMem (TempPtr, String, StrSize (String));\r
- TempPtr += StrSize (String);\r
- CopyMem (TempPtr, DevicePath, GetDevicePathSize (DevicePath));\r
-\r
- if (UpdateBootDevicePath) {\r
- //\r
- // The number in option#### to be updated\r
- //\r
- RegisterOptionNumber = TempOptionPtr[Index];\r
- } else {\r
- //\r
- // The new option#### number\r
- //\r
- RegisterOptionNumber = MaxOptionNumber + 1;\r
- }\r
-\r
- if (*VariableName == 'B') {\r
- UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", RegisterOptionNumber);\r
- } else {\r
- UnicodeSPrint (OptionName, sizeof (OptionName), L"Driver%04x", RegisterOptionNumber);\r
- }\r
-\r
- Status = gRT->SetVariable (\r
- OptionName,\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
- OptionSize,\r
- OptionPtr\r
- );\r
- if (EFI_ERROR (Status) || UpdateBootDevicePath) {\r
- gBS->FreePool (OptionPtr);\r
- gBS->FreePool (TempOptionPtr);\r
- return Status;\r
- }\r
-\r
- gBS->FreePool (OptionPtr);\r
-\r
- //\r
- // Update the option order variable\r
- //\r
- OptionOrderPtr = AllocateZeroPool ((Index + 1) * sizeof (UINT16));\r
- CopyMem (OptionOrderPtr, TempOptionPtr, Index * sizeof (UINT16));\r
- OptionOrderPtr[Index] = RegisterOptionNumber;\r
- Status = gRT->SetVariable (\r
- VariableName,\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
- (Index + 1) * sizeof (UINT16),\r
- OptionOrderPtr\r
- );\r
- if (EFI_ERROR (Status)) {\r
- gBS->FreePool (TempOptionPtr);\r
- gBS->FreePool (OptionOrderPtr);\r
- return Status;\r
- }\r
-\r
- gBS->FreePool (TempOptionPtr);\r
- gBS->FreePool (OptionOrderPtr);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-BDS_COMMON_OPTION *\r
-BdsLibVariableToOption (\r
- IN OUT LIST_ENTRY *BdsCommonOptionList,\r
- IN CHAR16 *VariableName\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Build the boot#### or driver#### option from the VariableName, the \r
- build boot#### or driver#### will also be linked to BdsCommonOptionList\r
- \r
-Arguments:\r
-\r
- BdsCommonOptionList - The header of the boot#### or driver#### option link list\r
-\r
- VariableName - EFI Variable name indicate if it is boot#### or driver####\r
-\r
-Returns:\r
-\r
- BDS_COMMON_OPTION - Get the option just been created\r
-\r
- NULL - Failed to get the new option\r
-\r
---*/\r
-{\r
- UINT32 Attribute;\r
- UINT16 FilePathSize;\r
- UINT8 *Variable;\r
- UINT8 *TempPtr;\r
- UINTN VariableSize;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- BDS_COMMON_OPTION *Option;\r
- VOID *LoadOptions;\r
- UINT32 LoadOptionsSize;\r
- CHAR16 *Description;\r
-\r
- //\r
- // Read the variable. We will never free this data.\r
- //\r
- Variable = BdsLibGetVariableAndSize (\r
- VariableName,\r
- &gEfiGlobalVariableGuid,\r
- &VariableSize\r
- );\r
- if (Variable == NULL) {\r
- return NULL;\r
- }\r
- //\r
- // Notes: careful defined the variable of Boot#### or\r
- // Driver####, consider use some macro to abstract the code\r
- //\r
- //\r
- // Get the option attribute\r
- //\r
- TempPtr = Variable;\r
- Attribute = *(UINT32 *) Variable;\r
- TempPtr += sizeof (UINT32);\r
-\r
- //\r
- // Get the option's device path size\r
- //\r
- FilePathSize = *(UINT16 *) TempPtr;\r
- TempPtr += sizeof (UINT16);\r
-\r
- //\r
- // Get the option's description string\r
- //\r
- Description = (CHAR16 *) TempPtr;\r
-\r
- //\r
- // Get the option's description string size\r
- //\r
- TempPtr += StrSize ((CHAR16 *) TempPtr);\r
-\r
- //\r
- // Get the option's device path\r
- //\r
- DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) TempPtr;\r
- TempPtr += FilePathSize;\r
-\r
- LoadOptions = TempPtr;\r
- LoadOptionsSize = (UINT32) (VariableSize - (UINTN) (TempPtr - Variable));\r
-\r
- //\r
- // The Console variables may have multiple device paths, so make\r
- // an Entry for each one.\r
- //\r
- Option = AllocateZeroPool (sizeof (BDS_COMMON_OPTION));\r
- if (Option == NULL) {\r
- return NULL;\r
- }\r
-\r
- Option->Signature = BDS_LOAD_OPTION_SIGNATURE;\r
- Option->DevicePath = AllocateZeroPool (GetDevicePathSize (DevicePath));\r
- CopyMem (Option->DevicePath, DevicePath, GetDevicePathSize (DevicePath));\r
- Option->Attribute = Attribute;\r
- Option->Description = AllocateZeroPool (StrSize (Description));\r
- CopyMem (Option->Description, Description, StrSize (Description));\r
- Option->LoadOptions = AllocateZeroPool (LoadOptionsSize);\r
- CopyMem (Option->LoadOptions, LoadOptions, LoadOptionsSize);\r
- Option->LoadOptionsSize = LoadOptionsSize;\r
-\r
- //\r
- // Insert active entry to BdsDeviceList\r
- //\r
- if ((Option->Attribute & LOAD_OPTION_ACTIVE) == LOAD_OPTION_ACTIVE) {\r
- InsertTailList (BdsCommonOptionList, &Option->Link);\r
- gBS->FreePool (Variable);\r
- return Option;\r
- }\r
-\r
- gBS->FreePool (Variable);\r
- gBS->FreePool (Option);\r
- return NULL;\r
-\r
-}\r
-\r
-EFI_STATUS\r
-BdsLibBuildOptionFromVar (\r
- IN LIST_ENTRY *BdsCommonOptionList,\r
- IN CHAR16 *VariableName\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Process BootOrder, or DriverOrder variables, by calling\r
- BdsLibVariableToOption () for each UINT16 in the variables.\r
-\r
-Arguments:\r
-\r
- BdsCommonOptionList - The header of the option list base on variable\r
- VariableName\r
-\r
- VariableName - EFI Variable name indicate the BootOrder or DriverOrder\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - Success create the boot option or driver option list\r
-\r
- EFI_OUT_OF_RESOURCES - Failed to get the boot option or driver option list\r
-\r
---*/\r
-{\r
- UINT16 *OptionOrder;\r
- UINTN OptionOrderSize;\r
- UINTN Index;\r
- BDS_COMMON_OPTION *Option;\r
- CHAR16 OptionName[20];\r
-\r
- //\r
- // Zero Buffer in order to get all BOOT#### variables\r
- //\r
- ZeroMem (OptionName, sizeof (OptionName));\r
-\r
- //\r
- // Read the BootOrder, or DriverOrder variable.\r
- //\r
- OptionOrder = BdsLibGetVariableAndSize (\r
- VariableName,\r
- &gEfiGlobalVariableGuid,\r
- &OptionOrderSize\r
- );\r
- if (OptionOrder == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- for (Index = 0; Index < OptionOrderSize / sizeof (UINT16); Index++) {\r
- if (*VariableName == 'B') {\r
- UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", OptionOrder[Index]);\r
- } else {\r
- UnicodeSPrint (OptionName, sizeof (OptionName), L"Driver%04x", OptionOrder[Index]);\r
- }\r
- Option = BdsLibVariableToOption (BdsCommonOptionList, OptionName);\r
- Option->BootCurrent = OptionOrder[Index];\r
-\r
- }\r
-\r
- gBS->FreePool (OptionOrder);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-BdsLibGetBootMode (\r
- OUT EFI_BOOT_MODE *BootMode\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Get boot mode by looking up configuration table and parsing HOB list\r
-\r
-Arguments:\r
-\r
- BootMode - Boot mode from PEI handoff HOB.\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - Successfully get boot mode\r
- \r
- EFI_NOT_FOUND - Can not find the current system boot mode\r
-\r
---*/\r
-{\r
- EFI_HOB_HANDOFF_INFO_TABLE *HobList;\r
-\r
- HobList = GetHobList ();\r
- ASSERT (HobList->Header.HobType == EFI_HOB_TYPE_HANDOFF);\r
- *BootMode = HobList->BootMode;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-VOID *\r
-BdsLibGetVariableAndSize (\r
- IN CHAR16 *Name,\r
- IN EFI_GUID *VendorGuid,\r
- OUT UINTN *VariableSize\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Read the EFI variable (VendorGuid/Name) and return a dynamically allocated\r
- buffer, and the size of the buffer. If failure return NULL.\r
-\r
-Arguments:\r
-\r
- Name - String part of EFI variable name\r
-\r
- VendorGuid - GUID part of EFI variable name\r
-\r
- VariableSize - Returns the size of the EFI variable that was read\r
-\r
-Returns:\r
-\r
- Dynamically allocated memory that contains a copy of the EFI variable.\r
- Caller is responsible freeing the buffer.\r
-\r
- NULL - Variable was not read\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- UINTN BufferSize;\r
- VOID *Buffer;\r
-\r
- Buffer = NULL;\r
-\r
- //\r
- // Pass in a zero size buffer to find the required buffer size.\r
- //\r
- BufferSize = 0;\r
- Status = gRT->GetVariable (Name, VendorGuid, NULL, &BufferSize, Buffer);\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- //\r
- // Allocate the buffer to return\r
- //\r
- Buffer = AllocateZeroPool (BufferSize);\r
- if (Buffer == NULL) {\r
- return NULL;\r
- }\r
- //\r
- // Read variable into the allocated buffer.\r
- //\r
- Status = gRT->GetVariable (Name, VendorGuid, NULL, &BufferSize, Buffer);\r
- if (EFI_ERROR (Status)) {\r
- BufferSize = 0;\r
- }\r
- }\r
-\r
- *VariableSize = BufferSize;\r
- return Buffer;\r
-}\r
-\r
-BOOLEAN\r
-BdsLibMatchDevicePaths (\r
- IN EFI_DEVICE_PATH_PROTOCOL *Multi,\r
- IN EFI_DEVICE_PATH_PROTOCOL *Single\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Function compares a device path data structure to that of all the nodes of a\r
- second device path instance.\r
-\r
-Arguments:\r
-\r
- Multi - A pointer to a multi-instance device path data structure.\r
-\r
- Single - A pointer to a single-instance device path data structure.\r
-\r
-Returns:\r
-\r
- TRUE - If the Single is contained within Multi\r
- \r
- FALSE - The Single is not match within Multi\r
- \r
-\r
---*/\r
-{\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePathInst;\r
- UINTN Size;\r
-\r
- if (!Multi || !Single) {\r
- return FALSE;\r
- }\r
-\r
- DevicePath = Multi;\r
- DevicePathInst = GetNextDevicePathInstance (&DevicePath, &Size);\r
- Size -= sizeof (EFI_DEVICE_PATH_PROTOCOL);\r
-\r
- //\r
- // Search for the match of 'Single' in 'Multi'\r
- //\r
- while (DevicePathInst != NULL) {\r
- //\r
- // If the single device path is found in multiple device paths,\r
- // return success\r
- //\r
- if (Size == 0) {\r
- return FALSE;\r
- }\r
-\r
- if (CompareMem (Single, DevicePathInst, Size) == 0) {\r
- return TRUE;\r
- }\r
-\r
- gBS->FreePool (DevicePathInst);\r
- DevicePathInst = GetNextDevicePathInstance (&DevicePath, &Size);\r
- Size -= sizeof (EFI_DEVICE_PATH_PROTOCOL);\r
- }\r
-\r
- return FALSE;\r
-}\r
-\r
-EFI_STATUS\r
-BdsLibOutputStrings (\r
- IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *ConOut,\r
- ...\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function prints a series of strings.\r
-\r
-Arguments:\r
-\r
- ConOut - Pointer to EFI_SIMPLE_TEXT_OUT_PROTOCOL\r
-\r
- ... - A variable argument list containing series of strings,\r
- the last string must be NULL.\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - Success print out the string using ConOut.\r
- \r
- EFI_STATUS - Return the status of the ConOut->OutputString ().\r
-\r
---*/\r
-{\r
- VA_LIST args;\r
- EFI_STATUS Status;\r
- CHAR16 *String;\r
-\r
- Status = EFI_SUCCESS;\r
- VA_START (args, ConOut);\r
-\r
- while (!EFI_ERROR (Status)) {\r
- //\r
- // If String is NULL, then it's the end of the list\r
- //\r
- String = VA_ARG (args, CHAR16 *);\r
- if (!String) {\r
- break;\r
- }\r
-\r
- Status = ConOut->OutputString (ConOut, String);\r
-\r
- if (EFI_ERROR (Status)) {\r
- break;\r
- }\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-//\r
-// Following are BDS Lib functions which contain all the code about setup browser reset reminder feature.\r
-// Setup Browser reset reminder feature is that an reset reminder will be given before user leaves the setup browser if \r
-// user change any option setting which needs a reset to be effective, and the reset will be applied according to the user selection.\r
-//\r
-\r
-VOID\r
-EnableResetReminderFeature (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Enable the setup browser reset reminder feature.\r
- This routine is used in platform tip. If the platform policy need the feature, use the routine to enable it.\r
-\r
-Arguments:\r
-\r
- VOID\r
-\r
-Returns:\r
-\r
- VOID\r
-\r
---*/\r
-{\r
- mFeaturerSwitch = TRUE;\r
-} \r
-\r
-VOID\r
-DisableResetReminderFeature (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Disable the setup browser reset reminder feature.\r
- This routine is used in platform tip. If the platform policy do not want the feature, use the routine to disable it.\r
- \r
-Arguments:\r
-\r
- VOID\r
-\r
-Returns:\r
-\r
- VOID\r
-\r
---*/\r
-{\r
- mFeaturerSwitch = FALSE;\r
-} \r
-\r
-VOID\r
-EnableResetRequired (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Record the info that a reset is required.\r
- A module boolean variable is used to record whether a reset is required. \r
- \r
-Arguments:\r
-\r
- VOID\r
-\r
-Returns:\r
-\r
- VOID\r
-\r
---*/\r
-{\r
- mResetRequired = TRUE;\r
-} \r
-\r
-VOID\r
-DisableResetRequired (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Record the info that no reset is required.\r
- A module boolean variable is used to record whether a reset is required. \r
-\r
-Arguments:\r
-\r
- VOID\r
-\r
-Returns:\r
-\r
- VOID\r
-\r
---*/\r
-{\r
- mResetRequired = FALSE;\r
-} \r
-\r
-BOOLEAN\r
-IsResetReminderFeatureEnable (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Check whether platform policy enable the reset reminder feature. The default is enabled.\r
-\r
-Arguments:\r
-\r
- VOID\r
-\r
-Returns:\r
-\r
- VOID\r
-\r
---*/\r
-{\r
- return mFeaturerSwitch;\r
-}\r
-\r
-BOOLEAN\r
-IsResetRequired (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Check if user changed any option setting which needs a system reset to be effective.\r
- \r
-Arguments:\r
-\r
- VOID\r
-\r
-Returns:\r
-\r
- VOID\r
-\r
---*/\r
-{\r
- return mResetRequired;\r
-}\r
-\r
-VOID\r
-SetupResetReminder (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Check whether a reset is needed, and finish the reset reminder feature.\r
- If a reset is needed, Popup a menu to notice user, and finish the feature \r
- according to the user selection.\r
-\r
-Arguments:\r
-\r
- VOID\r
-\r
-Returns:\r
-\r
- VOID\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_FORM_BROWSER_PROTOCOL *Browser;\r
- EFI_INPUT_KEY Key; \r
- CHAR16 *StringBuffer1;\r
- CHAR16 *StringBuffer2; \r
-\r
-\r
- //\r
- //check any reset required change is applied? if yes, reset system\r
- //\r
- if (IsResetReminderFeatureEnable ()) {\r
- if (IsResetRequired ()) {\r
- \r
- Status = gBS->LocateProtocol (\r
- &gEfiFormBrowserProtocolGuid,\r
- NULL,\r
- (VOID **)&Browser\r
- ); \r
- \r
- StringBuffer1 = AllocateZeroPool (MAX_STRING_LEN * sizeof (CHAR16));\r
- ASSERT (StringBuffer1 != NULL);\r
- StringBuffer2 = AllocateZeroPool (MAX_STRING_LEN * sizeof (CHAR16));\r
- ASSERT (StringBuffer2 != NULL); \r
- StrCpy (StringBuffer1, L"Configuration changed. Reset to apply it Now ? ");\r
- StrCpy (StringBuffer2, L"Enter (YES) / Esc (NO)"); \r
- //\r
- // Popup a menu to notice user\r
- // \r
- do {\r
- Browser->CreatePopUp (2, TRUE, 0, NULL, &Key, StringBuffer1, StringBuffer2);\r
- } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN)); \r
- \r
- gBS->FreePool (StringBuffer1); \r
- gBS->FreePool (StringBuffer2); \r
- //\r
- // If the user hits the YES Response key, reset\r
- //\r
- if ((Key.UnicodeChar == CHAR_CARRIAGE_RETURN)) {\r
- gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);\r
- }\r
- gST->ConOut->ClearScreen (gST->ConOut);\r
- } \r
- } \r
-} \r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- DevicePath.c\r
-\r
-Abstract:\r
-\r
- BDS internal function define the default device path string, it can be\r
- replaced by platform device path.\r
-\r
---*/\r
-\r
-\r
-#ifdef TIANO_EXTENSION_FLAG\r
-EFI_GUID UnknownDeviceGuid = UNKNOWN_DEVICE_GUID;\r
-#endif \r
-\r
-EFI_GUID mEfiUnixThunkProtocolGuid = EFI_UNIX_THUNK_PROTOCOL_GUID;\r
-EFI_GUID mEfiUnixUgaGuid = EFI_UNIX_UGA_GUID;\r
-EFI_GUID mEfiMsgPcAnsiGuid = DEVICE_PATH_MESSAGING_PC_ANSI;\r
-EFI_GUID mEfiMsgVt100Guid = DEVICE_PATH_MESSAGING_VT_100;\r
-EFI_GUID mEfiMsgVt100PlusGuid = DEVICE_PATH_MESSAGING_VT_100_PLUS;\r
-EFI_GUID mEfiMsgVt100Utf8Guid = DEVICE_PATH_MESSAGING_VT_UTF8;\r
-\r
-VOID *\r
-ReallocatePool (\r
- IN VOID *OldPool,\r
- IN UINTN OldSize,\r
- IN UINTN NewSize\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Adjusts the size of a previously allocated buffer.\r
-\r
-Arguments:\r
-\r
- OldPool - A pointer to the buffer whose size is being adjusted.\r
-\r
- OldSize - The size of the current buffer.\r
-\r
- NewSize - The size of the new buffer.\r
-\r
-Returns:\r
-\r
- EFI_SUCEESS - The requested number of bytes were allocated.\r
-\r
- EFI_OUT_OF_RESOURCES - The pool requested could not be allocated.\r
-\r
- EFI_INVALID_PARAMETER - The buffer was invalid.\r
-\r
---*/\r
-{\r
- VOID *NewPool;\r
-\r
- NewPool = NULL;\r
- if (NewSize) {\r
- NewPool = AllocateZeroPool (NewSize);\r
- }\r
-\r
- if (OldPool) {\r
- if (NewPool) {\r
- CopyMem (NewPool, OldPool, OldSize < NewSize ? OldSize : NewSize);\r
- }\r
-\r
- gBS->FreePool (OldPool);\r
- }\r
-\r
- return NewPool;\r
-}\r
-\r
-CHAR16 *\r
-CatPrint (\r
- IN OUT POOL_PRINT *Str,\r
- IN CHAR16 *fmt,\r
- ...\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Concatenates a formatted unicode string to allocated pool. \r
- The caller must free the resulting buffer.\r
-\r
-Arguments:\r
-\r
- Str - Tracks the allocated pool, size in use, and \r
- amount of pool allocated.\r
-\r
- fmt - The format string\r
-\r
-Returns:\r
-\r
- Allocated buffer with the formatted string printed in it. \r
- The caller must free the allocated buffer. The buffer\r
- allocation is not packed.\r
-\r
---*/\r
-{\r
- UINT16 *AppendStr;\r
- VA_LIST args;\r
- UINTN strsize;\r
-\r
- AppendStr = AllocateZeroPool (0x1000);\r
- if (AppendStr == NULL) {\r
- return Str->str;\r
- }\r
-\r
- VA_START (args, fmt);\r
- UnicodeVSPrint (AppendStr, 0x1000, fmt, args);\r
- VA_END (args);\r
- if (NULL == Str->str) {\r
- strsize = StrSize (AppendStr);\r
- Str->str = AllocateZeroPool (strsize);\r
- ASSERT (Str->str != NULL);\r
- } else {\r
- strsize = StrSize (AppendStr) + StrSize (Str->str) - sizeof (UINT16);\r
- Str->str = ReallocatePool (\r
- Str->str,\r
- StrSize (Str->str),\r
- strsize\r
- );\r
- ASSERT (Str->str != NULL);\r
- }\r
-\r
- Str->maxlen = MAX_CHAR * sizeof (UINT16);\r
- if (strsize < Str->maxlen) {\r
- StrCat (Str->str, AppendStr);\r
- Str->len = strsize - sizeof (UINT16);\r
- }\r
-\r
- gBS->FreePool (AppendStr);\r
- return Str->str;\r
-}\r
-\r
-EFI_DEVICE_PATH_PROTOCOL *\r
-BdsLibUnpackDevicePath (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevPath\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Function unpacks a device path data structure so that all the nodes\r
- of a device path are naturally aligned.\r
-\r
-Arguments:\r
-\r
- DevPath - A pointer to a device path data structure\r
-\r
-Returns:\r
-\r
- If the memory for the device path is successfully allocated, then a \r
- pointer to the new device path is returned. Otherwise, NULL is returned.\r
-\r
---*/\r
-{\r
- EFI_DEVICE_PATH_PROTOCOL *Src;\r
- EFI_DEVICE_PATH_PROTOCOL *Dest;\r
- EFI_DEVICE_PATH_PROTOCOL *NewPath;\r
- UINTN Size;\r
-\r
- //\r
- // Walk device path and round sizes to valid boundries\r
- //\r
- Src = DevPath;\r
- Size = 0;\r
- for (;;) {\r
- Size += DevicePathNodeLength (Src);\r
- Size += ALIGN_SIZE (Size);\r
-\r
- if (IsDevicePathEnd (Src)) {\r
- break;\r
- }\r
-\r
- Src = NextDevicePathNode (Src);\r
- }\r
- //\r
- // Allocate space for the unpacked path\r
- //\r
- NewPath = AllocateZeroPool (Size);\r
- if (NewPath) {\r
-\r
- ASSERT (((UINTN) NewPath) % MIN_ALIGNMENT_SIZE == 0);\r
-\r
- //\r
- // Copy each node\r
- //\r
- Src = DevPath;\r
- Dest = NewPath;\r
- for (;;) {\r
- Size = DevicePathNodeLength (Src);\r
- CopyMem (Dest, Src, Size);\r
- Size += ALIGN_SIZE (Size);\r
- SetDevicePathNodeLength (Dest, Size);\r
- Dest->Type |= EFI_DP_TYPE_UNPACKED;\r
- Dest = (EFI_DEVICE_PATH_PROTOCOL *) (((UINT8 *) Dest) + Size);\r
-\r
- if (IsDevicePathEnd (Src)) {\r
- break;\r
- }\r
-\r
- Src = NextDevicePathNode (Src);\r
- }\r
- }\r
-\r
- return NewPath;\r
-}\r
-\r
-VOID\r
-DevPathPci (\r
- IN OUT POOL_PRINT *Str,\r
- IN VOID *DevPath\r
- )\r
-{\r
- PCI_DEVICE_PATH *Pci;\r
-\r
- Pci = DevPath;\r
- CatPrint (Str, L"Pci(%x|%x)", Pci->Device, Pci->Function);\r
-}\r
-\r
-VOID\r
-DevPathPccard (\r
- IN OUT POOL_PRINT *Str,\r
- IN VOID *DevPath\r
- )\r
-{\r
- PCCARD_DEVICE_PATH *Pccard;\r
-\r
- Pccard = DevPath;\r
- CatPrint (Str, L"Pcmcia(Function%x)", Pccard->FunctionNumber);\r
-}\r
-\r
-VOID\r
-DevPathMemMap (\r
- IN OUT POOL_PRINT *Str,\r
- IN VOID *DevPath\r
- )\r
-{\r
- MEMMAP_DEVICE_PATH *MemMap;\r
-\r
- MemMap = DevPath;\r
- CatPrint (\r
- Str,\r
- L"MemMap(%d:%.lx-%.lx)",\r
- MemMap->MemoryType,\r
- MemMap->StartingAddress,\r
- MemMap->EndingAddress\r
- );\r
-}\r
-\r
-VOID\r
-DevPathController (\r
- IN OUT POOL_PRINT *Str,\r
- IN VOID *DevPath\r
- )\r
-{\r
- CONTROLLER_DEVICE_PATH *Controller;\r
-\r
- Controller = DevPath;\r
- CatPrint (Str, L"Ctrl(%d)", Controller->ControllerNumber);\r
-}\r
-\r
-VOID\r
-DevPathVendor (\r
- IN OUT POOL_PRINT *Str,\r
- IN VOID *DevPath\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Convert Vendor device path to device name\r
-\r
-Arguments:\r
-\r
- Str - The buffer store device name\r
- DevPath - Pointer to vendor device path\r
-\r
-Returns:\r
-\r
- When it return, the device name have been stored in *Str.\r
-\r
---*/\r
-{\r
- VENDOR_DEVICE_PATH *Vendor;\r
- CHAR16 *Type;\r
- INT32 *Temp;\r
-\r
- Vendor = DevPath;\r
- Temp = (INT32 *) (&Vendor->Guid);\r
-\r
- switch (DevicePathType (&Vendor->Header)) {\r
- case HARDWARE_DEVICE_PATH:\r
- //\r
- // If the device is an Unix device, we will give it a readable device name.\r
- //\r
- if (CompareGuid (&Vendor->Guid, &mEfiUnixThunkProtocolGuid)) {\r
- CatPrint (Str, L"%s", L"UnixBus");\r
- return ;\r
- } else if (CompareGuid (&Vendor->Guid, &mEfiUnixUgaGuid)) {\r
- CatPrint (Str, L"%s", L"UGA");\r
- return ;\r
- } else {\r
- Type = L"Hw";\r
- break;\r
- }\r
-\r
- case MESSAGING_DEVICE_PATH:\r
- //\r
- // If the device is an Unix device, we will give it a readable device name.\r
- //\r
- if (CompareGuid (&Vendor->Guid, &mEfiMsgPcAnsiGuid)) {\r
- CatPrint (Str, L"%s", L"PC-ANSI");\r
- return ;\r
- } else if (CompareGuid (&Vendor->Guid, &mEfiMsgVt100Guid)) {\r
- CatPrint (Str, L"%s", L"VT100");\r
- return ;\r
- } else if (CompareGuid (&Vendor->Guid, &mEfiMsgVt100PlusGuid)) {\r
- CatPrint (Str, L"%s", L"VT100+");\r
- return ;\r
- } else if (CompareGuid (&Vendor->Guid, &mEfiMsgVt100Utf8Guid)) {\r
- CatPrint (Str, L"%s", L"VT100-UTF8");\r
- return ;\r
- } else {\r
- Type = L"Msg";\r
- break;\r
- }\r
-\r
- case MEDIA_DEVICE_PATH:\r
- Type = L"Media";\r
- break;\r
-\r
- default:\r
- Type = L"?";\r
- break;\r
- }\r
-\r
- CatPrint (Str, L"Ven%s(%g)", Type, &Vendor->Guid);\r
-}\r
-\r
-VOID\r
-DevPathAcpi (\r
- IN OUT POOL_PRINT *Str,\r
- IN VOID *DevPath\r
- )\r
-{\r
- ACPI_HID_DEVICE_PATH *Acpi;\r
-\r
- Acpi = DevPath;\r
- if ((Acpi->HID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) {\r
- CatPrint (Str, L"Acpi(PNP%04x,%x)", EISA_ID_TO_NUM (Acpi->HID), Acpi->UID);\r
- } else {\r
- CatPrint (Str, L"Acpi(%08x,%x)", Acpi->HID, Acpi->UID);\r
- }\r
-}\r
-\r
-VOID\r
-DevPathAtapi (\r
- IN OUT POOL_PRINT *Str,\r
- IN VOID *DevPath\r
- )\r
-{\r
- ATAPI_DEVICE_PATH *Atapi;\r
-\r
- Atapi = DevPath;\r
- CatPrint (\r
- Str,\r
- L"Ata(%s,%s)",\r
- Atapi->PrimarySecondary ? L"Secondary" : L"Primary",\r
- Atapi->SlaveMaster ? L"Slave" : L"Master"\r
- );\r
-}\r
-\r
-VOID\r
-DevPathScsi (\r
- IN OUT POOL_PRINT *Str,\r
- IN VOID *DevPath\r
- )\r
-{\r
- SCSI_DEVICE_PATH *Scsi;\r
-\r
- Scsi = DevPath;\r
- CatPrint (Str, L"Scsi(Pun%x,Lun%x)", Scsi->Pun, Scsi->Lun);\r
-}\r
-\r
-VOID\r
-DevPathFibre (\r
- IN OUT POOL_PRINT *Str,\r
- IN VOID *DevPath\r
- )\r
-{\r
- FIBRECHANNEL_DEVICE_PATH *Fibre;\r
-\r
- Fibre = DevPath;\r
- CatPrint (Str, L"Fibre(Wwn%lx,Lun%x)", Fibre->WWN, Fibre->Lun);\r
-}\r
-\r
-VOID\r
-DevPath1394 (\r
- IN OUT POOL_PRINT *Str,\r
- IN VOID *DevPath\r
- )\r
-{\r
- F1394_DEVICE_PATH *F1394;\r
-\r
- F1394 = DevPath;\r
- CatPrint (Str, L"1394(%g)", &F1394->Guid);\r
-}\r
-\r
-VOID\r
-DevPathUsb (\r
- IN OUT POOL_PRINT *Str,\r
- IN VOID *DevPath\r
- )\r
-{\r
- USB_DEVICE_PATH *Usb;\r
-\r
- Usb = DevPath;\r
- CatPrint (Str, L"Usb(%x, %x)", Usb->ParentPortNumber, Usb->InterfaceNumber);\r
-}\r
-\r
-VOID\r
-DevPathUsbClass (\r
- IN OUT POOL_PRINT *Str,\r
- IN VOID *DevPath\r
- )\r
-{\r
- USB_CLASS_DEVICE_PATH *UsbClass;\r
-\r
- UsbClass = DevPath;\r
- CatPrint (\r
- Str,\r
- L"Usb Class(%x, %x, %x, %x, %x)",\r
- UsbClass->VendorId,\r
- UsbClass->ProductId,\r
- UsbClass->DeviceClass,\r
- UsbClass->DeviceSubClass,\r
- UsbClass->DeviceProtocol\r
- );\r
-}\r
-\r
-VOID\r
-DevPathI2O (\r
- IN OUT POOL_PRINT *Str,\r
- IN VOID *DevPath\r
- )\r
-{\r
- I2O_DEVICE_PATH *I2O;\r
-\r
- I2O = DevPath;\r
- CatPrint (Str, L"I2O(%x)", I2O->Tid);\r
-}\r
-\r
-VOID\r
-DevPathMacAddr (\r
- IN OUT POOL_PRINT *Str,\r
- IN VOID *DevPath\r
- )\r
-{\r
- MAC_ADDR_DEVICE_PATH *MAC;\r
- UINTN HwAddressSize;\r
- UINTN Index;\r
-\r
- MAC = DevPath;\r
-\r
- HwAddressSize = sizeof (EFI_MAC_ADDRESS);\r
- if (MAC->IfType == 0x01 || MAC->IfType == 0x00) {\r
- HwAddressSize = 6;\r
- }\r
-\r
- CatPrint (Str, L"Mac(");\r
-\r
- for (Index = 0; Index < HwAddressSize; Index++) {\r
- CatPrint (Str, L"%02x", MAC->MacAddress.Addr[Index]);\r
- }\r
-\r
- CatPrint (Str, L")");\r
-}\r
-\r
-VOID\r
-DevPathIPv4 (\r
- IN OUT POOL_PRINT *Str,\r
- IN VOID *DevPath\r
- )\r
-{\r
- IPv4_DEVICE_PATH *IP;\r
-\r
- IP = DevPath;\r
- CatPrint (\r
- Str,\r
- L"IPv4(%d.%d.%d.%d:%d)",\r
- IP->RemoteIpAddress.Addr[0],\r
- IP->RemoteIpAddress.Addr[1],\r
- IP->RemoteIpAddress.Addr[2],\r
- IP->RemoteIpAddress.Addr[3],\r
- IP->RemotePort\r
- );\r
-}\r
-\r
-VOID\r
-DevPathIPv6 (\r
- IN OUT POOL_PRINT *Str,\r
- IN VOID *DevPath\r
- )\r
-{\r
- IPv6_DEVICE_PATH *IP;\r
-\r
- IP = DevPath;\r
- CatPrint (Str, L"IP-v6(not-done)");\r
-}\r
-\r
-VOID\r
-DevPathInfiniBand (\r
- IN OUT POOL_PRINT *Str,\r
- IN VOID *DevPath\r
- )\r
-{\r
- INFINIBAND_DEVICE_PATH *InfiniBand;\r
-\r
- InfiniBand = DevPath;\r
- CatPrint (Str, L"InfiniBand(not-done)");\r
-}\r
-\r
-VOID\r
-DevPathUart (\r
- IN OUT POOL_PRINT *Str,\r
- IN VOID *DevPath\r
- )\r
-{\r
- UART_DEVICE_PATH *Uart;\r
- CHAR8 Parity;\r
-\r
- Uart = DevPath;\r
- switch (Uart->Parity) {\r
- case 0:\r
- Parity = 'D';\r
- break;\r
-\r
- case 1:\r
- Parity = 'N';\r
- break;\r
-\r
- case 2:\r
- Parity = 'E';\r
- break;\r
-\r
- case 3:\r
- Parity = 'O';\r
- break;\r
-\r
- case 4:\r
- Parity = 'M';\r
- break;\r
-\r
- case 5:\r
- Parity = 'S';\r
- break;\r
-\r
- default:\r
- Parity = 'x';\r
- break;\r
- }\r
-\r
- if (Uart->BaudRate == 0) {\r
- CatPrint (Str, L"Uart(DEFAULT %c", Parity);\r
- } else {\r
- CatPrint (Str, L"Uart(%d %c", Uart->BaudRate, Parity);\r
- }\r
-\r
- if (Uart->DataBits == 0) {\r
- CatPrint (Str, L"D");\r
- } else {\r
- CatPrint (Str, L"%d", Uart->DataBits);\r
- }\r
-\r
- switch (Uart->StopBits) {\r
- case 0:\r
- CatPrint (Str, L"D)");\r
- break;\r
-\r
- case 1:\r
- CatPrint (Str, L"1)");\r
- break;\r
-\r
- case 2:\r
- CatPrint (Str, L"1.5)");\r
- break;\r
-\r
- case 3:\r
- CatPrint (Str, L"2)");\r
- break;\r
-\r
- default:\r
- CatPrint (Str, L"x)");\r
- break;\r
- }\r
-}\r
-\r
-VOID\r
-DevPathHardDrive (\r
- IN OUT POOL_PRINT *Str,\r
- IN VOID *DevPath\r
- )\r
-{\r
- HARDDRIVE_DEVICE_PATH *Hd;\r
-\r
- Hd = DevPath;\r
- switch (Hd->SignatureType) {\r
- case SIGNATURE_TYPE_MBR:\r
- CatPrint (\r
- Str,\r
- L"HD(Part%d,Sig%08x)",\r
- Hd->PartitionNumber,\r
- *((UINT32 *) (&(Hd->Signature[0])))\r
- );\r
- break;\r
-\r
- case SIGNATURE_TYPE_GUID:\r
- CatPrint (\r
- Str,\r
- L"HD(Part%d,Sig%g)",\r
- Hd->PartitionNumber,\r
- (EFI_GUID *) &(Hd->Signature[0])\r
- );\r
- break;\r
-\r
- default:\r
- CatPrint (\r
- Str,\r
- L"HD(Part%d,MBRType=%02x,SigType=%02x)",\r
- Hd->PartitionNumber,\r
- Hd->MBRType,\r
- Hd->SignatureType\r
- );\r
- break;\r
- }\r
-}\r
-\r
-VOID\r
-DevPathCDROM (\r
- IN OUT POOL_PRINT *Str,\r
- IN VOID *DevPath\r
- )\r
-{\r
- CDROM_DEVICE_PATH *Cd;\r
-\r
- Cd = DevPath;\r
- CatPrint (Str, L"CDROM(Entry%x)", Cd->BootEntry);\r
-}\r
-\r
-VOID\r
-DevPathFilePath (\r
- IN OUT POOL_PRINT *Str,\r
- IN VOID *DevPath\r
- )\r
-{\r
- FILEPATH_DEVICE_PATH *Fp;\r
-\r
- Fp = DevPath;\r
- CatPrint (Str, L"%s", Fp->PathName);\r
-}\r
-\r
-VOID\r
-DevPathMediaProtocol (\r
- IN OUT POOL_PRINT *Str,\r
- IN VOID *DevPath\r
- )\r
-{\r
- MEDIA_PROTOCOL_DEVICE_PATH *MediaProt;\r
-\r
- MediaProt = DevPath;\r
- CatPrint (Str, L"%g", &MediaProt->Protocol);\r
-}\r
-\r
-VOID\r
-DevPathFvFilePath (\r
- IN OUT POOL_PRINT *Str,\r
- IN VOID *DevPath\r
- )\r
-{\r
- MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvFilePath;\r
-\r
- FvFilePath = DevPath;\r
- CatPrint (Str, L"%g", &FvFilePath->NameGuid);\r
-}\r
-\r
-VOID\r
-DevPathBssBss (\r
- IN OUT POOL_PRINT *Str,\r
- IN VOID *DevPath\r
- )\r
-{\r
- BBS_BBS_DEVICE_PATH *Bbs;\r
- CHAR16 *Type;\r
-\r
- Bbs = DevPath;\r
- switch (Bbs->DeviceType) {\r
- case BBS_TYPE_FLOPPY:\r
- Type = L"Floppy";\r
- break;\r
-\r
- case BBS_TYPE_HARDDRIVE:\r
- Type = L"Harddrive";\r
- break;\r
-\r
- case BBS_TYPE_CDROM:\r
- Type = L"CDROM";\r
- break;\r
-\r
- case BBS_TYPE_PCMCIA:\r
- Type = L"PCMCIA";\r
- break;\r
-\r
- case BBS_TYPE_USB:\r
- Type = L"Usb";\r
- break;\r
-\r
- case BBS_TYPE_EMBEDDED_NETWORK:\r
- Type = L"Net";\r
- break;\r
-\r
- default:\r
- Type = L"?";\r
- break;\r
- }\r
- //\r
- // Since current Print function hasn't implemented %a (for ansi string)\r
- // we will only print Unicode strings.\r
- //\r
- CatPrint (Str, L"Legacy-%s", Type);\r
-}\r
-\r
-VOID\r
-DevPathEndInstance (\r
- IN OUT POOL_PRINT *Str,\r
- IN VOID *DevPath\r
- )\r
-{\r
- CatPrint (Str, L",");\r
-}\r
-\r
-VOID\r
-DevPathNodeUnknown (\r
- IN OUT POOL_PRINT *Str,\r
- IN VOID *DevPath\r
- )\r
-{\r
- CatPrint (Str, L"?");\r
-}\r
-\r
-DEVICE_PATH_STRING_TABLE DevPathTable[] = {\r
- {
- HARDWARE_DEVICE_PATH,\r
- HW_PCI_DP,\r
- DevPathPci\r
- },
- {
- HARDWARE_DEVICE_PATH,\r
- HW_PCCARD_DP,\r
- DevPathPccard\r
- },
- {
- HARDWARE_DEVICE_PATH,\r
- HW_MEMMAP_DP,\r
- DevPathMemMap\r
- },
- {
- HARDWARE_DEVICE_PATH,\r
- HW_VENDOR_DP,\r
- DevPathVendor\r
- },
- {
- HARDWARE_DEVICE_PATH,\r
- HW_CONTROLLER_DP,\r
- DevPathController\r
- },
- {
- ACPI_DEVICE_PATH,\r
- ACPI_DP,\r
- DevPathAcpi\r
- },
- {
- MESSAGING_DEVICE_PATH,\r
- MSG_ATAPI_DP,\r
- DevPathAtapi\r
- },
- {
- MESSAGING_DEVICE_PATH,\r
- MSG_SCSI_DP,\r
- DevPathScsi\r
- },
- {
- MESSAGING_DEVICE_PATH,\r
- MSG_FIBRECHANNEL_DP,\r
- DevPathFibre\r
- },
- {
- MESSAGING_DEVICE_PATH,\r
- MSG_1394_DP,\r
- DevPath1394\r
- },
- {
- MESSAGING_DEVICE_PATH,\r
- MSG_USB_DP,\r
- DevPathUsb\r
- },
- {
- MESSAGING_DEVICE_PATH,\r
- MSG_USB_CLASS_DP,\r
- DevPathUsbClass\r
- },
- {
- MESSAGING_DEVICE_PATH,\r
- MSG_I2O_DP,\r
- DevPathI2O\r
- },
- {
- MESSAGING_DEVICE_PATH,\r
- MSG_MAC_ADDR_DP,\r
- DevPathMacAddr\r
- },
- {
- MESSAGING_DEVICE_PATH,\r
- MSG_IPv4_DP,\r
- DevPathIPv4\r
- },
- {
- MESSAGING_DEVICE_PATH,\r
- MSG_IPv6_DP,\r
- DevPathIPv6\r
- },
- {
- MESSAGING_DEVICE_PATH,\r
- MSG_INFINIBAND_DP,\r
- DevPathInfiniBand\r
- },
- {
- MESSAGING_DEVICE_PATH,\r
- MSG_UART_DP,\r
- DevPathUart\r
- },
- {
- MESSAGING_DEVICE_PATH,\r
- MSG_VENDOR_DP,\r
- DevPathVendor\r
- },
- {
- MEDIA_DEVICE_PATH,\r
- MEDIA_HARDDRIVE_DP,\r
- DevPathHardDrive\r
- },
- {
- MEDIA_DEVICE_PATH,\r
- MEDIA_CDROM_DP,\r
- DevPathCDROM\r
- },
- {
- MEDIA_DEVICE_PATH,\r
- MEDIA_VENDOR_DP,\r
- DevPathVendor\r
- },
- {
- MEDIA_DEVICE_PATH,\r
- MEDIA_FILEPATH_DP,\r
- DevPathFilePath\r
- },
- {
- MEDIA_DEVICE_PATH,\r
- MEDIA_PROTOCOL_DP,\r
- DevPathMediaProtocol\r
- },
-\r
-#if (EFI_SPECIFICATION_VERSION < 0x00020000)\r
- {
- MEDIA_DEVICE_PATH,\r
- MEDIA_FV_FILEPATH_DP,\r
- DevPathFvFilePath\r
- },
-#endif\r
-\r
- {
- BBS_DEVICE_PATH,\r
- BBS_BBS_DP,\r
- DevPathBssBss\r
- },
- {
- END_DEVICE_PATH_TYPE,\r
- END_INSTANCE_DEVICE_PATH_SUBTYPE,\r
- DevPathEndInstance\r
- },
- {
- 0,\r
- 0,\r
- NULL\r
- }
-};\r
-\r
-CHAR16 *\r
-DevicePathToStr (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevPath\r
- )\r
-/*++\r
-\r
- Turns the Device Path into a printable string. Allcoates\r
- the string from pool. The caller must SafeFreePool the returned\r
- string.\r
-\r
---*/\r
-{\r
- POOL_PRINT Str;\r
- EFI_DEVICE_PATH_PROTOCOL *DevPathNode;\r
- VOID (*DumpNode) (POOL_PRINT *, VOID *);\r
-\r
- UINTN Index;\r
- UINTN NewSize;\r
-\r
- ZeroMem (&Str, sizeof (Str));\r
-\r
- if (DevPath == NULL) {\r
- goto Done;\r
- }\r
- //\r
- // Unpacked the device path\r
- //\r
- DevPath = BdsLibUnpackDevicePath (DevPath);\r
- ASSERT (DevPath);\r
-\r
- //\r
- // Process each device path node\r
- //\r
- DevPathNode = DevPath;\r
- while (!IsDevicePathEnd (DevPathNode)) {\r
- //\r
- // Find the handler to dump this device path node\r
- //\r
- DumpNode = NULL;\r
- for (Index = 0; DevPathTable[Index].Function; Index += 1) {\r
-\r
- if (DevicePathType (DevPathNode) == DevPathTable[Index].Type &&\r
- DevicePathSubType (DevPathNode) == DevPathTable[Index].SubType\r
- ) {\r
- DumpNode = DevPathTable[Index].Function;\r
- break;\r
- }\r
- }\r
- //\r
- // If not found, use a generic function\r
- //\r
- if (!DumpNode) {\r
- DumpNode = DevPathNodeUnknown;\r
- }\r
- //\r
- // Put a path seperator in if needed\r
- //\r
- if (Str.len && DumpNode != DevPathEndInstance) {\r
- CatPrint (&Str, L"/");\r
- }\r
- //\r
- // Print this node of the device path\r
- //\r
- DumpNode (&Str, DevPathNode);\r
-\r
- //\r
- // Next device path node\r
- //\r
- DevPathNode = NextDevicePathNode (DevPathNode);\r
- }\r
- //\r
- // Shrink pool used for string allocation\r
- //\r
- gBS->FreePool (DevPath);\r
-\r
-Done:\r
- NewSize = (Str.len + 1) * sizeof (CHAR16);\r
- Str.str = ReallocatePool (Str.str, NewSize, NewSize);\r
- ASSERT (Str.str != NULL);\r
- Str.str[Str.len] = 0;\r
- return Str.str;\r
-}\r
-\r
-EFI_DEVICE_PATH_PROTOCOL *\r
-LibDuplicateDevicePathInstance (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevPath\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Function creates a device path data structure that identically matches the \r
- device path passed in.\r
-\r
-Arguments:\r
-\r
- DevPath - A pointer to a device path data structure.\r
-\r
-Returns:\r
-\r
- The new copy of DevPath is created to identically match the input. \r
- Otherwise, NULL is returned.\r
-\r
---*/\r
-{\r
- EFI_DEVICE_PATH_PROTOCOL *NewDevPath;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePathInst;\r
- EFI_DEVICE_PATH_PROTOCOL *Temp;\r
- UINTN Size;\r
-\r
- //\r
- // get the size of an instance from the input\r
- //\r
- Temp = DevPath;\r
- DevicePathInst = GetNextDevicePathInstance (&Temp, &Size);\r
-\r
- //\r
- // Make a copy\r
- //\r
- NewDevPath = NULL;\r
- if (Size) {\r
- NewDevPath = AllocateZeroPool (Size);\r
- ASSERT (NewDevPath != NULL);\r
- }\r
-\r
- if (NewDevPath) {\r
- CopyMem (NewDevPath, DevicePathInst, Size);\r
- }\r
-\r
- return NewDevPath;\r
-}\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0">\r
- <MsaHeader>\r
- <ModuleName>EdkGenericBdsLib</ModuleName>\r
- <ModuleType>DXE_DRIVER</ModuleType>\r
- <GuidValue>f3aaea62-8985-11db-baff-0040d02b1835</GuidValue>\r
- <Version>1.0</Version>\r
- <Abstract>EDK Generic BDS Common APIs Library Instance.</Abstract>\r
- <Description>The library instance provides common library routines help in \r
- performance measurement, device path debug print, boot device selections,\r
- boot device connection, console supports in BDS phase and boot from boot\r
- device.\r
- </Description>\r
- <Copyright>Copyright (c) 2006, Intel Corporation.</Copyright>\r
- <License>All rights reserved. This program and the accompanying materials\r
- are licensed and made available under the terms and conditions of the BSD License\r
- which accompanies this distribution. The full text of the license may be found at\r
- http://opensource.org/licenses/bsd-license.php\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.</License>\r
- <Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052</Specification>\r
- </MsaHeader>\r
- <ModuleDefinitions>\r
- <SupportedArchitectures>IA32 X64 IPF EBC</SupportedArchitectures>\r
- <BinaryModule>false</BinaryModule>\r
- <OutputFileBasename>EdkGenericBdsLib</OutputFileBasename>\r
- </ModuleDefinitions>\r
- <LibraryClassDefinitions>\r
- <LibraryClass Usage="ALWAYS_PRODUCED">\r
- <Keyword>EdkGenericBdsLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>BaseLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>UefiLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>DxeServicesTableLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>DebugLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>PrintLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>HobLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>BaseMemoryLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>MemoryAllocationLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>UefiBootServicesTableLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>UefiRuntimeServicesTableLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>DevicePathLib</Keyword>\r
- </LibraryClass>\r
- <LibraryClass Usage="ALWAYS_CONSUMED">\r
- <Keyword>PerformanceLib</Keyword>\r
- </LibraryClass>\r
- </LibraryClassDefinitions>\r
- <SourceFiles>\r
- <Filename>BdsBoot.c</Filename>\r
- <Filename>BdsConsole.c</Filename>\r
- <Filename>BdsConnect.c</Filename>\r
- <Filename>DevicePath.c</Filename>\r
- <Filename>Performance.h</Filename>\r
- <Filename>Performance.c</Filename>\r
- <Filename>BdsMisc.c</Filename>\r
- <Filename SupArchList="IPF">Ipf/ShadowRom.c</Filename>\r
- </SourceFiles>\r
- <PackageDependencies>\r
- <Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>\r
- <Package PackageGuid="68169ab0-d41b-4009-9060-292c253ac43d"/>\r
- <Package PackageGuid="f2805c44-8985-11db-9e98-0040d02b1835"/>\r
- </PackageDependencies>\r
- <Protocols>\r
- <Protocol Usage="ALWAYS_CONSUMED">\r
- <ProtocolCName>gEfiLoadedImageProtocolGuid</ProtocolCName>\r
- </Protocol>\r
- <Protocol Usage="ALWAYS_CONSUMED">\r
- <ProtocolCName>gEfiFirmwareVolumeProtocolGuid</ProtocolCName>\r
- </Protocol>\r
- <Protocol Usage="ALWAYS_CONSUMED">\r
- <ProtocolCName>gEfiAcpiS3SaveProtocolGuid</ProtocolCName>\r
- </Protocol>\r
- <Protocol Usage="ALWAYS_CONSUMED">\r
- <ProtocolCName>gEfiSimpleTextOutProtocolGuid</ProtocolCName>\r
- </Protocol>\r
- <Protocol Usage="ALWAYS_CONSUMED">\r
- <ProtocolCName>gEfiSimpleTextInProtocolGuid</ProtocolCName>\r
- </Protocol>\r
- <Protocol Usage="ALWAYS_CONSUMED">\r
- <ProtocolCName>gEfiSimpleNetworkProtocolGuid</ProtocolCName>\r
- </Protocol>\r
- </Protocols>\r
- <Guids>\r
- <GuidCNames Usage="ALWAYS_CONSUMED">\r
- <GuidCName>gEfiShellFileGuid</GuidCName>\r
- </GuidCNames>\r
- </Guids>\r
- <Externs>\r
- <Specification>EFI_SPECIFICATION_VERSION 0x00020000</Specification>\r
- <Specification>EDK_RELEASE_VERSION 0x00020000</Specification>\r
- </Externs>\r
-</ModuleSurfaceArea>
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
- \r
- ShadowRom.c\r
-\r
-Abstract:\r
-\r
- Shadow all option rom\r
-\r
-Revision History\r
-\r
---*/\r
-\r
-#include "Tiano.h"\r
-#include "EfiDriverLib.h"\r
-\r
-#include EFI_PROTOCOL_DEFINITION (LegacyBios)\r
-\r
-UINT8 mShadowRomFlag = 0;\r
-\r
-VOID\r
-ShadowAllOptionRom()\r
-{\r
- EFI_STATUS Status;\r
- EFI_LEGACY_BIOS_PROTOCOL *LegacyBios;\r
- //\r
- // Rom shadow only do once.\r
- //\r
- if (mShadowRomFlag == 0) {\r
- Status = gBS->LocateProtocol (\r
- &gEfiLegacyBiosProtocolGuid,\r
- NULL,\r
- &LegacyBios\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- LegacyBios->PrepareToBootEfi (LegacyBios, NULL, NULL);\r
- }\r
-\r
- mShadowRomFlag = 1;\r
- }\r
-\r
- return ;\r
-}\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- Performance.c\r
-\r
-Abstract:\r
-\r
- This file include the file which can help to get the system\r
- performance, all the function will only include if the performance\r
- switch is set.\r
-\r
---*/\r
-\r
-#include "Performance.h"\r
-\r
-VOID\r
-ClearDebugRegisters (\r
- VOID\r
- )\r
-{\r
- //\r
- // BugBug: We should not need to do this. We need to root cause this bug!!!!\r
- //\r
- AsmWriteDr0 (0);\r
- AsmWriteDr1 (0);\r
-}\r
-\r
-STATIC\r
-VOID\r
-GetShortPdbFileName (\r
- CHAR8 *PdbFileName,\r
- CHAR8 *GaugeString\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
-Arguments:\r
-\r
-Returns:\r
-\r
---*/\r
-{\r
- UINTN Index;\r
- UINTN Index1;\r
- UINTN StartIndex;\r
- UINTN EndIndex;\r
-\r
- if (PdbFileName == NULL) {\r
- AsciiStrCpy (GaugeString, " ");\r
- } else {\r
- StartIndex = 0;\r
- for (EndIndex = 0; PdbFileName[EndIndex] != 0; EndIndex++)\r
- ;\r
-\r
- for (Index = 0; PdbFileName[Index] != 0; Index++) {\r
- if (PdbFileName[Index] == '\\') {\r
- StartIndex = Index + 1;\r
- }\r
-\r
- if (PdbFileName[Index] == '.') {\r
- EndIndex = Index;\r
- }\r
- }\r
-\r
- Index1 = 0;\r
- for (Index = StartIndex; Index < EndIndex; Index++) {\r
- GaugeString[Index1] = PdbFileName[Index];\r
- Index1++;\r
- if (Index1 == PERF_TOKEN_LENGTH - 1) {\r
- break;\r
- }\r
- }\r
-\r
- GaugeString[Index1] = 0;\r
- }\r
-\r
- return ;\r
-}\r
-\r
-\r
-\r
-STATIC\r
-CHAR8 *\r
-GetPdbPath (\r
- VOID *ImageBase\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Located PDB path name in PE image\r
-\r
-Arguments:\r
-\r
- ImageBase - base of PE to search\r
-\r
-Returns:\r
-\r
- Pointer into image at offset of PDB file name if PDB file name is found,\r
- Otherwise a pointer to an empty string.\r
-\r
---*/\r
-{\r
- PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;\r
-\r
- ZeroMem (&ImageContext, sizeof (ImageContext));\r
- ImageContext.Handle = ImageBase;\r
- ImageContext.ImageRead = PeCoffLoaderImageReadFromMemory;\r
-\r
- PeCoffLoaderGetImageInfo (&ImageContext);\r
-\r
- return ImageContext.PdbPointer;\r
-}\r
-\r
-\r
-STATIC\r
-VOID\r
-GetNameFromHandle (\r
- IN EFI_HANDLE Handle,\r
- OUT CHAR8 *GaugeString\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_LOADED_IMAGE_PROTOCOL *Image;\r
- CHAR8 *PdbFileName;\r
- EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;\r
-\r
- AsciiStrCpy (GaugeString, " ");\r
-\r
- //\r
- // Get handle name from image protocol\r
- //\r
- Status = gBS->HandleProtocol (\r
- Handle,\r
- &gEfiLoadedImageProtocolGuid,\r
- (VOID **)&Image\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- Status = gBS->OpenProtocol (\r
- Handle,\r
- &gEfiDriverBindingProtocolGuid,\r
- (VOID **) &DriverBinding,\r
- NULL,\r
- NULL,\r
- EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return ;\r
- }\r
- //\r
- // Get handle name from image protocol\r
- //\r
- Status = gBS->HandleProtocol (\r
- DriverBinding->ImageHandle,\r
- &gEfiLoadedImageProtocolGuid,\r
- (VOID **)&Image\r
- );\r
- }\r
-\r
- PdbFileName = GetPdbPath (Image->ImageBase);\r
-\r
- if (PdbFileName != NULL) {\r
- GetShortPdbFileName (PdbFileName, GaugeString);\r
- }\r
-\r
- return ;\r
-}\r
-\r
-\r
-\r
-VOID\r
-WriteBootToOsPerformanceData (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- \r
- Allocates a block of memory and writes performance data of booting to OS into it.\r
-\r
-Arguments:\r
- \r
- None\r
- \r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_CPU_ARCH_PROTOCOL *Cpu;\r
- EFI_PHYSICAL_ADDRESS mAcpiLowMemoryBase;\r
- UINT32 mAcpiLowMemoryLength;\r
- UINT32 LimitCount;\r
- PERF_HEADER mPerfHeader;\r
- PERF_DATA mPerfData;\r
- EFI_HANDLE *Handles;\r
- UINTN NoHandles;\r
- CHAR8 GaugeString[PERF_TOKEN_LENGTH];\r
- UINT8 *Ptr;\r
- UINT32 mIndex;\r
- UINT64 Ticker;\r
- UINT64 Freq;\r
- UINT32 Duration;\r
- UINT64 CurrentTicker;\r
- UINT64 TimerPeriod;\r
- UINTN LogEntryKey;\r
- CONST VOID *Handle;\r
- CONST CHAR8 *Token;\r
- CONST CHAR8 *Module;\r
- UINT64 StartTicker;\r
- UINT64 EndTicker;\r
-\r
- //\r
- // Retrive time stamp count as early as possilbe\r
- //\r
- Ticker = AsmReadTsc ();\r
-\r
- //\r
- // Allocate a block of memory that contain performance data to OS\r
- //\r
- mAcpiLowMemoryBase = 0xFFFFFFFF;\r
- Status = gBS->AllocatePages (\r
- AllocateMaxAddress,\r
- EfiReservedMemoryType,\r
- 4,\r
- &mAcpiLowMemoryBase\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return ;\r
- }\r
-\r
- mAcpiLowMemoryLength = EFI_PAGES_TO_SIZE(4);\r
-\r
- Ptr = (UINT8 *) ((UINT32) mAcpiLowMemoryBase + sizeof (PERF_HEADER));\r
- LimitCount = (mAcpiLowMemoryLength - sizeof (PERF_HEADER)) / sizeof (PERF_DATA);\r
-\r
- //\r
- // Initialize performance data structure\r
- //\r
- ZeroMem (&mPerfHeader, sizeof (PERF_HEADER));\r
-\r
- //\r
- // Get CPU frequency\r
- //\r
- Status = gBS->LocateProtocol (\r
- &gEfiCpuArchProtocolGuid,\r
- NULL,\r
- (VOID **)&Cpu\r
- );\r
- if (EFI_ERROR (Status)) {\r
- gBS->FreePages (mAcpiLowMemoryBase, 4);\r
- return ;\r
- }\r
- //\r
- // Get Cpu Frequency\r
- //\r
- Status = Cpu->GetTimerValue (Cpu, 0, &(CurrentTicker), &TimerPeriod);\r
- if (EFI_ERROR (Status)) {\r
- gBS->FreePages (mAcpiLowMemoryBase, 4);\r
- return ;\r
- }\r
-\r
- Freq = DivU64x32 (1000000000000ULL, (UINTN) TimerPeriod);\r
-\r
- mPerfHeader.CpuFreq = Freq;\r
-\r
- //\r
- // Record BDS raw performance data\r
- //\r
- mPerfHeader.BDSRaw = Ticker;\r
-\r
- //\r
- // Put Detailed performance data into memory\r
- //\r
- Handles = NULL;\r
- Status = gBS->LocateHandleBuffer (\r
- AllHandles,\r
- NULL,\r
- NULL,\r
- &NoHandles,\r
- &Handles\r
- );\r
- if (EFI_ERROR (Status)) {\r
- gBS->FreePages (mAcpiLowMemoryBase, 4);\r
- return ;\r
- }\r
- //\r
- // Get DXE drivers performance\r
- //\r
- for (mIndex = 0; mIndex < NoHandles; mIndex++) {\r
- Ticker = 0;\r
- LogEntryKey = 0;\r
- while ((LogEntryKey = GetPerformanceMeasurement (\r
- LogEntryKey,\r
- &Handle,\r
- &Token,\r
- &Module,\r
- &StartTicker,\r
- &EndTicker)) != 0) {\r
- if ((Handle == Handles[mIndex]) && (StartTicker < EndTicker)) {\r
- Ticker += (EndTicker - StartTicker);\r
- }\r
- }\r
-\r
- Duration = (UINT32) DivU64x32 (\r
- Ticker,\r
- (UINT32) Freq\r
- );\r
-\r
- if (Duration > 0) {\r
- ZeroMem (&mPerfData, sizeof (PERF_DATA));\r
-\r
- GetNameFromHandle (Handles[mIndex], GaugeString);\r
-\r
- AsciiStrCpy (mPerfData.Token, GaugeString);\r
- mPerfData.Duration = Duration;\r
-\r
- CopyMem (Ptr, &mPerfData, sizeof (PERF_DATA));\r
- Ptr += sizeof (PERF_DATA);\r
-\r
- mPerfHeader.Count++;\r
- if (mPerfHeader.Count == LimitCount) {\r
- goto Done;\r
- }\r
- }\r
- }\r
-\r
- gBS->FreePool (Handles);\r
-\r
- //\r
- // Get inserted performance data\r
- //\r
- LogEntryKey = 0;\r
- while ((LogEntryKey = GetPerformanceMeasurement (\r
- LogEntryKey,\r
- &Handle,\r
- &Token,\r
- &Module,\r
- &StartTicker,\r
- &EndTicker)) != 0) {\r
- if ((Handle == NULL) && (StartTicker <= EndTicker)) {\r
-\r
- ZeroMem (&mPerfData, sizeof (PERF_DATA));\r
-\r
- AsciiStrnCpy (mPerfData.Token, Token, DXE_PERFORMANCE_STRING_SIZE);\r
- mPerfData.Duration = (UINT32) DivU64x32 (\r
- EndTicker - StartTicker,\r
- (UINT32) Freq\r
- );\r
-\r
- CopyMem (Ptr, &mPerfData, sizeof (PERF_DATA));\r
- Ptr += sizeof (PERF_DATA);\r
-\r
- mPerfHeader.Count++;\r
- if (mPerfHeader.Count == LimitCount) {\r
- goto Done;\r
- }\r
- }\r
- }\r
-\r
-Done:\r
-\r
- ClearDebugRegisters ();\r
-\r
- mPerfHeader.Signiture = 0x66726550;\r
-\r
- //\r
- // Put performance data to memory\r
- //\r
- CopyMem (\r
- (UINT32 *) (UINT32) mAcpiLowMemoryBase,\r
- &mPerfHeader,\r
- sizeof (PERF_HEADER)\r
- );\r
-\r
- gRT->SetVariable (\r
- L"PerfDataMemAddr",\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
- sizeof (UINT32),\r
- (VOID *) &mAcpiLowMemoryBase\r
- );\r
-\r
- return ;\r
-}\r
+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- Performance.h\r
-\r
-Abstract:\r
-\r
- This file included the performance relete function header and \r
- definition.\r
-\r
---*/\r
-\r
-#ifndef _PERF_H_\r
-#define _PERF_H_\r
-\r
-#define PERF_TOKEN_LENGTH 28\r
-#define PERF_PEI_ENTRY_MAX_NUM 50\r
-\r
-typedef struct {\r
- CHAR8 Token[PERF_TOKEN_LENGTH];\r
- UINT32 Duration;\r
-} PERF_DATA;\r
-\r
-typedef struct {\r
- UINT64 BootToOs;\r
- UINT64 S3Resume;\r
- UINT32 S3EntryNum;\r
- PERF_DATA S3Entry[PERF_PEI_ENTRY_MAX_NUM];\r
- UINT64 CpuFreq;\r
- UINT64 BDSRaw;\r
- UINT32 Count;\r
- UINT32 Signiture;\r
-} PERF_HEADER;\r
-\r
-VOID\r
-WriteBootToOsPerformanceData (\r
- VOID\r
- );\r
-\r
-VOID\r
-ClearDebugRegisters (\r
- VOID\r
- );\r
-\r
-#endif\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0">\r
- <MsaHeader>\r
- <ModuleName>Logo</ModuleName>\r
- <ModuleType>BASE</ModuleType>\r
- <GuidValue>7BB28B99-61BB-11D5-9A5D-0090273FC14D</GuidValue>\r
- <Version>1.0</Version>\r
- <Abstract>Component description file for creating a Logo file.</Abstract>\r
- <Description>This module provides the logo bitmap picture shown on setup screen.</Description>\r
- <Copyright>Copyright (c) 2006, Intel Corporation</Copyright>\r
- <License>All rights reserved. This program and the accompanying materials\r
- are licensed and made available under the terms and conditions of the BSD License\r
- which accompanies this distribution. The full text of the license may be found at\r
- http://opensource.org/licenses/bsd-license.php\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.</License>\r
- <Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052</Specification>\r
- </MsaHeader>\r
- <ModuleDefinitions>\r
- <SupportedArchitectures>IA32 X64 IPF EBC</SupportedArchitectures>\r
- <BinaryModule>true</BinaryModule>\r
- <OutputFileBasename>Logo</OutputFileBasename>\r
- </ModuleDefinitions>\r
- <SourceFiles>\r
- <Filename>Logo.bmp</Filename>\r
- </SourceFiles>\r
- <PackageDependencies>\r
- <Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>\r
- </PackageDependencies>\r
- <Externs>\r
- <Specification>EFI_SPECIFICATION_VERSION 0x00020000</Specification>\r
- <Specification>EDK_RELEASE_VERSION 0x00020000</Specification>\r
- </Externs>\r
-</ModuleSurfaceArea>