This function is useful for enabling KVM support in VMware VGA. Signed-off-by: Anthony Liguori <[EMAIL PROTECTED]>
diff --git a/qemu/hw/vga.c b/qemu/hw/vga.c index 222a39c..1cfc154 100644 --- a/qemu/hw/vga.c +++ b/qemu/hw/vga.c @@ -1813,6 +1813,36 @@ typedef struct PCIVGAState { VGAState vga_state; } PCIVGAState; +void vga_update_vram_mapping(VGAState *s, unsigned long vga_ram_begin, + unsigned long vga_ram_end) +{ + void *vram_pointer, *old_vram; + + if (vga_ram_begin == s->map_addr && + vga_ram_end == s->map_end) { + return; + } + + if (s->map_addr && s->map_end) + unset_vram_mapping(s->map_addr, s->map_end); + + vram_pointer = set_vram_mapping(vga_ram_begin, vga_ram_end); + if (!vram_pointer) { + fprintf(stderr, "set_vram_mapping failed\n"); + s->map_addr = s->map_end = 0; + } + else { + old_vram = vga_update_vram((VGAState *)s, vram_pointer, + VGA_RAM_SIZE); + if (s->map_addr && s->map_end) + munmap(old_vram, s->map_end - s->map_addr); + else + qemu_free(old_vram); + s->map_addr = vga_ram_begin; + s->map_end = vga_ram_end; + } +} + static void vga_map(PCIDevice *pci_dev, int region_num, uint32_t addr, uint32_t size, int type) { @@ -1822,37 +1852,8 @@ static void vga_map(PCIDevice *pci_dev, int region_num, cpu_register_physical_memory(addr, s->bios_size, s->bios_offset); } else { cpu_register_physical_memory(addr, s->vram_size, s->vram_offset); - if (kvm_enabled()) { - unsigned long vga_ram_begin, vga_ram_end; - void *vram_pointer, *old_vram; - - vga_ram_begin = addr; - vga_ram_end = addr + VGA_RAM_SIZE; - - if (vga_ram_begin == s->map_addr && - vga_ram_end == s->map_end) { - return; - } - - if (s->map_addr && s->map_end) - unset_vram_mapping(s->map_addr, s->map_end); - - vram_pointer = set_vram_mapping(vga_ram_begin, vga_ram_end); - if (!vram_pointer) { - fprintf(stderr, "set_vram_mapping failed\n"); - s->map_addr = s->map_end = 0; - } - else { - old_vram = vga_update_vram((VGAState *)s, vram_pointer, - VGA_RAM_SIZE); - if (s->map_addr && s->map_end) - munmap(old_vram, s->map_end - s->map_addr); - else - qemu_free(old_vram); - s->map_addr = vga_ram_begin; - s->map_end = vga_ram_end; - } - } + if (kvm_enabled()) + vga_update_vram_mapping(s, addr, addr + VGA_RAM_SIZE); } } diff --git a/qemu/hw/vga_int.h b/qemu/hw/vga_int.h index 196f8df..8d29205 100644 --- a/qemu/hw/vga_int.h +++ b/qemu/hw/vga_int.h @@ -192,5 +192,7 @@ void *set_vram_mapping(unsigned long begin, unsigned long end); int unset_vram_mapping(unsigned long begin, unsigned long end); void *vga_update_vram(VGAState *s, void *vga_ram_base, int vga_ram_size); +void vga_update_vram_mapping(VGAState *s, unsigned long vga_ram_begin, + unsigned long vga_ram_end); extern const uint8_t sr_mask[8]; extern const uint8_t gr_mask[16]; ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ kvm-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel