3 * Functions to call legacy BIOS API.
10 EFI_GUID gEfiLegacyBootProtocolGuid
= { 0xdb9a1e3d, 0x45cb, 0x4abb, { 0x85, 0x3b, 0xe5, 0x38, 0x7f, 0xdb, 0x2e, 0x2d }};
13 Internal helper function.
15 Update the BBS Table so that devices of DeviceType have their boot priority
16 updated to a high/bootable value.
18 See "DeviceType values" in
19 http://www.intel.com/content/dam/doc/reference-guide/efi-compatibility-support-module-specification-v097.pdf
21 NOTE: This function should probably be refactored! Currently, all devices of
22 type are enabled. This should be updated so that only a specific device is
23 enabled. The wrong device could boot if there are multiple targets of the same
26 @param DeviceType The device type that we wish to enable
34 EFI_LEGACY_BIOS_PROTOCOL
*LegacyBios
;
37 HDD_INFO
*HddInfo
= NULL
;
39 BBS_TABLE
*LocalBbsTable
= NULL
;
41 Status
= gBS
->LocateProtocol (&gEfiLegacyBootProtocolGuid
, NULL
, (VOID
**) &LegacyBios
);
42 if (EFI_ERROR (Status
)) {
46 Status
= LegacyBios
->GetBbsInfo (LegacyBios
, &HddCount
, &HddInfo
, &BbsCount
, &LocalBbsTable
);
49 //Print (L" NO Prio bb/dd/ff cl/sc Type Stat segm:offs\n");
50 //Print (L"=============================================\n");
52 for (Idx
= 0; Idx
< BbsCount
; Idx
++)
54 if(LocalBbsTable
[Idx
].DeviceType
== 0){
58 // Set devices of a particular type to BootPriority of 0. I believe 0 is the highest priority
59 if(LocalBbsTable
[Idx
].DeviceType
== DeviceType
){
60 LocalBbsTable
[Idx
].BootPriority
= 0;
65 L" %02x: %04x %02x/%02x/%02x %02x/%02x %04x %04x %04x:%04x\n",
67 (UINTN) LocalBbsTable[Idx].BootPriority,
68 (UINTN) LocalBbsTable[Idx].Bus,
69 (UINTN) LocalBbsTable[Idx].Device,
70 (UINTN) LocalBbsTable[Idx].Function,
71 (UINTN) LocalBbsTable[Idx].Class,
72 (UINTN) LocalBbsTable[Idx].SubClass,
73 (UINTN) LocalBbsTable[Idx].DeviceType,
74 (UINTN) * (UINT16 *) &LocalBbsTable[Idx].StatusFlags,
75 (UINTN) LocalBbsTable[Idx].BootHandlerSegment,
76 (UINTN) LocalBbsTable[Idx].BootHandlerOffset,
77 (UINTN) ((LocalBbsTable[Idx].MfgStringSegment << 4) + LocalBbsTable[Idx].MfgStringOffset),
78 (UINTN) ((LocalBbsTable[Idx].DescStringSegment << 4) + LocalBbsTable[Idx].DescStringOffset)
86 // Internal helper function
87 // BOOLEAN ArrayContains(UINT16* Arr, UINT8 ArrLen, UINT8 Target)
90 // for(i = 0; i < ArrLen; i++)
92 // if(Arr[i] == Target)
100 Boot the legacy system with the boot option
102 @param Option The legacy boot option which have BBS device path
104 @retval EFI_UNSUPPORTED There is no legacybios protocol, do not support
106 @retval EFI_STATUS Return the status of LegacyBios->LegacyBoot ().
111 IN BDS_COMMON_OPTION
*Option
115 EFI_LEGACY_BIOS_PROTOCOL
*LegacyBios
;
116 BBS_BBS_DEVICE_PATH
*OptionBBS
;
118 Status
= gBS
->LocateProtocol (&gEfiLegacyBootProtocolGuid
, NULL
, (VOID
**) &LegacyBios
);
119 if (EFI_ERROR (Status
)) {
120 return EFI_UNSUPPORTED
;
122 OptionBBS
= (BBS_BBS_DEVICE_PATH
*) Option
->DevicePath
;
125 // Print(L"Option->Name='%s'\n", Option->OptionName);
126 // Print(L"Option->Number='%d'\n", Option->OptionNumber);
127 // Print(L"Option->Description='%s'\n", Option->Description);
128 // Print(L"Option->LoadOptionsSize='%d'\n",Option->LoadOptionsSize);
129 // Print(L"Option->BootCurrent='%d'\n",Option->BootCurrent);
130 // Print(L"Option->DevicePath->Type= '%d'\n", Option->DevicePath->Type);
131 // Print(L"Option->DevicePath->SubType= '%d'\n", Option->DevicePath->SubType);
132 // Print(L"Option->DevicePath->Length[0]= '%d'\n", Option->DevicePath->Length[0]);
133 // Print(L"Option->DevicePath->Length[1]= '%d'\n", Option->DevicePath->Length[1]);
134 // Print(L"OptionBBS->DeviceType='%d'\n",OptionBBS->DeviceType);
135 // Print(L"OptionBBS->StatusFlag='%d'\n",OptionBBS->StatusFlag);
136 // Print(L"OptionBBS->String[0]='%c'\n",OptionBBS->String[0]);
137 // Print(L"About to legacy boot!\n");
140 UpdateBbsTable(OptionBBS
->DeviceType
);
142 return LegacyBios
->LegacyBoot (LegacyBios
, (BBS_BBS_DEVICE_PATH
*) Option
->DevicePath
, Option
->LoadOptionsSize
, Option
->LoadOptions
);