diff --git a/sdk/xtdk/bltypes.h b/sdk/xtdk/bltypes.h index 20c33d2..59ff5ab 100644 --- a/sdk/xtdk/bltypes.h +++ b/sdk/xtdk/bltypes.h @@ -10,14 +10,15 @@ #define __XTDK_BMTYPES_H #include +#include -/* Debug port type definitions */ +/* XTLDR Debug port type definitions */ #define XTBL_DEBUGPORT_SCREEN 1 #define XTBL_DEBUGPORT_SERIAL 2 /* XTLDR configuration data */ -typedef struct _XTBM_CONFIGURATION +typedef struct _XTBL_CONFIGURATION { PWCHAR Default; PWCHAR Debug; @@ -26,6 +27,14 @@ typedef struct _XTBM_CONFIGURATION PWCHAR Theme; ULONG Timeout; PWCHAR Tune; -} XTBM_CONFIGURATION, *PXTBM_CONFIGURATION; +} XTBL_CONFIGURATION, *PXTBL_CONFIGURATION; + +/* XTLDR status data */ +typedef struct _XTBL_STATUS +{ + BOOLEAN BootServices; + EFI_HANDLE ImageHandle; + PEFI_SYSTEM_TABLE SystemTable; +} XTBL_STATUS, *PXTBL_STATUS; #endif /* __XTDK_BMTYPES_H */ diff --git a/sdk/xtdk/xtblapi.h b/sdk/xtdk/xtblapi.h index ef5260f..f58c149 100644 --- a/sdk/xtdk/xtblapi.h +++ b/sdk/xtdk/xtblapi.h @@ -16,7 +16,7 @@ #include /* Architecture-specific XT forward references */ -#include ARCH_HEADER(xtstruct.h) +// #include ARCH_HEADER(xtstruct.h) /* Architecture-independent XT API */ #include @@ -32,16 +32,16 @@ #include /* Architecture dependent XT kernel data types */ -#include ARCH_HEADER(artypes.h) -#include ARCH_HEADER(hltypes.h) +// #include ARCH_HEADER(artypes.h) +// #include ARCH_HEADER(hltypes.h) /* XT Kernel runtime routines */ #include #include /* Architecture specific XT kernel routines */ -#include ARCH_HEADER(arfuncs.h) -#include ARCH_HEADER(hlfuncs.h) +// #include ARCH_HEADER(arfuncs.h) +// #include ARCH_HEADER(hlfuncs.h) /* Boot Manager specific structures */ #include diff --git a/xtldr2/debug.c b/xtldr2/debug.c index dcfddc5..3a4b689 100644 --- a/xtldr2/debug.c +++ b/xtldr2/debug.c @@ -43,7 +43,7 @@ BlDebugPrint(IN PUINT16 Format, } /* Check if screen debug port is enabled and Boot Services are still available */ - if((BlpConfiguration.DebugPort & XTBL_DEBUGPORT_SCREEN) && (EfiSystemTable->BootServices != 0)) + if((BlpConfiguration.DebugPort & XTBL_DEBUGPORT_SCREEN) && (BlpStatus.BootServices == TRUE)) { /* Format and print the string to the screen */ BlpStringPrint(BlpConsolePrintChar, Format, Arguments); @@ -54,68 +54,6 @@ BlDebugPrint(IN PUINT16 Format, } } -/** - * This routine initializes the serial debug console. - * - * @param PortNumber - * Supplies a port number. - * - * @param PortAddress - * Supplies an address of the COM port. - * - * @param BaudRate - * Supplies an optional port baud rate. - * - * @return This routine returns a status code. - * - * @since XT 1.0 - */ -XTCDECL -EFI_STATUS -BlpDebugInitializeComPort(IN ULONG PortNumber, - IN ULONG PortAddress, - IN ULONG BaudRate) -{ - EFI_STATUS EfiStatus; - XTSTATUS Status; - - /* Print debug message depending on port settings */ - if(PortAddress) - { - BlConsolePrint(L"Initializing serial console at COM port address: 0x%lx\n", PortAddress); - } - else - { - BlConsolePrint(L"Initializing serial console at port COM%d\n", PortNumber); - } - - /* Initialize COM port */ - Status = HlInitializeComPort(&BlpSerialPort, PortNumber, UlongToPtr(PortAddress), BaudRate); - - /* Port not found under supplied address */ - if(Status == STATUS_NOT_FOUND && PortAddress) - { - /* This might be PCI(E) serial controller, try to activate I/O space access first */ - EfiStatus = BlpActivateSerialIOController(); - if(EfiStatus == STATUS_EFI_SUCCESS) - { - /* Try to reinitialize COM port */ - BlConsolePrint(L"Enabled I/O space access for all PCI(E) serial controllers found\n"); - Status = HlInitializeComPort(&BlpSerialPort, PortNumber, UlongToPtr(PortAddress), BaudRate); - } - } - - /* Check COM port initialization status code */ - if(Status != STATUS_SUCCESS) - { - /* Serial port initialization failed, mark as not ready */ - return STATUS_EFI_NOT_READY; - } - - /* Return success */ - return STATUS_EFI_SUCCESS; -} - /** * This routine initializes the XTLDR debug console. * @@ -125,7 +63,7 @@ BlpDebugInitializeComPort(IN ULONG PortNumber, */ XTCDECL EFI_STATUS -BlpDebugInitializeConsole() +BlpInitializeDebugConsole() { ULONG PortAddress, PortNumber, BaudRate; PWCHAR DebugPort, LastPort; @@ -223,7 +161,7 @@ BlpDebugInitializeConsole() if(BlpConfiguration.DebugPort & XTBL_DEBUGPORT_SERIAL) { /* Try to initialize COM port */ - Status = BlpDebugInitializeComPort(PortNumber, PortAddress, BaudRate); + Status = BlpInitializeSerialPort(PortNumber, PortAddress, BaudRate); if(Status != STATUS_EFI_SUCCESS) { /* Remove serial debug port, as COM port initialization failed and return */ @@ -236,6 +174,68 @@ BlpDebugInitializeConsole() return STATUS_EFI_SUCCESS; } +/** + * This routine initializes the serial debug console. + * + * @param PortNumber + * Supplies a port number. + * + * @param PortAddress + * Supplies an address of the COM port. + * + * @param BaudRate + * Supplies an optional port baud rate. + * + * @return This routine returns a status code. + * + * @since XT 1.0 + */ +XTCDECL +EFI_STATUS +BlpInitializeSerialPort(IN ULONG PortNumber, + IN ULONG PortAddress, + IN ULONG BaudRate) +{ + EFI_STATUS EfiStatus; + XTSTATUS Status; + + /* Print debug message depending on port settings */ + if(PortAddress) + { + BlConsolePrint(L"Initializing serial console at COM port address: 0x%lx\n", PortAddress); + } + else + { + BlConsolePrint(L"Initializing serial console at port COM%d\n", PortNumber); + } + + /* Initialize COM port */ + Status = HlInitializeComPort(&BlpSerialPort, PortNumber, UlongToPtr(PortAddress), BaudRate); + + /* Port not found under supplied address */ + if(Status == STATUS_NOT_FOUND && PortAddress) + { + /* This might be PCI(E) serial controller, try to activate I/O space access first */ + EfiStatus = BlpActivateSerialIOController(); + if(EfiStatus == STATUS_EFI_SUCCESS) + { + /* Try to reinitialize COM port */ + BlConsolePrint(L"Enabled I/O space access for all PCI(E) serial controllers found\n"); + Status = HlInitializeComPort(&BlpSerialPort, PortNumber, UlongToPtr(PortAddress), BaudRate); + } + } + + /* Check COM port initialization status code */ + if(Status != STATUS_SUCCESS) + { + /* Serial port initialization failed, mark as not ready */ + return STATUS_EFI_NOT_READY; + } + + /* Return success */ + return STATUS_EFI_SUCCESS; +} + /** * Writes a character to the serial console. * diff --git a/xtldr2/efiutils.c b/xtldr2/efiutils.c index 3cded88..104db69 100644 --- a/xtldr2/efiutils.c +++ b/xtldr2/efiutils.c @@ -9,6 +9,41 @@ #include +/** + * Exits EFI boot services. + * + * @param MapKey + * Identifies the current memory map of the system. + * + * @return This routine returns status code. + * + * @since XT 1.0 + */ +XTCDECL +EFI_STATUS +BlExitBootServices(IN UINT_PTR MapKey) +{ + EFI_STATUS Status; + + /* Attempt to exit boot services */ + Status = EfiSystemTable->BootServices->ExitBootServices(BlpStatus.ImageHandle, MapKey); + if(Status != STATUS_EFI_SUCCESS) + { + /* Retry as UEFI spec says to do it twice */ + Status = EfiSystemTable->BootServices->ExitBootServices(BlpStatus.ImageHandle, MapKey); + } + + /* Make sure boot services were successfully exited */ + if(Status == STATUS_EFI_SUCCESS) + { + /* Mark EFI Boot Services as no longer available */ + BlpStatus.BootServices = FALSE; + } + + /* Return EFI status code */ + return Status; +} + /** * Puts the system to sleep for the specified number of milliseconds. * @@ -25,3 +60,23 @@ BlSleepExecution(IN ULONG_PTR Milliseconds) { EfiSystemTable->BootServices->Stall(Milliseconds * 1000); } + +/** + * Initializes EFI Boot Loader (XTLDR). + * + * @return This routine does not return any value. + * + * @since XT 1.0 + */ +XTCDECL +VOID +BlpInitializeEfiBootLoader() +{ + /* Set current XTLDR status */ + BlpStatus.BootServices = TRUE; + BlpStatus.ImageHandle = EfiImageHandle; + BlpStatus.SystemTable = EfiSystemTable; + + /* Initialize console */ + BlpConsoleInitialize(); +} diff --git a/xtldr2/globals.c b/xtldr2/globals.c index 844833c..6017862 100644 --- a/xtldr2/globals.c +++ b/xtldr2/globals.c @@ -10,7 +10,7 @@ /* XT Boot Loader configuration data */ -XTBM_CONFIGURATION BlpConfiguration = {0}; +XTBL_CONFIGURATION BlpConfiguration = {0}; /* XT Boot Loader hex table */ STATIC PUINT16 BlpHexTable = L"0123456789ABCDEF"; @@ -18,6 +18,9 @@ STATIC PUINT16 BlpHexTable = L"0123456789ABCDEF"; /* Serial port configuration */ CPPORT BlpSerialPort; +/* XT Boot Loader status data */ +XTBL_STATUS BlpStatus = {0}; + /* EFI Image Handle */ EFI_HANDLE EfiImageHandle; diff --git a/xtldr2/includes/bootman.h b/xtldr2/includes/bootman.h index 3a310ae..5fd9f9b 100644 --- a/xtldr2/includes/bootman.h +++ b/xtldr2/includes/bootman.h @@ -16,6 +16,10 @@ typedef VOID (BMPRINTCHAR)(IN USHORT Character); /* XTLDR routines forward references */ +XTCDECL +EFI_STATUS +BlExitBootServices(IN UINT_PTR MapKey); + XTCDECL EFI_STATUS BlMemoryAllocatePages(IN UINT64 Pages, @@ -87,18 +91,22 @@ VOID BlpConsolePrintChar(IN USHORT Character); XTCDECL -EFI_STATUS -BlpDebugInitializeComPort(IN ULONG PortNumber, - IN ULONG PortAddress, - IN ULONG BaudRate); +VOID +BlpDebugPutChar(IN USHORT Character); XTCDECL EFI_STATUS -BlpDebugInitializeConsole(); +BlpInitializeDebugConsole(); XTCDECL VOID -BlpDebugPutChar(IN USHORT Character); +BlpInitializeEfiBootLoader(); + +XTCDECL +EFI_STATUS +BlpInitializeSerialPort(IN ULONG PortNumber, + IN ULONG PortAddress, + IN ULONG BaudRate); XTCDECL VOID diff --git a/xtldr2/includes/globals.h b/xtldr2/includes/globals.h index 3ac01d9..9d09f76 100644 --- a/xtldr2/includes/globals.h +++ b/xtldr2/includes/globals.h @@ -13,7 +13,7 @@ /* XT Boot Loader configuration data */ -EXTERN XTBM_CONFIGURATION BlpConfiguration; +EXTERN XTBL_CONFIGURATION BlpConfiguration; /* XT Boot Loader hex table */ EXTERN PUINT16 BlpHexTable; @@ -21,6 +21,9 @@ EXTERN PUINT16 BlpHexTable; /* Serial port configuration */ EXTERN CPPORT BlpSerialPort; +/* XT Boot Loader status data */ +EXTERN XTBL_STATUS BlpStatus; + /* EFI Image Handle */ EXTERN EFI_HANDLE EfiImageHandle; diff --git a/xtldr2/xtldr.c b/xtldr2/xtldr.c index 2c96e1d..7a850d7 100644 --- a/xtldr2/xtldr.c +++ b/xtldr2/xtldr.c @@ -29,12 +29,8 @@ BlStartXtLoader(IN EFI_HANDLE ImageHandle, { EFI_STATUS Status; - /* Set the system table and image handle */ - EfiImageHandle = ImageHandle; - EfiSystemTable = SystemTable; - - /* Initialize UEFI console and early print XTLDR version */ - BlpConsoleInitialize(); + /* Initialize XTLDR and early print XTLDR version */ + BlpInitializeEfiBootLoader(); BlConsolePrint(L"XTLDR boot loader v%s\n", XTOS_VERSION); /* Parse configuration options passed from UEFI shell */ @@ -43,7 +39,7 @@ BlStartXtLoader(IN EFI_HANDLE ImageHandle, /* Attempt to early initialize debug console */ if(DEBUG) { - Status = BlpDebugInitializeConsole(); + Status = BlpInitializeDebugConsole(); if(Status != STATUS_EFI_SUCCESS) { /* Initialization failed, notify user on stdout */