On Tue, Sep 10, 2013 at 07:48:08AM +0200, Gerd Hoffmann wrote:
On Mo, 2013-09-09 at 12:48 -0400, Kevin O'Connor wrote:
That's odd. According to the vbe spec:
The NumberOfImagePages field specifies the "total number minus one (-1)" of complete display images that will fit into the frame buffer memory.
Odd indeed. But maybe nobody bothers too much. Linux (vesafb) for example prints it at boot, but otherwise doesn't use it. Instead it looks at the total_memory value reported by 0x4f00.
The existing code matches the original bochs vbe code and matches what the spec says. I'm surprised win8 would require such an odd value.
I'm surprised too, but that bit really makes the difference.
When reporting the number of pages fitting into memory win8 is fixed at 1024x748, when reporting a single page only win8 offers the whole range of vesa resolutions supported by the vesa bios ...
I have no idea why that is the case though, maybe the root cause it something different and this patch just papers over it.
FYI, I ran some tests on qemu and my e350m1 (with an AMD vgabios). Interestingly, it doesn't look like AMD ever reports a "pages=0".
-Kevin
==================== results =================
Original Cirrus: VESA 2.0 VENDOR: VGABIOS Cirrus extension PRODUCT: VGABIOS Cirrus extension mem=4194304 mode=101 x=640 y=480 d=8 pages=11 mode=110 x=640 y=480 d=15 pages=5 mode=111 x=640 y=480 d=16 pages=5 mode=112 x=640 y=480 d=24 pages=3 mode=103 x=800 y=600 d=8 pages=7 mode=113 x=800 y=600 d=15 pages=3 mode=114 x=800 y=600 d=16 pages=3 mode=115 x=800 y=600 d=24 pages=1 mode=105 x=1024 y=768 d=8 pages=4 mode=116 x=1024 y=768 d=15 pages=1 mode=117 x=1024 y=768 d=16 pages=1 mode=118 x=1024 y=768 d=24 pages=0 mode=107 x=1280 y=1024 d=8 pages=2 mode=119 x=1280 y=1024 d=15 pages=0 mode=11a x=1280 y=1024 d=16 pages=0
SeaVGABIOS cirrus: VESA 3.0 VENDOR: SeaBIOS Developers PRODUCT: SeaBIOS VBE Adapter mem=4194304 mode=101 x=640 y=480 d=8 pages=11 mode=111 x=640 y=480 d=16 pages=5 mode=110 x=640 y=480 d=15 pages=5 mode=112 x=640 y=480 d=24 pages=3 mode=103 x=800 y=600 d=8 pages=7 mode=114 x=800 y=600 d=16 pages=3 mode=113 x=800 y=600 d=15 pages=3 mode=105 x=1024 y=768 d=8 pages=4 mode=117 x=1024 y=768 d=16 pages=1 mode=116 x=1024 y=768 d=15 pages=1 mode=115 x=800 y=600 d=24 pages=1 mode=118 x=1024 y=768 d=24 pages=0 mode=107 x=1280 y=1024 d=8 pages=2 mode=119 x=1280 y=1024 d=15 pages=0 mode=11a x=1280 y=1024 d=16 pages=0 mode=00 x=40 y=25 d=4 pages=0 mode=01 x=40 y=25 d=4 pages=0 mode=02 x=80 y=25 d=4 pages=0 mode=03 x=80 y=25 d=4 pages=0 mode=04 x=320 y=200 d=2 pages=0 mode=05 x=320 y=200 d=2 pages=0 mode=06 x=640 y=200 d=1 pages=0 mode=07 x=80 y=25 d=4 pages=0 mode=0d x=320 y=200 d=4 pages=15 mode=0e x=640 y=200 d=4 pages=15 mode=0f x=640 y=350 d=1 pages=15 mode=10 x=640 y=350 d=4 pages=15 mode=11 x=640 y=480 d=1 pages=15 mode=12 x=640 y=480 d=4 pages=15 mode=13 x=320 y=200 d=8 pages=63 mode=6a x=800 y=600 d=4 pages=15
Original bochsvga: VESA 2.0 VENDOR: Bochs/Plex86 Developers PRODUCT: Bochs/Plex86 VBE Adapter mem=16777216 mode=100 x=640 y=400 d=8 pages=64 mode=101 x=640 y=480 d=8 pages=53 mode=102 x=800 y=600 d=4 pages=68 mode=103 x=800 y=600 d=8 pages=33 mode=104 x=1024 y=768 d=4 pages=41 mode=105 x=1024 y=768 d=8 pages=20 mode=106 x=1280 y=1024 d=4 pages=24 mode=107 x=1280 y=1024 d=8 pages=11 mode=10d x=320 y=200 d=15 pages=130 mode=10e x=320 y=200 d=16 pages=130 mode=10f x=320 y=200 d=24 pages=86 mode=110 x=640 y=480 d=15 pages=26 mode=111 x=640 y=480 d=16 pages=26 mode=112 x=640 y=480 d=24 pages=17 mode=113 x=800 y=600 d=15 pages=16 mode=114 x=800 y=600 d=16 pages=16 mode=115 x=800 y=600 d=24 pages=10 mode=116 x=1024 y=768 d=15 pages=9 mode=117 x=1024 y=768 d=16 pages=9 mode=118 x=1024 y=768 d=24 pages=6 mode=119 x=1280 y=1024 d=15 pages=5 mode=11a x=1280 y=1024 d=16 pages=5 mode=11b x=1280 y=1024 d=24 pages=3 mode=11c x=1600 y=1200 d=8 pages=7 mode=11d x=1600 y=1200 d=15 pages=3 mode=11e x=1600 y=1200 d=16 pages=3 mode=11f x=1600 y=1200 d=24 pages=1 mode=140 x=320 y=200 d=32 pages=64 mode=141 x=640 y=400 d=32 pages=15 mode=142 x=640 y=480 d=32 pages=12 mode=143 x=800 y=600 d=32 pages=7 mode=144 x=1024 y=768 d=32 pages=4 mode=145 x=1280 y=1024 d=32 pages=2 mode=146 x=320 y=200 d=8 pages=5 mode=147 x=1600 y=1200 d=32 pages=1 mode=148 x=1152 y=864 d=8 pages=15 mode=149 x=1152 y=864 d=15 pages=7 mode=14a x=1152 y=864 d=16 pages=7 mode=14b x=1152 y=864 d=24 pages=4 mode=14c x=1152 y=864 d=32 pages=3 mode=178 x=1280 y=800 d=16 pages=7 mode=179 x=1280 y=800 d=24 pages=4 mode=17a x=1280 y=800 d=32 pages=3 mode=17b x=1280 y=960 d=16 pages=5 mode=17c x=1280 y=960 d=24 pages=3 mode=17d x=1280 y=960 d=32 pages=2 mode=17e x=1440 y=900 d=16 pages=5 mode=17f x=1440 y=900 d=24 pages=3 mode=180 x=1440 y=900 d=32 pages=2 mode=181 x=1400 y=1050 d=16 pages=4 mode=182 x=1400 y=1050 d=24 pages=2 mode=183 x=1400 y=1050 d=32 pages=1 mode=184 x=1680 y=1050 d=16 pages=3 mode=185 x=1680 y=1050 d=24 pages=2 mode=186 x=1680 y=1050 d=32 pages=1 mode=187 x=1920 y=1200 d=16 pages=2 mode=188 x=1920 y=1200 d=24 pages=1 mode=189 x=1920 y=1200 d=32 pages=0 mode=18a x=2560 y=1600 d=16 pages=1 mode=18b x=2560 y=1600 d=24 pages=0 mode=18c x=2560 y=1600 d=32 pages=0
SeaVGABIOS bochsvga: VESA 3.0 VENDOR: SeaBIOS Developers PRODUCT: SeaBIOS VBE Adapter mem=16777216 mode=100 x=640 y=400 d=8 pages=63 mode=101 x=640 y=480 d=8 pages=50 mode=102 x=800 y=600 d=4 pages=63 mode=103 x=800 y=600 d=8 pages=31 mode=104 x=1024 y=768 d=4 pages=31 mode=105 x=1024 y=768 d=8 pages=20 mode=106 x=1280 y=1024 d=4 pages=20 mode=107 x=1280 y=1024 d=8 pages=11 mode=10d x=320 y=200 d=15 pages=127 mode=10e x=320 y=200 d=16 pages=127 mode=10f x=320 y=200 d=24 pages=84 mode=110 x=640 y=480 d=15 pages=24 mode=111 x=640 y=480 d=16 pages=24 mode=112 x=640 y=480 d=24 pages=16 mode=113 x=800 y=600 d=15 pages=16 mode=114 x=800 y=600 d=16 pages=16 mode=115 x=800 y=600 d=24 pages=10 mode=116 x=1024 y=768 d=15 pages=9 mode=117 x=1024 y=768 d=16 pages=9 mode=118 x=1024 y=768 d=24 pages=6 mode=119 x=1280 y=1024 d=15 pages=5 mode=11a x=1280 y=1024 d=16 pages=5 mode=11b x=1280 y=1024 d=24 pages=3 mode=11c x=1600 y=1200 d=8 pages=7 mode=11d x=1600 y=1200 d=15 pages=3 mode=11e x=1600 y=1200 d=16 pages=3 mode=11f x=1600 y=1200 d=24 pages=1 mode=140 x=320 y=200 d=32 pages=63 mode=141 x=640 y=400 d=32 pages=15 mode=142 x=640 y=480 d=32 pages=12 mode=143 x=800 y=600 d=32 pages=7 mode=144 x=1024 y=768 d=32 pages=4 mode=145 x=1280 y=1024 d=32 pages=2 mode=146 x=320 y=200 d=8 pages=255 mode=147 x=1600 y=1200 d=32 pages=1 mode=148 x=1152 y=864 d=8 pages=15 mode=149 x=1152 y=864 d=15 pages=7 mode=14a x=1152 y=864 d=16 pages=7 mode=14b x=1152 y=864 d=24 pages=4 mode=14c x=1152 y=864 d=32 pages=3 mode=178 x=1280 y=800 d=16 pages=7 mode=179 x=1280 y=800 d=24 pages=4 mode=17a x=1280 y=800 d=32 pages=3 mode=17b x=1280 y=960 d=16 pages=5 mode=17c x=1280 y=960 d=24 pages=3 mode=17d x=1280 y=960 d=32 pages=2 mode=17e x=1440 y=900 d=16 pages=5 mode=17f x=1440 y=900 d=24 pages=3 mode=180 x=1440 y=900 d=32 pages=2 mode=181 x=1400 y=1050 d=16 pages=4 mode=182 x=1400 y=1050 d=24 pages=2 mode=183 x=1400 y=1050 d=32 pages=1 mode=184 x=1680 y=1050 d=16 pages=3 mode=185 x=1680 y=1050 d=24 pages=2 mode=186 x=1680 y=1050 d=32 pages=1 mode=187 x=1920 y=1200 d=16 pages=2 mode=188 x=1920 y=1200 d=24 pages=1 mode=189 x=1920 y=1200 d=32 pages=0 mode=18a x=2560 y=1600 d=16 pages=1 mode=18b x=2560 y=1600 d=24 pages=0 mode=18c x=2560 y=1600 d=32 pages=0 mode=00 x=40 y=25 d=4 pages=0 mode=01 x=40 y=25 d=4 pages=0 mode=02 x=80 y=25 d=4 pages=0 mode=03 x=80 y=25 d=4 pages=0 mode=04 x=320 y=200 d=2 pages=0 mode=05 x=320 y=200 d=2 pages=0 mode=06 x=640 y=200 d=1 pages=0 mode=07 x=80 y=25 d=4 pages=0 mode=0d x=320 y=200 d=4 pages=63 mode=0e x=640 y=200 d=4 pages=63 mode=0f x=640 y=350 d=1 pages=63 mode=10 x=640 y=350 d=4 pages=63 mode=11 x=640 y=480 d=1 pages=63 mode=12 x=640 y=480 d=4 pages=63 mode=13 x=320 y=200 d=8 pages=255 mode=6a x=800 y=600 d=4 pages=63
01.131: VESA 3.0 01.132: VENDOR: (C) 1988-2010, AMD Technologies Inc. 01.131: PRODUCT: WRESTLER mem=16777216 01.132: mode=100 x=640 y=400 d=8 pages=63 01.132: mode=101 x=640 y=480 d=8 pages=50 01.132: mode=103 x=800 y=600 d=8 pages=31 01.132: mode=105 x=1024 y=768 d=8 pages=18 01.133: mode=107 x=1280 y=1024 d=8 pages=11 01.133: mode=110 x=640 y=480 d=16 pages=24 01.133: mode=111 x=640 y=480 d=16 pages=24 01.133: mode=113 x=800 y=600 d=16 pages=16 01.134: mode=114 x=800 y=600 d=16 pages=16 01.134: mode=116 x=1024 y=768 d=16 pages=9 01.134: mode=117 x=1024 y=768 d=16 pages=9 01.134: mode=119 x=1280 y=1024 d=16 pages=5 01.135: mode=11a x=1280 y=1024 d=16 pages=5 01.135: mode=10d x=320 y=200 d=16 pages=127 01.135: mode=10e x=320 y=200 d=16 pages=127 01.135: mode=120 x=320 y=200 d=32 pages=63 01.136: mode=193 x=320 y=240 d=8 pages=127 01.136: mode=195 x=320 y=240 d=16 pages=84 01.136: mode=196 x=320 y=240 d=32 pages=50 01.136: mode=1b3 x=512 y=384 d=8 pages=63 01.137: mode=1b5 x=512 y=384 d=16 pages=35 01.137: mode=1b6 x=512 y=384 d=32 pages=18 01.137: mode=1c3 x=640 y=350 d=8 pages=63 01.137: mode=1c5 x=640 y=350 d=16 pages=35 01.138: mode=1c6 x=640 y=350 d=32 pages=17 01.138: mode=133 x=720 y=400 d=8 pages=50 01.138: mode=135 x=720 y=400 d=16 pages=27 01.138: mode=136 x=720 y=400 d=32 pages=13 01.139: mode=153 x=1152 y=864 d=8 pages=15 01.139: mode=155 x=1152 y=864 d=16 pages=7 01.139: mode=156 x=1152 y=864 d=32 pages=3 01.139: mode=163 x=1280 y=960 d=8 pages=12 01.140: mode=165 x=1280 y=960 d=16 pages=5 01.140: mode=166 x=1280 y=960 d=32 pages=2 01.140: mode=121 x=640 y=480 d=32 pages=12 01.140: mode=122 x=800 y=600 d=32 pages=7 01.140: mode=123 x=1024 y=768 d=32 pages=4 01.140: mode=124 x=1280 y=1024 d=32 pages=2 01.141: mode=143 x=1400 y=1050 d=8 pages=10 01.141: mode=145 x=1400 y=1050 d=16 pages=4 01.141: mode=146 x=1400 y=1050 d=32 pages=1 01.142: mode=173 x=1600 y=1200 d=8 pages=7 01.142: mode=175 x=1600 y=1200 d=16 pages=3 01.142: mode=176 x=1600 y=1200 d=32 pages=1 01.142: mode=183 x=1792 y=1344 d=8 pages=5 01.143: mode=185 x=1792 y=1344 d=16 pages=2 01.143: mode=186 x=1792 y=1344 d=32 pages=1 01.143: mode=1d3 x=1856 y=1392 d=8 pages=5 01.143: mode=1d5 x=1856 y=1392 d=16 pages=2 01.144: mode=1d6 x=1856 y=1392 d=32 pages=1 01.144: mode=1e3 x=1920 y=1440 d=8 pages=4 01.144: mode=1e5 x=1920 y=1440 d=16 pages=2 01.144: mode=1e6 x=1920 y=1440 d=32 pages=1
==================== diff =================
diff --git a/src/bootsplash.c b/src/bootsplash.c index bd91102..4f94b08 100644 --- a/src/bootsplash.c +++ b/src/bootsplash.c @@ -34,6 +34,62 @@ call16_int10(struct bregs *br) * VGA text / graphics console ****************************************************************/
+static void +dump_videomodes(void) +{ + struct vbe_info *vesa_info = malloc_tmplow(sizeof(*vesa_info)); + struct vbe_mode_info *mode_info = malloc_tmplow(sizeof(*mode_info)); + if (!vesa_info || !mode_info) { + warn_noalloc(); + goto done; + } + + /* Check whether we have a VESA 2.0 compliant BIOS */ + memset(vesa_info, 0, sizeof(struct vbe_info)); + vesa_info->signature = VBE2_SIGNATURE; + struct bregs br; + memset(&br, 0, sizeof(br)); + br.ax = 0x4f00; + br.di = FLATPTR_TO_OFFSET(vesa_info); + br.es = FLATPTR_TO_SEG(vesa_info); + call16_int10(&br); + if (vesa_info->signature != VESA_SIGNATURE) { + dprintf(1,"No VBE2 found.\n"); + goto done; + } + + /* Print some debugging information about our card. */ + char *vendor = SEGOFF_TO_FLATPTR(vesa_info->oem_vendor_string); + char *product = SEGOFF_TO_FLATPTR(vesa_info->oem_product_string); + dprintf(1, "VESA %d.%d\nVENDOR: %s\nPRODUCT: %s mem=%d\n", + vesa_info->version>>8, vesa_info->version&0xff, + vendor, product, vesa_info->total_memory * 64*1024); + + u16 *videomodes = SEGOFF_TO_FLATPTR(vesa_info->video_mode); + for (;; videomodes++) { + u16 videomode = *videomodes; + if (videomode == 0xffff) + return; + struct bregs br; + memset(&br, 0, sizeof(br)); + br.ax = 0x4f01; + br.cx = videomode; + br.di = FLATPTR_TO_OFFSET(mode_info); + br.es = FLATPTR_TO_SEG(mode_info); + call16_int10(&br); + if (br.ax != 0x4f) { + dprintf(1, "get_mode failed.\n"); + continue; + } + dprintf(1, "mode=%02x x=%d y=%d d=%d pages=%d\n", videomode + , mode_info->xres, mode_info->yres, mode_info->bits_per_pixel + , mode_info->pages); + } +done: + free(vesa_info); + free(mode_info); +} + void enable_vga_console(void) { @@ -48,6 +104,7 @@ enable_vga_console(void) // Write to screen. printf("SeaBIOS (version %s)\n", VERSION); display_uuid(); + dump_videomodes(); }
static int