Author: ion
Date: Mon Sep 7 19:35:24 2015
New Revision: 69099
URL:
http://svn.reactos.org/svn/reactos?rev=69099&view=rev
Log:
[BOOTMGFW]
- Factor the display/console code into correct per-firmware/per-console-mode files. No
code changes.
Added:
trunk/reactos/boot/environ/lib/io/display/ (with props)
trunk/reactos/boot/environ/lib/io/display/display.c (with props)
trunk/reactos/boot/environ/lib/io/display/efi/ (with props)
trunk/reactos/boot/environ/lib/io/display/efi/gop.c (with props)
trunk/reactos/boot/environ/lib/io/display/efi/guicons.c (with props)
trunk/reactos/boot/environ/lib/io/display/efi/textcons.c (with props)
trunk/reactos/boot/environ/lib/io/display/efi/uga.c (with props)
trunk/reactos/boot/environ/lib/io/display/emscons.c (with props)
trunk/reactos/boot/environ/lib/io/display/guicons.c (with props)
trunk/reactos/boot/environ/lib/io/display/textcons.c (with props)
Removed:
trunk/reactos/boot/environ/lib/platform/display.c
Modified:
trunk/reactos/boot/environ/lib/io/fat.c
Propchange: trunk/reactos/boot/environ/lib/io/display/
------------------------------------------------------------------------------
--- bugtraq:logregex (added)
+++ bugtraq:logregex Mon Sep 7 19:35:24 2015
@@ -0,0 +1 @@
+((CORE|ROSTESTS|ROSAPPS)-\d+)(,? ?((CORE|ROSTESTS|ROSAPPS)-\d+))*(,? ?(and |or
)?((CORE|ROSTESTS|ROSAPPS)-\d+))?
Propchange: trunk/reactos/boot/environ/lib/io/display/
------------------------------------------------------------------------------
bugtraq:message = See issue %BUGID% for more details.
Propchange: trunk/reactos/boot/environ/lib/io/display/
------------------------------------------------------------------------------
bugtraq:url =
https://jira.reactos.org/browse/%BUGID%
Propchange: trunk/reactos/boot/environ/lib/io/display/
------------------------------------------------------------------------------
tsvn:logminsize = 10
Added: trunk/reactos/boot/environ/lib/io/display/display.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/lib/io/displa…
==============================================================================
--- trunk/reactos/boot/environ/lib/io/display/display.c (added)
+++ trunk/reactos/boot/environ/lib/io/display/display.c [iso-8859-1] Mon Sep 7 19:35:24
2015
@@ -0,0 +1,288 @@
+/*
+ * COPYRIGHT: See COPYING.ARM in the top level directory
+ * PROJECT: ReactOS UEFI Boot Library
+ * FILE: boot/environ/lib/platform/display.c
+ * PURPOSE: Boot Library Display Management Routines
+ * PROGRAMMER: Alex Ionescu (alex.ionescu(a)reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include "bl.h"
+#include <bcd.h>
+
+/* DATA VARIABLES ************************************************************/
+
+PVOID BfiCachedStrikeData;
+LIST_ENTRY BfiDeferredListHead;
+LIST_ENTRY BfiFontFileListHead;
+PVOID BfiGraphicsRectangle;
+
+ULONG ConsoleGraphicalResolutionListFlags;
+BL_DISPLAY_MODE ConsoleGraphicalResolutionList[3] =
+{
+ {1024, 768, 1024},
+ {800, 600, 800},
+ {1024, 600, 1024}
+};
+ULONG ConsoleGraphicalResolutionListSize =
RTL_NUMBER_OF(ConsoleGraphicalResolutionList);
+
+BL_DISPLAY_MODE ConsoleTextResolutionList[1] =
+{
+ {80, 25, 80}
+};
+
+PVOID DspRemoteInputConsole;
+PVOID DspTextConsole;
+PVOID DspGraphicalConsole;
+
+/* FUNCTIONS *****************************************************************/
+
+BOOLEAN
+DsppGraphicsDisabledByBcd (
+ VOID
+ )
+{
+ //EarlyPrint(L"Disabling graphics\n");
+ return FALSE;
+}
+
+NTSTATUS
+DsppInitialize (
+ _In_ ULONG Flags
+ )
+{
+ BL_LIBRARY_PARAMETERS LibraryParameters = BlpLibraryParameters;
+ BOOLEAN NoGraphics;// , HighestMode;
+ NTSTATUS Status;
+ PBL_DISPLAY_MODE DisplayMode;
+ //ULONG GraphicsResolution;
+ PBL_GRAPHICS_CONSOLE GraphicsConsole;
+ PBL_TEXT_CONSOLE TextConsole, RemoteConsole;
+
+ /* Initialize font data */
+ BfiCachedStrikeData = 0;
+ InitializeListHead(&BfiDeferredListHead);
+ InitializeListHead(&BfiFontFileListHead);
+
+ /* Allocate the font rectangle */
+ BfiGraphicsRectangle = BlMmAllocateHeap(0x5A);
+ if (!BfiGraphicsRectangle)
+ {
+ return STATUS_NO_MEMORY;
+ }
+
+ /* Display re-initialization not yet handled */
+ if (LibraryParameters.LibraryFlags & BL_LIBRARY_FLAG_REINITIALIZE_ALL)
+ {
+ EarlyPrint(L"Display path not handled\n");
+ return STATUS_NOT_SUPPORTED;
+ }
+
+ /* Check if no graphics console is needed */
+ if ((Flags & BL_LIBRARY_FLAG_NO_GRAPHICS_CONSOLE) ||
+ (DsppGraphicsDisabledByBcd()))
+ {
+ /* Remember this */
+ NoGraphics = TRUE;
+ }
+ else
+ {
+ /* No graphics -- remember this */
+ NoGraphics = FALSE;
+ }
+
+ /* On first load, we always initialize a graphics display */
+ GraphicsConsole = NULL;
+ if (!(Flags & BL_LIBRARY_FLAG_REINITIALIZE_ALL) || !(NoGraphics))
+ {
+ /* Default to mode 0 (1024x768) */
+ DisplayMode = &ConsoleGraphicalResolutionList[0];
+
+ /* Check what resolution to use*/
+#if 0
+ Status = BlGetBootOptionInteger(BlpApplicationEntry.BcdData,
+ BcdLibraryInteger_GraphicsResolution,
+ &GraphicsResolution);
+#else
+ //GraphicsResolution = 0;
+ Status = STATUS_NOT_FOUND;
+#endif
+ if (NT_SUCCESS(Status))
+ {
+ ConsoleGraphicalResolutionListFlags |=
BL_DISPLAY_GRAPHICS_FORCED_VIDEO_MODE_FLAG;
+ EarlyPrint(L"Display selection not yet handled\n");
+ return STATUS_NOT_IMPLEMENTED;
+ }
+
+ /* Check if the highest mode should be forced */
+#if 0
+ Status = BlGetBootOptionBoolean(BlpApplicationEntry.BcdData,
+ BcdLibraryBoolean_GraphicsForceHighestMode,
+ &HighestMode);
+#else
+ //HighestMode = 0;
+ Status = STATUS_NOT_FOUND;
+#endif
+ if (NT_SUCCESS(Status))
+ {
+ ConsoleGraphicalResolutionListFlags |=
BL_DISPLAY_GRAPHICS_FORCED_HIGH_RES_MODE_FLAG;
+ EarlyPrint(L"High res mode not yet handled\n");
+ return STATUS_NOT_IMPLEMENTED;
+ }
+
+ /* Do we need graphics mode after all? */
+ if (!NoGraphics)
+ {
+ /* Yep -- go allocate it */
+ GraphicsConsole = BlMmAllocateHeap(sizeof(*GraphicsConsole));
+ if (GraphicsConsole)
+ {
+ /* Construct it */
+ Status = ConsoleGraphicalConstruct(GraphicsConsole);
+ if (!NT_SUCCESS(Status))
+ {
+ EarlyPrint(L"GFX FAILED: %lx\n", Status);
+ BlMmFreeHeap(GraphicsConsole);
+ GraphicsConsole = NULL;
+ }
+ else
+ {
+ /* TEST */
+ RtlFillMemory(GraphicsConsole->FrameBuffer,
GraphicsConsole->FrameBufferSize, 0x55);
+ }
+ }
+ }
+
+ /* Are we using something else than the default mode? */
+ if (DisplayMode != &ConsoleGraphicalResolutionList[0])
+ {
+ EarlyPrint(L"Display path not handled\n");
+ return STATUS_NOT_SUPPORTED;
+ }
+
+ /* Mask out all the flags now */
+ ConsoleGraphicalResolutionListFlags &=
~(BL_DISPLAY_GRAPHICS_FORCED_VIDEO_MODE_FLAG |
+
BL_DISPLAY_GRAPHICS_FORCED_HIGH_RES_MODE_FLAG);
+ }
+
+ /* Do we have a graphics console? */
+ TextConsole = NULL;
+ if (!GraphicsConsole)
+ {
+ /* Nope -- go allocate a text console */
+ TextConsole = BlMmAllocateHeap(sizeof(*TextConsole));
+ if (TextConsole)
+ {
+ /* Construct it */
+ Status = ConsoleTextLocalConstruct(TextConsole, TRUE);
+ if (!NT_SUCCESS(Status))
+ {
+ BlMmFreeHeap(TextConsole);
+ TextConsole = NULL;
+ }
+ }
+ }
+
+ /* Initialize all globals to NULL */
+ DspRemoteInputConsole = NULL;
+ DspTextConsole = NULL;
+ DspGraphicalConsole = NULL;
+
+ /* If we don't have a text console, go get a remote console */
+ RemoteConsole = NULL;
+ if (!TextConsole)
+ {
+ ConsoleCreateRemoteConsole(&RemoteConsole);
+ }
+
+ /* Do we have a remote console? */
+ if (!RemoteConsole)
+ {
+ /* Nope -- what about a graphical one? */
+ if (GraphicsConsole)
+ {
+ /* Yes, use it for both graphics and text */
+ DspGraphicalConsole = GraphicsConsole;
+ DspTextConsole = GraphicsConsole;
+ }
+ else if (TextConsole)
+ {
+ /* Nope, but we have a text console */
+ DspTextConsole = TextConsole;
+ }
+
+ /* Console has been setup */
+ return STATUS_SUCCESS;
+ }
+
+ /* We have a remote console -- have to figure out how to use it*/
+ EarlyPrint(L"Display path not handled\n");
+ return STATUS_NOT_SUPPORTED;
+}
+
+NTSTATUS
+BlpDisplayInitialize (
+ _In_ ULONG Flags
+ )
+{
+ NTSTATUS Status;
+
+ /* Are we resetting or initializing? */
+ if (Flags & BL_LIBRARY_FLAG_REINITIALIZE)
+ {
+ /* This is a reset */
+ Status = STATUS_NOT_IMPLEMENTED;
+#if 0
+ Status = DsppReinitialize(Flags);
+ if (NT_SUCCESS(Status))
+ {
+ Status = BlpDisplayReinitialize();
+ }
+#endif
+ }
+ else
+ {
+ /* Initialize the display */
+ Status = DsppInitialize(Flags);
+ }
+
+ /* Return display initailziation state */
+ return Status;
+}
+
+VOID
+BlDisplayGetTextCellResolution (
+ _Out_ PULONG TextWidth,
+ _Out_ PULONG TextHeight
+ )
+{
+ NTSTATUS Status;
+
+ /* If the caller doesn't want anything, bail out */
+ if (!(TextWidth) || !(TextHeight))
+ {
+ return;
+ }
+
+ /* Do we have a text console? */
+ Status = STATUS_UNSUCCESSFUL;
+ if (DspTextConsole)
+ {
+ /* Do we have a graphics console? */
+ if (DspGraphicalConsole)
+ {
+ /* Yep -- query it */
+ EarlyPrint(L"Not supported\n");
+ Status = STATUS_NOT_IMPLEMENTED;
+ }
+ }
+
+ /* Check if we failed to get it from the graphics console */
+ if (!NT_SUCCESS(Status))
+ {
+ /* Set default text size */
+ *TextWidth = 8;
+ *TextHeight = 8;
+ }
+}
Propchange: trunk/reactos/boot/environ/lib/io/display/display.c
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: trunk/reactos/boot/environ/lib/io/display/efi/
------------------------------------------------------------------------------
--- bugtraq:logregex (added)
+++ bugtraq:logregex Mon Sep 7 19:35:24 2015
@@ -0,0 +1 @@
+((CORE|ROSTESTS|ROSAPPS)-\d+)(,? ?((CORE|ROSTESTS|ROSAPPS)-\d+))*(,? ?(and |or
)?((CORE|ROSTESTS|ROSAPPS)-\d+))?
Propchange: trunk/reactos/boot/environ/lib/io/display/efi/
------------------------------------------------------------------------------
bugtraq:message = See issue %BUGID% for more details.
Propchange: trunk/reactos/boot/environ/lib/io/display/efi/
------------------------------------------------------------------------------
bugtraq:url =
https://jira.reactos.org/browse/%BUGID%
Propchange: trunk/reactos/boot/environ/lib/io/display/efi/
------------------------------------------------------------------------------
tsvn:logminsize = 10
Added: trunk/reactos/boot/environ/lib/io/display/efi/gop.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/lib/io/displa…
==============================================================================
--- trunk/reactos/boot/environ/lib/io/display/efi/gop.c (added)
+++ trunk/reactos/boot/environ/lib/io/display/efi/gop.c [iso-8859-1] Mon Sep 7 19:35:24
2015
@@ -0,0 +1,280 @@
+/*
+ * COPYRIGHT: See COPYING.ARM in the top level directory
+ * PROJECT: ReactOS UEFI Boot Library
+ * FILE: boot/environ/lib/io/display/efi/gop.c
+ * PURPOSE: Boot Library EFI GOP Routines
+ * PROGRAMMER: Alex Ionescu (alex.ionescu(a)reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include "bl.h"
+
+/* DATA VARIABLES ************************************************************/
+
+/* FUNCTIONS *****************************************************************/
+
+NTSTATUS
+ConsoleEfiGopGetGraphicalFormat (
+ _In_ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *ModeInfo,
+ _Out_ PULONG PixelDepth
+ )
+{
+ /* Convert the format to depth */
+ if (ModeInfo->PixelFormat == PixelBlueGreenRedReserved8BitPerColor)
+ {
+ *PixelDepth = 32;
+ return STATUS_SUCCESS;
+ }
+ if (ModeInfo->PixelFormat == PixelBitMask)
+ {
+ *PixelDepth = 24;
+ return STATUS_SUCCESS;
+ }
+ return STATUS_UNSUCCESSFUL;
+}
+
+BOOLEAN
+ConsoleEfiGopIsPixelFormatSupported (
+ _In_ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Mode
+ )
+{
+ BOOLEAN Supported;
+ EFI_PIXEL_BITMASK PixelMask;
+
+ Supported = FALSE;
+
+ /* Check if it's simple BGR8 */
+ if (Mode->PixelFormat == PixelBlueGreenRedReserved8BitPerColor)
+ {
+ Supported = TRUE;
+ }
+ else
+ {
+ /* Otherwise, we can check if it's a masked format */
+ if (Mode->PixelFormat == PixelBitMask)
+ {
+ /* Check if the masked format is BGR8 */
+ PixelMask.BlueMask = 0xFF;
+ PixelMask.GreenMask = 0xFF00;
+ PixelMask.RedMask = 0xFF0000;
+ PixelMask.ReservedMask = 0;
+ if (RtlEqualMemory(&Mode->PixelInformation,
+ &PixelMask,
+ sizeof(PixelMask)))
+ {
+ Supported = TRUE;
+ }
+ }
+ }
+
+ /* Return if the format was supported */
+ return Supported;
+}
+
+
+NTSTATUS
+ConsoleEfiGopFindModeFromAllowed (
+ _In_ EFI_GRAPHICS_OUTPUT_PROTOCOL *GopProtocol,
+ _In_ PBL_DISPLAY_MODE SupportedModes,
+ _In_ ULONG MaximumIndex,
+ _Out_ PULONG SupportedMode
+ )
+{
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+ConsoleEfiGopEnable (
+ _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
+ )
+{
+ PVOID FrameBuffer;
+ UINTN CurrentMode, Dummy;
+ ULONG Mode, PixelDepth;
+ UINTN FrameBufferSize;
+ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION ModeInformation;
+ EFI_GRAPHICS_OUTPUT_PROTOCOL* Protocol;
+ NTSTATUS Status;
+ PHYSICAL_ADDRESS FrameBufferPhysical;
+
+ /* Capture the current mode and protocol */
+ Mode = GraphicsConsole->Mode;
+ Protocol = GraphicsConsole->Protocol;
+
+ /* Get the current mode and its information */
+ Status = EfiGopGetCurrentMode(Protocol, &CurrentMode, &ModeInformation);
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+
+ /* Check if we're not in the mode we should be */
+ if (CurrentMode != Mode)
+ {
+ /* Switch modes */
+ Status = EfiGopSetMode(Protocol, Mode);
+ if (Status < 0)
+ {
+ return Status;
+ }
+
+ /* Reset the OEM bitmap and get the new more information */
+// BlDisplayInvalidateOemBitmap();
+ EfiGopGetCurrentMode(Protocol, &Dummy, &ModeInformation);
+ }
+
+ /* Get the pixel depth for this mode */
+ Status = ConsoleEfiGopGetGraphicalFormat(&ModeInformation, &PixelDepth);
+ if (NT_SUCCESS(Status))
+ {
+ /* Get the framebuffer for this mode */
+ EfiGopGetFrameBuffer(Protocol, &FrameBufferPhysical, &FrameBufferSize);
+
+ /* Map the framebuffer, try as writeback first */
+ FrameBuffer = NULL;
+ Status = BlMmMapPhysicalAddressEx(&FrameBuffer,
+ BlMemoryWriteBack,
+ FrameBufferSize,
+ FrameBufferPhysical);
+ if (!NT_SUCCESS(Status))
+ {
+ /* That didn't work, so try uncached next */
+ Status = BlMmMapPhysicalAddressEx(&FrameBuffer,
+ BlMemoryUncached,
+ FrameBufferSize,
+ FrameBufferPhysical);
+ }
+ }
+
+ /* Check if getting all the required information worked out */
+ if (NT_SUCCESS(Status))
+ {
+ /* Capture the resolution, depth, and framebuffer information */
+ GraphicsConsole->DisplayMode.HRes = ModeInformation.HorizontalResolution;
+ GraphicsConsole->DisplayMode.VRes = ModeInformation.VerticalResolution;
+ GraphicsConsole->DisplayMode.HRes2 = ModeInformation.PixelsPerScanLine;
+ GraphicsConsole->PixelDepth = PixelDepth;
+ GraphicsConsole->FrameBuffer = FrameBuffer;
+ GraphicsConsole->FrameBufferSize = FrameBufferSize;
+ GraphicsConsole->PixelsPerScanLine = ModeInformation.PixelsPerScanLine;
+
+ /* All good */
+ Status = STATUS_SUCCESS;
+ }
+ else if (CurrentMode != GraphicsConsole->Mode)
+ {
+ /* We failed seomewhere, reset the mode and the OEM bitmap back */
+ EfiGopSetMode(Protocol, CurrentMode);
+ //BlDisplayInvalidateOemBitmap();
+ }
+
+ /* Return back to caller */
+ return Status;
+}
+
+VOID
+ConsoleEfiGopClose (
+ _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
+ )
+{
+ ULONG OldMode;
+
+ /* Did we switch modes when we turned on the console? */
+ OldMode = GraphicsConsole->OldMode;
+ if (GraphicsConsole->Mode != OldMode)
+ {
+ /* Restore the old mode and reset the OEM bitmap in ACPI */
+ EfiGopSetMode(GraphicsConsole->Protocol, OldMode);
+ //BlDisplayInvalidateOemBitmap();
+ }
+
+ /* Close the GOP protocol */
+ EfiCloseProtocol(GraphicsConsole->Handle,
+ &EfiGraphicsOutputProtocol);
+}
+
+NTSTATUS
+ConsoleEfiGopOpen (
+ _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
+ )
+{
+ NTSTATUS Status;
+ EFI_GRAPHICS_OUTPUT_PROTOCOL *GopProtocol;
+ ULONG Mode, PixelDepth;
+ UINTN CurrentMode;
+ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION ModeInformation;
+ BOOLEAN CurrentModeOk;
+
+ /* Open a handle to GOP */
+ Status = EfiOpenProtocol(GraphicsConsole->Handle,
+ &EfiGraphicsOutputProtocol,
+ (PVOID*)&GopProtocol);
+ if (!NT_SUCCESS(Status))
+ {
+ EarlyPrint(L"GOP OPEN failed: %lx\n", Status);
+ return STATUS_NOT_SUPPORTED;
+ }
+
+ /* Get the current mode */
+ Status = EfiGopGetCurrentMode(GopProtocol, &CurrentMode, &ModeInformation);
+ if (!NT_SUCCESS(Status))
+ {
+ EarlyPrint(L"GOP mode failed: %lx\n", Status);
+ goto Quickie;
+ }
+
+ Mode = CurrentMode;
+
+ /* Check if any custom BCD options were provided */
+ if (ConsoleGraphicalResolutionListFlags &
+ (BL_DISPLAY_GRAPHICS_FORCED_VIDEO_MODE_FLAG |
+ BL_DISPLAY_GRAPHICS_FORCED_HIGH_RES_MODE_FLAG))
+ {
+ /* We'll have to find a mode */
+ CurrentModeOk = FALSE;
+ }
+ else
+ {
+ /* Then we should be in the default mode, check if the pixel format is OK */
+ CurrentModeOk = ConsoleEfiGopIsPixelFormatSupported(&ModeInformation);
+ }
+
+ /* Is the mode/format OK? */
+ if (!CurrentModeOk)
+ {
+ /* Nope -- we'll have to go find one */
+ Status = ConsoleEfiGopFindModeFromAllowed(GopProtocol,
+ ConsoleGraphicalResolutionList,
+ ConsoleGraphicalResolutionListSize,
+ &Mode);
+ if (!NT_SUCCESS(Status))
+ {
+ goto Quickie;
+ }
+ }
+
+ /* Store mode information */
+ GraphicsConsole->Protocol = GopProtocol;
+ GraphicsConsole->Mode = Mode;
+ GraphicsConsole->OldMode = CurrentMode;
+
+ /* Get format information */
+ Status = ConsoleEfiGopGetGraphicalFormat(&ModeInformation, &PixelDepth);
+ if (NT_SUCCESS(Status))
+ {
+ /* Store it */
+ GraphicsConsole->OldDisplayMode.HRes = ModeInformation.HorizontalResolution;
+ GraphicsConsole->OldDisplayMode.VRes = ModeInformation.VerticalResolution;
+ GraphicsConsole->OldDisplayMode.HRes2 = ModeInformation.PixelsPerScanLine;
+ GraphicsConsole->PixelDepth = PixelDepth;
+ return STATUS_SUCCESS;
+ }
+
+Quickie:
+ /* We failed, close the protocol and return the failure code */
+ EarlyPrint(L"Get format failed: %lx\n", Status);
+ EfiCloseProtocol(GraphicsConsole->Handle, &EfiGraphicsOutputProtocol);
+ return Status;
+}
+
Propchange: trunk/reactos/boot/environ/lib/io/display/efi/gop.c
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/reactos/boot/environ/lib/io/display/efi/guicons.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/lib/io/displa…
==============================================================================
--- trunk/reactos/boot/environ/lib/io/display/efi/guicons.c (added)
+++ trunk/reactos/boot/environ/lib/io/display/efi/guicons.c [iso-8859-1] Mon Sep 7
19:35:24 2015
@@ -0,0 +1,113 @@
+/*
+ * COPYRIGHT: See COPYING.ARM in the top level directory
+ * PROJECT: ReactOS UEFI Boot Library
+ * FILE: boot/environ/lib/io/display/efi/guicons.c
+ * PURPOSE: Boot Library EFI GUI Console Routines
+ * PROGRAMMER: Alex Ionescu (alex.ionescu(a)reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include "bl.h"
+
+/* DATA VARIABLES ************************************************************/
+
+/* FUNCTIONS *****************************************************************/
+
+VOID
+ConsoleFirmwareGraphicalClose (
+ _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
+ )
+{
+ /* Call the correct close routine based on the console mode */
+ if (GraphicsConsole->Type == BlUgaConsole)
+ {
+ ConsoleEfiUgaClose(GraphicsConsole);
+ }
+ else
+ {
+ ConsoleEfiGopClose(GraphicsConsole);
+ }
+}
+
+NTSTATUS
+ConsoleEfiGraphicalOpenProtocol (
+ _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole,
+ _In_ BL_GRAPHICS_CONSOLE_TYPE Type
+ )
+{
+ ULONG HandleIndex, HandleCount;
+ EFI_HANDLE* HandleArray;
+ EFI_HANDLE Handle;
+ NTSTATUS Status;
+ PVOID Interface;
+
+ /* Find a device handle that implements either GOP or UGA */
+ HandleCount = 0;
+ HandleArray = NULL;
+ Status = EfiLocateHandleBuffer(ByProtocol,
+ (Type == BlGopConsole) ?
+ &EfiGraphicsOutputProtocol :
+ &EfiUgaDrawProtocol,
+ &HandleCount,
+ &HandleArray);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Nothing supports this (no video card?) */
+ EarlyPrint(L"Status: %lx Count: %d\n", Status, HandleCount);
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ /* Scan through the handles we received */
+ for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++)
+ {
+ /* Try to open each one */
+ GraphicsConsole->Handle = HandleArray[HandleIndex];
+ Handle = HandleArray[HandleIndex];
+ Status = EfiOpenProtocol(Handle, &EfiDevicePathProtocol, &Interface);
+ if (NT_SUCCESS(Status))
+ {
+ /* Test worked, close the protocol */
+ EfiCloseProtocol(Handle, &EfiDevicePathProtocol);
+
+ /* Now open the real protocol we want, either UGA or GOP */
+ Status = Type ? ConsoleEfiUgaOpen(GraphicsConsole) :
+ ConsoleEfiGopOpen(GraphicsConsole);
+ if (NT_SUCCESS(Status))
+ {
+ /* It worked -- store the type of console this is */
+ GraphicsConsole->Type = Type;
+ return STATUS_SUCCESS;
+ }
+ }
+ }
+
+ /* We failed to find a working GOP/UGA protocol provider */
+ return STATUS_UNSUCCESSFUL;
+}
+
+NTSTATUS
+ConsoleFirmwareGraphicalEnable (
+ _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
+ )
+{
+ NTSTATUS Status;
+
+ /* Check what type of console this is */
+ if (GraphicsConsole->Type == BlUgaConsole)
+ {
+ /* Handle UGA */
+ Status = ConsoleEfiUgaSetResolution(GraphicsConsole,
+ &GraphicsConsole->DisplayMode,
+ 1);
+ }
+ else
+ {
+ /* Handle GOP */
+ Status = ConsoleEfiGopEnable(GraphicsConsole);
+ }
+
+ /* Return back to caller */
+ return Status;
+}
+
Propchange: trunk/reactos/boot/environ/lib/io/display/efi/guicons.c
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/reactos/boot/environ/lib/io/display/efi/textcons.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/lib/io/displa…
==============================================================================
--- trunk/reactos/boot/environ/lib/io/display/efi/textcons.c (added)
+++ trunk/reactos/boot/environ/lib/io/display/efi/textcons.c [iso-8859-1] Mon Sep 7
19:35:24 2015
@@ -0,0 +1,491 @@
+/*
+ * COPYRIGHT: See COPYING.ARM in the top level directory
+ * PROJECT: ReactOS UEFI Boot Library
+ * FILE: boot/environ/lib/io/display/efi/textcons.c
+ * PURPOSE: Boot Library EFI Text Console Routines
+ * PROGRAMMER: Alex Ionescu (alex.ionescu(a)reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include "bl.h"
+
+/* DATA VARIABLES ************************************************************/
+
+/* FUNCTIONS *****************************************************************/
+
+BL_COLOR
+ConsoleEfiTextGetColorForeground (
+ _In_ UINT32 Attributes
+ )
+{
+ /* Read the foreground color attribute and convert to CGA color index */
+ switch (Attributes & 0x0F)
+ {
+ case EFI_BLACK:
+ return Black;
+ case EFI_BLUE:
+ return Blue;
+ case EFI_GREEN:
+ return Green;
+ case EFI_RED:
+ return Red;
+ case EFI_CYAN:
+ return Cyan;
+ case EFI_MAGENTA:
+ return Magenta;
+ case EFI_BROWN:
+ return Brown;
+ case EFI_LIGHTGRAY:
+ return LtGray;
+ case EFI_DARKGRAY:
+ return Gray;
+ case EFI_LIGHTBLUE:
+ return LtBlue;
+ case EFI_LIGHTGREEN:
+ return LtGreen;
+ case EFI_LIGHTCYAN:
+ return LtCyan;
+ case EFI_LIGHTRED:
+ return LtRed;
+ case EFI_LIGHTMAGENTA:
+ return LtMagenta;
+ case EFI_YELLOW:
+ return Yellow;
+ case EFI_WHITE:
+ default:
+ return White;
+ }
+}
+
+BL_COLOR
+ConsoleEfiTextGetColorBackground (
+ _In_ UINT32 Attributes
+ )
+{
+ /* Read the background color attribute and convert to CGA color index */
+ switch (Attributes & 0xF0)
+ {
+ case EFI_BACKGROUND_MAGENTA:
+ return Magenta;
+ case EFI_BACKGROUND_BROWN:
+ return Brown;
+ case EFI_BACKGROUND_LIGHTGRAY:
+ return White;
+ case EFI_BACKGROUND_BLACK:
+ default:
+ return Black;
+ case EFI_BACKGROUND_RED:
+ return Red;
+ case EFI_BACKGROUND_GREEN:
+ return Green;
+ case EFI_BACKGROUND_CYAN:
+ return Cyan;
+ case EFI_BACKGROUND_BLUE:
+ return Blue;
+ }
+}
+
+ULONG
+ConsoleEfiTextGetEfiColorBackground (
+ _In_ BL_COLOR Color
+ )
+{
+ /* Convert the CGA color index into an EFI background attribute */
+ switch (Color)
+ {
+ case Blue:
+ case LtBlue:
+ return EFI_BACKGROUND_BLUE;
+ case Green:
+ case LtGreen:
+ return EFI_BACKGROUND_GREEN;
+ case Cyan:
+ case LtCyan:
+ return EFI_BACKGROUND_CYAN;
+ case Red:
+ case LtRed:
+ return EFI_BACKGROUND_RED;
+ case Magenta:
+ case LtMagenta:
+ return EFI_BACKGROUND_MAGENTA;
+ case Brown:
+ case Yellow:
+ return EFI_BACKGROUND_BROWN;
+ case LtGray:
+ case White:
+ return EFI_BACKGROUND_LIGHTGRAY;
+ case Black:
+ case Gray:
+ default:
+ return EFI_BACKGROUND_BLACK;
+ }
+}
+
+ULONG
+ConsoleEfiTextGetEfiColorForeground (
+ _In_ BL_COLOR Color
+ )
+{
+ /* Convert the CGA color index into an EFI foreground attribute */
+ switch (Color)
+ {
+ case Black:
+ return EFI_BLACK;
+ case Blue:
+ return EFI_BLUE;
+ case Green:
+ return EFI_GREEN;
+ case Cyan:
+ return EFI_CYAN;
+ case Red:
+ return EFI_RED;
+ case Magenta:
+ return EFI_MAGENTA;
+ case Brown:
+ return EFI_BROWN;
+ case LtGray:
+ return EFI_LIGHTGRAY;
+ case Gray:
+ return EFI_DARKGRAY;
+ case LtBlue:
+ return EFI_LIGHTBLUE;
+ case LtGreen:
+ return EFI_LIGHTGREEN;
+ case LtCyan:
+ return EFI_LIGHTCYAN;
+ case LtRed:
+ return EFI_LIGHTRED;
+ case LtMagenta:
+ return EFI_LIGHTMAGENTA;
+ case Yellow:
+ return EFI_YELLOW;
+ case White:
+ default:
+ return EFI_WHITE;
+ }
+}
+
+ULONG
+ConsoleEfiTextGetAttribute (
+ BL_COLOR BgColor,
+ BL_COLOR FgColor
+ )
+{
+ /* Convert each part and OR into a single attribute */
+ return ConsoleEfiTextGetEfiColorBackground(BgColor) |
+ ConsoleEfiTextGetEfiColorForeground(FgColor);
+}
+
+VOID
+ConsoleEfiTextGetStateFromMode (
+ _In_ EFI_SIMPLE_TEXT_OUTPUT_MODE *Mode,
+ _Out_ PBL_DISPLAY_STATE State
+ )
+{
+ ULONG TextWidth, TextHeight;
+
+ /* Get all the EFI data and convert it into our own structure */
+ BlDisplayGetTextCellResolution(&TextWidth, &TextHeight);
+ State->FgColor = ConsoleEfiTextGetColorForeground(Mode->Attribute);
+ State->BgColor = ConsoleEfiTextGetColorBackground(Mode->Attribute);
+ State->XPos = Mode->CursorColumn * TextWidth;
+ State->YPos = Mode->CursorRow * TextHeight;
+ State->CursorVisible = Mode->CursorVisible != FALSE;
+}
+
+NTSTATUS
+ConsoleFirmwareTextSetState (
+ _In_ PBL_TEXT_CONSOLE TextConsole,
+ _In_ UCHAR Mask,
+ _In_ PBL_DISPLAY_STATE State
+ )
+{
+ NTSTATUS Status;
+ ULONG FgColor, BgColor, Attribute, XPos, YPos, TextHeight, TextWidth;
+ BOOLEAN Visible;
+
+ /* Check if foreground state is being set */
+ if (Mask & 1)
+ {
+ /* Check if there's a difference from current */
+ FgColor = State->FgColor;
+ if (TextConsole->State.FgColor != FgColor)
+ {
+ /* Ignore invalid color */
+ if (FgColor > White)
+ {
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ /* Convert from NT/CGA format to EFI, and then set the attribute */
+ Attribute = ConsoleEfiTextGetAttribute(TextConsole->State.BgColor,
+ FgColor);
+ Status = EfiConOutSetAttribute(TextConsole->Protocol, Attribute);
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+
+ /* Update cached state */
+ TextConsole->State.FgColor = FgColor;
+ }
+ }
+
+ /* Check if background state is being set */
+ if (Mask & 2)
+ {
+ /* Check if there's a difference from current */
+ BgColor = State->BgColor;
+ if (TextConsole->State.BgColor != BgColor)
+ {
+ /* Ignore invalid color */
+ if (BgColor > White)
+ {
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ /* Convert from NT/CGA format to EFI, and then set the attribute */
+ Attribute = ConsoleEfiTextGetAttribute(BgColor,
+ TextConsole->State.FgColor);
+ Status = EfiConOutSetAttribute(TextConsole->Protocol, Attribute);
+
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+
+ /* Update cached state */
+ TextConsole->State.BgColor = BgColor;
+ }
+ }
+
+ /* Check if position state is being set */
+ if (Mask & 4)
+ {
+ /* Check if there's a difference from current */
+ XPos = State->XPos;
+ YPos = State->YPos;
+ if ((TextConsole->State.XPos != XPos) ||
+ (TextConsole->State.YPos != YPos))
+ {
+ /* Set the new cursor position */
+ BlDisplayGetTextCellResolution(&TextWidth, &TextHeight);
+ Status = EfiConOutSetCursorPosition(TextConsole->Protocol,
+ XPos/ TextWidth,
+ YPos / TextHeight);
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+
+ /* Update cached state */
+ TextConsole->State.XPos = XPos;
+ TextConsole->State.YPos = YPos;
+ }
+ }
+
+ /* Check if cursor state is being set */
+ if (Mask & 8)
+ {
+ /* Check if there's a difference from current */
+ Visible = State->CursorVisible;
+ if (TextConsole->State.CursorVisible != Visible)
+ {
+ /* Ignore invalid state */
+ if (Visible >= 3)
+ {
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ /* Set the new cursor state */
+ Status = EfiConOutEnableCursor(TextConsole->Protocol, Visible);
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+
+ /* Update cached status */
+ TextConsole->State.CursorVisible = Visible;
+ }
+ }
+
+ /* Return success */
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+ConsoleEfiTextFindModeFromAllowed (
+ _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextProtocol,
+ _In_ PBL_DISPLAY_MODE SupportedModes,
+ _In_ ULONG MaxIndex,
+ _Out_ PULONG SupportedMode
+ )
+{
+ EFI_SIMPLE_TEXT_OUTPUT_MODE ModeInfo;
+ ULONG MaxMode, MaxQueriedMode, Mode, i, MatchingMode;
+ UINTN HRes, VRes;
+ ULONGLONG ModeListSize;
+ PBL_DISPLAY_MODE ModeEntry, ModeList, SupportedModeEntry;
+ NTSTATUS Status;
+
+ /* Read information on the current mode */
+ EfiConOutReadCurrentMode(TextProtocol, &ModeInfo);
+
+ /* Figure out the max mode, and how many modes we'll have to read */
+ MaxMode = ModeInfo.MaxMode;
+ ModeListSize = sizeof(*ModeEntry) * ModeInfo.MaxMode;
+ if (ModeListSize > MAXULONG)
+ {
+ return STATUS_INTEGER_OVERFLOW;
+ }
+
+ /* Allocate a list for all the supported EFI modes */
+ ModeList = BlMmAllocateHeap(ModeListSize);
+ if (!ModeList)
+ {
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* Scan all the EFI modes */
+ EarlyPrint(L"Scanning through %d modes\n", MaxMode);
+ for (MaxQueriedMode = 0, Mode = 0; Mode < MaxMode; Mode++)
+ {
+ /* Query information on this mode */
+ ModeEntry = &ModeList[MaxQueriedMode];
+ if (NT_SUCCESS(EfiConOutQueryMode(TextProtocol,
+ Mode,
+ &HRes,
+ &VRes)))
+ {
+ /* This mode was succesfully queried. Save the data */
+ EarlyPrint(L"EFI Firmware Supported Mode %d is H: %d V: %d\n",
Mode, HRes, VRes);
+ ModeEntry->HRes = HRes;
+ ModeEntry->VRes = VRes;
+ ModeEntry->HRes2 = HRes;
+ MaxQueriedMode = Mode + 1;
+ }
+ }
+
+ /* Loop all the supported mode entries */
+ for (i = 0; i < MaxIndex; i++)
+ {
+ /* Loop all the UEFI queried modes */
+ SupportedModeEntry = &SupportedModes[i];
+ for (MatchingMode = 0; MatchingMode < MaxQueriedMode; MatchingMode++)
+ {
+ /* Check if the UEFI mode is compatible with our supported mode */
+ ModeEntry = &ModeList[MatchingMode];
+ EarlyPrint(L"H1: %d V1: %d - H2: %d - V2: %d\n",
ModeEntry->HRes, ModeEntry->VRes, SupportedModeEntry->HRes,
SupportedModeEntry->VRes);
+ if ((ModeEntry->HRes == SupportedModeEntry->HRes) &&
+ (ModeEntry->VRes == SupportedModeEntry->VRes))
+ {
+ /* Yep -- free the mode list and return this mode */
+ BlMmFreeHeap(ModeList);
+ *SupportedMode = MatchingMode;
+ return STATUS_SUCCESS;
+ }
+ }
+ }
+
+ /* We can't do anything -- there are no matching modes */
+ Status = STATUS_UNSUCCESSFUL;
+ BlMmFreeHeap(ModeList);
+ return Status;
+}
+
+VOID
+ConsoleFirmwareTextClose (
+ _In_ PBL_TEXT_CONSOLE TextConsole
+ )
+{
+ ULONG Mode;
+ BL_DISPLAY_STATE DisplayState;
+
+ /* Read the original mode, and see if it's different than the one now */
+ Mode = TextConsole->OldMode.Mode;
+ if (Mode != TextConsole->Mode)
+ {
+ /* Restore to the original mode */
+ EfiConOutSetMode(TextConsole->Protocol, Mode);
+ }
+
+ /* Read the EFI settings for the original mode */
+ ConsoleEfiTextGetStateFromMode(&TextConsole->OldMode, &DisplayState);
+
+ /* Set the original settings */
+ ConsoleFirmwareTextSetState(TextConsole, 0xF, &DisplayState);
+}
+
+NTSTATUS
+ConsoleFirmwareTextOpen (
+ _In_ PBL_TEXT_CONSOLE TextConsole
+ )
+{
+ BL_DISPLAY_MODE DisplayMode;
+ EFI_SIMPLE_TEXT_OUTPUT_MODE CurrentMode, NewMode;
+ UINTN HRes, VRes;
+ ULONG Mode;
+ NTSTATUS Status;
+
+ /* Read the current mode and its settings */
+ EfiConOutReadCurrentMode(EfiConOut, &CurrentMode);
+ Status = EfiConOutQueryMode(EfiConOut, CurrentMode.Mode, &HRes, &VRes);
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+
+ /* Save the current mode and its settings */
+ NewMode = CurrentMode;
+ DisplayMode.VRes = VRes;
+ DisplayMode.HRes = HRes;
+ DisplayMode.HRes2 = HRes;
+
+ /* Check if the current mode is compatible with one of our modes */
+ if (!ConsolepFindResolution(&DisplayMode, ConsoleTextResolutionList, 1))
+ {
+ /* It isn't -- find a matching EFI mode for what we need */
+ EarlyPrint(L"In incorrect mode, scanning for right one\n");
+ Status = ConsoleEfiTextFindModeFromAllowed(EfiConOut,
+ ConsoleTextResolutionList,
+ 1,
+ &Mode);
+ if (!NT_SUCCESS(Status))
+ {
+ EarlyPrint(L"Failed to find mode: %lx\n", Status);
+ return Status;
+ }
+
+ /* Set the new EFI mode */
+ EarlyPrint(L"Setting new mode: %d\n", Mode);
+ Status = EfiConOutSetMode(EfiConOut, Mode);
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+
+ /* Read the current mode and its settings */
+ EfiConOutReadCurrentMode(EfiConOut, &NewMode);
+ Status = EfiConOutQueryMode(EfiConOut, Mode, &HRes, &VRes);
+ if (!NT_SUCCESS(Status))
+ {
+ EfiConOutSetMode(EfiConOut, CurrentMode.Mode);
+ return Status;
+ }
+
+ /* Save the current mode and its settings */
+ DisplayMode.HRes = HRes;
+ DisplayMode.VRes = VRes;
+ DisplayMode.HRes2 = HRes;
+ }
+
+ /* Capture all the current settings */
+ ConsoleEfiTextGetStateFromMode(&NewMode, &TextConsole->State);
+ TextConsole->Mode = NewMode.Mode;
+ TextConsole->DisplayMode = DisplayMode;
+ TextConsole->Protocol = EfiConOut;
+ TextConsole->OldMode = CurrentMode;
+ return STATUS_SUCCESS;
+}
+
Propchange: trunk/reactos/boot/environ/lib/io/display/efi/textcons.c
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/reactos/boot/environ/lib/io/display/efi/uga.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/lib/io/displa…
==============================================================================
--- trunk/reactos/boot/environ/lib/io/display/efi/uga.c (added)
+++ trunk/reactos/boot/environ/lib/io/display/efi/uga.c [iso-8859-1] Mon Sep 7 19:35:24
2015
@@ -0,0 +1,42 @@
+/*
+ * COPYRIGHT: See COPYING.ARM in the top level directory
+ * PROJECT: ReactOS UEFI Boot Library
+ * FILE: boot/environ/lib/io/display/efi/uga.c
+ * PURPOSE: Boot Library EFI UGA Routines
+ * PROGRAMMER: Alex Ionescu (alex.ionescu(a)reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include "bl.h"
+
+/* DATA VARIABLES ************************************************************/
+
+/* FUNCTIONS *****************************************************************/
+
+NTSTATUS
+ConsoleEfiUgaOpen (
+ _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
+ )
+{
+ EarlyPrint(L"UGA not implemented\n");
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+VOID
+ConsoleEfiUgaClose (
+ _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
+ )
+{
+ return;
+}
+
+NTSTATUS
+ConsoleEfiUgaSetResolution (
+ _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole,
+ _In_ PBL_DISPLAY_MODE DisplayMode,
+ _In_ ULONG DisplayModeCount
+ )
+{
+ return STATUS_NOT_IMPLEMENTED;
+}
Propchange: trunk/reactos/boot/environ/lib/io/display/efi/uga.c
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/reactos/boot/environ/lib/io/display/emscons.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/lib/io/displa…
==============================================================================
--- trunk/reactos/boot/environ/lib/io/display/emscons.c (added)
+++ trunk/reactos/boot/environ/lib/io/display/emscons.c [iso-8859-1] Mon Sep 7 19:35:24
2015
@@ -0,0 +1,58 @@
+/*
+ * COPYRIGHT: See COPYING.ARM in the top level directory
+ * PROJECT: ReactOS UEFI Boot Library
+ * FILE: boot/environ/lib/io/display/emscons.c
+ * PURPOSE: Boot Library Remote Console Routines
+ * PROGRAMMER: Alex Ionescu (alex.ionescu(a)reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include "bl.h"
+
+/* DATA VARIABLES ************************************************************/
+
+/* FUNCTIONS *****************************************************************/
+
+NTSTATUS
+ConsoleRemoteConstruct (
+ _In_ PBL_REMOTE_CONSOLE RemoteConsole
+ )
+{
+#ifdef BL_EMS_SUPPORT
+#error Implement me
+#else
+ /* We don't support EMS for now */
+ return STATUS_NOT_IMPLEMENTED;
+#endif
+}
+
+NTSTATUS
+ConsoleCreateRemoteConsole (
+ _In_ PBL_TEXT_CONSOLE* TextConsole
+ )
+{
+ PBL_REMOTE_CONSOLE RemoteConsole;
+ NTSTATUS Status;
+
+ /* Allocate the remote console */
+ RemoteConsole = BlMmAllocateHeap(sizeof(*RemoteConsole));
+ if (!RemoteConsole)
+ {
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* Construct it */
+ Status = ConsoleRemoteConstruct(RemoteConsole);
+ if (Status < 0)
+ {
+ /* Failed to construct it, delete it */
+ BlMmFreeHeap(RemoteConsole);
+ return Status;
+ }
+
+ /* Save the global pointer and return a pointer to the text console */
+ DspRemoteInputConsole = RemoteConsole;
+ *TextConsole = &RemoteConsole->TextConsole;
+ return STATUS_SUCCESS;
+}
Propchange: trunk/reactos/boot/environ/lib/io/display/emscons.c
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/reactos/boot/environ/lib/io/display/guicons.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/lib/io/displa…
==============================================================================
--- trunk/reactos/boot/environ/lib/io/display/guicons.c (added)
+++ trunk/reactos/boot/environ/lib/io/display/guicons.c [iso-8859-1] Mon Sep 7 19:35:24
2015
@@ -0,0 +1,71 @@
+/*
+ * COPYRIGHT: See COPYING.ARM in the top level directory
+ * PROJECT: ReactOS UEFI Boot Library
+ * FILE: boot/environ/lib/io/display/guicons.c
+ * PURPOSE: Boot Library GUI Console Routines
+ * PROGRAMMER: Alex Ionescu (alex.ionescu(a)reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include "bl.h"
+
+/* DATA VARIABLES ************************************************************/
+
+BL_GRAPHICS_CONSOLE_VTABLE ConsoleGraphicalVtbl =
+{
+ { NULL },
+};
+
+/* FUNCTIONS *****************************************************************/
+
+NTSTATUS
+ConsoleGraphicalConstruct (
+ _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
+ )
+{
+ NTSTATUS Status;
+
+ /* Create a text console */
+ Status = ConsoleTextLocalConstruct(&GraphicsConsole->TextConsole, FALSE);
+ if (!NT_SUCCESS(Status))
+ {
+ EarlyPrint(L"Text failed: %lx\n", Status);
+ return Status;
+ }
+
+ /* But overwrite its callbacks with ours */
+ GraphicsConsole->TextConsole.Callbacks = &ConsoleGraphicalVtbl.Text;
+
+ /* Try to create a GOP console */
+ Status = ConsoleEfiGraphicalOpenProtocol(GraphicsConsole, BlGopConsole);
+ if (!NT_SUCCESS(Status))
+ {
+ /* That failed, try an older EFI 1.02 UGA console */
+ EarlyPrint(L"GOP open failed!\n", Status);
+ Status = ConsoleEfiGraphicalOpenProtocol(GraphicsConsole, BlUgaConsole);
+ if (!NT_SUCCESS(Status))
+ {
+ /* That failed too, give up */
+ EarlyPrint(L"UGA failed!\n", Status);
+ ConsoleTextLocalDestruct(&GraphicsConsole->TextConsole);
+ return STATUS_UNSUCCESSFUL;
+ }
+ }
+
+ /* Enable the console */
+ Status = ConsoleFirmwareGraphicalEnable(GraphicsConsole);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Failed to enable it, undo everything */
+ EarlyPrint(L"Enable failed\n");
+ ConsoleFirmwareGraphicalClose(GraphicsConsole);
+ ConsoleTextLocalDestruct(&GraphicsConsole->TextConsole);
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ /* Save the graphics text color from the text mode text color */
+ GraphicsConsole->FgColor = GraphicsConsole->TextConsole.State.FgColor;
+ GraphicsConsole->BgColor = GraphicsConsole->TextConsole.State.BgColor;
+ return STATUS_SUCCESS;
+}
Propchange: trunk/reactos/boot/environ/lib/io/display/guicons.c
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/reactos/boot/environ/lib/io/display/textcons.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/lib/io/displa…
==============================================================================
--- trunk/reactos/boot/environ/lib/io/display/textcons.c (added)
+++ trunk/reactos/boot/environ/lib/io/display/textcons.c [iso-8859-1] Mon Sep 7 19:35:24
2015
@@ -0,0 +1,184 @@
+/*
+ * COPYRIGHT: See COPYING.ARM in the top level directory
+ * PROJECT: ReactOS UEFI Boot Library
+ * FILE: boot/environ/lib/io/display/textcons.c
+ * PURPOSE: Boot Library Text Console Routines
+ * PROGRAMMER: Alex Ionescu (alex.ionescu(a)reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include "bl.h"
+
+/* DATA VARIABLES ************************************************************/
+
+BL_TEXT_CONSOLE_VTABLE ConsoleTextLocalVtbl =
+{
+ ConsoleTextLocalDestruct,
+ ConsoleTextLocalReinitialize,
+ ConsoleTextBaseGetTextState,
+ ConsoleTextLocalSetTextState,
+ ConsoleTextBaseGetTextResolution,
+ ConsoleTextLocalSetTextResolution,
+ ConsoleTextLocalClearText,
+ ConsoleTextLocalWriteText
+};
+
+/* FUNCTIONS *****************************************************************/
+
+NTSTATUS
+ConsoleTextLocalDestruct (
+ _In_ struct _BL_TEXT_CONSOLE* Console
+ )
+{
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+ConsoleTextLocalReinitialize (
+ _In_ struct _BL_TEXT_CONSOLE* Console
+ )
+{
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+ConsoleTextBaseGetTextState (
+ _In_ struct _BL_TEXT_CONSOLE* Console,
+ _Out_ PBL_DISPLAY_STATE TextState
+ )
+{
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+ConsoleTextLocalSetTextState (
+ _In_ struct _BL_TEXT_CONSOLE* Console,
+ _In_ ULONG Flags,
+ _In_ PBL_DISPLAY_STATE TextState
+ )
+{
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+ConsoleTextBaseGetTextResolution (
+ _In_ struct _BL_TEXT_CONSOLE* Console,
+ _Out_ PULONG TextResolution
+ )
+{
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+ConsoleTextLocalSetTextResolution (
+ _In_ struct _BL_TEXT_CONSOLE* Console,
+ _In_ ULONG NewTextResolution,
+ _Out_ PULONG OldTextResolution
+ )
+{
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+ConsoleTextLocalClearText (
+ _In_ struct _BL_TEXT_CONSOLE* Console,
+ _In_ ULONG Attribute
+ )
+{
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+ConsoleTextLocalWriteText (
+ _In_ struct _BL_TEXT_CONSOLE* Console,
+ _In_ PCHAR Text,
+ _In_ ULONG Attribute
+ )
+{
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+ConsoleTextLocalConstruct (
+ _In_ PBL_TEXT_CONSOLE TextConsole,
+ _In_ BOOLEAN Activate
+ )
+{
+ NTSTATUS Status;
+ BL_DISPLAY_STATE TextState;
+
+ /* Set our callbacks */
+ TextConsole->Callbacks = &ConsoleTextLocalVtbl;
+
+ /* Are we activating this console? */
+ if (Activate)
+ {
+ /* Call firmware to activate it */
+ Status = ConsoleFirmwareTextOpen(TextConsole);
+ if (!NT_SUCCESS(Status))
+ {
+ EarlyPrint(L"Failed to activate console: %lx\n", Status);
+ return Status;
+ }
+ }
+
+ /* Set default text state */
+ TextState.BgColor = 0;
+ TextState.XPos = 0;
+ TextState.YPos = 0;
+ TextState.CursorVisible = FALSE;
+ TextState.FgColor = White;
+
+ /* Are we activating? */
+ if (Activate)
+ {
+ /* Call firmware to set it */
+ Status = ConsoleFirmwareTextSetState(TextConsole, 0xF, &TextState);
+ if (!NT_SUCCESS(Status))
+ {
+ /* We failed, back down */
+ EarlyPrint(L"Failed to set console state: %lx\n", Status);
+ ConsoleFirmwareTextClose(TextConsole);
+ return Status;
+ }
+ }
+ else
+ {
+ /* Just save the state for now, someone else can activate later */
+ TextConsole->State = TextState;
+ }
+
+ /* Remember if we activated it */
+ TextConsole->Active = Activate;
+ return STATUS_SUCCESS;
+}
+
+BOOLEAN
+ConsolepFindResolution (
+ _In_ PBL_DISPLAY_MODE Mode,
+ _In_ PBL_DISPLAY_MODE List,
+ _In_ ULONG MaxIndex
+ )
+{
+ PBL_DISPLAY_MODE ListEnd;
+
+ /* Loop until we hit the maximum supported list index */
+ ListEnd = &List[MaxIndex];
+ while (List != ListEnd)
+ {
+ /* Does this resolution match? */
+ if ((Mode->HRes == List->HRes) && (Mode->VRes ==
List->VRes))
+ {
+ /* Yep -- we got a match */
+ return TRUE;
+
+ }
+
+ /* Try another one*/
+ List++;
+ }
+
+ /* No matches were found */
+ return FALSE;
+}
Propchange: trunk/reactos/boot/environ/lib/io/display/textcons.c
------------------------------------------------------------------------------
svn:eol-style = native
Modified: trunk/reactos/boot/environ/lib/io/fat.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/lib/io/fat.c?…
==============================================================================
--- trunk/reactos/boot/environ/lib/io/fat.c [iso-8859-1] (original)
+++ trunk/reactos/boot/environ/lib/io/fat.c [iso-8859-1] Mon Sep 7 19:35:24 2015
@@ -1,10 +1,10 @@
/*
-* COPYRIGHT: See COPYING.ARM in the top level directory
-* PROJECT: ReactOS UEFI Boot Library
-* FILE: boot/environ/lib/io/fat.c
-* PURPOSE: Boot Library FAT File System Management Routines
-* PROGRAMMER: Alex Ionescu (alex.ionescu(a)reactos.org)
-*/
+ * COPYRIGHT: See COPYING.ARM in the top level directory
+ * PROJECT: ReactOS UEFI Boot Library
+ * FILE: boot/environ/lib/io/fat.c
+ * PURPOSE: Boot Library FAT File System Management Routines
+ * PROGRAMMER: Alex Ionescu (alex.ionescu(a)reactos.org)
+ */
/* INCLUDES ******************************************************************/
Removed: trunk/reactos/boot/environ/lib/platform/display.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/lib/platform/…
==============================================================================
--- trunk/reactos/boot/environ/lib/platform/display.c [iso-8859-1] (original)
+++ trunk/reactos/boot/environ/lib/platform/display.c (removed)
@@ -1,1626 +0,0 @@
-/*
- * COPYRIGHT: See COPYING.ARM in the top level directory
- * PROJECT: ReactOS UEFI Boot Library
- * FILE: boot/environ/lib/platform/display.c
- * PURPOSE: Boot Library Display Management Routines
- * PROGRAMMER: Alex Ionescu (alex.ionescu(a)reactos.org)
- */
-
-/* INCLUDES ******************************************************************/
-
-#include "bl.h"
-#include <bcd.h>
-
-/* DATA VARIABLES ************************************************************/
-
-typedef enum _BL_COLOR
-{
- Black,
- Blue,
- Green,
- Cyan,
- Red,
- Magenta,
- Brown,
- LtGray,
- Gray,
- LtBlue,
- LtGreen,
- LtCyan,
- LtRed,
- LtMagenta,
- Yellow,
- White
-} BL_COLOR, *PBL_COLOR;
-
-typedef struct _BL_DISPLAY_STATE
-{
- ULONG BgColor;
- ULONG FgColor;
- ULONG XPos;
- ULONG YPos;
- ULONG CursorVisible;
-} BL_DISPLAY_STATE, *PBL_DISPLAY_STATE;
-
-typedef struct _BL_DISPLAY_MODE
-{
- ULONG HRes;
- ULONG VRes;
- ULONG HRes2;
-} BL_DISPLAY_MODE, *PBL_DISPLAY_MODE;
-
-struct _BL_TEXT_CONSOLE;
-typedef
-NTSTATUS
-(*PCONSOLE_DESTRUCT) (
- _In_ struct _BL_TEXT_CONSOLE* Console
- );
-
-typedef
-NTSTATUS
-(*PCONSOLE_REINITIALIZE) (
- _In_ struct _BL_TEXT_CONSOLE* Console
- );
-
-typedef
-NTSTATUS
-(*PCONSOLE_GET_TEXT_STATE) (
- _In_ struct _BL_TEXT_CONSOLE* Console,
- _Out_ PBL_DISPLAY_STATE TextState
- );
-
-typedef
-NTSTATUS
-(*PCONSOLE_SET_TEXT_STATE) (
- _In_ struct _BL_TEXT_CONSOLE* Console,
- _In_ ULONG Flags,
- _In_ PBL_DISPLAY_STATE TextState
- );
-
-typedef
-NTSTATUS
-(*PCONSOLE_GET_TEXT_RESOLUTION) (
- _In_ struct _BL_TEXT_CONSOLE* Console,
- _Out_ PULONG TextResolution
- );
-
-typedef
-NTSTATUS
-(*PCONSOLE_SET_TEXT_RESOLUTION) (
- _In_ struct _BL_TEXT_CONSOLE* Console,
- _In_ ULONG NewTextResolution,
- _Out_ PULONG OldTextResolution
- );
-
-typedef
-NTSTATUS
-(*PCONSOLE_CLEAR_TEXT) (
- _In_ struct _BL_TEXT_CONSOLE* Console,
- _In_ ULONG Attribute
- );
-
-
-typedef
-NTSTATUS
-(*PCONSOLE_WRITE_TEXT) (
- _In_ struct _BL_TEXT_CONSOLE* Console,
- _In_ PCHAR Text,
- _In_ ULONG Attribute
- );
-
-typedef struct _BL_TEXT_CONSOLE_VTABLE
-{
- PCONSOLE_DESTRUCT Destruct;
- PCONSOLE_REINITIALIZE Reinitialize;
- PCONSOLE_GET_TEXT_STATE GetTextState;
- PCONSOLE_SET_TEXT_STATE SetTextState;
- PCONSOLE_GET_TEXT_RESOLUTION GetTextResolution;
- PCONSOLE_SET_TEXT_RESOLUTION SetTextResolution;
- PCONSOLE_CLEAR_TEXT ClearText;
- PCONSOLE_WRITE_TEXT WriteText;
-} BL_TEXT_CONSOLE_VTABLE, *PBL_TEXT_CONSOLE_VTABLE;
-
-typedef struct _BL_GRAPHICS_CONSOLE_VTABLE
-{
- BL_TEXT_CONSOLE_VTABLE Text;
- /// more for graphics ///
-} BL_GRAPHICS_CONSOLE_VTABLE, *PBL_GRAPHICS_CONSOLE_VTABLE;
-
-typedef struct _BL_TEXT_CONSOLE
-{
- PBL_TEXT_CONSOLE_VTABLE Callbacks;
- BL_DISPLAY_STATE State;
- BL_DISPLAY_MODE DisplayMode;
- BOOLEAN Active;
- EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL* Protocol;
- ULONG Mode;
- EFI_SIMPLE_TEXT_OUTPUT_MODE OldMode;
-} BL_TEXT_CONSOLE, *PBL_TEXT_CONSOLE;
-
-typedef enum _BL_GRAPHICS_CONSOLE_TYPE
-{
- BlGopConsole,
- BlUgaConsole
-} BL_GRAPHICS_CONSOLE_TYPE;
-
-typedef struct _BL_GRAPHICS_CONSOLE
-{
- BL_TEXT_CONSOLE TextConsole;
- BL_DISPLAY_MODE DisplayMode;
- ULONG PixelDepth;
- ULONG FgColor;
- ULONG BgColor;
- BL_DISPLAY_MODE OldDisplayMode;
- ULONG OldPixelDepth;
- EFI_HANDLE Handle;
- BL_GRAPHICS_CONSOLE_TYPE Type;
- EFI_GRAPHICS_OUTPUT_PROTOCOL* Protocol;
- PVOID FrameBuffer;
- ULONG FrameBufferSize;
- ULONG PixelsPerScanLine;
- ULONG Mode;
- ULONG OldMode;
-} BL_GRAPHICS_CONSOLE, *PBL_GRAPHICS_CONSOLE;
-
-typedef struct _BL_REMOTE_CONSOLE
-{
- BL_TEXT_CONSOLE TextConsole;
-} BL_REMOTE_CONSOLE, *PBL_REMOTE_CONSOLE;
-
-PVOID BfiCachedStrikeData;
-LIST_ENTRY BfiDeferredListHead;
-LIST_ENTRY BfiFontFileListHead;
-
-PVOID BfiGraphicsRectangle;
-
-ULONG ConsoleGraphicalResolutionListFlags;
-BL_DISPLAY_MODE ConsoleGraphicalResolutionList[3] =
-{
- {1024, 768, 1024},
- {800, 600, 800},
- {1024, 600, 1024}
-};
-ULONG ConsoleGraphicalResolutionListSize =
RTL_NUMBER_OF(ConsoleGraphicalResolutionList);
-
-BL_DISPLAY_MODE ConsoleTextResolutionList[1] =
-{
- {80, 25, 80}
-};
-
-NTSTATUS
-ConsoleTextLocalDestruct (
- _In_ struct _BL_TEXT_CONSOLE* Console
- );
-
-NTSTATUS
-ConsoleTextLocalReinitialize (
- _In_ struct _BL_TEXT_CONSOLE* Console
- );
-
-NTSTATUS
-ConsoleTextBaseGetTextState (
- _In_ struct _BL_TEXT_CONSOLE* Console,
- _Out_ PBL_DISPLAY_STATE TextState
- );
-
-NTSTATUS
-ConsoleTextLocalSetTextState (
- _In_ struct _BL_TEXT_CONSOLE* Console,
- _In_ ULONG Flags,
- _In_ PBL_DISPLAY_STATE TextState
- );
-
-NTSTATUS
-ConsoleTextBaseGetTextResolution (
- _In_ struct _BL_TEXT_CONSOLE* Console,
- _Out_ PULONG TextResolution
- );
-
-NTSTATUS
-ConsoleTextLocalSetTextResolution (
- _In_ struct _BL_TEXT_CONSOLE* Console,
- _In_ ULONG NewTextResolution,
- _Out_ PULONG OldTextResolution
- );
-
-NTSTATUS
-ConsoleTextLocalClearText (
- _In_ struct _BL_TEXT_CONSOLE* Console,
- _In_ ULONG Attribute
- );
-
-NTSTATUS
-ConsoleTextLocalWriteText (
- _In_ struct _BL_TEXT_CONSOLE* Console,
- _In_ PCHAR Text,
- _In_ ULONG Attribute
- );
-
-BL_TEXT_CONSOLE_VTABLE ConsoleTextLocalVtbl =
-{
- ConsoleTextLocalDestruct,
- ConsoleTextLocalReinitialize,
- ConsoleTextBaseGetTextState,
- ConsoleTextLocalSetTextState,
- ConsoleTextBaseGetTextResolution,
- ConsoleTextLocalSetTextResolution,
- ConsoleTextLocalClearText,
- ConsoleTextLocalWriteText
-};
-
-BL_GRAPHICS_CONSOLE_VTABLE ConsoleGraphicalVtbl =
-{
- {NULL},
-};
-
-PVOID DspRemoteInputConsole;
-PVOID DspTextConsole;
-PVOID DspGraphicalConsole;
-
-/* FUNCTIONS *****************************************************************/
-
-BOOLEAN
-ConsolepFindResolution (
- _In_ PBL_DISPLAY_MODE Mode,
- _In_ PBL_DISPLAY_MODE List,
- _In_ ULONG MaxIndex
- )
-{
- PBL_DISPLAY_MODE ListEnd;
-
- /* Loop until we hit the maximum supported list index */
- ListEnd = &List[MaxIndex];
- while (List != ListEnd)
- {
- /* Does this resolution match? */
- if ((Mode->HRes == List->HRes) && (Mode->VRes ==
List->VRes))
- {
- /* Yep -- we got a match */
- return TRUE;
-
- }
-
- /* Try another one*/
- List++;
- }
-
- /* No matches were found */
- return FALSE;
-}
-
-BL_COLOR
-ConsoleEfiTextGetColorForeground (
- _In_ UINT32 Attributes
- )
-{
- /* Read the foreground color attribute and convert to CGA color index */
- switch (Attributes & 0x0F)
- {
- case EFI_BLACK:
- return Black;
- case EFI_BLUE:
- return Blue;
- case EFI_GREEN:
- return Green;
- case EFI_RED:
- return Red;
- case EFI_CYAN:
- return Cyan;
- case EFI_MAGENTA:
- return Magenta;
- case EFI_BROWN:
- return Brown;
- case EFI_LIGHTGRAY:
- return LtGray;
- case EFI_DARKGRAY:
- return Gray;
- case EFI_LIGHTBLUE:
- return LtBlue;
- case EFI_LIGHTGREEN:
- return LtGreen;
- case EFI_LIGHTCYAN:
- return LtCyan;
- case EFI_LIGHTRED:
- return LtRed;
- case EFI_LIGHTMAGENTA:
- return LtMagenta;
- case EFI_YELLOW:
- return Yellow;
- case EFI_WHITE:
- default:
- return White;
- }
-}
-
-BL_COLOR
-ConsoleEfiTextGetColorBackground (
- _In_ UINT32 Attributes
- )
-{
- /* Read the background color attribute and convert to CGA color index */
- switch (Attributes & 0xF0)
- {
- case EFI_BACKGROUND_MAGENTA:
- return Magenta;
- case EFI_BACKGROUND_BROWN:
- return Brown;
- case EFI_BACKGROUND_LIGHTGRAY:
- return White;
- case EFI_BACKGROUND_BLACK:
- default:
- return Black;
- case EFI_BACKGROUND_RED:
- return Red;
- case EFI_BACKGROUND_GREEN:
- return Green;
- case EFI_BACKGROUND_CYAN:
- return Cyan;
- case EFI_BACKGROUND_BLUE:
- return Blue;
- }
-}
-
-ULONG
-ConsoleEfiTextGetEfiColorBackground (
- _In_ BL_COLOR Color
- )
-{
- /* Convert the CGA color index into an EFI background attribute */
- switch (Color)
- {
- case Blue:
- case LtBlue:
- return EFI_BACKGROUND_BLUE;
- case Green:
- case LtGreen:
- return EFI_BACKGROUND_GREEN;
- case Cyan:
- case LtCyan:
- return EFI_BACKGROUND_CYAN;
- case Red:
- case LtRed:
- return EFI_BACKGROUND_RED;
- case Magenta:
- case LtMagenta:
- return EFI_BACKGROUND_MAGENTA;
- case Brown:
- case Yellow:
- return EFI_BACKGROUND_BROWN;
- case LtGray:
- case White:
- return EFI_BACKGROUND_LIGHTGRAY;
- case Black:
- case Gray:
- default:
- return EFI_BACKGROUND_BLACK;
- }
-}
-
-ULONG
-ConsoleEfiTextGetEfiColorForeground (
- _In_ BL_COLOR Color
- )
-{
- /* Convert the CGA color index into an EFI foreground attribute */
- switch (Color)
- {
- case Black:
- return EFI_BLACK;
- case Blue:
- return EFI_BLUE;
- case Green:
- return EFI_GREEN;
- case Cyan:
- return EFI_CYAN;
- case Red:
- return EFI_RED;
- case Magenta:
- return EFI_MAGENTA;
- case Brown:
- return EFI_BROWN;
- case LtGray:
- return EFI_LIGHTGRAY;
- case Gray:
- return EFI_DARKGRAY;
- case LtBlue:
- return EFI_LIGHTBLUE;
- case LtGreen:
- return EFI_LIGHTGREEN;
- case LtCyan:
- return EFI_LIGHTCYAN;
- case LtRed:
- return EFI_LIGHTRED;
- case LtMagenta:
- return EFI_LIGHTMAGENTA;
- case Yellow:
- return EFI_YELLOW;
- case White:
- default:
- return EFI_WHITE;
- }
-}
-
-ULONG
-ConsoleEfiTextGetAttribute (
- BL_COLOR BgColor,
- BL_COLOR FgColor
- )
-{
- /* Convert each part and OR into a single attribute */
- return ConsoleEfiTextGetEfiColorBackground(BgColor) |
- ConsoleEfiTextGetEfiColorForeground(FgColor);
-}
-
-VOID
-ConsoleEfiTextGetStateFromMode (
- _In_ EFI_SIMPLE_TEXT_OUTPUT_MODE *Mode,
- _Out_ PBL_DISPLAY_STATE State
- )
-{
-
- ULONG TextWidth, TextHeight;
-
- /* Get all the EFI data and convert it into our own structure */
- BlDisplayGetTextCellResolution(&TextWidth, &TextHeight);
- State->FgColor = ConsoleEfiTextGetColorForeground(Mode->Attribute);
- State->BgColor = ConsoleEfiTextGetColorBackground(Mode->Attribute);
- State->XPos = Mode->CursorColumn * TextWidth;
- State->YPos = Mode->CursorRow * TextHeight;
- State->CursorVisible = Mode->CursorVisible != FALSE;
-}
-
-NTSTATUS
-ConsoleFirmwareTextSetState (
- _In_ PBL_TEXT_CONSOLE TextConsole,
- _In_ UCHAR Mask,
- _In_ PBL_DISPLAY_STATE State
- )
-{
- NTSTATUS Status;
- ULONG FgColor, BgColor, Attribute, XPos, YPos, TextHeight, TextWidth;
- BOOLEAN Visible;
-
- /* Check if foreground state is being set */
- if (Mask & 1)
- {
- /* Check if there's a difference from current */
- FgColor = State->FgColor;
- if (TextConsole->State.FgColor != FgColor)
- {
- /* Ignore invalid color */
- if (FgColor > White)
- {
- return STATUS_INVALID_PARAMETER;
- }
-
- /* Convert from NT/CGA format to EFI, and then set the attribute */
- Attribute = ConsoleEfiTextGetAttribute(TextConsole->State.BgColor,
- FgColor);
- Status = EfiConOutSetAttribute(TextConsole->Protocol, Attribute);
- if (!NT_SUCCESS(Status))
- {
- return Status;
- }
-
- /* Update cached state */
- TextConsole->State.FgColor = FgColor;
- }
- }
-
- /* Check if background state is being set */
- if (Mask & 2)
- {
- /* Check if there's a difference from current */
- BgColor = State->BgColor;
- if (TextConsole->State.BgColor != BgColor)
- {
- /* Ignore invalid color */
- if (BgColor > White)
- {
- return STATUS_INVALID_PARAMETER;
- }
-
- /* Convert from NT/CGA format to EFI, and then set the attribute */
- Attribute = ConsoleEfiTextGetAttribute(BgColor,
- TextConsole->State.FgColor);
- Status = EfiConOutSetAttribute(TextConsole->Protocol, Attribute);
-
- if (!NT_SUCCESS(Status))
- {
- return Status;
- }
-
- /* Update cached state */
- TextConsole->State.BgColor = BgColor;
- }
- }
-
- /* Check if position state is being set */
- if (Mask & 4)
- {
- /* Check if there's a difference from current */
- XPos = State->XPos;
- YPos = State->YPos;
- if ((TextConsole->State.XPos != XPos) ||
- (TextConsole->State.YPos != YPos))
- {
- /* Set the new cursor position */
- BlDisplayGetTextCellResolution(&TextWidth, &TextHeight);
- Status = EfiConOutSetCursorPosition(TextConsole->Protocol,
- XPos/ TextWidth,
- YPos / TextHeight);
- if (!NT_SUCCESS(Status))
- {
- return Status;
- }
-
- /* Update cached state */
- TextConsole->State.XPos = XPos;
- TextConsole->State.YPos = YPos;
- }
- }
-
- /* Check if cursor state is being set */
- if (Mask & 8)
- {
- /* Check if there's a difference from current */
- Visible = State->CursorVisible;
- if (TextConsole->State.CursorVisible != Visible)
- {
- /* Ignore invalid state */
- if (Visible >= 3)
- {
- return STATUS_INVALID_PARAMETER;
- }
-
- /* Set the new cursor state */
- Status = EfiConOutEnableCursor(TextConsole->Protocol, Visible);
- if (!NT_SUCCESS(Status))
- {
- return Status;
- }
-
- /* Update cached status */
- TextConsole->State.CursorVisible = Visible;
- }
- }
-
- /* Return success */
- return STATUS_SUCCESS;
-}
-
-NTSTATUS
-ConsoleEfiTextFindModeFromAllowed (
- _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextProtocol,
- _In_ PBL_DISPLAY_MODE SupportedModes,
- _In_ ULONG MaxIndex,
- _Out_ PULONG SupportedMode
- )
-{
- EFI_SIMPLE_TEXT_OUTPUT_MODE ModeInfo;
- ULONG MaxMode, MaxQueriedMode, Mode, i, MatchingMode;
- UINTN HRes, VRes;
- ULONGLONG ModeListSize;
- PBL_DISPLAY_MODE ModeEntry, ModeList, SupportedModeEntry;
- NTSTATUS Status;
-
- /* Read information on the current mode */
- EfiConOutReadCurrentMode(TextProtocol, &ModeInfo);
-
- /* Figure out the max mode, and how many modes we'll have to read */
- MaxMode = ModeInfo.MaxMode;
- ModeListSize = sizeof(*ModeEntry) * ModeInfo.MaxMode;
- if (ModeListSize > MAXULONG)
- {
- return STATUS_INTEGER_OVERFLOW;
- }
-
- /* Allocate a list for all the supported EFI modes */
- ModeList = BlMmAllocateHeap(ModeListSize);
- if (!ModeList)
- {
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- /* Scan all the EFI modes */
- EarlyPrint(L"Scanning through %d modes\n", MaxMode);
- for (MaxQueriedMode = 0, Mode = 0; Mode < MaxMode; Mode++)
- {
- /* Query information on this mode */
- ModeEntry = &ModeList[MaxQueriedMode];
- if (NT_SUCCESS(EfiConOutQueryMode(TextProtocol,
- Mode,
- &HRes,
- &VRes)))
- {
- /* This mode was succesfully queried. Save the data */
- EarlyPrint(L"EFI Firmware Supported Mode %d is H: %d V: %d\n",
Mode, HRes, VRes);
- ModeEntry->HRes = HRes;
- ModeEntry->VRes = VRes;
- ModeEntry->HRes2 = HRes;
- MaxQueriedMode = Mode + 1;
- }
- }
-
- /* Loop all the supported mode entries */
- for (i = 0; i < MaxIndex; i++)
- {
- /* Loop all the UEFI queried modes */
- SupportedModeEntry = &SupportedModes[i];
- for (MatchingMode = 0; MatchingMode < MaxQueriedMode; MatchingMode++)
- {
- /* Check if the UEFI mode is compatible with our supported mode */
- ModeEntry = &ModeList[MatchingMode];
- EarlyPrint(L"H1: %d V1: %d - H2: %d - V2: %d\n",
ModeEntry->HRes, ModeEntry->VRes, SupportedModeEntry->HRes,
SupportedModeEntry->VRes);
- if ((ModeEntry->HRes == SupportedModeEntry->HRes) &&
- (ModeEntry->VRes == SupportedModeEntry->VRes))
- {
- /* Yep -- free the mode list and return this mode */
- BlMmFreeHeap(ModeList);
- *SupportedMode = MatchingMode;
- return STATUS_SUCCESS;
- }
- }
- }
-
- /* We can't do anything -- there are no matching modes */
- Status = STATUS_UNSUCCESSFUL;
- BlMmFreeHeap(ModeList);
- return Status;
-}
-
-VOID
-ConsoleFirmwareTextClose (
- _In_ PBL_TEXT_CONSOLE TextConsole
- )
-{
- ULONG Mode;
- BL_DISPLAY_STATE DisplayState;
-
- /* Read the original mode, and see if it's different than the one now */
- Mode = TextConsole->OldMode.Mode;
- if (Mode != TextConsole->Mode)
- {
- /* Restore to the original mode */
- EfiConOutSetMode(TextConsole->Protocol, Mode);
- }
-
- /* Read the EFI settings for the original mode */
- ConsoleEfiTextGetStateFromMode(&TextConsole->OldMode, &DisplayState);
-
- /* Set the original settings */
- ConsoleFirmwareTextSetState(TextConsole, 0xF, &DisplayState);
-}
-
-NTSTATUS
-ConsoleFirmwareTextOpen (
- _In_ PBL_TEXT_CONSOLE TextConsole
- )
-{
- BL_DISPLAY_MODE DisplayMode;
- EFI_SIMPLE_TEXT_OUTPUT_MODE CurrentMode, NewMode;
- UINTN HRes, VRes;
- ULONG Mode;
- NTSTATUS Status;
-
- /* Read the current mode and its settings */
- EfiConOutReadCurrentMode(EfiConOut, &CurrentMode);
- Status = EfiConOutQueryMode(EfiConOut, CurrentMode.Mode, &HRes, &VRes);
- if (!NT_SUCCESS(Status))
- {
- return Status;
- }
-
- /* Save the current mode and its settings */
- NewMode = CurrentMode;
- DisplayMode.VRes = VRes;
- DisplayMode.HRes = HRes;
- DisplayMode.HRes2 = HRes;
-
- /* Check if the current mode is compatible with one of our modes */
- if (!ConsolepFindResolution(&DisplayMode, ConsoleTextResolutionList, 1))
- {
- /* It isn't -- find a matching EFI mode for what we need */
- EarlyPrint(L"In incorrect mode, scanning for right one\n");
- Status = ConsoleEfiTextFindModeFromAllowed(EfiConOut,
- ConsoleTextResolutionList,
- 1,
- &Mode);
- if (!NT_SUCCESS(Status))
- {
- EarlyPrint(L"Failed to find mode: %lx\n", Status);
- return Status;
- }
-
- /* Set the new EFI mode */
- EarlyPrint(L"Setting new mode: %d\n", Mode);
- Status = EfiConOutSetMode(EfiConOut, Mode);
- if (!NT_SUCCESS(Status))
- {
- return Status;
- }
-
- /* Read the current mode and its settings */
- EfiConOutReadCurrentMode(EfiConOut, &NewMode);
- Status = EfiConOutQueryMode(EfiConOut, Mode, &HRes, &VRes);
- if (!NT_SUCCESS(Status))
- {
- EfiConOutSetMode(EfiConOut, CurrentMode.Mode);
- return Status;
- }
-
- /* Save the current mode and its settings */
- DisplayMode.HRes = HRes;
- DisplayMode.VRes = VRes;
- DisplayMode.HRes2 = HRes;
- }
-
- /* Capture all the current settings */
- ConsoleEfiTextGetStateFromMode(&NewMode, &TextConsole->State);
- TextConsole->Mode = NewMode.Mode;
- TextConsole->DisplayMode = DisplayMode;
- TextConsole->Protocol = EfiConOut;
- TextConsole->OldMode = CurrentMode;
- return STATUS_SUCCESS;
-}
-
-NTSTATUS
-ConsoleEfiUgaOpen (
- _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
- )
-{
- EarlyPrint(L"UGA not implemented\n");
- return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-ConsoleEfiGopGetGraphicalFormat (
- _In_ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *ModeInfo,
- _Out_ PULONG PixelDepth
- )
-{
- /* Convert the format to depth */
- if (ModeInfo->PixelFormat == PixelBlueGreenRedReserved8BitPerColor)
- {
- *PixelDepth = 32;
- return STATUS_SUCCESS;
- }
- if (ModeInfo->PixelFormat == PixelBitMask)
- {
- *PixelDepth = 24;
- return STATUS_SUCCESS;
- }
- return STATUS_UNSUCCESSFUL;
-}
-
-BOOLEAN
-ConsoleEfiGopIsPixelFormatSupported (
- _In_ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Mode
- )
-{
- BOOLEAN Supported;
- EFI_PIXEL_BITMASK PixelMask;
-
- Supported = FALSE;
-
- /* Check if it's simple BGR8 */
- if (Mode->PixelFormat == PixelBlueGreenRedReserved8BitPerColor)
- {
- Supported = TRUE;
- }
- else
- {
- /* Otherwise, we can check if it's a masked format */
- if (Mode->PixelFormat == PixelBitMask)
- {
- /* Check if the masked format is BGR8 */
- PixelMask.BlueMask = 0xFF;
- PixelMask.GreenMask = 0xFF00;
- PixelMask.RedMask = 0xFF0000;
- PixelMask.ReservedMask = 0;
- if (RtlEqualMemory(&Mode->PixelInformation,
- &PixelMask,
- sizeof(PixelMask)))
- {
- Supported = TRUE;
- }
- }
- }
-
- /* Return if the format was supported */
- return Supported;
-}
-
-#define BL_DISPLAY_GRAPHICS_FORCED_VIDEO_MODE_FLAG 0x01
-#define BL_DISPLAY_GRAPHICS_FORCED_HIGH_RES_MODE_FLAG 0x02
-
-NTSTATUS
-ConsoleEfiGopFindModeFromAllowed (
- _In_ EFI_GRAPHICS_OUTPUT_PROTOCOL *GopProtocol,
- _In_ PBL_DISPLAY_MODE SupportedModes,
- _In_ ULONG MaximumIndex,
- _Out_ PULONG SupportedMode
- )
-{
- return STATUS_NOT_IMPLEMENTED;
-}
-
-VOID
-ConsoleEfiUgaClose (
- _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
- )
-{
- return;
-}
-
-VOID
-ConsoleEfiGopClose (
- _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
- )
-{
- ULONG OldMode;
-
- /* Did we switch modes when we turned on the console? */
- OldMode = GraphicsConsole->OldMode;
- if (GraphicsConsole->Mode != OldMode)
- {
- /* Restore the old mode and reset the OEM bitmap in ACPI */
- EfiGopSetMode(GraphicsConsole->Protocol, OldMode);
- //BlDisplayInvalidateOemBitmap();
- }
-
- /* Close the GOP protocol */
- EfiCloseProtocol(GraphicsConsole->Handle,
- &EfiGraphicsOutputProtocol);
-}
-
-VOID
-ConsoleFirmwareGraphicalClose (
- _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
- )
-{
- /* Call the correct close routine based on the console mode */
- if (GraphicsConsole->Type == BlUgaConsole)
- {
- ConsoleEfiUgaClose(GraphicsConsole);
- }
- else
- {
- ConsoleEfiGopClose(GraphicsConsole);
- }
-
-}
-NTSTATUS
-ConsoleEfiGopOpen (
- _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
- )
-{
- NTSTATUS Status;
- EFI_GRAPHICS_OUTPUT_PROTOCOL *GopProtocol;
- ULONG Mode, PixelDepth;
- UINTN CurrentMode;
- EFI_GRAPHICS_OUTPUT_MODE_INFORMATION ModeInformation;
- BOOLEAN CurrentModeOk;
-
- /* Open a handle to GOP */
- Status = EfiOpenProtocol(GraphicsConsole->Handle,
- &EfiGraphicsOutputProtocol,
- (PVOID*)&GopProtocol);
- if (!NT_SUCCESS(Status))
- {
- EarlyPrint(L"GOP OPEN failed: %lx\n", Status);
- return STATUS_NOT_SUPPORTED;
- }
-
- /* Get the current mode */
- Status = EfiGopGetCurrentMode(GopProtocol, &CurrentMode, &ModeInformation);
- if (!NT_SUCCESS(Status))
- {
- EarlyPrint(L"GOP mode failed: %lx\n", Status);
- goto Quickie;
- }
-
- Mode = CurrentMode;
-
- /* Check if any custom BCD options were provided */
- if (ConsoleGraphicalResolutionListFlags &
- (BL_DISPLAY_GRAPHICS_FORCED_VIDEO_MODE_FLAG |
- BL_DISPLAY_GRAPHICS_FORCED_HIGH_RES_MODE_FLAG))
- {
- /* We'll have to find a mode */
- CurrentModeOk = FALSE;
- }
- else
- {
- /* Then we should be in the default mode, check if the pixel format is OK */
- CurrentModeOk = ConsoleEfiGopIsPixelFormatSupported(&ModeInformation);
- }
-
- /* Is the mode/format OK? */
- if (!CurrentModeOk)
- {
- /* Nope -- we'll have to go find one */
- Status = ConsoleEfiGopFindModeFromAllowed(GopProtocol,
- ConsoleGraphicalResolutionList,
- ConsoleGraphicalResolutionListSize,
- &Mode);
- if (!NT_SUCCESS(Status))
- {
- goto Quickie;
- }
- }
-
- /* Store mode information */
- GraphicsConsole->Protocol = GopProtocol;
- GraphicsConsole->Mode = Mode;
- GraphicsConsole->OldMode = CurrentMode;
-
- /* Get format information */
- Status = ConsoleEfiGopGetGraphicalFormat(&ModeInformation, &PixelDepth);
- if (NT_SUCCESS(Status))
- {
- /* Store it */
- GraphicsConsole->OldDisplayMode.HRes = ModeInformation.HorizontalResolution;
- GraphicsConsole->OldDisplayMode.VRes = ModeInformation.VerticalResolution;
- GraphicsConsole->OldDisplayMode.HRes2 = ModeInformation.PixelsPerScanLine;
- GraphicsConsole->PixelDepth = PixelDepth;
- return STATUS_SUCCESS;
- }
-
-Quickie:
- /* We failed, close the protocol and return the failure code */
- EarlyPrint(L"Get format failed: %lx\n", Status);
- EfiCloseProtocol(GraphicsConsole->Handle, &EfiGraphicsOutputProtocol);
- return Status;
-}
-
-NTSTATUS
-ConsoleEfiGraphicalOpenProtocol (
- _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole,
- _In_ BL_GRAPHICS_CONSOLE_TYPE Type
- )
-{
- ULONG HandleIndex, HandleCount;
- EFI_HANDLE* HandleArray;
- EFI_HANDLE Handle;
- NTSTATUS Status;
- PVOID Interface;
-
- /* Find a device handle that implements either GOP or UGA */
- HandleCount = 0;
- HandleArray = NULL;
- Status = EfiLocateHandleBuffer(ByProtocol,
- (Type == BlGopConsole) ?
- &EfiGraphicsOutputProtocol :
- &EfiUgaDrawProtocol,
- &HandleCount,
- &HandleArray);
- if (!NT_SUCCESS(Status))
- {
- /* Nothing supports this (no video card?) */
- EarlyPrint(L"Status: %lx Count: %d\n", Status, HandleCount);
- return STATUS_UNSUCCESSFUL;
- }
-
- /* Scan through the handles we received */
- for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++)
- {
- /* Try to open each one */
- GraphicsConsole->Handle = HandleArray[HandleIndex];
- Handle = HandleArray[HandleIndex];
- Status = EfiOpenProtocol(Handle, &EfiDevicePathProtocol, &Interface);
- if (NT_SUCCESS(Status))
- {
- /* Test worked, close the protocol */
- EfiCloseProtocol(Handle, &EfiDevicePathProtocol);
-
- /* Now open the real protocol we want, either UGA or GOP */
- Status = Type ? ConsoleEfiUgaOpen(GraphicsConsole) :
- ConsoleEfiGopOpen(GraphicsConsole);
- if (NT_SUCCESS(Status))
- {
- /* It worked -- store the type of console this is */
- GraphicsConsole->Type = Type;
- return STATUS_SUCCESS;
- }
- }
- }
-
- /* We failed to find a working GOP/UGA protocol provider */
- return STATUS_UNSUCCESSFUL;
-}
-
-NTSTATUS
-ConsoleTextLocalDestruct (
- _In_ struct _BL_TEXT_CONSOLE* Console
- )
-{
- return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-ConsoleTextLocalReinitialize (
- _In_ struct _BL_TEXT_CONSOLE* Console
- )
-{
- return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-ConsoleTextBaseGetTextState (
- _In_ struct _BL_TEXT_CONSOLE* Console,
- _Out_ PBL_DISPLAY_STATE TextState
- )
-{
- return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-ConsoleTextLocalSetTextState (
- _In_ struct _BL_TEXT_CONSOLE* Console,
- _In_ ULONG Flags,
- _In_ PBL_DISPLAY_STATE TextState
- )
-{
- return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-ConsoleTextBaseGetTextResolution (
- _In_ struct _BL_TEXT_CONSOLE* Console,
- _Out_ PULONG TextResolution
- )
-{
- return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-ConsoleTextLocalSetTextResolution (
- _In_ struct _BL_TEXT_CONSOLE* Console,
- _In_ ULONG NewTextResolution,
- _Out_ PULONG OldTextResolution
- )
-{
- return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-ConsoleTextLocalClearText (
- _In_ struct _BL_TEXT_CONSOLE* Console,
- _In_ ULONG Attribute
- )
-{
- return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-ConsoleTextLocalWriteText (
- _In_ struct _BL_TEXT_CONSOLE* Console,
- _In_ PCHAR Text,
- _In_ ULONG Attribute
- )
-{
- return STATUS_NOT_IMPLEMENTED;
-}
-
-BOOLEAN
-DsppGraphicsDisabledByBcd (
- VOID
- )
-{
- //EarlyPrint(L"Disabling graphics\n");
- return FALSE;
-}
-
-NTSTATUS
-ConsoleTextLocalConstruct (
- _In_ PBL_TEXT_CONSOLE TextConsole,
- _In_ BOOLEAN Activate
- )
-{
- NTSTATUS Status;
- BL_DISPLAY_STATE TextState;
-
- /* Set our callbacks */
- TextConsole->Callbacks = &ConsoleTextLocalVtbl;
-
- /* Are we activating this console? */
- if (Activate)
- {
- /* Call firmware to activate it */
- Status = ConsoleFirmwareTextOpen(TextConsole);
- if (!NT_SUCCESS(Status))
- {
- EarlyPrint(L"Failed to activate console: %lx\n", Status);
- return Status;
- }
- }
-
- /* Set default text state */
- TextState.BgColor = 0;
- TextState.XPos = 0;
- TextState.YPos = 0;
- TextState.CursorVisible = FALSE;
- TextState.FgColor = White;
-
- /* Are we activating? */
- if (Activate)
- {
- /* Call firmware to set it */
- Status = ConsoleFirmwareTextSetState(TextConsole, 0xF, &TextState);
- if (!NT_SUCCESS(Status))
- {
- /* We failed, back down */
- EarlyPrint(L"Failed to set console state: %lx\n", Status);
- ConsoleFirmwareTextClose(TextConsole);
- return Status;
- }
- }
- else
- {
- /* Just save the state for now, someone else can activate later */
- TextConsole->State = TextState;
- }
-
- /* Remember if we activated it */
- TextConsole->Active = Activate;
- return STATUS_SUCCESS;
-}
-
-NTSTATUS
-ConsoleEfiUgaSetResolution (
- _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole,
- _In_ PBL_DISPLAY_MODE DisplayMode,
- _In_ ULONG DisplayModeCount
- )
-{
- return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-ConsoleEfiGopEnable (
- _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
- )
-{
- PVOID FrameBuffer;
- UINTN CurrentMode, Dummy;
- ULONG Mode, PixelDepth;
- UINTN FrameBufferSize;
- EFI_GRAPHICS_OUTPUT_MODE_INFORMATION ModeInformation;
- EFI_GRAPHICS_OUTPUT_PROTOCOL* Protocol;
- NTSTATUS Status;
- PHYSICAL_ADDRESS FrameBufferPhysical;
-
- /* Capture the current mode and protocol */
- Mode = GraphicsConsole->Mode;
- Protocol = GraphicsConsole->Protocol;
-
- /* Get the current mode and its information */
- Status = EfiGopGetCurrentMode(Protocol, &CurrentMode, &ModeInformation);
- if (!NT_SUCCESS(Status))
- {
- return Status;
- }
-
- /* Check if we're not in the mode we should be */
- if (CurrentMode != Mode)
- {
- /* Switch modes */
- Status = EfiGopSetMode(Protocol, Mode);
- if (Status < 0)
- {
- return Status;
- }
-
- /* Reset the OEM bitmap and get the new more information */
-// BlDisplayInvalidateOemBitmap();
- EfiGopGetCurrentMode(Protocol, &Dummy, &ModeInformation);
- }
-
- /* Get the pixel depth for this mode */
- Status = ConsoleEfiGopGetGraphicalFormat(&ModeInformation, &PixelDepth);
- if (NT_SUCCESS(Status))
- {
- /* Get the framebuffer for this mode */
- EfiGopGetFrameBuffer(Protocol, &FrameBufferPhysical, &FrameBufferSize);
-
- /* Map the framebuffer, try as writeback first */
- FrameBuffer = NULL;
- Status = BlMmMapPhysicalAddressEx(&FrameBuffer,
- BlMemoryWriteBack,
- FrameBufferSize,
- FrameBufferPhysical);
- if (!NT_SUCCESS(Status))
- {
- /* That didn't work, so try uncached next */
- Status = BlMmMapPhysicalAddressEx(&FrameBuffer,
- BlMemoryUncached,
- FrameBufferSize,
- FrameBufferPhysical);
- }
- }
-
- /* Check if getting all the required information worked out */
- if (NT_SUCCESS(Status))
- {
- /* Capture the resolution, depth, and framebuffer information */
- GraphicsConsole->DisplayMode.HRes = ModeInformation.HorizontalResolution;
- GraphicsConsole->DisplayMode.VRes = ModeInformation.VerticalResolution;
- GraphicsConsole->DisplayMode.HRes2 = ModeInformation.PixelsPerScanLine;
- GraphicsConsole->PixelDepth = PixelDepth;
- GraphicsConsole->FrameBuffer = FrameBuffer;
- GraphicsConsole->FrameBufferSize = FrameBufferSize;
- GraphicsConsole->PixelsPerScanLine = ModeInformation.PixelsPerScanLine;
-
- /* All good */
- Status = STATUS_SUCCESS;
- }
- else if (CurrentMode != GraphicsConsole->Mode)
- {
- /* We failed seomewhere, reset the mode and the OEM bitmap back */
- EfiGopSetMode(Protocol, CurrentMode);
- //BlDisplayInvalidateOemBitmap();
- }
-
- /* Return back to caller */
- return Status;
-}
-
-NTSTATUS
-ConsoleFirmwareGraphicalEnable (
- _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
- )
-{
- NTSTATUS Status;
-
- /* Check what type of console this is */
- if (GraphicsConsole->Type == BlUgaConsole)
- {
- /* Handle UGA */
- Status = ConsoleEfiUgaSetResolution(GraphicsConsole,
- &GraphicsConsole->DisplayMode,
- 1);
- }
- else
- {
- /* Handle GOP */
- Status = ConsoleEfiGopEnable(GraphicsConsole);
- }
-
- /* Return back to caller */
- return Status;
-}
-
-NTSTATUS
-ConsoleGraphicalConstruct (
- _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
- )
-{
- NTSTATUS Status;
-
- /* Create a text console */
- Status = ConsoleTextLocalConstruct(&GraphicsConsole->TextConsole, FALSE);
- if (!NT_SUCCESS(Status))
- {
- EarlyPrint(L"Text failed: %lx\n", Status);
- return Status;
- }
-
- /* But overwrite its callbacks with ours */
- GraphicsConsole->TextConsole.Callbacks = &ConsoleGraphicalVtbl.Text;
-
- /* Try to create a GOP console */
- Status = ConsoleEfiGraphicalOpenProtocol(GraphicsConsole, BlGopConsole);
- if (!NT_SUCCESS(Status))
- {
- /* That failed, try an older EFI 1.02 UGA console */
- EarlyPrint(L"GOP open failed!\n", Status);
- Status = ConsoleEfiGraphicalOpenProtocol(GraphicsConsole, BlUgaConsole);
- if (!NT_SUCCESS(Status))
- {
- /* That failed too, give up */
- EarlyPrint(L"UGA failed!\n", Status);
- ConsoleTextLocalDestruct(&GraphicsConsole->TextConsole);
- return STATUS_UNSUCCESSFUL;
- }
- }
-
- /* Enable the console */
- Status = ConsoleFirmwareGraphicalEnable(GraphicsConsole);
- if (!NT_SUCCESS(Status))
- {
- /* Failed to enable it, undo everything */
- EarlyPrint(L"Enable failed\n");
- ConsoleFirmwareGraphicalClose(GraphicsConsole);
- ConsoleTextLocalDestruct(&GraphicsConsole->TextConsole);
- return STATUS_UNSUCCESSFUL;
- }
-
- /* Save the graphics text color from the text mode text color */
- GraphicsConsole->FgColor = GraphicsConsole->TextConsole.State.FgColor;
- GraphicsConsole->BgColor = GraphicsConsole->TextConsole.State.BgColor;
- return STATUS_SUCCESS;
-}
-
-NTSTATUS
-ConsoleRemoteConstruct (
- _In_ PBL_REMOTE_CONSOLE RemoteConsole
- )
-{
-#ifdef BL_EMS_SUPPORT
-#error Implement me
-#else
- /* We don't support EMS for now */
- return STATUS_NOT_IMPLEMENTED;
-#endif
-}
-
-NTSTATUS
-ConsoleCreateRemoteConsole (
- _In_ PBL_TEXT_CONSOLE* TextConsole
- )
-{
- PBL_REMOTE_CONSOLE RemoteConsole;
- NTSTATUS Status;
-
- /* Allocate the remote console */
- RemoteConsole = BlMmAllocateHeap(sizeof(*RemoteConsole));
- if (!RemoteConsole)
- {
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- /* Construct it */
- Status = ConsoleRemoteConstruct(RemoteConsole);
- if (Status < 0)
- {
- /* Failed to construct it, delete it */
- BlMmFreeHeap(RemoteConsole);
- return Status;
- }
-
- /* Save the global pointer and return a pointer to the text console */
- DspRemoteInputConsole = RemoteConsole;
- *TextConsole = &RemoteConsole->TextConsole;
- return STATUS_SUCCESS;
-}
-
-NTSTATUS
-DsppInitialize (
- _In_ ULONG Flags
- )
-{
- BL_LIBRARY_PARAMETERS LibraryParameters = BlpLibraryParameters;
- BOOLEAN NoGraphics;// , HighestMode;
- NTSTATUS Status;
- PBL_DISPLAY_MODE DisplayMode;
- //ULONG GraphicsResolution;
- PBL_GRAPHICS_CONSOLE GraphicsConsole;
- PBL_TEXT_CONSOLE TextConsole, RemoteConsole;
-
- /* Initialize font data */
- BfiCachedStrikeData = 0;
- InitializeListHead(&BfiDeferredListHead);
- InitializeListHead(&BfiFontFileListHead);
-
- /* Allocate the font rectangle */
- BfiGraphicsRectangle = BlMmAllocateHeap(0x5A);
- if (!BfiGraphicsRectangle)
- {
- return STATUS_NO_MEMORY;
- }
-
- /* Display re-initialization not yet handled */
- if (LibraryParameters.LibraryFlags & BL_LIBRARY_FLAG_REINITIALIZE_ALL)
- {
- EarlyPrint(L"Display path not handled\n");
- return STATUS_NOT_SUPPORTED;
- }
-
- /* Check if no graphics console is needed */
- if ((Flags & BL_LIBRARY_FLAG_NO_GRAPHICS_CONSOLE) ||
- (DsppGraphicsDisabledByBcd()))
- {
- /* Remember this */
- NoGraphics = TRUE;
- }
- else
- {
- /* No graphics -- remember this */
- NoGraphics = FALSE;
- }
-
- /* On first load, we always initialize a graphics display */
- GraphicsConsole = NULL;
- if (!(Flags & BL_LIBRARY_FLAG_REINITIALIZE_ALL) || !(NoGraphics))
- {
- /* Default to mode 0 (1024x768) */
- DisplayMode = &ConsoleGraphicalResolutionList[0];
-
- /* Check what resolution to use*/
-#if 0
- Status = BlGetBootOptionInteger(BlpApplicationEntry.BcdData,
- BcdLibraryInteger_GraphicsResolution,
- &GraphicsResolution);
-#else
- //GraphicsResolution = 0;
- Status = STATUS_NOT_FOUND;
-#endif
- if (NT_SUCCESS(Status))
- {
- ConsoleGraphicalResolutionListFlags |=
BL_DISPLAY_GRAPHICS_FORCED_VIDEO_MODE_FLAG;
- EarlyPrint(L"Display selection not yet handled\n");
- return STATUS_NOT_IMPLEMENTED;
- }
-
- /* Check if the highest mode should be forced */
-#if 0
- Status = BlGetBootOptionBoolean(BlpApplicationEntry.BcdData,
- BcdLibraryBoolean_GraphicsForceHighestMode,
- &HighestMode);
-#else
- //HighestMode = 0;
- Status = STATUS_NOT_FOUND;
-#endif
- if (NT_SUCCESS(Status))
- {
- ConsoleGraphicalResolutionListFlags |=
BL_DISPLAY_GRAPHICS_FORCED_HIGH_RES_MODE_FLAG;
- EarlyPrint(L"High res mode not yet handled\n");
- return STATUS_NOT_IMPLEMENTED;
- }
-
- /* Do we need graphics mode after all? */
- if (!NoGraphics)
- {
- /* Yep -- go allocate it */
- GraphicsConsole = BlMmAllocateHeap(sizeof(*GraphicsConsole));
- if (GraphicsConsole)
- {
- /* Construct it */
- Status = ConsoleGraphicalConstruct(GraphicsConsole);
- if (!NT_SUCCESS(Status))
- {
- EarlyPrint(L"GFX FAILED: %lx\n", Status);
- BlMmFreeHeap(GraphicsConsole);
- GraphicsConsole = NULL;
- }
- else
- {
- /* TEST */
- RtlFillMemory(GraphicsConsole->FrameBuffer,
GraphicsConsole->FrameBufferSize, 0x55);
- }
- }
- }
-
- /* Are we using something else than the default mode? */
- if (DisplayMode != &ConsoleGraphicalResolutionList[0])
- {
- EarlyPrint(L"Display path not handled\n");
- return STATUS_NOT_SUPPORTED;
- }
-
- /* Mask out all the flags now */
- ConsoleGraphicalResolutionListFlags &=
~(BL_DISPLAY_GRAPHICS_FORCED_VIDEO_MODE_FLAG |
-
BL_DISPLAY_GRAPHICS_FORCED_HIGH_RES_MODE_FLAG);
- }
-
- /* Do we have a graphics console? */
- TextConsole = NULL;
- if (!GraphicsConsole)
- {
- /* Nope -- go allocate a text console */
- TextConsole = BlMmAllocateHeap(sizeof(*TextConsole));
- if (TextConsole)
- {
- /* Construct it */
- Status = ConsoleTextLocalConstruct(TextConsole, TRUE);
- if (!NT_SUCCESS(Status))
- {
- BlMmFreeHeap(TextConsole);
- TextConsole = NULL;
- }
- }
- }
-
- /* Initialize all globals to NULL */
- DspRemoteInputConsole = NULL;
- DspTextConsole = NULL;
- DspGraphicalConsole = NULL;
-
- /* If we don't have a text console, go get a remote console */
- RemoteConsole = NULL;
- if (!TextConsole)
- {
- ConsoleCreateRemoteConsole(&RemoteConsole);
- }
-
- /* Do we have a remote console? */
- if (!RemoteConsole)
- {
- /* Nope -- what about a graphical one? */
- if (GraphicsConsole)
- {
- /* Yes, use it for both graphics and text */
- DspGraphicalConsole = GraphicsConsole;
- DspTextConsole = GraphicsConsole;
- }
- else if (TextConsole)
- {
- /* Nope, but we have a text console */
- DspTextConsole = TextConsole;
- }
-
- /* Console has been setup */
- return STATUS_SUCCESS;
- }
-
- /* We have a remote console -- have to figure out how to use it*/
- EarlyPrint(L"Display path not handled\n");
- return STATUS_NOT_SUPPORTED;
-}
-
-NTSTATUS
-BlpDisplayInitialize (
- _In_ ULONG Flags
- )
-{
- NTSTATUS Status;
-
- /* Are we resetting or initializing? */
- if (Flags & BL_LIBRARY_FLAG_REINITIALIZE)
- {
- /* This is a reset */
- Status = STATUS_NOT_IMPLEMENTED;
-#if 0
- Status = DsppReinitialize(Flags);
- if (NT_SUCCESS(Status))
- {
- Status = BlpDisplayReinitialize();
- }
-#endif
- }
- else
- {
- /* Initialize the display */
- Status = DsppInitialize(Flags);
- }
-
- /* Return display initailziation state */
- return Status;
-}
-
-VOID
-BlDisplayGetTextCellResolution (
- _Out_ PULONG TextWidth,
- _Out_ PULONG TextHeight
- )
-{
- NTSTATUS Status;
-
- /* If the caller doesn't want anything, bail out */
- if (!(TextWidth) || !(TextHeight))
- {
- return;
- }
-
- /* Do we have a text console? */
- Status = STATUS_UNSUCCESSFUL;
- if (DspTextConsole)
- {
- /* Do we have a graphics console? */
- if (DspGraphicalConsole)
- {
- /* Yep -- query it */
- EarlyPrint(L"Not supported\n");
- Status = STATUS_NOT_IMPLEMENTED;
- }
- }
-
- /* Check if we failed to get it from the graphics console */
- if (!NT_SUCCESS(Status))
- {
- /* Set default text size */
- *TextWidth = 8;
- *TextHeight = 8;
- }
-}