PrintDebug("Getting framebuffer for screen; framebuf=%p, screen_offset=%d, offset=%d, length=%d\n",
state->framebuf, screen_byte_offset, offset, length);
+ V3_ASSERT(screen_byte_offset <= FRAMEBUF_SIZE - SCREEN_SIZE);
+ V3_ASSERT(offset < SCREEN_SIZE);
+ V3_ASSERT(length <= SCREEN_SIZE);
+ V3_ASSERT(offset + length <= SCREEN_SIZE);
memcpy(dst, state->framebuf + screen_byte_offset + offset, length);
return 0;
{
struct vm_device *dev = (struct vm_device *) private_data;
struct cons_state *state = (struct cons_state *) dev->private_data;
- uint_t offset = (x * BYTES_PER_COL) + (y * BYTES_PER_ROW);
+ uint_t offset;
uint_t last_x, last_y;
+ /* avoid out-of-range coordinates */
+ if (x >= NUM_COLS) x = NUM_COLS - 1;
+ if (y >= NUM_ROWS) y = NUM_ROWS - 1;
+ offset = (x * BYTES_PER_COL) + (y * BYTES_PER_ROW);
+
/* unfortunately Palacios sometimes misses some writes,
* but if they are accompanied by a cursor move we may be able to
* detect this