X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Fcga.c;fp=palacios%2Fsrc%2Fdevices%2Fcga.c;h=6c82c585dffe3e48f4ecfd58bac894cabe7d9adb;hp=ee94f84f343fba49599eb433ec7f9e72722c64b7;hb=c09d92dc256363c742ca2a4bef685ed79575bf22;hpb=3b67b03716ad6bfdda5c95c8a0ef9004da1b3913 diff --git a/palacios/src/devices/cga.c b/palacios/src/devices/cga.c index ee94f84..6c82c58 100644 --- a/palacios/src/devices/cga.c +++ b/palacios/src/devices/cga.c @@ -24,7 +24,7 @@ #include #include -#include +#include @@ -120,6 +120,7 @@ static int video_write_mem(addr_t guest_addr, void * dest, uint_t length, void * struct video_internal * state = (struct video_internal *)dev->private_data; uint_t fb_offset = guest_addr - START_ADDR; uint_t screen_byte_offset = state->screen_offset * BYTES_PER_COL; + uint_t screen_length; PrintDebug("Guest address: %p length = %d, fb_offset=%d, screen_offset=%d\n", (void *)guest_addr, length, fb_offset, screen_byte_offset); @@ -136,7 +137,11 @@ static int video_write_mem(addr_t guest_addr, void * dest, uint_t length, void * if (state->ops) { PrintDebug("\tcalling update_screen()\n"); - state->ops->update_screen(x, y, length, state->private_data); + + /* avoid updates past end of screen */ + screen_length = SCREEN_SIZE - screen_byte_offset; + if (screen_length > length) screen_length = length; + state->ops->update_screen(x, y, screen_length, state->private_data); } }