Store all configuration in a linked list, read config from INI file and EFI shell
All checks were successful
Builds / ExectOS (amd64) (push) Successful in 46s
Builds / ExectOS (i686) (push) Successful in 25s

This commit is contained in:
Rafal Kupiec 2023-12-11 16:31:15 +01:00
parent 6ffedf6302
commit 0cea10ad42
Signed by: belliash
GPG Key ID: 4E829243E0CFE6B4
9 changed files with 344 additions and 124 deletions

View File

@ -45,32 +45,21 @@ typedef EFI_STATUS (*PBL_OPEN_XT_PROTOCOL)(OUT PVOID *ProtocolHandler, IN PEFI_G
typedef EFI_STATUS (*PBL_READ_FILE)(IN PEFI_FILE_HANDLE DirHandle, IN CONST PWCHAR FileName, OUT PVOID *FileData, OUT PSIZE_T FileSize);
typedef VOID (*PBL_SLEEP_EXECUTION)(IN ULONG_PTR Milliseconds);
/* XTLDR Configuration */
typedef struct _XTBL_CONFIGURATION
{
PWCHAR Default;
PWCHAR Debug;
ULONG DebugPort;
BOOLEAN Shell;
ULONG Timeout;
PWCHAR Tune;
} XTBL_CONFIGURATION, *PXTBL_CONFIGURATION;
/* XTLDR Configuration data */
typedef struct _XTBL_INI_OPTION
typedef struct _XTBL_CONFIG_ENTRY
{
LIST_ENTRY Flink;
PWCHAR Name;
PWCHAR Value;
} XTBL_INI_OPTION, *PXTBL_INI_OPTION;
} XTBL_CONFIG_ENTRY, *PXTBL_CONFIG_ENTRY;
/* XTLDR Configuration section */
typedef struct _XTBL_INI_SECTION
typedef struct _XTBL_CONFIG_SECTION
{
LIST_ENTRY Flink;
LIST_ENTRY Options;
PWCHAR SectionName;
} XTBL_INI_SECTION, *PXTBL_INI_SECTION;
} XTBL_CONFIG_SECTION, *PXTBL_CONFIG_SECTION;
/* XTLDR Status data */
typedef struct _XTBL_STATUS

View File

