VESA: work around bug in the Bochs VESA BIOS syslinux-3.62-pre10
authorH. Peter Anvin <hpa@zytor.com>
Sun, 17 Feb 2008 03:16:40 +0000 (19:16 -0800)
committerH. Peter Anvin <hpa@zytor.com>
Sun, 17 Feb 2008 03:16:40 +0000 (19:16 -0800)
The Bochs VESA BIOS returns a value other than 1 for the number of
banks in unbanked modes.  Ignore the number of banks if bank_size == 0
(the spec says that for unbanked modes, banks == 1 && bank_size == 0;
for banked modes banks > 1 and bank_size != 0).

com32/lib/sys/vesa/initvesa.c
com32/lib/sys/vesa/vesa.h

index 0ad882b..7032bb9 100644 (file)
@@ -164,13 +164,23 @@ static int vesacon_set_mode(void)
       continue;
 
     /* We don't support multibank (interlaced memory) modes */
-    if ( mi->banks > 1 )
+    /* 
+     *  Note: The Bochs VESA BIOS (vbe.c 1.58 2006/08/19) violates the
+     * specification which states that banks == 1 for unbanked modes;
+     * fortunately it does report bank_size == 0 for those.
+     */
+    if ( mi->banks > 1 && mi->bank_size ) {
+      debug("bad: banks = %d, banksize = %d, pages = %d\r\n",
+           mi->banks, mi->bank_size, mi->image_pages);
       continue;
+    }
 
     /* Must be either a flat-framebuffer mode, or be an acceptable
        paged mode */
-    if ( !(mi->mode_attr & 0x0080) && !vesacon_paged_mode_ok(mi) )
+    if ( !(mi->mode_attr & 0x0080) && !vesacon_paged_mode_ok(mi) ) {
+      debug("bad: invalid paged mode\r\n");
       continue;
+    }
 
     /* Must either be a packed-pixel mode or a direct color mode
        (depending on VESA version ); must be a supported pixel format */
@@ -198,7 +208,7 @@ static int vesacon_set_mode(void)
       pxf = PXF_LE_RGB15_555;
 
     if (pxf < bestpxf) {
-      debug("Best mode so far, pxf = %d\n", pxf);
+      debug("Best mode so far, pxf = %d\r\n", pxf);
 
       /* Best mode so far... */
       bestmode = mode;
@@ -302,7 +312,7 @@ int __vesacon_init(void)
 
   init_text_display();
 
-  debug("Mode set, now drawing at %#p\n", __vesa_info.mi.lfb_ptr);
+  debug("Mode set, now drawing at %#p\r\n", __vesa_info.mi.lfb_ptr);
 
   __vesacon_init_background();
 
index 58f9ba4..e67a310 100644 (file)
@@ -70,7 +70,7 @@ struct vesa_mode_info {
   uint8_t   banks;
   uint8_t   memory_layout;
   uint8_t   bank_size;
-  uint8_t   image_planes;
+  uint8_t   image_pages;
   uint8_t   page_function;
 
   uint8_t   rmask;