1 | Index: 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 | } |
---|
178 | Index: 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 | |
---|
200 | Index: 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 | |
---|
253 | Index: 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]; |
---|
264 | Index: 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 |
---|
331 | Index: 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; |
---|