@ -9,19 +9,120 @@
#include <xtldr.h>
/**
* Returns a value of the specified configuration key.
*
* @param ConfigName
* Specifies the configuration key to return its value.
*
* @return This routine returns a pointer to the configuration value, or NULL if key was not found.
*
* @since XT 1.0
*/
XTCDECL
PWCHAR
BlGetConfigValue(IN CONST PWCHAR ConfigName)
{
PXTBL_CONFIG_ENTRY ConfigEntry;
PLIST_ENTRY ConfigListEntry;
SIZE_T Length;
/* Get config entry name length */
Length = RtlWideStringLength(ConfigName, 0);
/* Iterate through config entries */
ConfigListEntry = BlpConfig->Flink;
while(ConfigListEntry != BlpConfig)
{
/* Get config entry */
ConfigEntry = CONTAIN_RECORD(ConfigListEntry, XTBL_CONFIG_ENTRY, Flink);
/* Check if requested configuration found */
if(RtlCompareWideStringInsensitive(ConfigEntry->Name, ConfigName, Length) == 0)
{
/* Return config value */
return ConfigEntry->Value;
}
/* Move to the next config entry */
ConfigListEntry = ConfigListEntry->Flink;
}
/* Config entry not found, return NULL */
return NULL;
}
/**
* Updates existing configuration value.
*
* @param ConfigName
* Specifies the configuration key to update.
*
* @param ConfigValue
* Specifies the new configuration value.
*
* @return This routine returns status code.
*
* @since XT 1.0
*/
XTCDECL
EFI_STATUS
BlSetConfigValue(IN CONST PWCHAR ConfigName,
IN CONST PWCHAR ConfigValue)
{
PXTBL_CONFIG_ENTRY ConfigEntry;
PLIST_ENTRY ConfigListEntry;
SIZE_T Length;
/* Get config entry name length */
Length = RtlWideStringLength(ConfigName, 0);
/* Iterate through config entries */
ConfigListEntry = BlpConfig->Flink;
while(ConfigListEntry != BlpConfig)
{
/* Get config entry */
ConfigEntry = CONTAIN_RECORD(ConfigListEntry, XTBL_CONFIG_ENTRY, Flink);
/* Check if requested configuration found */
if(RtlCompareWideStringInsensitive(ConfigEntry->Name, ConfigName, Length) == 0)
{
/* Update config value */
ConfigEntry->Value = ConfigValue;
/* Return success */
return STATUS_EFI_SUCCESS;
}
/* Move to the next config entry */
ConfigListEntry = ConfigListEntry->Flink;
}
/* Config entry not found */
return STATUS_EFI_NOT_FOUND;
}
/**
* Loads and parses XTLDR configuration file.
*
* @return This routine returns status code.
*
* @since XT 1.0
*/
XTCDECL
EFI_STATUS
BlpLoadConfiguration()
{
PLIST_ENTRY SectionListEntry;
STATIC LIST_ENTRY Configuration;
EFI_STATUS Status;
PLIST_ENTRY Configuration;
PCHAR ConfigData;
/* Initialize configuration pointer */
Configuration = NULL;
RtlInitializeListHead(&Configuration);
/* Read data from configuration file */
Status = BlpReadConfigurationFile(L"\\EFI\\BOOT\\", L"XTLDR.INI", &ConfigData);
Status = BlpReadConfigFile(L"\\EFI\\BOOT\\", L"XTLDR.INI", &ConfigData);
if(Status != STATUS_EFI_SUCCESS)
{
/* Failed to load configuration */
@ -30,7 +131,7 @@ BlpLoadConfiguration()
}
/* Parse configuration data */
Status = BlpParseConfigurationFile(ConfigData, Configuration);
Status = BlpParseConfigFile(ConfigData, &Configuration);
if(Status != STATUS_EFI_SUCCESS)
{
/* Failed to parse configuration */
@ -38,6 +139,31 @@ BlpLoadConfiguration()
return Status;
}
/* Iterate through config sections */
SectionListEntry = Configuration.Flink;
while(SectionListEntry != &Configuration)
{
/* Get config section */
PXTBL_CONFIG_SECTION Section = CONTAIN_RECORD(SectionListEntry, XTBL_CONFIG_SECTION, Flink);
/* Look for global XTLDR configuration section */
if(RtlCompareWideStringInsensitive(Section->SectionName, L"XTLDR", 5) == 0)
{
/* Update global configuration */
BlpUpdateConfiguration(&Section->Options);
/* Remove XTLDR section from the list */
RtlRemoveEntryList(SectionListEntry);
break;
}
/* Move to the next section */
SectionListEntry = SectionListEntry->Flink;
}
/* Update boot menu OS list */
BlpMenuList = &Configuration;
/* Return success */
return STATUS_EFI_SUCCESS;
}
@ -50,12 +176,19 @@ BlpLoadConfiguration()
* @since XT 1.0
*/
XTCDECL
VOID
EFI_STATUS
BlpParseCommandLine(VOID)
{
EFI_GUID LIPGuid = EFI_LOADED_IMAGE_PROTOCOL_GUID;
PEFI_LOADED_IMAGE_PROTOCOL LoadedImage;
PWCHAR Argument, Key, LastArg, Value;
PXTBL_CONFIG_ENTRY Option;
EFI_STATUS Status;
SIZE_T KeyLength, ValueLength;
LIST_ENTRY Config;
/* Initialize configuration list */
RtlInitializeListHead(&Config);
/* Handle loaded image protocol */
Status = EfiSystemTable->BootServices->HandleProtocol(EfiImageHandle, &LIPGuid, (PVOID *)&LoadedImage);
@ -64,21 +197,113 @@ BlpParseCommandLine(VOID)
/* Check if launched from UEFI shell */
if(LoadedImage && LoadedImage->LoadOptions)
{
/* Update global boot loader configuration */
BlpUpdateGlobalConfiguration(LoadedImage->LoadOptions);
/* Tokenize provided options */
Argument = RtlTokenizeWideString(LoadedImage->LoadOptions, L" ", &LastArg);
/* Iterate over all arguments passed to boot loader */
while(Argument != NULL)
{
/* Store key name */
Key = Argument;
/* Find end of the key */
while(*Argument != '=' && *Argument != 0 && *Argument != '\n')
{
/* Advance to the next character */
Argument++;
}
/* Mark end of the key and advance to the next character */
*Argument = 0;
Argument++;
/* Store value */
Value = Argument;
/* Find end of the value */
while(*Argument != 0 && *Argument != '\n')
{
/* Advance to the next character */
Argument++;
}
/* Mark end of the value and advance to the next character */
*Argument = 0;
Argument++;
/* Get length of the key and its value */
KeyLength = RtlWideStringLength(Key, 0);
ValueLength = RtlWideStringLength(Value, 0);
/* Check if argument is valid */
if(KeyLength == 0 || ValueLength == 0)
{
/* Invalid argument, skip to the next one */
continue;
}
/* Allocate memory for new option */
Status = BlMemoryAllocatePool(sizeof(XTBL_CONFIG_ENTRY), (PVOID*)&Option);
if(Status == STATUS_EFI_SUCCESS)
{
/* Allocate more memory for option name */
Status = BlMemoryAllocatePool(sizeof(PWCHAR) * (KeyLength + 1), (PVOID*)&Option->Name);
if(Status == STATUS_EFI_SUCCESS)
{
/* Allocate even more memory for option value */
Status = BlMemoryAllocatePool(sizeof(PWCHAR) * (ValueLength + 1), (PVOID*)&Option->Value);
}
}
if(Status != STATUS_EFI_SUCCESS)
{
/* Some memory allocation failed */
return Status;
}
/* Set entry name and value */
RtlCopyMemory(Option->Name, Key, (KeyLength * sizeof(WCHAR)));
RtlCopyMemory(Option->Value, Value, (ValueLength * sizeof(WCHAR)));
Option->Name[KeyLength] = 0;
Option->Value[ValueLength] = 0;
/* Add entry to the list */
RtlInsertTailList(&Config, &Option->Flink);
/* Take next argument */
Argument = RtlTokenizeWideString(NULL, L" ", &LastArg);
}
/* Update global configuration */
BlpUpdateConfiguration(&Config);
}
}
/* Return success */
return STATUS_EFI_SUCCESS;
}
/**
* Parses configuration INI file.
*
* @param RawConfig
* Suplies a pointer to configuration INI file to be parsed.
*
* @param Configuration
* Supplies a pointer to memory region where parsed configuration will be stored.
*
* @return This routine returns a status code.
*
* @since XT 1.0
*/
XTCDECL
EFI_STATUS
BlpParseConfigurationFile(IN CONST PCHAR RawConfig,
BlpParseConfigFile(IN CONST PCHAR RawConfig,
OUT PLIST_ENTRY Configuration)
{
SIZE_T SectionLength, KeyLength, ValueLength;
PCHAR InputData, Key, SectionName, Value;
PXTBL_INI_SECTION Section;
PXTBL_INI_OPTION Option;
PXTBL_CONFIG_SECTION Section;
PXTBL_CONFIG_ENTRY Option;
EFI_STATUS Status;
/* Initialize pointers */
@ -139,7 +364,7 @@ BlpParseConfigurationFile(IN CONST PCHAR RawConfig,
SectionLength = RtlStringLength(SectionName, 0);
/* Allocate memory for new section */
Status = BlMemoryAllocatePool(sizeof(XTBL_INI_SECTION), (PVOID*)&Section);
Status = BlMemoryAllocatePool(sizeof(XTBL_CONFIG_SECTION), (PVOID*)&Section);
if(Status == STATUS_EFI_SUCCESS)
{
/* Allocate more memory for section name */
@ -209,7 +434,7 @@ BlpParseConfigurationFile(IN CONST PCHAR RawConfig,
ValueLength = RtlStringLength(Value, 0);
/* Allocate memory for new option */
Status = BlMemoryAllocatePool(sizeof(XTBL_INI_OPTION), (PVOID*)&Option);
Status = BlMemoryAllocatePool(sizeof(XTBL_CONFIG_ENTRY), (PVOID*)&Option);
if(Status == STATUS_EFI_SUCCESS)
{
/* Allocate more memory for option name */
@ -255,7 +480,7 @@ BlpParseConfigurationFile(IN CONST PCHAR RawConfig,
*/
XTCDECL
EFI_STATUS
BlpReadConfigurationFile(IN CONST PWCHAR ConfigDirectory,
BlpReadConfigFile(IN CONST PWCHAR ConfigDirectory,
IN CONST PWCHAR ConfigFile,
OUT PCHAR *ConfigData)
{
@ -295,10 +520,10 @@ BlpReadConfigurationFile(IN CONST PWCHAR ConfigDirectory,
}
/**
* Updates XTLDR configuration based on provided options.
* Adds new XTLDR configuration entries to the global configuration list. Existing entries are not overwritten.
*
* @param Options
* Supplies a formatted list of options to be processed and stored in global configuration.
* @param NewConfig
* Supplies a pointer to a linked list containing new configuration entries.
*
* @return This routine does not return any value.
*
@ -306,78 +531,29 @@ BlpReadConfigurationFile(IN CONST PWCHAR ConfigDirectory,
*/
XTCDECL
VOID
BlpUpdateGlobalConfiguration(IN PWCHAR Options)
BlpUpdateConfiguration(IN PLIST_ENTRY NewConfig)
{
PWCHAR Argument, LastArg;
SIZE_T Length;
PXTBL_CONFIG_ENTRY ConfigEntry;
PLIST_ENTRY ConfigListEntry, NextListEntry;
/* Tokenize provided options */
Argument = RtlTokenizeWideString(Options, L" ", &LastArg);
/* Iterate through new config entries */
ConfigListEntry = NewConfig->Flink;
while(ConfigListEntry != NewConfig)
{
/* Get new config entry */
ConfigEntry = CONTAIN_RECORD(ConfigListEntry, XTBL_CONFIG_ENTRY, Flink);
/* Iterate over all arguments passed to boot loader */
while(Argument != NULL)
{
/* Check all provided parameters */
if(RtlCompareWideStringInsensitive(Argument, L"DEFAULT=", 8) == 0)
{
/* Skip to the argument value and calculate argument length */
Argument += 8;
Length = RtlWideStringLength(Argument, 0);
/* Get next config entry */
NextListEntry = ConfigListEntry->Flink;
/* Save default OS parameter in global configuration */
BlMemoryAllocatePool(Length, (PVOID *)&BlpConfiguration.Default);
RtlCopyMemory(BlpConfiguration.Default, Argument, (Length * sizeof(WCHAR)));
BlpConfiguration.Default[Length] = '\0';
}
else if(RtlCompareWideStringInsensitive(Argument, L"DEBUG=", 6) == 0)
/* Make sure config entry does not exist yet */
if(BlGetConfigValue(ConfigEntry->Name) == NULL)
{
/* Skip to the argument value */
Argument += 6;
Length = RtlWideStringLength(Argument, 0);
/* Store debug port configuration if not set already */
if(BlpConfiguration.Debug == NULL)
{
/* Save debug port in global configuration */
BlMemoryAllocatePool(Length, (PVOID *)&BlpConfiguration.Debug);
RtlCopyMemory(BlpConfiguration.Debug, Argument, (Length * sizeof(WCHAR)));
BlpConfiguration.Debug[Length] = '\0';
}
}
else if(RtlCompareWideStringInsensitive(Argument, L"SHELL", 5) == 0)
{
/* Force shell mode */
BlpConfiguration.Shell = TRUE;
}
else if(RtlCompareWideStringInsensitive(Argument, L"TIMEOUT=", 8) == 0)
{
/* Skip to the argument value */
Argument += 8;
/* Zero the timeout */
BlpConfiguration.Timeout = 0;
/* Read the timeout value and store it in global configuration */
while(*Argument >= '0' && *Argument <= '9')
{
BlpConfiguration.Timeout *= 10;
BlpConfiguration.Timeout += *Argument - '0';
Argument++;
}
}
else if(RtlCompareWideStringInsensitive(Argument, L"TUNE=", 5) == 0)
{
/* Skip to the argument value */
Argument += 5;
Length = RtlWideStringLength(Argument, 0);
/* Save theme in global configuration */
BlMemoryAllocatePool(Length, (PVOID *)&BlpConfiguration.Tune);
RtlCopyMemory(BlpConfiguration.Tune, Argument, (Length * sizeof(WCHAR)));
BlpConfiguration.Tune[Length] = '\0';
/* Remove new config entry from input list and put it into global config list */
RtlInsertTailList(BlpConfig, &ConfigEntry->Flink);
}
/* Take next argument */
Argument = RtlTokenizeWideString(NULL, L" ", &LastArg);
/* Move to the next new config entry */
ConfigListEntry = NextListEntry;
}
}

View File

@ -102,7 +102,7 @@ BlConsolePrint(IN PUINT16 Format,
*/
XTCDECL
VOID
BlpConsoleInitialize()
BlpInitializeConsole()
{
/* Clear console buffers */
EfiSystemTable->ConIn->Reset(EfiSystemTable->ConIn, TRUE);

View File

@ -36,14 +36,14 @@ BlDebugPrint(IN PUINT16 Format,
VA_START(Arguments, Format);
/* Check if serial debug port is enabled */
if((BlpConfiguration.DebugPort & XTBL_DEBUGPORT_SERIAL) && (BlpSerialPort.Flags & COMPORT_FLAG_INIT))
if((BlpDebugPort & XTBL_DEBUGPORT_SERIAL) && (BlpSerialPort.Flags & COMPORT_FLAG_INIT))
{
/* Format and print the string to the serial console */
BlpStringPrint(BlpDebugPutChar, Format, Arguments);
}
/* Check if screen debug port is enabled and Boot Services are still available */
if((BlpConfiguration.DebugPort & XTBL_DEBUGPORT_SCREEN) && (BlpStatus.BootServices == TRUE))
if((BlpDebugPort & XTBL_DEBUGPORT_SCREEN) && (BlpStatus.BootServices == TRUE))
{
/* Format and print the string to the screen */
BlpStringPrint(BlpConsolePrintChar, Format, Arguments);
@ -66,7 +66,7 @@ EFI_STATUS
BlpInitializeDebugConsole()
{
ULONG PortAddress, PortNumber, BaudRate;
PWCHAR DebugPort, LastPort;
PWCHAR DebugConfiguration, DebugPort, LastPort;
EFI_STATUS Status;
/* Set default serial port options */
@ -74,11 +74,14 @@ BlpInitializeDebugConsole()
PortNumber = 0;
BaudRate = 0;
/* Make sure any debug options are provided */
if(BlpConfiguration.Debug)
/* Get debug configuration */
DebugConfiguration = BlGetConfigValue(L"DEBUG");
/* Make sure any debug options are provided and debug console is not initialized yet */
if(DebugConfiguration && BlpDebugPort == 0)
{
/* Find all debug ports */
DebugPort = RtlTokenizeWideString(BlpConfiguration.Debug, L";", &LastPort);
DebugPort = RtlTokenizeWideString(DebugConfiguration, L";", &LastPort);
/* Iterate over all debug ports */
while(DebugPort != NULL)
@ -138,12 +141,12 @@ BlpInitializeDebugConsole()
}
/* Enable debug port */
BlpConfiguration.DebugPort |= XTBL_DEBUGPORT_SERIAL;
BlpDebugPort |= XTBL_DEBUGPORT_SERIAL;
}
else if(RtlCompareWideStringInsensitive(DebugPort, L"SCREEN", 5) == 0)
{
/* Enable debug port */
BlpConfiguration.DebugPort |= XTBL_DEBUGPORT_SCREEN;
BlpDebugPort |= XTBL_DEBUGPORT_SCREEN;
}
else
{
@ -158,14 +161,14 @@ BlpInitializeDebugConsole()
}
/* Check if serial debug port is enabled */
if(BlpConfiguration.DebugPort & XTBL_DEBUGPORT_SERIAL)
if(BlpDebugPort & XTBL_DEBUGPORT_SERIAL)
{
/* Try to initialize COM port */
Status = BlpInitializeSerialPort(PortNumber, PortAddress, BaudRate);
if(Status != STATUS_EFI_SUCCESS)
{
/* Remove serial debug port, as COM port initialization failed and return */
BlpConfiguration.DebugPort &= ~XTBL_DEBUGPORT_SERIAL;
BlpDebugPort &= ~XTBL_DEBUGPORT_SERIAL;
return Status;
}
}

View File

@ -78,5 +78,5 @@ BlpInitializeEfiBootLoader()
BlpStatus.SystemTable = EfiSystemTable;
/* Initialize console */
BlpConsoleInitialize();
BlpInitializeConsole();
}

View File

@ -9,12 +9,18 @@
#include <xtldr.h>
/* XT Boot Loader configuration data */
XTBL_CONFIGURATION BlpConfiguration = {0};
/* XT Boot Loader configuration list */
PLIST_ENTRY BlpConfig = NULL;
/* XT Boot Loader debug port configuration */
ULONG BlpDebugPort = 0;
/* XT Boot Loader hex table */
STATIC PUINT16 BlpHexTable = L"0123456789ABCDEF";
/* XT Boot Loader menu list */
PLIST_ENTRY BlpMenuList = NULL;
/* Serial port configuration */
CPPORT BlpSerialPort;

View File

@ -56,6 +56,10 @@ BlFindVolumeDevicePath(IN PEFI_DEVICE_PATH_PROTOCOL FsHandle,
IN CONST PWCHAR FileSystemPath,
OUT PEFI_DEVICE_PATH_PROTOCOL* DevicePath);
XTCDECL
PWCHAR
BlGetConfigValue(IN CONST PWCHAR ConfigName);
XTCDECL
EFI_STATUS
BlGetVolumeDevicePath(IN PCHAR SystemPath,
@ -100,6 +104,11 @@ EFI_STATUS
BlOpenXtProtocol(OUT PVOID *ProtocolHandler,
IN PEFI_GUID ProtocolGuid);
XTCDECL
EFI_STATUS
BlSetConfigValue(IN CONST PWCHAR ConfigName,
IN CONST PWCHAR ConfigValue);
XTCDECL
VOID
BlSleepExecution(IN ULONG_PTR Milliseconds);
@ -115,7 +124,7 @@ BlpActivateSerialIOController();
XTCDECL
VOID
BlpConsoleInitialize();
BlpInitializeConsole();
XTCDECL
VOID
@ -168,17 +177,21 @@ BlpInitializeSerialPort(IN ULONG PortNumber,
IN ULONG BaudRate);
XTCDECL
VOID
EFI_STATUS
BlpLoadConfiguration();
XTCDECL
EFI_STATUS
BlpParseCommandLine(VOID);
XTCDECL
EFI_STATUS
BlpParseConfigurationFile(IN CONST PCHAR RawConfig,
BlpParseConfigFile(IN CONST PCHAR RawConfig,
OUT PLIST_ENTRY Configuration);
XTCDECL
EFI_STATUS
BlpReadConfigurationFile(IN CONST PWCHAR ConfigDirectory,
BlpReadConfigFile(IN CONST PWCHAR ConfigDirectory,
IN CONST PWCHAR ConfigFile,
OUT PCHAR *ConfigData);
@ -230,6 +243,6 @@ BlpStringReadPadding(IN PUINT16 *Format);
XTCDECL
VOID
BlpUpdateGlobalConfiguration(IN PWCHAR Options);
BlpUpdateConfiguration(IN PLIST_ENTRY NewConfig);
#endif /* __XTLDR_BOOTMAN_H */

View File

@ -12,12 +12,18 @@
#include <xtblapi.h>
/* XT Boot Loader configuration data */
EXTERN XTBL_CONFIGURATION BlpConfiguration;
/* XT Boot Loader configuration list */
EXTERN PLIST_ENTRY BlpConfig;
/* XT Boot Loader debug port configuration */
EXTERN ULONG BlpDebugPort;
/* XT Boot Loader hex table */
EXTERN PUINT16 BlpHexTable;
/* XT Boot Loader menu list */
EXTERN PLIST_ENTRY BlpMenuList;
/* Serial port configuration */
EXTERN CPPORT BlpSerialPort;

View File

@ -38,7 +38,13 @@ BlStartXtLoader(IN EFI_HANDLE ImageHandle,
BlConsolePrint(L"XTLDR boot loader v%s\n", XTOS_VERSION);
/* Parse configuration options passed from UEFI shell */
BlpParseCommandLine();
Status = BlpParseCommandLine();
if(Status != STATUS_EFI_SUCCESS)
{
/* Failed to parse command line options */
BlConsolePrint(L"ERROR: Failed to parse command line options\n");
BlSleepExecution(3000);
}
/* Attempt to early initialize debug console */
if(DEBUG)
@ -52,6 +58,27 @@ BlStartXtLoader(IN EFI_HANDLE ImageHandle,
}
}
/* Load XTLDR configuration file */
Status = BlpLoadConfiguration();
if(Status != STATUS_EFI_SUCCESS)
{
/* Failed to load/parse config file */
BlConsolePrint(L"ERROR: Failed to load configuration file\n");
BlSleepExecution(3000);
}
/* Reinitialize debug console if it was not initialized earlier */
if(DEBUG)
{
Status = BlpInitializeDebugConsole();
if(Status != STATUS_EFI_SUCCESS)
{
/* Initialization failed, notify user on stdout */
BlConsolePrint(L"ERROR: Failed to initialize debug console\n");
BlSleepExecution(3000);
}
}
/* Disable watchdog timer */
Status = EfiSystemTable->BootServices->SetWatchdogTimer(0, 0x10000, 0, NULL);
if(Status != STATUS_EFI_SUCCESS)