summaryrefslogtreecommitdiff
path: root/Core/EM/FastBoot/FastBootOption
diff options
context:
space:
mode:
authorraywu <raywu0301@gmail.com>2018-06-15 00:00:50 +0800
committerraywu <raywu0301@gmail.com>2018-06-15 00:00:50 +0800
commitb7c51c9cf4864df6aabb99a1ae843becd577237c (patch)
treeeebe9b0d0ca03062955223097e57da84dd618b9a /Core/EM/FastBoot/FastBootOption
downloadzprj-master.tar.xz
init. 1AQQW051HEADmaster
Diffstat (limited to 'Core/EM/FastBoot/FastBootOption')
-rw-r--r--Core/EM/FastBoot/FastBootOption/FastBootOption.c433
-rw-r--r--Core/EM/FastBoot/FastBootOption/FastBootOption.cif13
-rw-r--r--Core/EM/FastBoot/FastBootOption/FastBootOption.dxs66
-rw-r--r--Core/EM/FastBoot/FastBootOption/FastBootOption.h96
-rw-r--r--Core/EM/FastBoot/FastBootOption/FastBootOption.mak80
-rw-r--r--Core/EM/FastBoot/FastBootOption/FastBootOption.sdl40
-rw-r--r--Core/EM/FastBoot/FastBootOption/FastBootOptionBds.c274
7 files changed, 1002 insertions, 0 deletions
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
+//
+//
+//<AMI_FHDR_START>
+//---------------------------------------------------------------------------
+//
+// Name: FastBootOption.c
+//
+// Description: FastBootOption Support
+//
+//---------------------------------------------------------------------------
+//<AMI_FHDR_END>
+
+#include "FastBootOption.h"
+#include <Setup.h>
+#include <Protocol\FastBootProtocol.h>
+
+#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" }
+};
+
+//<AMI_PHDR_START>
+//---------------------------------------------------------------------------
+//
+// Procedure: GetUEFIBootName
+//
+// Description: Get Variable Boot#### and return data pointer.
+//
+// Input:
+// IN UINT16 BootIndex
+//
+// Output:
+// EFI_LOAD_OPTION
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//
+//---------------------------------------------------------------------------
+//<AMI_PHDR_END>
+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;
+
+}
+
+//<AMI_PHDR_START>
+//---------------------------------------------------------------------------
+//
+// 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:
+//
+//---------------------------------------------------------------------------
+//<AMI_PHDR_END>
+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;
+}
+
+//<AMI_PHDR_START>
+//---------------------------------------------------------------------------
+//
+// Procedure: CreateBootOption
+//
+// Description: Create variable Boot####
+//
+//
+// Input: IN UINT16 OptionNumber
+// IN UINT16 Index
+// IN UINT16 DevType
+//
+// Output:
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//
+//---------------------------------------------------------------------------
+//<AMI_PHDR_END>
+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);
+
+}
+
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: CreateTempBootOption
+//
+// Description: This function is the entry point for FastBootOption Driver.
+//
+// Input:
+//
+//
+// Output:
+//
+//
+// Notes:
+//
+//
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+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; i<BootOrderSize/sizeof(UINT16); i++)
+ {
+ EFI_LOAD_OPTION *BootOption=NULL;
+ BBS_BBS_DEVICE_PATH *BBSdp;
+ BootOption=GetUEFIBootName( BootOrder[i] );
+
+ if( BootOption )
+ {
+ BBSdp = (BBS_BBS_DEVICE_PATH*) ((UINT8*)(BootOption+1)
+ +(Wcslen((CHAR16*)(BootOption+1))+1)*sizeof(CHAR16));
+
+ if( BBSdp->Header.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; MapIndex<sizeof(BootOptionTemp)/sizeof(TempDeviceMap); MapIndex++)
+ {
+ for( i=0; i<BootOrderSize/sizeof(UINT16); i++)
+ {
+ if( NewBootOrder[i] == BootIndex )
+ {
+ BootIndex++;
+ i=-1;
+ continue;
+ }
+ }
+
+ NewBootOrder[i]=BootIndex;
+ BootOrderSize+=sizeof(UINT16);
+
+ CreateBootOption( BootIndex, BootOptionTemp[MapIndex].DeviceTypeId, BootOptionTemp[MapIndex].TempName );
+ }
+
+ //Update Variable "BootOrder".
+ if( BootOrderSize )
+ {
+ pRS->SetVariable(
+ L"BootOrder",
+ &EfiVariableGuid,
+ EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
+ BootOrderSize,
+ &NewBootOrder[0]);
+ }
+
+ return Status;
+}
+
+
+
+//<AMI_PHDR_START>
+//---------------------------------------------------------------------------
+//
+// Name: OnExitBootServices
+//
+// Description: EXIT_BOOT_SERVICES notification callback function.
+//
+//---------------------------------------------------------------------------
+//<AMI_PHDR_END>
+
+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);
+}
+
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// 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.
+//
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+
+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 @@
+<component>
+ name = "FastBootOption"
+ category = ModulePart
+ LocalRoot = "Core\EM\FastBoot\FastBootOption\"
+ RefName = "FastBootOption"
+[files]
+"FastBootOption.sdl"
+"FastBootOption.mak"
+"FastBootOption.h"
+"FastBootOption.c"
+"FastBootOptionBds.c"
+"FastBootOption.dxs"
+<endComponent>
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
+//
+//
+//**********************************************************************
+
+//<AMI_FHDR_START>
+//---------------------------------------------------------------------------
+//
+// Name: FastBootOption.DXS
+//
+// Description: Dependency expression for FastBootOption driver.
+//
+//---------------------------------------------------------------------------
+//<AMI_FHDR_END>
+
+#include <Protocol/PciRootBridgeIo.h>
+
+
+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
+//
+//
+//<AMI_FHDR_START>
+//----------------------------------------------------------------------------
+//
+// Name: <FastBootOption.h>
+//
+// Description: This file contains the Includes, Definitions, typedefs,
+// Variable and External Declarations, Structure and
+// function prototypes needed for the IdeSecurity driver
+//
+//----------------------------------------------------------------------------
+//<AMI_FHDR_END>
+
+#ifndef _FastBootOption_
+#define _FastBootOption_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <Efi.h>
+#include <Token.h>
+#include <Dxe.h>
+#include <AmiDxeLib.h>
+#include <Protocol\Devicepath.h>
+
+#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
+#
+#**********************************************************************
+#<AMI_FHDR_START>
+#
+# Name: FastBootOption.mak
+#
+# Description: Make file to build FastBootOption Driver Sources.
+#
+#<AMI_FHDR_END>
+#**********************************************************************
+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
+//
+//
+//*****************************************************************//
+
+//<AMI_FHDR_START>
+//----------------------------------------------------------------------
+//
+// Name: FastBootOptionBds.c
+//
+// Description:
+//
+//----------------------------------------------------------------------
+//<AMI_FHDR_END>
+
+//----------------------------------------------------------------------
+// Include Files
+//----------------------------------------------------------------------
+#include <efi.h>
+#include <amidxelib.h>
+#include <protocol\blockio.h>
+#include <protocol\devicepath.h>
+#include <BootOptions.h>
+#include "FastBootOption.h"
+//---------------------------------------------------------------------------
+// Global Variable declarations
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+// External functions
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+// Function Definitions
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+// Type definitions
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+// Constant and Variables declarations
+//---------------------------------------------------------------------------
+ BOOLEAN TempDeviceFound=FALSE;
+ UINT16 BootDeviceType=0;
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: GetUefiDeviceType
+//
+// Description: Function returns device type
+//
+// Input: EFI_DEVICE_PATH_PROTOCOL *Dp -
+//
+// Output: UINT32 - device type
+//
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+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;
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: SetBootNextBootOption
+//
+// Description: Compare Boot device type and re-setting variable "BootNext"
+//
+// Input:
+// NONE
+// Output:
+// NONE
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+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));
+ }
+
+ }
+ }
+}
+
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: CheckBootNextTempBootOption
+//
+// Description: Check BootNext device and find uefi device, adjust BootNext
+// number.
+// Input:
+//
+// Output:
+//
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+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;
+ }
+ }
+ }
+ }
+ }
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: RemoveFastBootOption
+//
+// Description: Remove all TempUefiDevice Bootoption.
+//
+// Input:
+//
+// Output:
+//
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+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 **
+//** **
+//**********************************************************************
+//**********************************************************************