[34] | 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; |
---|