From 3524453b5d5eca4ec352f099e0cc8419a1ac778d Mon Sep 17 00:00:00 2001 From: Kevin O'Connor Date: Sun, 29 Jan 2012 11:42:44 -0500 Subject: [PATCH] vgabios: Fix linelength calculations in bochsvga and vbe. Signed-off-by: Kevin O'Connor --- vgasrc/bochsvga.c | 3 ++- vgasrc/vbe.c | 13 ++++--------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/vgasrc/bochsvga.c b/vgasrc/bochsvga.c index e40a1fd..3668832 100644 --- a/vgasrc/bochsvga.c +++ b/vgasrc/bochsvga.c @@ -171,7 +171,8 @@ static int mode_valid(struct vgamode_s *vmode_g) u16 width = GET_GLOBAL(vmode_g->width); u16 height = GET_GLOBAL(vmode_g->height); u8 depth = GET_GLOBAL(vmode_g->depth); - u32 mem = width * height * DIV_ROUND_UP(depth, 8); + u32 mem = (height * DIV_ROUND_UP(width * vga_bpp(vmode_g), 8) + * 4 / stdvga_bpp_factor(vmode_g)); return width <= max_xres && depth <= max_bpp && mem <= max_mem; } diff --git a/vgasrc/vbe.c b/vgasrc/vbe.c index 55ad97e..77b0934 100644 --- a/vgasrc/vbe.c +++ b/vgasrc/vbe.c @@ -108,25 +108,20 @@ vbe_104f01(struct bregs *regs) , SEGOFF(get_global_seg(), (u32)entry_104f05)); int width = GET_GLOBAL(vmode_g->width); int height = GET_GLOBAL(vmode_g->height); - int linesize = width * DIV_ROUND_UP(depth, 8); + int linesize = DIV_ROUND_UP(width * vga_bpp(vmode_g), 8); SET_FARVAR(seg, info->bytes_per_scanline, linesize); SET_FARVAR(seg, info->xres, width); SET_FARVAR(seg, info->yres, height); SET_FARVAR(seg, info->xcharsize, GET_GLOBAL(vmode_g->cwidth)); SET_FARVAR(seg, info->ycharsize, GET_GLOBAL(vmode_g->cheight)); - if (depth == 4) - SET_FARVAR(seg, info->planes, 4); - else - SET_FARVAR(seg, info->planes, 1); + int planes = (depth == 4) ? 4 : 1; + SET_FARVAR(seg, info->planes, planes); SET_FARVAR(seg, info->bits_per_pixel, depth); SET_FARVAR(seg, info->banks, 1); SET_FARVAR(seg, info->mem_model, GET_GLOBAL(vmode_g->memmodel)); SET_FARVAR(seg, info->bank_size, 0); u32 pages = GET_GLOBAL(VBE_total_memory) / (height * linesize); - if (depth == 4) - SET_FARVAR(seg, info->pages, (pages / 4) - 1); - else - SET_FARVAR(seg, info->pages, pages - 1); + SET_FARVAR(seg, info->pages, (pages / planes) - 1); SET_FARVAR(seg, info->reserved0, 1); u8 r_size, r_pos, g_size, g_pos, b_size, b_pos, a_size, a_pos; -- 2.25.1