[SeaBIOS] [PATCH] vgabios: Reorder video modes to work around a Windows bug

Kevin O'Connor kevin at koconnor.net
Wed Oct 19 01:29:24 CEST 2016


On Mon, Oct 17, 2016 at 05:53:04PM +0200, Ladi Prosek wrote:
> Windows Server 2016 and Windows 10 RS1 come with a bug in its blue screen
> of death rendering logic which prevents it from generating crash dumps.
> 
> The bug does not manifest if Windows sees a suitable 32 bpp video mode
> before a suitable 24 bpp video mode in the list of modes returned from
> vgabios. This commit moves all 32 bpp modes to the front of the list to
> make sure that this is always the case.
> 
> Signed-off-by: Ladi Prosek <lprosek at redhat.com>
> ---
>  vgasrc/bochsvga.c | 39 ++++++++++++++++++++-------------------
>  1 file changed, 20 insertions(+), 19 deletions(-)
> 
> diff --git a/vgasrc/bochsvga.c b/vgasrc/bochsvga.c
> index ec5d101..c5d1511 100644
> --- a/vgasrc/bochsvga.c
> +++ b/vgasrc/bochsvga.c
> @@ -28,6 +28,25 @@ static struct bochsvga_mode
>      u16 mode;
>      struct vgamode_s info;
>  } bochsvga_modes[] VAR16 = {
> +    /* 32 bpp BOCHS modes */
> +    { 0x140, { MM_DIRECT, 320,  200,  32, 8, 16, SEG_GRAPH } },
> +    { 0x141, { MM_DIRECT, 640,  400,  32, 8, 16, SEG_GRAPH } },
> +    { 0x142, { MM_DIRECT, 640,  480,  32, 8, 16, SEG_GRAPH } },
> +    { 0x143, { MM_DIRECT, 800,  600,  32, 8, 16, SEG_GRAPH } },
> +    { 0x144, { MM_DIRECT, 1024, 768,  32, 8, 16, SEG_GRAPH } },
> +    { 0x145, { MM_DIRECT, 1280, 1024, 32, 8, 16, SEG_GRAPH } },
> +    { 0x147, { MM_DIRECT, 1600, 1200, 32, 8, 16, SEG_GRAPH } },
> +    { 0x14c, { MM_DIRECT, 1152, 864,  32, 8, 16, SEG_GRAPH } },
> +    { 0x177, { MM_DIRECT, 1280, 768,  32, 8, 16, SEG_GRAPH } },
> +    { 0x17a, { MM_DIRECT, 1280, 800,  32, 8, 16, SEG_GRAPH } },
> +    { 0x17d, { MM_DIRECT, 1280, 960,  32, 8, 16, SEG_GRAPH } },
> +    { 0x180, { MM_DIRECT, 1440, 900,  32, 8, 16, SEG_GRAPH } },
> +    { 0x183, { MM_DIRECT, 1400, 1050, 32, 8, 16, SEG_GRAPH } },
> +    { 0x186, { MM_DIRECT, 1680, 1050, 32, 8, 16, SEG_GRAPH } },
> +    { 0x189, { MM_DIRECT, 1920, 1200, 32, 8, 16, SEG_GRAPH } },
> +    { 0x18c, { MM_DIRECT, 2560, 1600, 32, 8, 16, SEG_GRAPH } },
> +    { 0x18f, { MM_DIRECT, 1280, 720,  32, 8, 16, SEG_GRAPH } },
> +    { 0x192, { MM_DIRECT, 1920, 1080, 32, 8, 16, SEG_GRAPH } },
>      /* standard modes */
>      { 0x100, { MM_PACKED, 640,  400,  8,  8, 16, SEG_GRAPH } },
>      { 0x101, { MM_PACKED, 640,  480,  8,  8, 16, SEG_GRAPH } },
> @@ -56,50 +75,32 @@ static struct bochsvga_mode
>      { 0x11D, { MM_DIRECT, 1600, 1200, 15, 8, 16, SEG_GRAPH } },
>      { 0x11E, { MM_DIRECT, 1600, 1200, 16, 8, 16, SEG_GRAPH } },
>      { 0x11F, { MM_DIRECT, 1600, 1200, 24, 8, 16, SEG_GRAPH } },
> -    /* BOCHS modes */
> -    { 0x140, { MM_DIRECT, 320,  200,  32, 8, 16, SEG_GRAPH } },
> -    { 0x141, { MM_DIRECT, 640,  400,  32, 8, 16, SEG_GRAPH } },
> -    { 0x142, { MM_DIRECT, 640,  480,  32, 8, 16, SEG_GRAPH } },
> -    { 0x143, { MM_DIRECT, 800,  600,  32, 8, 16, SEG_GRAPH } },
> -    { 0x144, { MM_DIRECT, 1024, 768,  32, 8, 16, SEG_GRAPH } },
> -    { 0x145, { MM_DIRECT, 1280, 1024, 32, 8, 16, SEG_GRAPH } },
> +    /* 8, 15, 16, and 24 bpp BOCHS modes */
>      { 0x146, { MM_PACKED, 320,  200,  8,  8, 16, SEG_GRAPH } },
> -    { 0x147, { MM_DIRECT, 1600, 1200, 32, 8, 16, SEG_GRAPH } },

Thanks.  Instead of moving all of the 32bit modes to the top of the
list, can the 32bit modes be kept next to the other modes with the
same resolution, just above the 24bpp mode?

Also, all of the mode numbers above 0x11b are arbitrary, so it would
be preferable to renumber the mode numbers as lines are moved.

We were about to make a SeaBIOS release - does this need to go into
that release?

-Kevin



More information about the SeaBIOS mailing list