diff --git a/xtldr/CMakeLists.txt b/xtldr/CMakeLists.txt index 82638a3..7dc81f0 100644 --- a/xtldr/CMakeLists.txt +++ b/xtldr/CMakeLists.txt @@ -4,6 +4,7 @@ PROJECT(XTLDR) # Specify include directories include_directories( ${EXECTOS_SOURCE_DIR}/sdk/xtdk + ${EXECTOS_SOURCE_DIR}/sdk/xtklib/includes ${XTLDR_SOURCE_DIR}/includes) # Specify list of source code files @@ -16,6 +17,9 @@ list(APPEND XTLDR_SOURCE # Add executable add_executable(xtldr ${XTLDR_SOURCE}) +# Add linker libraries +target_link_libraries(xtldr xtklib) + # Set proper binary name and install target if(ARCH STREQUAL "i686") set(BINARY_NAME "bootia32") @@ -26,5 +30,5 @@ set_target_properties(xtldr PROPERTIES OUTPUT_NAME ${BINARY_NAME} SUFFIX .efi) set_install_target(xtldr efi/boot) # Set loader entrypoint, imagebase address, ordinals and subsystem -set_entrypoint(xtldr "XtLoaderStartup") +set_entrypoint(xtldr "BlStartXtLoader") set_subsystem(xtldr efi_application) diff --git a/xtldr/efiutil.c b/xtldr/efiutil.c index 9ecf83b..755a2c2 100644 --- a/xtldr/efiutil.c +++ b/xtldr/efiutil.c @@ -9,6 +9,35 @@ #include +/** + * This routine formats the input string and prints it out to the serial console. + * + * @param Format + * The formatted string that is to be written to the output. + * + * @param ... + * Depending on the format string, this routine might expect a sequence of additional arguments. + * + * @return This routine does not return any value. + * + * @since XT 1.0 + */ +VOID +BlDbgPrint(IN PUINT16 Format, + IN ...) +{ + VA_LIST Arguments; + + /* Initialise the va_list */ + VA_START(Arguments, Format); + + /* Format and print the string to the serial console */ + BlStringPrint(BlComPortPutChar, Format, Arguments); + + /* Clean up the va_list */ + VA_END(Arguments); +} + /** * This routine formats the input string and prints it out to the stdout and serial console. * @@ -22,7 +51,7 @@ * * @since XT 1.0 * - * @todo Check if GOP is active and use it instead of default conout protocol; duplicate output to serial console. + * @todo Check if GOP is active and use it instead of default conout protocol */ VOID BlEfiPrint(IN PUINT16 Format, @@ -36,6 +65,9 @@ BlEfiPrint(IN PUINT16 Format, /* Format and print the string to the stdout */ BlStringPrint(BlConsolePutChar, Format, Arguments); + /* Format and print the string to the serial console */ + BlStringPrint(BlComPortPutChar, Format, Arguments); + /* Clean up the va_list */ VA_END(Arguments); } diff --git a/xtldr/includes/xtbl.h b/xtldr/includes/xtbl.h index 1a3d8e0..e241a63 100644 --- a/xtldr/includes/xtbl.h +++ b/xtldr/includes/xtbl.h @@ -10,6 +10,7 @@ #define __XTLDR_XTBL_H #include +#include /* EFI Image Handle */ @@ -18,6 +19,12 @@ EXTERN EFI_HANDLE EfiImageHandle; /* EFI System Table */ EXTERN EFI_SYSTEM_TABLE *EfiSystemTable; +/* Serial port configuration */ +EXTERN CPPORT EfiSerialPort; + +VOID +BlComPortPutChar(IN USHORT Character); + VOID BlConsoleClearScreen(); @@ -27,10 +34,18 @@ BlConsoleInitialize(); VOID BlConsolePutChar(IN USHORT Character); +VOID +BlDbgPrint(IN PUINT16 Format, + IN ...); + VOID BlEfiPrint(IN PUINT16 Format, IN ...); +EFI_STATUS +BlStartXtLoader(IN EFI_HANDLE ImageHandle, + IN PEFI_SYSTEM_TABLE SystemTable); + VOID BlStringPrint(IN VOID PutChar(IN USHORT Character), IN PUINT16 Format, @@ -66,8 +81,4 @@ BlpStringPrintUnsigned64(IN VOID PutChar(IN USHORT Character), UINT64 BlpStringReadPadding(IN PUINT16 *Format); -EFI_STATUS -XtLoaderStartup(IN EFI_HANDLE ImageHandle, - IN PEFI_SYSTEM_TABLE SystemTable); - #endif /* __XTLDR_XTBL_H */ diff --git a/xtldr/xtldr.c b/xtldr/xtldr.c index 27d8522..7e7abed 100644 --- a/xtldr/xtldr.c +++ b/xtldr/xtldr.c @@ -15,6 +15,31 @@ EFI_HANDLE EfiImageHandle; /* EFI System Table */ PEFI_SYSTEM_TABLE EfiSystemTable; +/* Serial port configuration */ +CPPORT EfiSerialPort; + +/** + * Writes a character to the serial console. + * + * @param Character + * The integer promotion of the character to be written. + * + * @return This routine does not return any value. + * + * @since XT 1.0 + */ +VOID +BlComPortPutChar(IN USHORT Character) +{ + USHORT Buffer[2]; + + /* Write character to the serial console */ + Buffer[0] = Character; + Buffer[1] = 0; + + HlComPortPutByte(&EfiSerialPort, Buffer[0]); +} + /** * This routine is the entry point of the XT EFI boot loader. * @@ -27,10 +52,9 @@ PEFI_SYSTEM_TABLE EfiSystemTable; * @return This routine returns status code. * * @since XT 1.0 - * */ EFI_STATUS -XtLoaderStartup(IN EFI_HANDLE ImageHandle, +BlStartXtLoader(IN EFI_HANDLE ImageHandle, IN PEFI_SYSTEM_TABLE SystemTable) { EFI_STATUS Status; @@ -39,6 +63,12 @@ XtLoaderStartup(IN EFI_HANDLE ImageHandle, EfiImageHandle = ImageHandle; EfiSystemTable = SystemTable; + Status = HlInitializeComPort(&EfiSerialPort, 1, 0); + if(Status != STATUS_SUCCESS) + { + BlEfiPrint(L"Failed to initialize serial console"); + } + /* Initialize EFI console */ Status = BlConsoleInitialize(); if(Status != STATUS_EFI_SUCCESS) {