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

Reply via email to