123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- #include <efi.h>
- #include <efilib.h>
- extern EFI_GUID GraphicsOutputProtocol;
- static int memcmp(const void *s1, const void *s2, UINTN n)
- {
- const unsigned char *c1 = s1, *c2 = s2;
- int d = 0;
- if (!s1 && !s2)
- return 0;
- if (s1 && !s2)
- return 1;
- if (!s1 && s2)
- return -1;
- while (n--) {
- d = (int)*c1++ - (int)*c2++;
- if (d)
- break;
- }
- return d;
- }
- static void
- print_modes(EFI_GRAPHICS_OUTPUT_PROTOCOL *gop)
- {
- int i, imax;
- EFI_STATUS rc;
- imax = gop->Mode->MaxMode;
- Print(L"GOP reports MaxMode %d\n", imax);
- for (i = 0; i < imax; i++) {
- EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info;
- UINTN SizeOfInfo;
- rc = uefi_call_wrapper(gop->QueryMode, 4, gop, i, &SizeOfInfo,
- &info);
- if (EFI_ERROR(rc) && rc == EFI_NOT_STARTED) {
- rc = uefi_call_wrapper(gop->SetMode, 2, gop,
- gop->Mode->Mode);
- rc = uefi_call_wrapper(gop->QueryMode, 4, gop, i,
- &SizeOfInfo, &info);
- }
- if (EFI_ERROR(rc)) {
- CHAR16 Buffer[64];
- StatusToString(Buffer, rc);
- Print(L"%d: Bad response from QueryMode: %s (%d)\n",
- i, Buffer, rc);
- continue;
- }
- Print(L"%c%d: %dx%d ", memcmp(info,gop->Mode->Info,sizeof(*info)) == 0 ? '*' : ' ', i,
- info->HorizontalResolution,
- info->VerticalResolution);
- switch(info->PixelFormat) {
- case PixelRedGreenBlueReserved8BitPerColor:
- Print(L"RGBR");
- break;
- case PixelBlueGreenRedReserved8BitPerColor:
- Print(L"BGRR");
- break;
- case PixelBitMask:
- Print(L"R:%08x G:%08x B:%08x X:%08x",
- info->PixelInformation.RedMask,
- info->PixelInformation.GreenMask,
- info->PixelInformation.BlueMask,
- info->PixelInformation.ReservedMask);
- break;
- case PixelBltOnly:
- Print(L"(blt only)");
- break;
- default:
- Print(L"(Invalid pixel format)");
- break;
- }
- Print(L" pitch %d\n", info->PixelsPerScanLine);
- }
- }
- static EFI_STATUS
- SetWatchdog(UINTN seconds)
- {
- EFI_STATUS rc;
- rc = uefi_call_wrapper(BS->SetWatchdogTimer, 4, seconds, 0x1ffff,
- 0, NULL);
- if (EFI_ERROR(rc)) {
- CHAR16 Buffer[64];
- StatusToString(Buffer, rc);
- Print(L"Bad response from QueryMode: %s (%d)\n", Buffer, rc);
- }
- return rc;
- }
- EFI_STATUS
- efi_main (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *systab)
- {
- EFI_STATUS rc;
- EFI_GRAPHICS_OUTPUT_PROTOCOL *gop;
- InitializeLib(image_handle, systab);
- SetWatchdog(10);
- rc = LibLocateProtocol(&GraphicsOutputProtocol, (void **)&gop);
- if (EFI_ERROR(rc))
- return rc;
- print_modes(gop);
- SetWatchdog(0);
- return EFI_SUCCESS;
- }
|