summaryrefslogtreecommitdiff
path: root/MdeModulePkg
diff options
context:
space:
mode:
Diffstat (limited to 'MdeModulePkg')
-rw-r--r--MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.c63
-rw-r--r--MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c9
-rw-r--r--MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c2
-rw-r--r--MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h8
-rw-r--r--MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c16
5 files changed, 73 insertions, 25 deletions
diff --git a/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.c b/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.c
index 63be0b1..abf3595 100644
--- a/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.c
+++ b/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.c
@@ -2152,12 +2152,20 @@ Returns:
Mode = 0;
Index = 0;
while (Mode < MaxMode) {
- TextOut->QueryMode (
- TextOut,
- Mode,
- &Private->TextOutQueryData[Mode].Columns,
- &Private->TextOutQueryData[Mode].Rows
- );
+ Status = TextOut->QueryMode (
+ TextOut,
+ Mode,
+ &Private->TextOutQueryData[Mode].Columns,
+ &Private->TextOutQueryData[Mode].Rows
+ );
+ //
+ // If mode 1 (80x50) is not supported, make sure mode 1 in TextOutQueryData
+ // is clear to 0x0.
+ //
+ if ((EFI_ERROR(Status)) && (Mode == 1)) {
+ Private->TextOutQueryData[Mode].Columns = 0;
+ Private->TextOutQueryData[Mode].Rows = 0;
+ }
Private->TextOutModeMap[Index] = Mode;
Mode++;
Index += Private->TextOutListCount;
@@ -2166,6 +2174,24 @@ Returns:
return EFI_SUCCESS;
}
+/**
+ Reconstruct TextOutModeMap to get intersection of modes
+
+ This routine reconstruct TextOutModeMap to get the intersection
+ of modes for all console out devices. Because EFI/UEFI spec require
+ mode 0 is 80x25, mode 1 is 80x50, this routine will not check the
+ intersection for mode 0 and mode 1.
+
+ @parm TextOutModeMap Current text out mode map, begin with the mode 80x25
+ @parm NewlyAddedMap New text out mode map, begin with the mode 80x25
+ @parm MapStepSize Mode step size for one console device
+ @parm NewMapStepSize Mode step size for one console device
+ @parm MaxMode Current max text mode
+ @parm CurrentMode Current text mode
+
+ @retval None
+
+**/
STATIC
VOID
ConSplitterGetIntersection (
@@ -2183,9 +2209,16 @@ ConSplitterGetIntersection (
INT32 CurrentMaxMode;
INT32 Mode;
- Index = 0;
- CurrentMapEntry = TextOutModeMap;
- NextMapEntry = TextOutModeMap;
+ //
+ // According to EFI/UEFI spec, mode 0 and mode 1 have been reserved
+ // for 80x25 and 80x50 in Simple Text Out protocol, so don't make intersection
+ // for mode 0 and mode 1, mode number starts from 2.
+ //
+ Index = 2;
+ CurrentMapEntry = &TextOutModeMap[MapStepSize * 2];
+ NextMapEntry = &TextOutModeMap[MapStepSize * 2];
+ NewlyAddedMap = &NewlyAddedMap[NewMapStepSize * 2];
+
CurrentMaxMode = *MaxMode;
Mode = *CurrentMode;
@@ -2248,6 +2281,7 @@ Returns:
UINTN Rows;
UINTN Columns;
UINTN StepSize;
+ EFI_STATUS Status;
//
// Must make sure that current mode won't change even if mode number changes
@@ -2263,9 +2297,16 @@ Returns:
Mode = 0;
MapTable = TextOutModeMap + Private->CurrentNumberOfConsoles;
while (Mode < TextOut->Mode->MaxMode) {
- TextOut->QueryMode (TextOut, Mode, &Columns, &Rows);
+ Status = TextOut->QueryMode (TextOut, Mode, &Columns, &Rows);
+ if (EFI_ERROR(Status)) {
+ if (Mode == 1) {
MapTable[StepSize] = Mode;
-
+ TextOutQueryData[Mode].Columns = 0;
+ TextOutQueryData[Mode].Rows = 0;
+ }
+ Mode++;
+ continue;
+ }
//
// Search the intersection map and QueryData database to see if they intersects
//
diff --git a/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c b/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c
index 0f83803..37e816a 100644
--- a/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c
+++ b/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c
@@ -1157,7 +1157,7 @@ GraphicsConsoleConOutQueryMode (
GRAPHICS_CONSOLE_DEV *Private;
EFI_STATUS Status;
EFI_TPL OldTpl;
-
+
if (ModeNumber >= (UINTN) This->Mode->MaxMode) {
return EFI_UNSUPPORTED;
}
@@ -1280,10 +1280,10 @@ GraphicsConsoleConOutSetMode (
goto Done;
}
//
- // Otherwise, the size of the text console and/or the UGA mode will be changed,
- // so turn off the cursor, and free the LineBuffer for the current mode
+ // Otherwise, the size of the text console and/or the GOP/UGA mode will be changed,
+ // so erase the cursor, and free the LineBuffer for the current mode
//
- This->EnableCursor (This, FALSE);
+ EraseCursor (This);
FreePool (Private->LineBuffer);
}
@@ -1377,7 +1377,6 @@ GraphicsConsoleConOutSetMode (
// Move the text cursor to the upper left hand corner of the displat and enable it
//
This->SetCursorPosition (This, 0, 0);
- This->EnableCursor (This, TRUE);
Status = EFI_SUCCESS;
diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c
index 8a38aa8..06c4f66 100644
--- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c
+++ b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c
@@ -500,7 +500,7 @@ TerminalDriverBindingStart (
TerminalDevice->SimpleTextOutput.EnableCursor = TerminalConOutEnableCursor;
TerminalDevice->SimpleTextOutput.Mode = &TerminalDevice->SimpleTextOutputMode;
- TerminalDevice->SimpleTextOutputMode.MaxMode = 2;
+ TerminalDevice->SimpleTextOutputMode.MaxMode = 3;
//
// For terminal devices, cursor is always visible
//
diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h
index 103adfb..ba573a6 100644
--- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h
+++ b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h
@@ -143,8 +143,12 @@ typedef union {
#define MODE0_COLUMN_COUNT 80
#define MODE0_ROW_COUNT 25
-#define MODE1_COLUMN_COUNT 100
-#define MODE1_ROW_COUNT 31
+#define MODE1_COLUMN_COUNT 80
+#define MODE1_ROW_COUNT 50
+
+#define MODE2_COLUMN_COUNT 100
+#define MODE2_ROW_COUNT 31
+
#define BACKSPACE 8
#define ESC 27
#define CSI 0x9B
diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c
index 74def9e..2be62ff 100644
--- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c
+++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c
@@ -230,7 +230,7 @@ TerminalConOutOutputString (
//
Mode = This->Mode;
- if (Mode->Mode > 1) {
+ if (Mode->Mode > 2) {
return EFI_UNSUPPORTED;
}
@@ -431,11 +431,11 @@ TerminalConOutQueryMode (
/*++
Routine Description:
- Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.QueryMode().
+ Implements EFI_SIMPLE_TEXT_OUT_PROTOCOL.QueryMode().
It returns information for an available text mode
that the terminal supports.
- In this driver, we only support text mode 80x25, which is
- defined as mode 0.
+ In this driver, we support text mode 80x25 (mode 0),
+ 80x50 (mode 1), 100x31 (mode 2).
Arguments:
@@ -464,7 +464,7 @@ TerminalConOutQueryMode (
--*/
{
- if (This->Mode->MaxMode > 2) {
+ if (This->Mode->MaxMode > 3) {
return EFI_DEVICE_ERROR;
}
@@ -476,6 +476,10 @@ TerminalConOutQueryMode (
*Columns = MODE1_COLUMN_COUNT;
*Rows = MODE1_ROW_COUNT;
return EFI_SUCCESS;
+ } else if (ModeNumber == 2) {
+ *Columns = MODE2_COLUMN_COUNT;
+ *Rows = MODE2_ROW_COUNT;
+ return EFI_SUCCESS;
}
return EFI_UNSUPPORTED;
@@ -523,7 +527,7 @@ TerminalConOutSetMode (
//
TerminalDevice = TERMINAL_CON_OUT_DEV_FROM_THIS (This);
- if (ModeNumber > 1) {
+ if (ModeNumber > 2) {
return EFI_UNSUPPORTED;
}