diff options
author | eric_tian <eric_tian@6f19259b-4bc3-4df7-8a09-765794883524> | 2008-06-30 05:08:49 +0000 |
---|---|---|
committer | eric_tian <eric_tian@6f19259b-4bc3-4df7-8a09-765794883524> | 2008-06-30 05:08:49 +0000 |
commit | 804405e7d10525e41720216137b2551f62a0663f (patch) | |
tree | a615301e36e63aba81adcb0a963e4d3aa7830863 /UnixPkg/UnixConsoleDxe/ConsoleOut.c | |
parent | 27d55a2d56320e6e7a1dda2b02089721540d6bc3 (diff) | |
download | edk2-platforms-804405e7d10525e41720216137b2551f62a0663f.tar.xz |
Port EdkUnixPkg to UnixPkg. The changes are listed as follows:
1. change *.msa to *.inf, and create platform configuration files .dec&.dsc&.fdf to comply with Edk2 build process
2. using PCD mechanism to replace macro.
3. change Sec code to cowork with PI1.0 Pei Core and produce temparory memory ppi.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5380 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'UnixPkg/UnixConsoleDxe/ConsoleOut.c')
-rw-r--r-- | UnixPkg/UnixConsoleDxe/ConsoleOut.c | 635 |
1 files changed, 635 insertions, 0 deletions
diff --git a/UnixPkg/UnixConsoleDxe/ConsoleOut.c b/UnixPkg/UnixConsoleDxe/ConsoleOut.c new file mode 100644 index 0000000000..416db945aa --- /dev/null +++ b/UnixPkg/UnixConsoleDxe/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 Posix APIs.
+
+ This file creates an Posix 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_OUTPUT_PROTOCOL *This,
+ IN UINTN Attribute
+ );
+STATIC
+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))
+
+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_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;
+}
+
+STATIC
+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;
+}
+
+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_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;
+}
+
+STATIC
+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;
+}
+
+STATIC
+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;
+}
+
+STATIC
+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;
+}
+
+STATIC
+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;
+}
+
+STATIC
+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;
+}
+
+STATIC
+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;
+}
|