vgabios: Fix size computation overflow

Remove an overflow computing width x height x bit which does
not fit into a 16 bits. I wrote a routine to multiple these value
and get the size required for framebuffer in segment unit (64k).

Signed-off-by: Frediano Ziglio <frediano.ziglio@citrix.com>
Committed-by: Keir Fraser <keir@xen.org>
This commit is contained in:
Frediano Ziglio committed 2012-05-07 13:37:10 +01:00
1 parent 090e7cbafd
commit ab1f3cd4ab
1 file changed
+28 -2
+28 -2
View File
@@ -742,6 +742,29 @@ no_vbe_flag:
jmp _display_string
ASM_END
ASM_START
_size64:
push bp
mov bp, sp
push dx
; multiply bbp by yres first as results fit in 16bits
; then multiply by xres
mov ax, 8[bp]
mul word 6[bp]
mul word 4[bp]
; divide by 2^19 ceiling result
add ax, #0xffff
adc dx, #7
mov ax, dx
shr ax, #3
pop dx
pop bp
ret
ASM_END
/** Function 00h - Return VBE Controller Information
*
* Input:
@@ -844,9 +867,12 @@ Bit16u *AX;Bit16u ES;Bit16u DI;
do
{
Bit16u size_64k = size64(cur_info->info.XResolution, cur_info->info.YResolution, cur_info->info.BitsPerPixel);
Bit16u max_bpp = dispi_get_max_bpp();
if ((cur_info->info.XResolution <= dispi_get_max_xres()) &&
(cur_info->info.BitsPerPixel <= dispi_get_max_bpp()) &&
(cur_info->info.XResolution * cur_info->info.XResolution * cur_info->info.BitsPerPixel <= vbe_info_block.TotalMemory << 19 )) {
(cur_info->info.BitsPerPixel <= max_bpp) &&
(size_64k <= vbe_info_block.TotalMemory)) {
#ifdef DEBUG
printf("VBE found mode %x => %x\n", cur_info->mode,cur_mode);
#endif
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.