[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 3/7] vgabios: Fix size computation overflow
On Fri, 2012-05-04 at 15:12 +0100, Ian Campbell wrote: > On Fri, 2012-05-04 at 13:36 +0100, Frediano Ziglio wrote: > > 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). > > Couldn't this be done in C using a suitably wide temporary variable? > I'd like :( BCC compiler used need some function which are not linked by BIOS. Personally I would switch to something more clever like OpenWatcom but mainly I wrote some small asm. I think bochs code fix the issue providing a asm function used by compiler but seems more hacky than my function. Frediano > > > > Signed-off-by: Frediano Ziglio <frediano.ziglio@xxxxxxxxxx> > > --- > > tools/firmware/vgabios/vbe.c | 30 ++++++++++++++++++++++++++++-- > > 1 files changed, 28 insertions(+), 2 deletions(-) > > > > diff --git a/tools/firmware/vgabios/vbe.c b/tools/firmware/vgabios/vbe.c > > index 3d42216..35d9866 100644 > > --- a/tools/firmware/vgabios/vbe.c > > +++ b/tools/firmware/vgabios/vbe.c > > @@ -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: > > @@ -846,9 +869,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); > > cur_mode++; > > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |