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/display... ============================================================================== --- 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@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/display... ============================================================================== --- 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@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/display... ============================================================================== --- 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@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/display... ============================================================================== --- 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@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/display... ============================================================================== --- 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@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/display... ============================================================================== --- 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@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/display... ============================================================================== --- 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@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/display... ============================================================================== --- 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@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?r... ============================================================================== --- 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@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@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/d... ============================================================================== --- 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@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; - } -}