boot - Abort boot if EFI-framebuffer format is unsupported.
authorImre Vadász <imre@vdsz.com>
Wed, 25 Oct 2017 19:11:08 +0000 (21:11 +0200)
committerImre Vadász <imre@vdsz.com>
Wed, 25 Oct 2017 20:55:05 +0000 (22:55 +0200)
* At the moment we support 24-bit and 32-bit pixel formats, make sure we
  notify the user and abort booting, when encountering an unsupported
  framebuffer format.

sys/boot/efi/loader/arch/x86_64/framebuffer.c
sys/boot/efi/loader/arch/x86_64/framebuffer.h
sys/boot/efi/loader/bootinfo.c

index 8bfcd03..f323cc2 100644 (file)
@@ -43,8 +43,8 @@ static EFI_GUID gop_guid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID;
 static EFI_GUID pciio_guid = EFI_PCI_IO_PROTOCOL_GUID;
 static EFI_GUID uga_guid = EFI_UGA_DRAW_PROTOCOL_GUID;
 
-static u_int
-efifb_color_depth(struct efi_fb *efifb)
+u_int
+efi_framebuffer_bpp(struct efi_fb *efifb)
 {
        uint32_t mask;
        u_int depth;
@@ -448,7 +448,7 @@ print_efifb(int mode, struct efi_fb *efifb, int verbose)
 
        if (mode >= 0)
                printf("mode %d: ", mode);
-       depth = efifb_color_depth(efifb);
+       depth = efi_framebuffer_bpp(efifb);
        printf("%ux%ux%u, stride=%u", efifb->fb_width, efifb->fb_height,
            depth, efifb->fb_stride);
        if (verbose) {
index 5977b37..6e22160 100644 (file)
@@ -33,4 +33,7 @@
 
 int    efi_find_framebuffer(struct efi_fb *efifb);
 
+/* Guess bits-per-pixel from the color masks. */
+u_int  efi_framebuffer_bpp(struct efi_fb *efifb);
+
 #endif /* _EFIFB_H_ */
index 6a03b93..6cd13dd 100644 (file)
@@ -244,6 +244,7 @@ bi_load_efi_data(struct preloaded_file *kfp)
 
 #if defined(__x86_64__)
        struct efi_fb efifb;
+       int colordepth;
 
        if (efi_find_framebuffer(&efifb) == 0) {
                printf("EFI framebuffer information:\n");
@@ -256,7 +257,15 @@ bi_load_efi_data(struct preloaded_file *kfp)
                    efifb.fb_mask_red, efifb.fb_mask_green, efifb.fb_mask_blue,
                    efifb.fb_mask_reserved);
 
-               file_addmetadata(kfp, MODINFOMD_EFI_FB, sizeof(efifb), &efifb);
+               colordepth = efi_framebuffer_bpp(&efifb);
+               if (colordepth != 24 && colordepth != 32) {
+                       printf("Unsupported framebuffer format: depth=%d\n",
+                           colordepth);
+                       return (EINVAL);
+               } else {
+                       file_addmetadata(kfp, MODINFOMD_EFI_FB, sizeof(efifb),
+                           &efifb);
+               }
        }
 #endif