From ab7fa5ffa4b43485f0071c5044cb5d5b50d8fb0f Mon Sep 17 00:00:00 2001 From: Rafal Kupiec Date: Sun, 3 Dec 2023 14:22:14 +0100 Subject: [PATCH] Initial XTLDR configuration --- xtldr2/CMakeLists.txt | 1 + xtldr2/config.c | 116 ++++++++++++++++++++++++++++++++++++++ xtldr2/globals.c | 3 + xtldr2/includes/bootman.h | 9 +++ xtldr2/includes/globals.h | 3 + 5 files changed, 132 insertions(+) create mode 100644 xtldr2/config.c diff --git a/xtldr2/CMakeLists.txt b/xtldr2/CMakeLists.txt index 5ebd7a1..911fca8 100644 --- a/xtldr2/CMakeLists.txt +++ b/xtldr2/CMakeLists.txt @@ -8,6 +8,7 @@ include_directories( # Specify list of source code files list(APPEND XTLDR_SOURCE + ${XTLDR_SOURCE_DIR}/config.c ${XTLDR_SOURCE_DIR}/console.c ${XTLDR_SOURCE_DIR}/globals.c ${XTLDR_SOURCE_DIR}/hardware.c diff --git a/xtldr2/config.c b/xtldr2/config.c new file mode 100644 index 0000000..2e1c8d2 --- /dev/null +++ b/xtldr2/config.c @@ -0,0 +1,116 @@ +/** + * PROJECT: ExectOS + * COPYRIGHT: See COPYING.md in the top level directory + * FILE: xtldr/config.c + * DESCRIPTION: XT Boot Manager Configuration + * DEVELOPERS: Rafal Kupiec + */ + +#include + + +XTCDECL +VOID +BmpParseCommandLineOptions(VOID) +{ + EFI_GUID LIPGuid = EFI_LOADED_IMAGE_PROTOCOL_GUID; + PEFI_LOADED_IMAGE_PROTOCOL LoadedImage; + EFI_STATUS Status; + + /* Handle loaded image protocol */ + Status = EfiSystemTable->BootServices->HandleProtocol(EfiImageHandle, &LIPGuid, (PVOID *)&LoadedImage); + if(Status == STATUS_EFI_SUCCESS) + { + /* Check if launched from UEFI shell */ + if(LoadedImage && LoadedImage->LoadOptions) + { + /* Update global boot loader configuration */ + BmpUpdateGlobalConfiguration(LoadedImage->LoadOptions); + } + } +} + +XTCDECL +VOID +BmpUpdateGlobalConfiguration(IN PWCHAR Options) +{ + PWCHAR Argument, LastArg; + SIZE_T Length; + + /* Tokenize provided options */ + Argument = RtlWideStringTokenize(Options, L" ", &LastArg); + + /* Iterate over all arguments passed to boot loader */ + while(Argument != NULL) + { + /* Check all provided parameters */ + if(RtlWideStringCompare(Argument, L"DEFAULT=", 8) == 0) + { + /* Skip to the argument value and calculate argument length */ + Argument += 8; + Length = RtlWideStringLength(Argument, 0); + + /* Save default OS parameter in global configuration */ + BmAllocateEfiPool(Length, (PVOID *)&BmpConfiguration.Default); + RtlCopyMemory(BmpConfiguration.Default, Argument, (Length * sizeof(WCHAR)) - 1); + BmpConfiguration.Default[Length] = '\0'; + } + else if(RtlWideStringCompare(Argument, L"DEBUG=", 6) == 0) + { + /* Skip to the argument value */ + Argument += 6; + Length = RtlWideStringLength(Argument, 0); + + /* Save debug port in global configuration */ + BmAllocateEfiPool(Length, (PVOID *)&BmpConfiguration.Debug); + RtlCopyMemory(BmpConfiguration.Debug, Argument, (Length * sizeof(WCHAR)) - 1); + BmpConfiguration.Debug[Length] = '\0'; + } + else if(RtlWideStringCompare(Argument, L"SHELL", 5) == 0) + { + /* Force shell mode */ + BmpConfiguration.Shell = TRUE; + } + else if(RtlWideStringCompare(Argument, L"THEME=", 6) == 0) + { + /* Skip to the argument value */ + Argument += 6; + Length = RtlWideStringLength(Argument, 0); + + /* Save theme in global configuration */ + BmAllocateEfiPool(Length, (PVOID *)&BmpConfiguration.Theme); + RtlCopyMemory(BmpConfiguration.Theme, Argument, (Length * sizeof(WCHAR)) - 1); + BmpConfiguration.Theme[Length] = '\0'; + } + else if(RtlWideStringCompare(Argument, L"TIMEOUT=", 8) == 0) + { + /* Skip to the argument value */ + Argument += 8; + + /* Zero the timeout */ + BmpConfiguration.Timeout = 0; + + /* Read the timeout value and store it in global configuration */ + while(*Argument >= '0' && *Argument <= '9') + { + BmpConfiguration.Timeout *= 10; + BmpConfiguration.Timeout += *Argument - '0'; + Argument++; + } + } + else if(RtlWideStringCompare(Argument, L"TUNE=", 5) == 0) + { + /* Skip to the argument value */ + Argument += 5; + Length = RtlWideStringLength(Argument, 0); + + /* Save theme in global configuration */ + BmAllocateEfiPool(Length, (PVOID *)&BmpConfiguration.Tune); + RtlCopyMemory(BmpConfiguration.Tune, Argument, (Length * sizeof(WCHAR)) - 1); + BmpConfiguration.Tune[Length] = '\0'; + } + + /* Take next argument */ + Argument = RtlWideStringTokenize(NULL, L" ", &LastArg); + } +} diff --git a/xtldr2/globals.c b/xtldr2/globals.c index ef1cbbc..8c5f2b9 100644 --- a/xtldr2/globals.c +++ b/xtldr2/globals.c @@ -9,6 +9,9 @@ #include +/* XT Boot Loader configuration data */ +XTBM_CONFIGURATION BmpConfiguration = {0}; + /* XT Boot Loader hex table */ STATIC PUINT16 BmpHexTable = L"0123456789ABCDEF"; diff --git a/xtldr2/includes/bootman.h b/xtldr2/includes/bootman.h index 1fa2014..87d772f 100644 --- a/xtldr2/includes/bootman.h +++ b/xtldr2/includes/bootman.h @@ -72,12 +72,17 @@ EFI_STATUS BmStartXtLoader(IN EFI_HANDLE ImageHandle, IN PEFI_SYSTEM_TABLE SystemTable); + XTCDECL VOID BmpFormatString(IN BMPRINTCHAR PrintCharRoutine, IN PUINT16 Format, IN ...); +XTCDECL +VOID +BmpParseCommandLineOptions(VOID); + XTCDECL VOID BmpPrintSigned32String(IN BMPRINTCHAR PrintCharRoutine, @@ -108,4 +113,8 @@ XTCDECL UINT64 BmpReadStringPadding(IN PUINT16 *Format); +XTCDECL +VOID +BmpUpdateGlobalConfiguration(IN PWCHAR Options); + #endif /* __XTLDR_BOOTMAN_H */ diff --git a/xtldr2/includes/globals.h b/xtldr2/includes/globals.h index a9b2fab..ad7d7eb 100644 --- a/xtldr2/includes/globals.h +++ b/xtldr2/includes/globals.h @@ -12,6 +12,9 @@ #include +/* XT Boot Loader configuration data */ +EXTERN XTBM_CONFIGURATION BmpConfiguration; + /* XT Boot Loader hex table */ EXTERN PUINT16 BmpHexTable;