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