From b7c51c9cf4864df6aabb99a1ae843becd577237c Mon Sep 17 00:00:00 2001 From: raywu Date: Fri, 15 Jun 2018 00:00:50 +0800 Subject: init. 1AQQW051 --- Core/EM/FastBoot/FastBootOption/FastBootOption.c | 433 +++++++++++++++++++++ Core/EM/FastBoot/FastBootOption/FastBootOption.cif | 13 + Core/EM/FastBoot/FastBootOption/FastBootOption.dxs | 66 ++++ Core/EM/FastBoot/FastBootOption/FastBootOption.h | 96 +++++ Core/EM/FastBoot/FastBootOption/FastBootOption.mak | 80 ++++ Core/EM/FastBoot/FastBootOption/FastBootOption.sdl | 40 ++ .../EM/FastBoot/FastBootOption/FastBootOptionBds.c | 274 +++++++++++++ 7 files changed, 1002 insertions(+) create mode 100644 Core/EM/FastBoot/FastBootOption/FastBootOption.c create mode 100644 Core/EM/FastBoot/FastBootOption/FastBootOption.cif create mode 100644 Core/EM/FastBoot/FastBootOption/FastBootOption.dxs create mode 100644 Core/EM/FastBoot/FastBootOption/FastBootOption.h create mode 100644 Core/EM/FastBoot/FastBootOption/FastBootOption.mak create mode 100644 Core/EM/FastBoot/FastBootOption/FastBootOption.sdl create mode 100644 Core/EM/FastBoot/FastBootOption/FastBootOptionBds.c (limited to 'Core/EM/FastBoot/FastBootOption') diff --git a/Core/EM/FastBoot/FastBootOption/FastBootOption.c b/Core/EM/FastBoot/FastBootOption/FastBootOption.c new file mode 100644 index 0000000..d05d0b9 --- /dev/null +++ b/Core/EM/FastBoot/FastBootOption/FastBootOption.c @@ -0,0 +1,433 @@ +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2012, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 6145-F Northbelt Pkwy, Norcross, GA 30071 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** + +//********************************************************************** +// $Header: /Alaska/SOURCE/Modules/PTT/FastBootOption/FastBootOption.c 2 7/14/13 10:52p Simonchen $ +// +// $Revision: 2 $ +// +// $Date: 7/14/13 10:52p $ +//********************************************************************** +// Revision History +// ---------------- +// $Log: /Alaska/SOURCE/Modules/PTT/FastBootOption/FastBootOption.c $ +// +// 2 7/14/13 10:52p Simonchen +// [TAG] EIP129092 +// [Category] Improvement +// [Description] Add CloseEvent in OnExitBootServices in +// FastBootOption.c +// [Files] FastBootOption.c +// +// 1 10/30/12 4:22a Bibbyyeh +// [TAG] EIP105177 +// [Category] New Feature +// [Description] Report pseudo boot option for Windows 'Boot To Device' +// support +// [Files] FastBootOption.cif FastBootOption.sdl +// FastBootOption.mak FastBootOption.h FastBootOption.c +// FastBootOptionBds.c FastBootOption.dxs +// +// +// +//--------------------------------------------------------------------------- +// +// Name: FastBootOption.c +// +// Description: FastBootOption Support +// +//--------------------------------------------------------------------------- +// + +#include "FastBootOption.h" +#include +#include + +#define EFI_TPL_NOTIFY TPL_NOTIFY + +#define BOOT_FLOW_CONDITION_FAST_BOOT 7 +#define BOOT_FLOW_CONDITION_NORMAL 0 + +EFI_EVENT gExitBootServicesEvent; +EFI_GUID EfiVariableGuid = EFI_GLOBAL_VARIABLE; + +TempDeviceMap BootOptionTemp[]={ +// { TempUefiHddDevice, "UEFI:Hard Drive" }, + { TempUefiOddDevice, "UEFI:CD/DVD Drive" }, + { TempUefiRemDevice, "UEFI:Removable Device" }, + { TempUefiNetDevice, "UEFI:Network Device" } +}; + +// +//--------------------------------------------------------------------------- +// +// Procedure: GetUEFIBootName +// +// Description: Get Variable Boot#### and return data pointer. +// +// Input: +// IN UINT16 BootIndex +// +// Output: +// EFI_LOAD_OPTION +// +// Modified: +// +// Referrals: +// +// Notes: +// +//--------------------------------------------------------------------------- +// +EFI_LOAD_OPTION* GetUEFIBootName(IN UINT16 BootIndex) +{ +// EFI_GUID EfiVariableGuid = EFI_GLOBAL_VARIABLE; + EFI_STATUS Status; + UINTN OptionSize; + CHAR16 BootVarName[15]; + EFI_LOAD_OPTION *BootOption = NULL; //buffer for BootXXX variables + + Swprintf( BootVarName, gBootName, BootIndex); //(EIP35562) + + OptionSize = 0; + Status = pRS->GetVariable( BootVarName, &EfiVariableGuid, NULL, &OptionSize, NULL); + if(Status != EFI_NOT_FOUND) + { + BootOption=Malloc( OptionSize ); + Status = pRS->GetVariable( BootVarName, &EfiVariableGuid, NULL, &OptionSize, BootOption); + return BootOption; + } + else + return NULL; + +} + +// +//--------------------------------------------------------------------------- +// +// Procedure: AddBootOption +// +// Description: calculate devicepath length +// +// +// Input: IN UINT16 Number +// IN EFI_DEVICE_PATH_PROTOCOL *Dp +// IN UINT32 Attributes +// IN VOID *pOptions +// IN UINTN OptionsSize +// IN CHAR16 *DefaultName +// Output: +// +// Modified: +// +// Referrals: +// +// Notes: +// +//--------------------------------------------------------------------------- +// +EFI_STATUS AddBootOption( + IN UINT16 Number, + IN EFI_DEVICE_PATH_PROTOCOL *Dp, + IN UINT32 Attributes, + IN VOID *pOptions, IN UINTN OptionsSize, IN CHAR16 *DefaultName +) +{ + + EFI_GUID EfiVariableGuid = EFI_GLOBAL_VARIABLE; + EFI_LOAD_OPTION *Option; + UINTN Size=0, Length; + CHAR16 BootVarName[15]; //Boot0000 + CHAR16 NameStr[1024]; + EFI_STATUS Status; + + Length = DPLength(Dp); + + if ( !pOptions ) + OptionsSize=0; + else + { + Swprintf( NameStr, L"%S", pOptions ); + Size = (Wcslen(NameStr)+1)*sizeof(CHAR16); + } + //Size = (EfiStrLen(NameStr)+1)*sizeof(CHAR16); + Option = Malloc(sizeof(*Option)+Size+Length); + if (!Option) return EFI_OUT_OF_RESOURCES; + + Option->Attributes = Attributes; + Option->FilePathListLength = (UINT16)Length; + + if(OptionsSize) + pBS->CopyMem(Option+1, NameStr, Size); + + pBS->CopyMem((UINT8*)(Option+1)+Size, Dp, Length); + + Swprintf(BootVarName, gBootName, Number); + TRACE((-1,"[FastBootOption] Add %S (%S)\n", BootVarName, NameStr)); + Status = pRS->SetVariable( + BootVarName, &EfiVariableGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, + sizeof(*Option)+Size+Length, Option + ); + + pBS->FreePool(Option); + return Status; +} + +// +//--------------------------------------------------------------------------- +// +// Procedure: CreateBootOption +// +// Description: Create variable Boot#### +// +// +// Input: IN UINT16 OptionNumber +// IN UINT16 Index +// IN UINT16 DevType +// +// Output: +// +// Modified: +// +// Referrals: +// +// Notes: +// +//--------------------------------------------------------------------------- +// +void CreateBootOption(IN UINT16 OptionNumber, IN UINT16 DevType, CHAR8 *Description) +{ + +static struct { + BBS_BBS_DEVICE_PATH bbs; + EFI_DEVICE_PATH_PROTOCOL end; +} LegacyDp = + { + {{BBS_DEVICE_PATH,BBS_BBS_DP,sizeof(BBS_BBS_DEVICE_PATH)},0xff,0,0}, + {END_DEVICE_PATH,END_ENTIRE_SUBTYPE,sizeof(EFI_DEVICE_PATH_PROTOCOL)} + }; + + + LegacyDp.bbs.DeviceType = DevType; + + AddBootOption( + OptionNumber, &LegacyDp.bbs.Header, + LOAD_OPTION_ACTIVE, + Description, sizeof(Description) + 1, NULL); + +} + + +// +//---------------------------------------------------------------------------- +// Procedure: CreateTempBootOption +// +// Description: This function is the entry point for FastBootOption Driver. +// +// Input: +// +// +// Output: +// +// +// Notes: +// +// +//---------------------------------------------------------------------------- +// +EFI_STATUS CreateTempBootOption() +{ + EFI_STATUS Status = EFI_SUCCESS; + UINT16 *BootOrder = NULL, NewBootOrder[50]; + UINTN BootOrderSize = 0; + UINT16 MapIndex, i, BootIndex = 1; + BOOLEAN TempDeviceFound = FALSE; + + Status = GetEfiVariable( L"BootOrder", &EfiVariableGuid, NULL, &BootOrderSize, &BootOrder); + + if( !EFI_ERROR(Status) ) + { + for( i=0; iHeader.Type == BBS_DEVICE_PATH ) + { + switch( BBSdp->DeviceType ) + { + case TempUefiHddDevice: + case TempUefiOddDevice: + case TempUefiRemDevice: + case TempUefiNetDevice: + TempDeviceFound=TRUE; + break; + } + } + + pBS->FreePool(BootOption); + } + + if( TempDeviceFound ) + break; + } + + pBS->CopyMem(NewBootOrder, BootOrder, BootOrderSize); + pBS->FreePool(BootOrder); + + //TRACE((-1,"CreateTempBootOption::TempDeviceFound(%d)\n", TempDeviceFound)); + //already create temp device? + if( TempDeviceFound ) + return EFI_SUCCESS; + } + + for( MapIndex=0; MapIndexSetVariable( + L"BootOrder", + &EfiVariableGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, + BootOrderSize, + &NewBootOrder[0]); + } + + return Status; +} + + + +// +//--------------------------------------------------------------------------- +// +// Name: OnExitBootServices +// +// Description: EXIT_BOOT_SERVICES notification callback function. +// +//--------------------------------------------------------------------------- +// + +VOID +OnExitBootServices( + IN EFI_EVENT Event, + IN VOID *Context +) +{ + EFI_STATUS Status; + EFI_GUID FastBootPolicyGuid = FAST_BOOT_POLICY_PROTOCOL_GUID; + FAST_BOOT_POLICY *gFastBootPolicy; + EFI_GUID guidBootFlow = BOOT_FLOW_VARIABLE_GUID; + UINT32 BootFlow; + UINTN Size; + + TRACE((-1,"FastBootOption OnExitBootServices event .............\n")); + Status = pBS->LocateProtocol(&FastBootPolicyGuid,NULL,&gFastBootPolicy); + + TRACE((-1,"FastBootOption gFastBootPolicy->FastBootEnable = %d\n", gFastBootPolicy->FastBootEnable)); + if (EFI_ERROR(Status) || gFastBootPolicy->FastBootEnable == FALSE) { + pBS->CloseEvent (Event); + return; + } + Status = pRS->GetVariable(L"BootFlow", &guidBootFlow, NULL, &Size, &BootFlow); + TRACE((-1,"FastBootOption BootFlow = %d\n", BootFlow)); + + if(!EFI_ERROR(Status) && (BootFlow == BOOT_FLOW_CONDITION_FAST_BOOT)) + CreateTempBootOption(); + + pBS->CloseEvent (Event); +} + + +// +//---------------------------------------------------------------------------- +// Procedure: FastBootOptionEntryPoint +// +// Description: This function is the entry point for FastBootOption Driver. +// +// Input: +// EFI_HANDLE ImageHandle Image handle. +// EFI_SYSTEM_TABLE *SystemTable Pointer to the EFI system table. +// +// Output: +// EFI_SUCCESS Security interface installed. +// EFI_ERROR Security interface not installed or unable to locate +// some protocol. +// +// Notes: +// Entry Points are used to locate or install protocol interfaces and +// notification events. +// +//---------------------------------------------------------------------------- +// + +EFI_STATUS FastBootOptionEntryPoint( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable ) +{ + EFI_HANDLE Handle = NULL; + EFI_STATUS Status = EFI_SUCCESS; + + InitAmiLib( ImageHandle, SystemTable ); + + TRACE((-1,"FastBootOptionEntryPoint.............\n")); + + pBS->CreateEvent ( + EVT_SIGNAL_EXIT_BOOT_SERVICES, + EFI_TPL_NOTIFY, + OnExitBootServices, + NULL, + &gExitBootServicesEvent + ); + + return Status; +} + +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2012, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 6145-F Northbelt Pkwy, Norcross, GA 30071 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** diff --git a/Core/EM/FastBoot/FastBootOption/FastBootOption.cif b/Core/EM/FastBoot/FastBootOption/FastBootOption.cif new file mode 100644 index 0000000..1d5c216 --- /dev/null +++ b/Core/EM/FastBoot/FastBootOption/FastBootOption.cif @@ -0,0 +1,13 @@ + + name = "FastBootOption" + category = ModulePart + LocalRoot = "Core\EM\FastBoot\FastBootOption\" + RefName = "FastBootOption" +[files] +"FastBootOption.sdl" +"FastBootOption.mak" +"FastBootOption.h" +"FastBootOption.c" +"FastBootOptionBds.c" +"FastBootOption.dxs" + diff --git a/Core/EM/FastBoot/FastBootOption/FastBootOption.dxs b/Core/EM/FastBoot/FastBootOption/FastBootOption.dxs new file mode 100644 index 0000000..49592e6 --- /dev/null +++ b/Core/EM/FastBoot/FastBootOption/FastBootOption.dxs @@ -0,0 +1,66 @@ +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2007, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 6145-F Northbelt Pkwy, Norcross, GA 30071 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** +//********************************************************************** +// $Header: /Alaska/SOURCE/Modules/PTT/FastBootOption/FastBootOption.dxs 1 10/30/12 4:22a Bibbyyeh $ +// +// $Revision: 1 $ +// +// $Date: 10/30/12 4:22a $ +//********************************************************************** +// Revision History +// ---------------- +// $Log: /Alaska/SOURCE/Modules/PTT/FastBootOption/FastBootOption.dxs $ +// +// 1 10/30/12 4:22a Bibbyyeh +// [TAG] EIP105177 +// [Category] New Feature +// [Description] Report pseudo boot option for Windows 'Boot To Device' +// support +// [Files] FastBootOption.cif FastBootOption.sdl +// FastBootOption.mak FastBootOption.h FastBootOption.c +// FastBootOptionBds.c FastBootOption.dxs +// +// +//********************************************************************** + +// +//--------------------------------------------------------------------------- +// +// Name: FastBootOption.DXS +// +// Description: Dependency expression for FastBootOption driver. +// +//--------------------------------------------------------------------------- +// + +#include + + +DEPENDENCY_START + EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_GUID +DEPENDENCY_END + +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2007, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 6145-F Northbelt Pkwy, Norcross, GA 30071 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** diff --git a/Core/EM/FastBoot/FastBootOption/FastBootOption.h b/Core/EM/FastBoot/FastBootOption/FastBootOption.h new file mode 100644 index 0000000..b86eff7 --- /dev/null +++ b/Core/EM/FastBoot/FastBootOption/FastBootOption.h @@ -0,0 +1,96 @@ +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2010, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Pkwy, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** + +//********************************************************************** +// $Header: /Alaska/SOURCE/Modules/PTT/FastBootOption/FastBootOption.h 1 10/30/12 4:22a Bibbyyeh $ +// +// $Revision: 1 $ +// +// $Date: 10/30/12 4:22a $ +//********************************************************************** +// Revision History +// ---------------- +// $Log: /Alaska/SOURCE/Modules/PTT/FastBootOption/FastBootOption.h $ +// +// 1 10/30/12 4:22a Bibbyyeh +// [TAG] EIP105177 +// [Category] New Feature +// [Description] Report pseudo boot option for Windows 'Boot To Device' +// support +// [Files] FastBootOption.cif FastBootOption.sdl +// FastBootOption.mak FastBootOption.h FastBootOption.c +// FastBootOptionBds.c FastBootOption.dxs +// +// +// +//---------------------------------------------------------------------------- +// +// Name: +// +// Description: This file contains the Includes, Definitions, typedefs, +// Variable and External Declarations, Structure and +// function prototypes needed for the IdeSecurity driver +// +//---------------------------------------------------------------------------- +// + +#ifndef _FastBootOption_ +#define _FastBootOption_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include + +#if CORE_COMBINED_VERSION > 0x40280 //4.6.4.1 or Last +#define gBootName L"Boot%04X" +#else +#define gBootName L"Boot%04x" +#endif + +#define TempUefiHddDevice 0x80 +#define TempUefiOddDevice 0x81 +#define TempUefiRemDevice 0x82 +#define TempUefiNetDevice 0x83 + +typedef struct { + UINT16 DeviceTypeId; + CHAR8 *TempName; +} TempDeviceMap; + +/****** DO NOT WRITE BELOW THIS LINE *******/ +#ifdef __cplusplus +} +#endif + +#endif + +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2010, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Pkwy, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** diff --git a/Core/EM/FastBoot/FastBootOption/FastBootOption.mak b/Core/EM/FastBoot/FastBootOption/FastBootOption.mak new file mode 100644 index 0000000..b7edc0c --- /dev/null +++ b/Core/EM/FastBoot/FastBootOption/FastBootOption.mak @@ -0,0 +1,80 @@ +#********************************************************************** +#********************************************************************** +#** ** +#** (C)Copyright 1985-2007, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 6145-F Northbelt Pkwy, Norcross, GA 30071 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#********************************************************************** +#********************************************************************** + +#********************************************************************** +# $Header: /Alaska/SOURCE/Modules/PTT/FastBootOption/FastBootOption.mak 1 10/30/12 4:21a Bibbyyeh $ +# +# $Revision: 1 $ +# +# $Date: 10/30/12 4:21a $ +#********************************************************************** +# Revision History +# ---------------- +# $Log: /Alaska/SOURCE/Modules/PTT/FastBootOption/FastBootOption.mak $ +# +# 1 10/30/12 4:21a Bibbyyeh +# [TAG] EIP105177 +# [Category] New Feature +# [Description] Report pseudo boot option for Windows 'Boot To Device' +# support +# [Files] FastBootOption.cif FastBootOption.sdl +# FastBootOption.mak FastBootOption.h FastBootOption.c +# FastBootOptionBds.c FastBootOption.dxs +# +#********************************************************************** +# +# +# Name: FastBootOption.mak +# +# Description: Make file to build FastBootOption Driver Sources. +# +# +#********************************************************************** +all : FastBootOption + +FastBootOption : $(BUILD_DIR)\FastBootOption.mak FastBootOptionBin + +$(BUILD_DIR)\FastBootOption.mak : $(FastBootOption_DIR)\$(@B).cif $(FastBootOption_DIR)\$(@B).mak $(BUILD_RULES) + $(CIF2MAK) $(FastBootOption_DIR)\$(@B).cif $(CIF2MAK_DEFAULTS) + +FastBootOptionBin: $(AMIDXELIB) + $(MAKE) /$(MAKEFLAGS) $(BUILD_DEFAULTS)\ + /f $(BUILD_DIR)\FastBootOption.mak all\ + GUID=A58C5D1D-C22B-4845-90BC-8C94FCE96457\ + ENTRY_POINT=FastBootOptionEntryPoint \ + TYPE=BS_DRIVER \ + COMPRESS=1\ + "OBJECTS=$(BUILD_DIR)\$(FastBootOption_DIR)\FastBootOption.obj" + +CORE_DXE_LIBBin : $(BUILD_DIR)\FastBootOptionBds.obj + +#----------------------------------------------------------------------- +# AMICSP library files compilation +#----------------------------------------------------------------------- +{$(FastBootOption_DIR)}.c{$(BUILD_DIR)}.obj:: + $(CC) $(CFLAGS) /I $(FastBootOption_DIR) /I $(Foundation_DIR) /I $(CORE_DXE_DIR) /Fo$(BUILD_DIR)\ $< + +#********************************************************************** +#********************************************************************** +#** ** +#** (C)Copyright 1985-2007, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 6145-F Northbelt Pkwy, Norcross, GA 30071 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#********************************************************************** +#********************************************************************** diff --git a/Core/EM/FastBoot/FastBootOption/FastBootOption.sdl b/Core/EM/FastBoot/FastBootOption/FastBootOption.sdl new file mode 100644 index 0000000..3e478b4 --- /dev/null +++ b/Core/EM/FastBoot/FastBootOption/FastBootOption.sdl @@ -0,0 +1,40 @@ +TOKEN + Name = "FastBootOption_SUPPORT" + Value = "1" + Help = "Main switch to enable FastBootOption support in Project" + TokenType = Boolean + TargetEQU = Yes + TargetMAK = Yes + TargetH = Yes + Master = Yes + Token = "CORE_COMBINED_VERSION" ">=" "0x040281" +End + + +PATH + Name = "FastBootOption_DIR" +End + +MODULE + Help = "Includes FastBootOption.mak to Project" + File = "FastBootOption.mak" +End + +ELINK + Name = "$(BUILD_DIR)\FastBootOption.ffs" + Parent = "FV_MAIN" + Token = "FastBootOption_SUPPORT" "=" "1" + InvokeOrder = AfterParent +End + +ELINK + Name = "RemoveFastBootOption," + Parent = "ReadBootOptions," + InvokeOrder = AfterParent +End + +ELINK + Name = "SetBootNextBootOption," + Parent = "SaveBootOptions," + InvokeOrder = BeforeParent +End \ No newline at end of file diff --git a/Core/EM/FastBoot/FastBootOption/FastBootOptionBds.c b/Core/EM/FastBoot/FastBootOption/FastBootOptionBds.c new file mode 100644 index 0000000..d9a8302 --- /dev/null +++ b/Core/EM/FastBoot/FastBootOption/FastBootOptionBds.c @@ -0,0 +1,274 @@ +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2012, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 6145-F Northbelt Pkwy, Norcross, GA 30071 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** +//********************************************************************** +// $Archive: /Alaska/SOURCE/Modules/PTT/FastBootOption/FastBootOptionBds.c $ +// +// $Author: Bibbyyeh $ +// +// $Revision: 1 $ +// +// $Date: 10/30/12 4:22a $ +// +//*****************************************************************// +//*****************************************************************// +// Revision History +// ---------------- +// $Log: /Alaska/SOURCE/Modules/PTT/FastBootOption/FastBootOptionBds.c $ +// +// 1 10/30/12 4:22a Bibbyyeh +// [TAG] EIP105177 +// [Category] New Feature +// [Description] Report pseudo boot option for Windows 'Boot To Device' +// support +// [Files] FastBootOption.cif FastBootOption.sdl +// FastBootOption.mak FastBootOption.h FastBootOption.c +// FastBootOptionBds.c FastBootOption.dxs +// +// +//*****************************************************************// + +// +//---------------------------------------------------------------------- +// +// Name: FastBootOptionBds.c +// +// Description: +// +//---------------------------------------------------------------------- +// + +//---------------------------------------------------------------------- +// Include Files +//---------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include "FastBootOption.h" +//--------------------------------------------------------------------------- +// Global Variable declarations +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +// External functions +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +// Function Definitions +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +// Type definitions +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +// Constant and Variables declarations +//--------------------------------------------------------------------------- + BOOLEAN TempDeviceFound=FALSE; + UINT16 BootDeviceType=0; + +// +//---------------------------------------------------------------------------- +// Procedure: GetUefiDeviceType +// +// Description: Function returns device type +// +// Input: EFI_DEVICE_PATH_PROTOCOL *Dp - +// +// Output: UINT32 - device type +// +//---------------------------------------------------------------------------- +// +UINT32 GetUefiDeviceType( + IN EFI_DEVICE_PATH_PROTOCOL *Dp +) +{ + EFI_DEVICE_PATH_PROTOCOL *DpPtr = Dp; + BOOLEAN IsUSB = FALSE; + + if( Dp == NULL ) + return 0xffff; + + for( ; !(isEndNode(DpPtr)); DpPtr = NEXT_NODE(DpPtr)) + { + if(DpPtr->Type == MESSAGING_DEVICE_PATH) + { + if(DpPtr->SubType == MSG_USB_DP) + IsUSB = TRUE; + + if(DpPtr->SubType == MSG_MAC_ADDR_DP) + return TempUefiNetDevice; + + continue; + } + + if(DpPtr->Type == MEDIA_DEVICE_PATH) + { + if(!IsUSB && DpPtr->SubType == MEDIA_HARDDRIVE_DP) + return TempUefiHddDevice; + else + if(!IsUSB && DpPtr->SubType == MEDIA_CDROM_DP) + return TempUefiOddDevice; + else + if(IsUSB && DpPtr->SubType == MEDIA_HARDDRIVE_DP) + { + return TempUefiRemDevice; + } + else + if(IsUSB && DpPtr->SubType == MEDIA_CDROM_DP) + return TempUefiOddDevice; + } + } + return 0xffff; +} + +// +//---------------------------------------------------------------------------- +// Procedure: SetBootNextBootOption +// +// Description: Compare Boot device type and re-setting variable "BootNext" +// +// Input: +// NONE +// Output: +// NONE +//---------------------------------------------------------------------------- +// +SetBootNextBootOption() +{ + EFI_STATUS Status; + DLINK *Link; + BOOT_OPTION *Option; + UINT16 BootNext; + UINTN Size; + + Size = sizeof(BootNext); + + if( TempDeviceFound ) + { + FOR_EACH_BOOT_OPTION(BootOptionList,Link,Option){ + + if( GetUefiDeviceType(Option->FilePathList) == BootDeviceType ) + { + BootNext = Option->BootOptionNumber; + Status = pRS->SetVariable(L"BootNext", &EfiVariableGuid, BOOT_VARIABLE_ATTRIBUTES, Size, &BootNext); + TRACE((-1,"FastBootOptionBds.c:: SetVariable Status=%r BootNext=%d\n", Status, BootNext)); + } + + } + } +} + + +// +//---------------------------------------------------------------------------- +// Procedure: CheckBootNextTempBootOption +// +// Description: Check BootNext device and find uefi device, adjust BootNext +// number. +// Input: +// +// Output: +// +//---------------------------------------------------------------------------- +// +CheckBootNextTempBootOption() +{ + EFI_STATUS Status; + DLINK *Link; + BOOT_OPTION *Option; + UINT16 BootNext; + UINTN Size; + + Size = sizeof(BootNext); + Status = pRS->GetVariable(L"BootNext", &EfiVariableGuid, NULL, &Size, &BootNext); + + TRACE((-1,"FastBootOptionBds.c:: Status=%r BootNext=%d\n", Status, BootNext)); + + if( !EFI_ERROR( Status ) ) + { + FOR_EACH_BOOT_OPTION(BootOptionList,Link,Option){ + BBS_BBS_DEVICE_PATH *BBSdp; + + if( BootNext == Option->BootOptionNumber ) + { + BBSdp=(BBS_BBS_DEVICE_PATH*)Option->FilePathList; + if( BBSdp->Header.Type == BBS_DEVICE_PATH ) + { + BootDeviceType = BBSdp->DeviceType; + switch( BootDeviceType ) + { + case TempUefiHddDevice: + case TempUefiOddDevice: + case TempUefiRemDevice: + case TempUefiNetDevice: + TempDeviceFound=TRUE; + break; + } + } + } + } + } +} + +// +//---------------------------------------------------------------------------- +// Procedure: RemoveFastBootOption +// +// Description: Remove all TempUefiDevice Bootoption. +// +// Input: +// +// Output: +// +//---------------------------------------------------------------------------- +// +RemoveFastBootOption() +{ + + DLINK *Link; + BOOT_OPTION *Option; + + CheckBootNextTempBootOption(); + + FOR_EACH_BOOT_OPTION(BootOptionList,Link,Option){ + BBS_BBS_DEVICE_PATH *BBSdp; + BBSdp=(BBS_BBS_DEVICE_PATH*)Option->FilePathList; + + if( BBSdp->Header.Type == BBS_DEVICE_PATH ) + { + switch( BBSdp->DeviceType ) + { + case TempUefiHddDevice: + case TempUefiOddDevice: + case TempUefiRemDevice: + case TempUefiNetDevice: + Option->FwBootOption = TRUE; + break; + } + } + + } +} + +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2012, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 6145-F Northbelt Pkwy, Norcross, GA 30071 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** -- cgit v1.2.3