| /*++
|
|
|
| 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 Posix APIs.
|
|
|
| This file creates an Posix window and attaches a SimpleTextOut protocol.
|
|
|
| --*/
|
|
|
| #include "Console.h"
|
| //
|
| // Private worker functions.
|
| //
|
|
|
| #if 0 |
| VOID
|
| UnixSimpleTextOutScrollScreen (
|
| IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console
|
| );
|
|
|
| #endif |
| VOID
|
| UnixSimpleTextOutPutChar (
|
| IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console,
|
| IN CHAR16 Char
|
| );
|
|
|
| EFI_STATUS
|
| EFIAPI
|
| UnixSimpleTextOutSetAttribute (
|
| IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
|
| IN UINTN Attribute
|
| );
|
| EFI_STATUS
|
| EFIAPI
|
| UnixSimpleTextOutSetMode (
|
| IN EFI_SIMPLE_TEXT_OUTPUT_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))
|
|
|
| UNIX_SIMPLE_TEXT_OUT_MODE mUnixSimpleTextOutSupportedModes[] = {
|
| { 80, 25 },
|
| #if 0 |
| { 80, 50 },
|
| { 80, 43 },
|
| { 100, 100 },
|
| { 100, 999 }
|
| #endif |
| };
|
|
|
| EFI_STATUS
|
| EFIAPI
|
| UnixSimpleTextOutReset (
|
| IN EFI_SIMPLE_TEXT_OUTPUT_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;
|
| }
|
|
|
| EFI_STATUS
|
| EFIAPI
|
| UnixSimpleTextOutOutputString (
|
| IN EFI_SIMPLE_TEXT_OUTPUT_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;
|
| }
|
|
|
| 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 |
| 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 |
| |
|
|
| EFI_STATUS
|
| EFIAPI
|
| UnixSimpleTextOutTestString (
|
| IN EFI_SIMPLE_TEXT_OUTPUT_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;
|
| }
|
|
|
| EFI_STATUS
|
| EFIAPI
|
| UnixSimpleTextOutQueryMode (
|
| IN EFI_SIMPLE_TEXT_OUTPUT_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;
|
| }
|
|
|
| EFI_STATUS
|
| EFIAPI
|
| UnixSimpleTextOutSetMode (
|
| IN EFI_SIMPLE_TEXT_OUTPUT_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;
|
| }
|
|
|
| EFI_STATUS
|
| EFIAPI
|
| UnixSimpleTextOutSetAttribute (
|
| IN EFI_SIMPLE_TEXT_OUTPUT_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;
|
| }
|
|
|
| EFI_STATUS
|
| EFIAPI
|
| UnixSimpleTextOutClearScreen (
|
| IN EFI_SIMPLE_TEXT_OUTPUT_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;
|
| }
|
|
|
| EFI_STATUS
|
| EFIAPI
|
| UnixSimpleTextOutSetCursorPosition (
|
| IN EFI_SIMPLE_TEXT_OUTPUT_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;
|
| }
|
|
|
| EFI_STATUS
|
| EFIAPI
|
| UnixSimpleTextOutEnableCursor (
|
| IN EFI_SIMPLE_TEXT_OUTPUT_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_OUTPUT_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;
|
| }
|