From: Avi Kivity <[EMAIL PROTECTED]> Instead of juggling with vga-allocated memory when logging memory, use the regular memory allocated by qemu from phys_ram_base, and use the slot management api to map it into kvm and turn on logging if the current mode allows this.
Fixes the std-vga regression. Signed-off-by: Avi Kivity <[EMAIL PROTECTED]> diff --git a/qemu/hw/cirrus_vga.c b/qemu/hw/cirrus_vga.c index 6739906..922a9f9 100644 --- a/qemu/hw/cirrus_vga.c +++ b/qemu/hw/cirrus_vga.c @@ -2628,40 +2628,34 @@ static CPUWriteMemoryFunc *cirrus_linear_bitblt_write[3] = { cirrus_linear_bitblt_writel, }; -void *set_vram_mapping(unsigned long begin, unsigned long end) +void set_vram_mapping(void *ptr, unsigned long begin, unsigned long end) { - void *vram_pointer = NULL; - /* align begin and end address */ begin = begin & TARGET_PAGE_MASK; end = begin + VGA_RAM_SIZE; end = (end + TARGET_PAGE_SIZE -1 ) & TARGET_PAGE_MASK; - if (kvm_enabled()) - vram_pointer = kvm_cpu_create_phys_mem(begin, end - begin, 1, 1); - - if (vram_pointer == NULL) { - printf("set_vram_mapping: cannot allocate memory: %m\n"); - return NULL; + if (kvm_enabled()) { + kvm_cpu_register_physical_memory(begin, end - begin, + ptr - (void *)phys_ram_base); + kvm_qemu_log_memory(begin, end - begin, 1); } - - memset(vram_pointer, 0, end - begin); - - return vram_pointer; } -int unset_vram_mapping(unsigned long begin, unsigned long end) +void unset_vram_mapping(void *ptr, unsigned long begin, unsigned long end) { /* align begin and end address */ end = begin + VGA_RAM_SIZE; begin = begin & TARGET_PAGE_MASK; end = (end + TARGET_PAGE_SIZE -1 ) & TARGET_PAGE_MASK; - if (kvm_enabled()) - kvm_cpu_destroy_phys_mem(begin, end - begin); - - return 0; + if (kvm_enabled()) { + kvm_qemu_log_memory(begin, end - begin, 0); + kvm_cpu_unregister_physical_memory(begin, end - begin, + ptr - (void *)phys_ram_base); + } } + #ifdef CONFIG_X86 static void kvm_update_vga_alias(CirrusVGAState *s, int ok, int bank) { @@ -2720,17 +2714,8 @@ static void cirrus_update_memory_access(CirrusVGAState *s) if (mode < 4 || mode > 5 || ((s->gr[0x0B] & 0x4) == 0)) { if (kvm_enabled() && s->cirrus_lfb_addr && s->cirrus_lfb_end && !s->map_addr) { - void *vram_pointer, *old_vram; - - vram_pointer = set_vram_mapping(s->cirrus_lfb_addr, - s->cirrus_lfb_end); - if (!vram_pointer) - fprintf(stderr, "NULL vram_pointer\n"); - else { - old_vram = vga_update_vram((VGAState *)s, vram_pointer, - VGA_RAM_SIZE); - qemu_free(old_vram); - } + set_vram_mapping(s->vram_ptr, + s->cirrus_lfb_addr, s->cirrus_lfb_end); s->map_addr = s->cirrus_lfb_addr; s->map_end = s->cirrus_lfb_end; } @@ -2749,16 +2734,9 @@ static void cirrus_update_memory_access(CirrusVGAState *s) generic_io: if (kvm_enabled() && s->cirrus_lfb_addr && s->cirrus_lfb_end && s->map_addr) { - int error; - void *old_vram = NULL; - - error = unset_vram_mapping(s->cirrus_lfb_addr, - s->cirrus_lfb_end); - if (!error) - old_vram = vga_update_vram((VGAState *)s, NULL, - VGA_RAM_SIZE); - if (old_vram) - munmap(old_vram, s->map_end - s->map_addr); + unset_vram_mapping(s->vram_ptr, + s->cirrus_lfb_addr, + s->cirrus_lfb_end); s->map_addr = s->map_end = 0; } s->cirrus_linear_write[0] = cirrus_linear_writeb; diff --git a/qemu/hw/vga.c b/qemu/hw/vga.c index 96ccd46..1cb8cee 100644 --- a/qemu/hw/vga.c +++ b/qemu/hw/vga.c @@ -2129,36 +2129,6 @@ 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) { @@ -2168,8 +2138,10 @@ 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()) - vga_update_vram_mapping(s, addr, addr + VGA_RAM_SIZE); + if (kvm_enabled()) { + kvm_qemu_log_memory(addr, VGA_RAM_SIZE, 1); + s->map_addr = addr; + } } } @@ -2336,10 +2308,7 @@ void vga_common_init(VGAState *s, DisplayState *ds, uint8_t *vga_ram_base, vga_reset(s); - if (kvm_enabled()) - s->vram_ptr = qemu_malloc(vga_ram_size); - else - s->vram_ptr = vga_ram_base; + s->vram_ptr = vga_ram_base; s->vram_offset = vga_ram_offset; s->vram_size = vga_ram_size; s->ds = ds; diff --git a/qemu/hw/vga_int.h b/qemu/hw/vga_int.h index c13adf9..7d1ec03 100644 --- a/qemu/hw/vga_int.h +++ b/qemu/hw/vga_int.h @@ -215,8 +215,8 @@ void vga_draw_cursor_line_32(uint8_t *d1, const uint8_t *src1, unsigned int color_xor); /* let kvm create vga memory */ -void *set_vram_mapping(unsigned long begin, unsigned long end); -int unset_vram_mapping(unsigned long begin, unsigned long end); +void set_vram_mapping(void *mem, unsigned long begin, unsigned long end); +void unset_vram_mapping(void *mem, 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, -- To unsubscribe from this list: send the line "unsubscribe kvm-commits" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html