source: bootcd/isolinux/syslinux-6.03/gnu-efi/gnu-efi-3.0/apps/modelist.c

Last change on this file was e16e8f2, checked in by Edwin Eefting <edwin@datux.nl>, 3 years ago

bootstuff

  • Property mode set to 100644
File size: 2.4 KB
Line 
1#include <efi.h>
2#include <efilib.h>
3
4extern EFI_GUID GraphicsOutputProtocol;
5
6static int memcmp(const void *s1, const void *s2, UINTN n)
7{
8        const unsigned char *c1 = s1, *c2 = s2;
9        int d = 0;
10
11        if (!s1 && !s2)
12                return 0;
13        if (s1 && !s2)
14                return 1;
15        if (!s1 && s2)
16                return -1;
17
18        while (n--) {
19                d = (int)*c1++ - (int)*c2++;
20                if (d)
21                        break;
22        }
23        return d;
24}
25
26static void
27print_modes(EFI_GRAPHICS_OUTPUT_PROTOCOL *gop)
28{
29        int i, imax;
30        EFI_STATUS rc;
31
32        imax = gop->Mode->MaxMode;
33
34        Print(L"GOP reports MaxMode %d\n", imax);
35        for (i = 0; i < imax; i++) {
36                EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info;
37                UINTN SizeOfInfo;
38                rc = uefi_call_wrapper(gop->QueryMode, 4, gop, i, &SizeOfInfo,
39                                        &info);
40                if (EFI_ERROR(rc) && rc == EFI_NOT_STARTED) {
41                        rc = uefi_call_wrapper(gop->SetMode, 2, gop,
42                                gop->Mode->Mode);
43                        rc = uefi_call_wrapper(gop->QueryMode, 4, gop, i,
44                                &SizeOfInfo, &info);
45                }
46
47                if (EFI_ERROR(rc)) {
48                        CHAR16 Buffer[64];
49                        StatusToString(Buffer, rc);
50                        Print(L"%d: Bad response from QueryMode: %s (%d)\n",
51                                i, Buffer, rc);
52                        continue;
53                }
54                Print(L"%c%d: %dx%d ", memcmp(info,gop->Mode->Info,sizeof(*info)) == 0 ? '*' : ' ', i,
55                        info->HorizontalResolution,
56                        info->VerticalResolution);
57                switch(info->PixelFormat) {
58                        case PixelRedGreenBlueReserved8BitPerColor:
59                                Print(L"RGBR");
60                                break;
61                        case PixelBlueGreenRedReserved8BitPerColor:
62                                Print(L"BGRR");
63                                break;
64                        case PixelBitMask:
65                                Print(L"R:%08x G:%08x B:%08x X:%08x",
66                                        info->PixelInformation.RedMask,
67                                        info->PixelInformation.GreenMask,
68                                        info->PixelInformation.BlueMask,
69                                        info->PixelInformation.ReservedMask);
70                                break;
71                        case PixelBltOnly:
72                                Print(L"(blt only)");
73                                break;
74                        default:
75                                Print(L"(Invalid pixel format)");
76                                break;
77                }
78                Print(L" pitch %d\n", info->PixelsPerScanLine);
79        }
80}
81
82static EFI_STATUS
83SetWatchdog(UINTN seconds)
84{
85        EFI_STATUS rc;
86        rc = uefi_call_wrapper(BS->SetWatchdogTimer, 4, seconds, 0x1ffff,
87                                0, NULL);
88        if (EFI_ERROR(rc)) {
89                CHAR16 Buffer[64];
90                StatusToString(Buffer, rc);
91                Print(L"Bad response from QueryMode: %s (%d)\n", Buffer, rc);
92        }
93        return rc;
94}
95
96EFI_STATUS
97efi_main (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *systab)
98{
99        EFI_STATUS rc;
100        EFI_GRAPHICS_OUTPUT_PROTOCOL *gop;
101
102        InitializeLib(image_handle, systab);
103
104        SetWatchdog(10);
105
106        rc = LibLocateProtocol(&GraphicsOutputProtocol, (void **)&gop);
107        if (EFI_ERROR(rc))
108                return rc;
109
110        print_modes(gop);
111
112        SetWatchdog(0);
113        return EFI_SUCCESS;
114}
Note: See TracBrowser for help on using the repository browser.