diff options
Diffstat (limited to 'memtestEDK/Memtest/GraphicsOutput/GraphicsOutputProtocol.c')
-rw-r--r-- | memtestEDK/Memtest/GraphicsOutput/GraphicsOutputProtocol.c | 104 |
1 files changed, 103 insertions, 1 deletions
diff --git a/memtestEDK/Memtest/GraphicsOutput/GraphicsOutputProtocol.c b/memtestEDK/Memtest/GraphicsOutput/GraphicsOutputProtocol.c index e2e661b..2198553 100644 --- a/memtestEDK/Memtest/GraphicsOutput/GraphicsOutputProtocol.c +++ b/memtestEDK/Memtest/GraphicsOutput/GraphicsOutputProtocol.c @@ -7,6 +7,7 @@ + static int memcmp(const void *s1, const void *s2, UINTN n) { @@ -146,6 +147,105 @@ CheckGOP(BOOLEAN Verbose, IN EFI_SYSTEM_TABLE *gST, IN EFI_BOOT_SERVICES *gBS) } EFI_STATUS +PrintCCP(EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl) +{ + EFI_STATUS Status = EFI_SUCCESS; + EFI_CONSOLE_CONTROL_SCREEN_MODE Mode; + BOOLEAN GopUgaExists; + BOOLEAN StdInLocked; + + Status = ConsoleControl->GetMode(ConsoleControl, &Mode, &GopUgaExists, &StdInLocked); + if (EFI_ERROR (Status)) { + Print(L"ERROR: ConsoleControl GetMode failed [%d]\n", Status ); + return Status; + } + + Print(L"Screen mode: "); + switch (Mode) { + case EfiConsoleControlScreenText: + Print(L"Text"); + break; + case EfiConsoleControlScreenGraphics: + Print(L"Graphics"); + break; + case EfiConsoleControlScreenMaxValue: + Print(L"MaxValue"); + break; + } + Print(L"\n"); + Print(L"Graphics Support Avalaiable: "); + if (GopUgaExists) + Print(L"Yes"); + else + Print(L"No"); + Print(L"\n"); + + Print(L"\n"); + + return EFI_SUCCESS; +} + + +EFI_STATUS +CheckCCP(BOOLEAN Verbose, IN EFI_SYSTEM_TABLE *gST, IN EFI_BOOT_SERVICES *gBS) +{ + EFI_GUID gEfiConsoleControlProtocolGuid = EFI_CONSOLE_CONTROL_PROTOCOL_GUID; + EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl = NULL; + EFI_HANDLE *HandleBuffer = NULL; + UINTN HandleCount = 0; + EFI_STATUS Status = EFI_SUCCESS; + + // get from ConsoleOutHandle? + Status = gBS->HandleProtocol( gST->ConsoleOutHandle, + &gEfiConsoleControlProtocolGuid, + (VOID **) &ConsoleControl); + if (EFI_ERROR (Status)) { + Print(L"No ConsoleControl handle found via HandleProtocol\n"); + } else { + Print(L"ConsoleControl handle found via HandleProtocol\n"); + if (Verbose) + PrintCCP(ConsoleControl); + } + + // try locating directly + Status = gBS->LocateProtocol( &gEfiConsoleControlProtocolGuid, + NULL, + (VOID **) &ConsoleControl); + if (EFI_ERROR(Status) || ConsoleControl == NULL) { + Print(L"No ConsoleControl handle found via LocateProtocol\n"); + } else { + Print(L"Found ConsoleControl handle via LocateProtocol\n"); + if (Verbose) + PrintCCP(ConsoleControl); + } + + // try locating by handle + Status = gBS->LocateHandleBuffer( ByProtocol, + &gEfiConsoleControlProtocolGuid, + NULL, + &HandleCount, + &HandleBuffer); + if (EFI_ERROR (Status)) { + Print(L"No ConsoleControl handles found via LocateHandleBuffer\n"); + } else { + Print(L"Found %d ConsoleControl handles via LocateHandleBuffer\n", HandleCount); + for (int i = 0; i < HandleCount; i++) { + Status = gBS->HandleProtocol( HandleBuffer[i], + &gEfiConsoleControlProtocolGuid, + (VOID*) &ConsoleControl); + if (!EFI_ERROR (Status)) + if (Verbose) + PrintCCP(ConsoleControl); + } + FreePool(HandleBuffer); + } + + Print(L"\n"); + + return Status; +} + +EFI_STATUS EFIAPI UefiMain ( IN EFI_HANDLE ImageHandle, @@ -153,7 +253,9 @@ UefiMain ( ) { - CheckGOP(TRUE, SystemTable, SystemTable->BootServices); + CheckGOP(FALSE, SystemTable, SystemTable->BootServices); + + CheckCCP(FALSE, SystemTable, SystemTable->BootServices); return EFI_SUCCESS; |