# fix VMware VGA driver depth calculation error, which may cause segmentation fault # # ktian1, 06/29/2010 Index: qemu-0.13.0/console.h =================================================================== --- qemu-0.13.0.orig/console.h 2011-01-17 16:41:58.000000000 +0800 +++ qemu-0.13.0/console.h 2011-01-17 16:48:00.000000000 +0800 @@ -171,6 +171,12 @@ void (*free_displaysurface)(DisplaySurface *surface); }; +struct DisplayPostCallback { + void (*postcall) (void *); + void *parm; + struct DisplayPostCallback *next; +}; + struct DisplayState { struct DisplaySurface *surface; void *opaque; @@ -178,6 +184,7 @@ struct DisplayAllocator* allocator; struct DisplayChangeListener* listeners; + struct DisplayPostCallback* postcalls; void (*mouse_set)(int x, int y, int on); void (*cursor_define)(QEMUCursor *cursor); @@ -229,6 +236,12 @@ ds->listeners = dcl; } +static inline void register_displaypostcallback(DisplayState *ds, DisplayPostCallback *dpc) +{ + dpc->next = ds->postcalls; + ds->postcalls = dpc; +} + static inline void dpy_update(DisplayState *s, int x, int y, int w, int h) { struct DisplayChangeListener *dcl = s->listeners; Index: qemu-0.13.0/hw/vmware_vga.c =================================================================== --- qemu-0.13.0.orig/hw/vmware_vga.c 2011-01-17 16:42:36.000000000 +0800 +++ qemu-0.13.0/hw/vmware_vga.c 2011-01-17 16:48:00.000000000 +0800 @@ -957,8 +957,9 @@ } } -static void vmsvga_reset(struct vmsvga_state_s *s) +static void vmsvga_reset(void *parm) { + struct vmsvga_state_s *s = (struct vmsvga_state_s *)parm; s->index = 0; s->enable = 0; s->config = 0; @@ -1163,6 +1164,8 @@ static void vmsvga_init(struct vmsvga_state_s *s, int vga_ram_size) { + DisplayPostCallback *dpc; + s->scratch_size = SVGA_SCRATCH_SIZE; s->scratch = qemu_malloc(s->scratch_size * 4); @@ -1190,7 +1193,10 @@ rom_add_vga(VGABIOS_FILENAME); - vmsvga_reset(s); + dpc = qemu_mallocz(sizeof(DisplayPostCallback)); + dpc->postcall = vmsvga_reset; + dpc->parm = s; + register_displaypostcallback(s->vga.ds, dpc); } static void pci_vmsvga_map_ioport(PCIDevice *pci_dev, int region_num, Index: qemu-0.13.0/qemu-common.h =================================================================== --- qemu-0.13.0.orig/qemu-common.h 2011-01-17 16:41:58.000000000 +0800 +++ qemu-0.13.0/qemu-common.h 2011-01-17 16:48:00.000000000 +0800 @@ -205,6 +205,7 @@ typedef struct DisplayChangeListener DisplayChangeListener; typedef struct DisplaySurface DisplaySurface; typedef struct DisplayAllocator DisplayAllocator; +typedef struct DisplayPostCallback DisplayPostCallback; typedef struct PixelFormat PixelFormat; typedef struct TextConsole TextConsole; typedef TextConsole QEMUConsole; Index: qemu-0.13.0/vl.c =================================================================== --- qemu-0.13.0.orig/vl.c 2011-01-17 16:42:36.000000000 +0800 +++ qemu-0.13.0/vl.c 2011-01-17 16:48:00.000000000 +0800 @@ -1814,6 +1814,7 @@ char boot_devices[33] = "cad"; /* default to HD->floppy->CD-ROM */ DisplayState *ds; DisplayChangeListener *dcl; + DisplayPostCallback *dpc; int cyls, heads, secs, translation; QemuOpts *hda_opts = NULL, *opts; int optind; @@ -2960,6 +2961,13 @@ } dpy_resize(ds); + dpc = ds->postcalls; + while (dpc != NULL) { + if (dpc->postcall != NULL) + dpc->postcall(dpc->parm); + dpc = dpc->next; + } + dcl = ds->listeners; while (dcl != NULL) { if (dcl->dpy_refresh != NULL) {