X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EdkUnixPkg%2FDxe%2FUnixThunk%2FBus%2FConsole%2FConsoleOut.c;fp=EdkUnixPkg%2FDxe%2FUnixThunk%2FBus%2FConsole%2FConsoleOut.c;h=bd9d4e29fe781d6c1ee8f6b6cd71b2524fce7be7;hp=0000000000000000000000000000000000000000;hb=c9093a06e72ef16d2f3bd7ce0a2b9a172e9d048c;hpb=8ba7afaf2e9c682a5d17760e6dd5463b3a2b2d67 diff --git a/EdkUnixPkg/Dxe/UnixThunk/Bus/Console/ConsoleOut.c b/EdkUnixPkg/Dxe/UnixThunk/Bus/Console/ConsoleOut.c new file mode 100644 index 0000000000..bd9d4e29fe --- /dev/null +++ b/EdkUnixPkg/Dxe/UnixThunk/Bus/Console/ConsoleOut.c @@ -0,0 +1,635 @@ +/*++ + +Copyright (c) 2004, Intel Corporation +All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +Module Name: + + ConsoleOut.c + +Abstract: + + Console based on Win32 APIs. + + This file creates an Win32 window and attaches a SimpleTextOut protocol. + +--*/ + +#include "Console.h" +// +// Private worker functions. +// + +#if 0 +STATIC +VOID +UnixSimpleTextOutScrollScreen ( + IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console + ); + +#endif +STATIC +VOID +UnixSimpleTextOutPutChar ( + IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console, + IN CHAR16 Char + ); + +STATIC +EFI_STATUS +EFIAPI +UnixSimpleTextOutSetAttribute ( + IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This, + IN UINTN Attribute + ); +STATIC +EFI_STATUS +EFIAPI +UnixSimpleTextOutSetMode ( + IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This, + IN UINTN ModeNumber + ); + +// +// Modeule Global for Simple Text Out Mode. +// +#define MAX_SIMPLE_TEXT_OUT_MODE \ + (sizeof(mUnixSimpleTextOutSupportedModes)/sizeof(UNIX_SIMPLE_TEXT_OUT_MODE)) + +STATIC UNIX_SIMPLE_TEXT_OUT_MODE mUnixSimpleTextOutSupportedModes[] = { + { 80, 25 }, +#if 0 + { 80, 50 }, + { 80, 43 }, + { 100, 100 }, + { 100, 999 } +#endif +}; + +STATIC +EFI_STATUS +EFIAPI +UnixSimpleTextOutReset ( + IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This, + IN BOOLEAN ExtendedVerification + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + This - TODO: add argument description + ExtendedVerification - TODO: add argument description + +Returns: + + EFI_SUCCESS - TODO: Add description for return value + +--*/ +{ + UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private; + + Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This); + + UnixSimpleTextOutSetAttribute (This, EFI_TEXT_ATTR (This->Mode->Attribute & 0x0F, EFI_BACKGROUND_BLACK)); + + UnixSimpleTextOutSetMode (This, 0); + return EFI_SUCCESS; +} + +STATIC +EFI_STATUS +EFIAPI +UnixSimpleTextOutOutputString ( + IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This, + IN CHAR16 *String + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + This - TODO: add argument description + String - TODO: add argument description + +Returns: + + EFI_SUCCESS - TODO: Add description for return value + +--*/ +{ + UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private; + CHAR16 *Str; + + Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This); + + for (Str = String; *Str != '\0'; Str++) { + switch (*Str) { +#if 0 + case '\n': + if (Private->Position.Y == (Private->MaxScreenSize.Y - 1)) { + UnixSimpleTextOutScrollScreen (Private); + } + + if (Private->Position.Y < (Private->MaxScreenSize.Y - 1)) { + Private->Position.Y++; + This->Mode->CursorRow++; + } + break; + + case '\r': + Private->Position.X = 0; + This->Mode->CursorColumn = 0; + break; + + case '\b': + if (Private->Position.X > 0) { + Private->Position.X--; + This->Mode->CursorColumn--; + } + break; + +#endif + default: + UnixSimpleTextOutPutChar (Private, *Str); + } + } + + return EFI_SUCCESS; +} + +STATIC +VOID +UnixSimpleTextOutPutChar ( + IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console, + IN CHAR16 Char + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + Console - TODO: add argument description + Char - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +{ + char c = Char; + Console->UnixThunk->Write (1, &c, 1); +} + +#if 0 +STATIC +VOID +UnixSimpleTextOutScrollScreen ( + IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + Console - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +{ +} +#endif + + +STATIC +EFI_STATUS +EFIAPI +UnixSimpleTextOutTestString ( + IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This, + IN CHAR16 *String + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + This - TODO: add argument description + String - TODO: add argument description + +Returns: + + EFI_SUCCESS - TODO: Add description for return value + +--*/ +{ + UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private; + + Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This); + + // + // BugBug: The correct answer would be a function of what code pages + // are currently loaded? For now we will just return success. + // + return EFI_SUCCESS; +} + +STATIC +EFI_STATUS +EFIAPI +UnixSimpleTextOutQueryMode ( + IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This, + IN UINTN ModeNumber, + OUT UINTN *Columns, + OUT UINTN *Rows + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + This - TODO: add argument description + ModeNumber - TODO: add argument description + Columns - TODO: add argument description + Rows - TODO: add argument description + +Returns: + + EFI_INVALID_PARAMETER - TODO: Add description for return value + EFI_SUCCESS - TODO: Add description for return value + +--*/ +{ + UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private; + + Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This); + + if (ModeNumber > MAX_SIMPLE_TEXT_OUT_MODE) { + return EFI_INVALID_PARAMETER; + } + + *Columns = mUnixSimpleTextOutSupportedModes[ModeNumber].ColumnsX; + *Rows = mUnixSimpleTextOutSupportedModes[ModeNumber].RowsY; + + return EFI_SUCCESS; +} + +STATIC +EFI_STATUS +EFIAPI +UnixSimpleTextOutSetMode ( + IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This, + IN UINTN ModeNumber + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + This - TODO: add argument description + ModeNumber - TODO: add argument description + +Returns: + + EFI_INVALID_PARAMETER - TODO: Add description for return value + EFI_SUCCESS - TODO: Add description for return value + +--*/ +{ + UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private; + + Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This); + + if (ModeNumber > MAX_SIMPLE_TEXT_OUT_MODE) { + return EFI_INVALID_PARAMETER; + } + + + This->Mode->Mode = (INT32) ModeNumber; + + This->EnableCursor (This, TRUE); + This->ClearScreen (This); + return EFI_SUCCESS; +} + +STATIC +EFI_STATUS +EFIAPI +UnixSimpleTextOutSetAttribute ( + IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This, + IN UINTN Attribute + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + This - TODO: add argument description + Attribute - TODO: add argument description + +Returns: + + EFI_SUCCESS - TODO: Add description for return value + +--*/ +{ + UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private; + + Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This); + +#if 0 + Private->Attribute = (WORD) Attribute; +#endif + This->Mode->Attribute = (INT32) Attribute; + + return EFI_SUCCESS; +} + +STATIC +EFI_STATUS +EFIAPI +UnixSimpleTextOutClearScreen ( + IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + This - TODO: add argument description + +Returns: + + EFI_SUCCESS - TODO: Add description for return value + +--*/ +{ + UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private; + // DWORD ConsoleWindow; + + Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This); + + This->SetCursorPosition (This, 0, 0); + Private->UnixThunk->Write (1, "\e[2J", 4); + + +#if 0 + Private->UnixThunk->FillConsoleOutputCharacter ( + Private->NtOutHandle, + ' ', + Private->MaxScreenSize.X * Private->MaxScreenSize.Y, + Private->Possition, + &ConsoleWindow + ); + Private->UnixThunk->FillConsoleOutputAttribute ( + Private->NtOutHandle, + Private->Attribute, + Private->MaxScreenSize.X * Private->MaxScreenSize.Y, + Private->Possition, + &ConsoleWindow + ); +#endif + + return EFI_SUCCESS; +} + +STATIC +EFI_STATUS +EFIAPI +UnixSimpleTextOutSetCursorPosition ( + IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This, + IN UINTN Column, + IN UINTN Row + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + This - TODO: add argument description + Column - TODO: add argument description + Row - TODO: add argument description + +Returns: + + EFI_SUCCESS - TODO: Add description for return value + +--*/ +{ + char buf[12]; + UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private; + + Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This); + +#if 0 + Private->Position.X = (WORD) Column; +#endif + This->Mode->CursorColumn = (INT32) Column; + +#if 0 + Private->Position.Y = (WORD) Row; +#endif + This->Mode->CursorRow = (INT32) Row; +#if 0 + Private->UnixThunk->SetConsoleCursorPosition (Private->NtOutHandle, Private->Possition); +#endif + + buf[0] = '\e'; + buf[1] = '['; + buf[2] = '0' + ((Row / 100) % 10); + buf[3] = '0' + ((Row / 10) % 10); + buf[4] = '0' + ((Row / 1) % 10); + buf[5] = ';'; + buf[6] = '0' + ((Column / 100) % 10); + buf[7] = '0' + ((Column / 10) % 10); + buf[8] = '0' + ((Column / 1) % 10); + buf[9] = 'H'; + Private->UnixThunk->Write (1, buf, 10); + + return EFI_SUCCESS; +} + +STATIC +EFI_STATUS +EFIAPI +UnixSimpleTextOutEnableCursor ( + IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This, + IN BOOLEAN Enable + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + This - TODO: add argument description + Enable - TODO: add argument description + +Returns: + + EFI_SUCCESS - TODO: Add description for return value + +--*/ +{ + UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private; +#if 0 + CONSOLE_CURSOR_INFO Info; +#endif + + Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This); + Private->CursorEnable = Enable; + This->Mode->CursorVisible = Enable; + +#if 0 + Private->UnixThunk->GetConsoleCursorInfo (Private->NtOutHandle, &Info); + Info.bVisible = Enable; + Private->UnixThunk->SetConsoleCursorInfo (Private->NtOutHandle, &Info); +#endif + + return EFI_SUCCESS; +} + +EFI_STATUS +UnixSimpleTextOutOpenWindow ( + IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + Private - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +{ + EFI_SIMPLE_TEXT_OUT_PROTOCOL *SimpleTextOut; + CHAR16 *WindowName; + + //WindowName = Private->UnixIo->EnvString; +#if 0 + Private->Attribute = FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY; + if (*WindowName == '?') { + Private->Attribute = BACKGROUND_RED | FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN; + WindowName = L"EFI Emulator Error Console"; + } +#endif + WindowName = L"EFI Emulator Error Console"; + + AddUnicodeString ( + "eng", + gUnixConsoleComponentName.SupportedLanguages, + &Private->ControllerNameTable, + WindowName + ); + + // + // Fill in protocol member functions + // + SimpleTextOut = &Private->SimpleTextOut; + SimpleTextOut->Reset = UnixSimpleTextOutReset; + SimpleTextOut->OutputString = UnixSimpleTextOutOutputString; + SimpleTextOut->TestString = UnixSimpleTextOutTestString; + SimpleTextOut->QueryMode = UnixSimpleTextOutQueryMode; + SimpleTextOut->SetMode = UnixSimpleTextOutSetMode; + SimpleTextOut->SetAttribute = UnixSimpleTextOutSetAttribute; + SimpleTextOut->ClearScreen = UnixSimpleTextOutClearScreen; + SimpleTextOut->SetCursorPosition = UnixSimpleTextOutSetCursorPosition; + SimpleTextOut->EnableCursor = UnixSimpleTextOutEnableCursor; + + // + // Initialize SimpleTextOut protocol mode structure + // + SimpleTextOut->Mode = &Private->SimpleTextOutMode; + SimpleTextOut->Mode->MaxMode = MAX_SIMPLE_TEXT_OUT_MODE; + SimpleTextOut->Mode->Attribute = 0; //FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY; + +#if 0 + // + // Open the window an initialize it! + // + Private->NtOutHandle = Private->UnixThunk->CreateConsoleScreenBuffer ( + GENERIC_WRITE | GENERIC_READ, + FILE_SHARE_WRITE | FILE_SHARE_READ, + NULL, + CONSOLE_TEXTMODE_BUFFER, + NULL + ); + Private->UnixThunk->SetConsoleTitle (WindowName); +#endif + + return SimpleTextOut->SetMode (SimpleTextOut, 0); +} + +EFI_STATUS +UnixSimpleTextOutCloseWindow ( + IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + Console - TODO: add argument description + +Returns: + + EFI_SUCCESS - TODO: Add description for return value + +--*/ +{ +#if 0 + Console->UnixThunk->CloseHandle (Console->NtOutHandle); +#endif + return EFI_SUCCESS; +}