#include #include #include #include #include #include #include #include #include #include #include "UefiMonitorTest.h" STATIC VOID PrepareGraphicsInfo ( IN GRAPHICS_CONTEXT *Graphics, IN EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop ) { ASSERT (Graphics != NULL); ASSERT (Gop != NULL); Graphics->Gop = Gop; Graphics->FrontBuffer = (UINT8 *)Gop->Mode->FrameBufferBase; Graphics->BufferSize = Gop->Mode->FrameBufferSize; Graphics->BackBuffer = AllocateCopyPool (Graphics->BufferSize, Graphics->FrontBuffer); ASSERT (Graphics->BackBuffer != NULL); Graphics->Width = Gop->Mode->Info->HorizontalResolution; Graphics->Height = Gop->Mode->Info->VerticalResolution; Graphics->PixelWidth = 4; // A pixel is 32-bits Graphics->Pitch = Graphics->PixelWidth * Gop->Mode->Info->PixelsPerScanLine; DEBUG (( DEBUG_INFO, "GOP information:\n" "Mode: %d\n" "Support a physical frame buffer: %s\n" "Framebuffer address, size: %x, %d\n" "Screen width x height: %d x %d\n", Gop->Mode->Mode, (Gop->Mode->Info->PixelFormat == PixelBltOnly) ? L"NO" : L"YES", Gop->Mode->FrameBufferBase, Gop->Mode->FrameBufferSize, Gop->Mode->Info->HorizontalResolution, Gop->Mode->Info->VerticalResolution )); } STATIC VOID ForgetGraphicsInfo ( IN GRAPHICS_CONTEXT *Graphics ) { ASSERT (Graphics != NULL); // Should we zero all the data structure? FreePool (Graphics->BackBuffer); } EFI_GRAPHICS_OUTPUT_PROTOCOL * GetGraphicsOutputProtocol ( VOID ) { EFI_STATUS Status; EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop; EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *ModeInfo; UINTN SizeOfInfo; Status = gBS->LocateProtocol ( &gEfiGraphicsOutputProtocolGuid, NULL, (VOID **)&Gop ); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "Unable to locate GOP\n")); return NULL; } Status = Gop->QueryMode ( Gop, (Gop->Mode == NULL) ? 0 : Gop->Mode->Mode, &SizeOfInfo, &ModeInfo ); if (Status == EFI_NOT_STARTED) { Status = Gop->SetMode (Gop, 0); } if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "Unable to get native mode\n")); return NULL; } // TODO: free ModeInfo return Gop; } EFI_STATUS EFIAPI UefiMain ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop; GRAPHICS_CONTEXT Graphics; Gop = GetGraphicsOutputProtocol (); if (Gop == NULL) { Print (L"Error: Getting a Graphical Output Protocol is failed\n"); return EFI_NOT_FOUND; } PrepareGraphicsInfo (&Graphics, Gop); ForgetGraphicsInfo (&Graphics); return EFI_SUCCESS; }