source: trunk/packages/xen-3.1/xen-3.1/tools/ioemu/patches/shared-vram @ 34

Last change on this file since 34 was 34, checked in by hartmans, 18 years ago

Add xen and xen-common

File size: 11.1 KB
Line 
1Index: ioemu/hw/cirrus_vga.c
2===================================================================
3--- ioemu.orig/hw/cirrus_vga.c  2007-05-03 09:56:32.000000000 +0100
4+++ ioemu/hw/cirrus_vga.c       2007-05-03 10:07:53.000000000 +0100
5@@ -28,6 +28,9 @@
6  */
7 #include "vl.h"
8 #include "vga_int.h"
9+#ifndef _WIN32
10+#include <sys/mman.h>
11+#endif
12 
13 /*
14  * TODO:
15@@ -231,6 +234,8 @@
16     int cirrus_linear_io_addr;
17     int cirrus_linear_bitblt_io_addr;
18     int cirrus_mmio_io_addr;
19+    unsigned long cirrus_lfb_addr;
20+    unsigned long cirrus_lfb_end;
21     uint32_t cirrus_addr_mask;
22     uint32_t linear_mmio_mask;
23     uint8_t cirrus_shadow_gr0;
24@@ -267,6 +272,8 @@
25     int last_hw_cursor_y_end;
26     int real_vram_size; /* XXX: suppress that */
27     CPUWriteMemoryFunc **cirrus_linear_write;
28+    unsigned long map_addr;
29+    unsigned long map_end;
30 } CirrusVGAState;
31 
32 typedef struct PCICirrusVGAState {
33@@ -276,6 +283,8 @@
34 
35 static uint8_t rop_to_index[256];
36     
37+void *shared_vram;
38+
39 /***************************************
40  *
41  *  prototypes.
42@@ -2520,6 +2529,83 @@
43     cirrus_linear_bitblt_writel,
44 };
45 
46+static void *set_vram_mapping(unsigned long begin, unsigned long end)
47+{
48+    xen_pfn_t *extent_start = NULL;
49+    unsigned long nr_extents;
50+    void *vram_pointer = NULL;
51+    int i;
52+
53+    /* align begin and end address */
54+    begin = begin & TARGET_PAGE_MASK;
55+    end = begin + VGA_RAM_SIZE;
56+    end = (end + TARGET_PAGE_SIZE -1 ) & TARGET_PAGE_MASK;
57+    nr_extents = (end - begin) >> TARGET_PAGE_BITS;
58+
59+    extent_start = malloc(sizeof(xen_pfn_t) * nr_extents);
60+    if (extent_start == NULL) {
61+        fprintf(stderr, "Failed malloc on set_vram_mapping\n");
62+        return NULL;
63+    }
64+
65+    memset(extent_start, 0, sizeof(xen_pfn_t) * nr_extents);
66+
67+    for (i = 0; i < nr_extents; i++)
68+        extent_start[i] = (begin + i * TARGET_PAGE_SIZE) >> TARGET_PAGE_BITS;
69+
70+    set_mm_mapping(xc_handle, domid, nr_extents, 0, extent_start);
71+
72+    vram_pointer = xc_map_foreign_batch(xc_handle, domid,
73+                                        PROT_READ|PROT_WRITE,
74+                                        extent_start, nr_extents);
75+    if (vram_pointer == NULL) {
76+        fprintf(logfile, "xc_map_foreign_batch vgaram returned error %d\n",
77+                errno);
78+        return NULL;
79+    }
80+
81+    memset(vram_pointer, 0, nr_extents * TARGET_PAGE_SIZE);
82+
83+    free(extent_start);
84+
85+    return vram_pointer;
86+}
87+
88+static int unset_vram_mapping(unsigned long begin, unsigned long end,
89+                              void *mapping)
90+{
91+    xen_pfn_t *extent_start = NULL;
92+    unsigned long nr_extents;
93+    int i;
94+
95+    /* align begin and end address */
96+
97+    end = begin + VGA_RAM_SIZE;
98+    begin = begin & TARGET_PAGE_MASK;
99+    end = (end + TARGET_PAGE_SIZE -1 ) & TARGET_PAGE_MASK;
100+    nr_extents = (end - begin) >> TARGET_PAGE_BITS;
101+
102+    extent_start = malloc(sizeof(xen_pfn_t) * nr_extents);
103+
104+    if (extent_start == NULL) {
105+        fprintf(stderr, "Failed malloc on set_mm_mapping\n");
106+        return -1;
107+    }
108+
109+    /* Drop our own references to the vram pages */
110+    munmap(mapping, nr_extents * TARGET_PAGE_SIZE);
111+
112+    /* Now drop the guest's mappings */
113+    memset(extent_start, 0, sizeof(xen_pfn_t) * nr_extents);
114+    for (i = 0; i < nr_extents; i++)
115+        extent_start[i] = (begin + (i * TARGET_PAGE_SIZE)) >> TARGET_PAGE_BITS;
116+    unset_mm_mapping(xc_handle, domid, nr_extents, 0, extent_start);
117+
118+    free(extent_start);
119+
120+    return 0;
121+}
122+
123 /* Compute the memory access functions */
124 static void cirrus_update_memory_access(CirrusVGAState *s)
125 {
126@@ -2538,11 +2624,37 @@
127         
128        mode = s->gr[0x05] & 0x7;
129        if (mode < 4 || mode > 5 || ((s->gr[0x0B] & 0x4) == 0)) {
130+            if (s->cirrus_lfb_addr && s->cirrus_lfb_end && !s->map_addr) {
131+                void *vram_pointer, *old_vram;
132+
133+                vram_pointer = set_vram_mapping(s->cirrus_lfb_addr,
134+                                                s->cirrus_lfb_end);
135+                if (!vram_pointer)
136+                    fprintf(stderr, "NULL vram_pointer\n");
137+                else {
138+                    old_vram = vga_update_vram((VGAState *)s, vram_pointer,
139+                                               VGA_RAM_SIZE);
140+                    qemu_free(old_vram);
141+                }
142+                s->map_addr = s->cirrus_lfb_addr;
143+                s->map_end = s->cirrus_lfb_end;
144+            }
145             s->cirrus_linear_write[0] = cirrus_linear_mem_writeb;
146             s->cirrus_linear_write[1] = cirrus_linear_mem_writew;
147             s->cirrus_linear_write[2] = cirrus_linear_mem_writel;
148         } else {
149         generic_io:
150+            if (s->cirrus_lfb_addr && s->cirrus_lfb_end && s->map_addr) {
151+                void *old_vram;
152+
153+                old_vram = vga_update_vram((VGAState *)s, NULL, VGA_RAM_SIZE);
154+
155+                unset_vram_mapping(s->cirrus_lfb_addr,
156+                                   s->cirrus_lfb_end,
157+                                   old_vram);
158+
159+                s->map_addr = s->map_end = 0;
160+            }
161             s->cirrus_linear_write[0] = cirrus_linear_writeb;
162             s->cirrus_linear_write[1] = cirrus_linear_writew;
163             s->cirrus_linear_write[2] = cirrus_linear_writel;
164@@ -3136,6 +3248,13 @@
165     /* XXX: add byte swapping apertures */
166     cpu_register_physical_memory(addr, s->vram_size,
167                                 s->cirrus_linear_io_addr);
168+    s->cirrus_lfb_addr = addr;
169+    s->cirrus_lfb_end = addr + VGA_RAM_SIZE;
170+
171+    if (s->map_addr && (s->cirrus_lfb_addr != s->map_addr) &&
172+        (s->cirrus_lfb_end != s->map_end))
173+        fprintf(logfile, "cirrus vga map change while on lfb mode\n");
174+
175     cpu_register_physical_memory(addr + 0x1000000, 0x400000,
176                                 s->cirrus_linear_bitblt_io_addr);
177 }
178Index: ioemu/hw/pc.c
179===================================================================
180--- ioemu.orig/hw/pc.c  2007-05-03 10:07:53.000000000 +0100
181+++ ioemu/hw/pc.c       2007-05-03 10:07:53.000000000 +0100
182@@ -790,14 +790,14 @@
183     if (cirrus_vga_enabled) {
184         if (pci_enabled) {
185             pci_cirrus_vga_init(pci_bus,
186-                                ds, phys_ram_base + ram_size, ram_size,
187+                                ds, NULL, ram_size,
188                                 vga_ram_size);
189         } else {
190-            isa_cirrus_vga_init(ds, phys_ram_base + ram_size, ram_size,
191+            isa_cirrus_vga_init(ds, NULL, ram_size,
192                                 vga_ram_size);
193         }
194     } else {
195-        vga_initialize(pci_bus, ds, phys_ram_base + ram_size, ram_size,
196+        vga_initialize(pci_bus, ds, NULL, ram_size,
197                        vga_ram_size, 0, 0);
198     }
199 
200Index: ioemu/hw/vga.c
201===================================================================
202--- ioemu.orig/hw/vga.c 2007-05-03 10:07:52.000000000 +0100
203+++ ioemu/hw/vga.c      2007-05-03 10:07:53.000000000 +0100
204@@ -1858,6 +1858,7 @@
205     /* TODO: add vbe support if enabled */
206 }
207 
208+/* when used on xen environment, the vga_ram_base is not used */
209 void vga_common_init(VGAState *s, DisplayState *ds, uint8_t *vga_ram_base,
210                      unsigned long vga_ram_offset, int vga_ram_size)
211 {
212@@ -1888,7 +1889,7 @@
213 
214     vga_reset(s);
215 
216-    s->vram_ptr = vga_ram_base;
217+    s->vram_ptr = qemu_malloc(vga_ram_size);
218     s->vram_offset = vga_ram_offset;
219     s->vram_size = vga_ram_size;
220     s->ds = ds;
221@@ -2002,6 +2003,31 @@
222     return 0;
223 }
224 
225+void *vga_update_vram(VGAState *s, void *vga_ram_base, int vga_ram_size)
226+{
227+    uint8_t *old_pointer;
228+
229+    if (s->vram_size != vga_ram_size) {
230+        fprintf(stderr, "No support to change vga_ram_size\n");
231+        return NULL;
232+    }
233+
234+    if (!vga_ram_base) {
235+        vga_ram_base = qemu_malloc(vga_ram_size);
236+        if (!vga_ram_base) {
237+            fprintf(stderr, "reallocate error\n");
238+            return NULL;
239+        }
240+    }
241+
242+    /* XXX lock needed? */
243+    memcpy(vga_ram_base, s->vram_ptr, vga_ram_size);
244+    old_pointer = s->vram_ptr;
245+    s->vram_ptr = vga_ram_base;
246+
247+    return old_pointer;
248+}
249+
250 /********************************************************/
251 /* vga screen dump */
252 
253Index: ioemu/hw/vga_int.h
254===================================================================
255--- ioemu.orig/hw/vga_int.h     2007-05-03 09:56:32.000000000 +0100
256+++ ioemu/hw/vga_int.h  2007-05-03 10:07:53.000000000 +0100
257@@ -169,5 +169,6 @@
258                              unsigned int color0, unsigned int color1,
259                              unsigned int color_xor);
260 
261+void *vga_update_vram(VGAState *s, void *vga_ram_base, int vga_ram_size);
262 extern const uint8_t sr_mask[8];
263 extern const uint8_t gr_mask[16];
264Index: ioemu/vl.c
265===================================================================
266--- ioemu.orig/vl.c     2007-05-03 10:07:53.000000000 +0100
267+++ ioemu/vl.c  2007-05-03 10:07:53.000000000 +0100
268@@ -5745,6 +5745,62 @@
269 
270 #define MAX_NET_CLIENTS 32
271 
272+#include <xg_private.h>
273+
274+/* FIXME Flush the shadow page */
275+int unset_mm_mapping(int xc_handle, uint32_t domid,
276+                     unsigned long nr_pages, unsigned int address_bits,
277+                     xen_pfn_t *extent_start)
278+{
279+    int err = 0;
280+    xc_dominfo_t info;
281+
282+    xc_domain_getinfo(xc_handle, domid, 1, &info);
283+    if ((info.nr_pages - nr_pages) <= 0) {
284+        fprintf(stderr, "unset_mm_mapping: error nr_pages\n");
285+        err = -1;
286+    }
287+
288+    err = xc_domain_memory_decrease_reservation(xc_handle, domid,
289+                                                nr_pages, 0, extent_start);
290+    if (err)
291+        fprintf(stderr, "Failed to decrease physmap\n");
292+
293+
294+    if (xc_domain_setmaxmem(xc_handle, domid, (info.nr_pages - nr_pages) *
295+                            PAGE_SIZE/1024) != 0) {
296+        fprintf(logfile, "set maxmem returned error %d\n", errno);
297+        err = -1;
298+    }
299+
300+    return err;
301+}
302+
303+int set_mm_mapping(int xc_handle, uint32_t domid,
304+                   unsigned long nr_pages, unsigned int address_bits,
305+                   xen_pfn_t *extent_start)
306+{
307+    xc_dominfo_t info;
308+    int err = 0;
309+
310+    xc_domain_getinfo(xc_handle, domid, 1, &info);
311+
312+    if (xc_domain_setmaxmem(xc_handle, domid, info.max_memkb +
313+                            nr_pages * PAGE_SIZE/1024) != 0) {
314+        fprintf(logfile, "set maxmem returned error %d\n", errno);
315+        return -1;
316+    }
317+
318+    err = xc_domain_memory_populate_physmap(xc_handle, domid, nr_pages, 0,
319+                                            address_bits, extent_start);
320+    if (err) {
321+        fprintf(stderr, "Failed to populate physmap\n");
322+        return -1;
323+    }
324+
325+    return 0;
326+}
327+
328 int main(int argc, char **argv)
329 {
330 #ifdef CONFIG_GDBSTUB
331Index: ioemu/vl.h
332===================================================================
333--- ioemu.orig/vl.h     2007-05-03 10:07:53.000000000 +0100
334+++ ioemu/vl.h  2007-05-03 10:07:53.000000000 +0100
335@@ -145,6 +145,13 @@
336 
337 void main_loop_wait(int timeout);
338 
339+int unset_mm_mapping(int xc_handle, uint32_t domid, unsigned long nr_pages,
340+                     unsigned int address_bits, unsigned long *extent_start);
341+int set_mm_mapping(int xc_handle, uint32_t domid, unsigned long nr_pages,
342+                   unsigned int address_bits, unsigned long *extent_start);
343+
344+extern void *shared_vram;
345+
346 extern FILE *logfile;
347 
348 extern int xc_handle;
Note: See TracBrowser for help on using the repository browser.