Unix version of EFI emulator
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2182 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
635
EdkUnixPkg/Dxe/UnixThunk/Bus/Console/ConsoleOut.c
Normal file
635
EdkUnixPkg/Dxe/UnixThunk/Bus/Console/ConsoleOut.c
Normal file
@ -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;
|
||||
}
|
Reference in New Issue
Block a user