/** Free up all Menu Option list. **/ VOID FreeAllMenu ( VOID ) { BOpt_FreeMenu (&DirectoryMenu); BOpt_FreeMenu (&FsOptionMenu); BOpt_FreeMenu (&BootOptionMenu); BOpt_FreeMenu (&DriverOptionMenu); BOpt_FreeMenu (&DriverMenu); BOpt_FreeLegacyOptions (); FreeAllConsoles (); }
EFI_STATUS BOpt_GetLegacyOptions ( VOID ) /*++ Routine Description: Build the LegacyFDMenu LegacyHDMenu LegacyCDMenu according to LegacyBios.GetBbsInfo(). Arguments: None Returns: The device info of legacy device. --*/ { BM_MENU_ENTRY *NewMenuEntry; BM_LEGACY_DEVICE_CONTEXT *NewLegacyDevContext; EFI_STATUS Status; EFI_LEGACY_BIOS_PROTOCOL *LegacyBios; UINT16 HddCount; HDD_INFO *HddInfo; UINT16 BbsCount; BBS_TABLE *BbsTable; UINTN Index; CHAR16 DescString[100]; UINTN FDNum; UINTN HDNum; UINTN CDNum; UINTN NETNum; UINTN BEVNum; NewMenuEntry = NULL; HddInfo = NULL; BbsTable = NULL; BbsCount = 0; // // Initialize Bbs Table Context from BBS info data // InitializeListHead (&LegacyFDMenu.Head); InitializeListHead (&LegacyHDMenu.Head); InitializeListHead (&LegacyCDMenu.Head); InitializeListHead (&LegacyNETMenu.Head); InitializeListHead (&LegacyBEVMenu.Head); Status = gBS->LocateProtocol ( &gEfiLegacyBiosProtocolGuid, NULL, &LegacyBios ); if (!EFI_ERROR (Status)) { Status = LegacyBios->GetBbsInfo ( LegacyBios, &HddCount, &HddInfo, &BbsCount, &BbsTable ); if (EFI_ERROR (Status)) { return Status; } } FDNum = 0; HDNum = 0; CDNum = 0; NETNum = 0; BEVNum = 0; for (Index = 0; Index < BbsCount; Index++) { if ((BBS_IGNORE_ENTRY == BbsTable[Index].BootPriority) || (BBS_DO_NOT_BOOT_FROM == BbsTable[Index].BootPriority) ) { continue; } NewMenuEntry = BOpt_CreateMenuEntry (BM_LEGACY_DEV_CONTEXT_SELECT); if (NULL == NewMenuEntry) { break; } NewLegacyDevContext = (BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext; NewLegacyDevContext->BbsTable = &BbsTable[Index]; NewLegacyDevContext->Index = Index; NewLegacyDevContext->BbsCount = BbsCount; BdsBuildLegacyDevNameString ( &BbsTable[Index], Index, sizeof (DescString), DescString ); NewLegacyDevContext->Description = EfiAllocateZeroPool (EfiStrSize (DescString)); if (NULL == NewLegacyDevContext->Description) { break; } EfiCopyMem (NewLegacyDevContext->Description, DescString, EfiStrSize (DescString)); NewMenuEntry->DisplayString = NewLegacyDevContext->Description; NewMenuEntry->HelpString = NULL; switch (BbsTable[Index].DeviceType) { case BBS_FLOPPY: InsertTailList (&LegacyFDMenu.Head, &NewMenuEntry->Link); FDNum++; break; case BBS_HARDDISK: InsertTailList (&LegacyHDMenu.Head, &NewMenuEntry->Link); HDNum++; break; case BBS_CDROM: InsertTailList (&LegacyCDMenu.Head, &NewMenuEntry->Link); CDNum++; break; case BBS_EMBED_NETWORK: InsertTailList (&LegacyNETMenu.Head, &NewMenuEntry->Link); NETNum++; break; case BBS_BEV_DEVICE: InsertTailList (&LegacyBEVMenu.Head, &NewMenuEntry->Link); BEVNum++; break; } } if (Index != BbsCount) { BOpt_FreeLegacyOptions (); return EFI_OUT_OF_RESOURCES; } LegacyFDMenu.MenuNumber = FDNum; LegacyHDMenu.MenuNumber = HDNum; LegacyCDMenu.MenuNumber = CDNum; LegacyNETMenu.MenuNumber = NETNum; LegacyBEVMenu.MenuNumber = BEVNum; return EFI_SUCCESS; }