summaryrefslogtreecommitdiffstats
path: root/memtestEDK/Memtest/GraphicsOutput/GraphicsOutputProtocol.c
diff options
context:
space:
mode:
Diffstat (limited to 'memtestEDK/Memtest/GraphicsOutput/GraphicsOutputProtocol.c')
-rw-r--r--memtestEDK/Memtest/GraphicsOutput/GraphicsOutputProtocol.c104
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;