int last_hw_cursor_y_end;
int real_vram_size; /* XXX: suppress that */
CPUWriteMemoryFunc **cirrus_linear_write;
- uint32_t map_addr;
- uint32_t map_end;
} CirrusVGAState;
typedef struct PCICirrusVGAState {
cirrus_linear_bitblt_writel,
};
-
-static void set_vram_mapping(CirrusVGAState *s, unsigned long begin, unsigned long end)
-{
- unsigned long i;
- struct xen_add_to_physmap xatp;
- int rc;
-
- if (end > begin + video_ram_size)
- end = begin + video_ram_size;
-
- fprintf(logfile,"mapping vram to %lx - %lx\n", begin, end);
-
- if (!s->vram_mfns)
- return;
-
- xatp.domid = domid;
- xatp.space = XENMAPSPACE_mfn;
-
- for (i = 0; i < (end - begin) >> TARGET_PAGE_BITS; i++) {
- xatp.idx = s->vram_mfns[i];
- xatp.gpfn = (begin >> TARGET_PAGE_BITS) + i;
- rc = xc_memory_op(xc_handle, XENMEM_add_to_physmap, &xatp);
- if (rc) {
- fprintf(stderr, "add_to_physmap MFN %"PRI_xen_pfn" to PFN %"PRI_xen_pfn" failed: %d\n", xatp.idx, xatp.gpfn, rc);
- return;
- }
- }
-
- (void)xc_domain_pin_memory_cacheattr(
- xc_handle, domid,
- begin >> TARGET_PAGE_BITS,
- end >> TARGET_PAGE_BITS,
- XEN_DOMCTL_MEM_CACHEATTR_WB);
-}
-
-static void unset_vram_mapping(CirrusVGAState *s, unsigned long begin, unsigned long end)
-{
- if (s->stolen_vram_addr) {
- /* We can put it there for xend to save it efficiently */
- set_vram_mapping(s, s->stolen_vram_addr, s->stolen_vram_addr + video_ram_size);
- } else {
- /* Old image, we have to unmap them completely */
- struct xen_remove_from_physmap xrfp;
- unsigned long i;
- int rc;
-
- if (end > begin + video_ram_size)
- end = begin + video_ram_size;
-
- fprintf(logfile,"unmapping vram from %lx - %lx\n", begin, end);
-
- xrfp.domid = domid;
-
- for (i = 0; i < (end - begin) >> TARGET_PAGE_BITS; i++) {
- xrfp.gpfn = (begin >> TARGET_PAGE_BITS) + i;
- rc = xc_memory_op(xc_handle, XENMEM_remove_from_physmap, &xrfp);
- if (rc) {
- fprintf(stderr, "remove_from_physmap PFN %"PRI_xen_pfn" failed: %d\n", xrfp.gpfn, rc);
- return;
- }
- }
- }
-}
-
void cirrus_restart_acc(CirrusVGAState *s)
{
set_vram_mapping(s, s->lfb_addr, s->lfb_end);
qemu_get_be32s(f, &s->lfb_end);
/* XXX throwing away 32 bits */
qemu_get_be32(f);
+ video_ram_size = s->lfb_end - s->lfb_addr;
if (version_id >= 3) {
qemu_get_be64s(f, &s->stolen_vram_addr);
if (!s->stolen_vram_addr && !vga_acc) {
static void vga_screen_dump(void *opaque, const char *filename);
-static void set_vram_mapping(VGAState *s, unsigned long begin, unsigned long end);
-
static uint32_t vga_ioport_read(void *opaque, uint32_t addr)
{
VGAState *s = opaque;
!(s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED)) {
int h, shift_control;
static int firsttime=0;
-
- set_vram_mapping(s, s->lfb_addr, s->lfb_end);
+
+ if(s->map_addr != s->lfb_addr || s->map_end != s->lfb_end) {
+ set_vram_mapping(s, s->lfb_addr, s->lfb_end);
+ s->map_addr = s->lfb_addr;
+ s->map_end = s->lfb_end;
+ }
s->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] =
s->vbe_regs[VBE_DISPI_INDEX_XRES];
vga_mem_writel,
};
-static void set_vram_mapping(VGAState *s, unsigned long begin, unsigned long end)
+void unset_vram_mapping(void *opaque, unsigned long begin, unsigned long end)
+{
+ VGAState *s = (VGAState *) opaque;
+ if (s->stolen_vram_addr) {
+ /* We can put it there for xend to save it efficiently */
+ set_vram_mapping(s, s->stolen_vram_addr, s->stolen_vram_addr + video_ram_size);
+ } else {
+ /* Old image, we have to unmap them completely */
+ struct xen_remove_from_physmap xrfp;
+ unsigned long i;
+ int rc;
+
+ if (end > begin + video_ram_size)
+ end = begin + video_ram_size;
+
+ fprintf(logfile,"unmapping vram from %lx - %lx\n", begin, end);
+
+ xrfp.domid = domid;
+
+ for (i = 0; i < (end - begin) >> TARGET_PAGE_BITS; i++) {
+ xrfp.gpfn = (begin >> TARGET_PAGE_BITS) + i;
+ rc = xc_memory_op(xc_handle, XENMEM_remove_from_physmap, &xrfp);
+ if (rc) {
+ fprintf(stderr, "remove_from_physmap PFN %"PRI_xen_pfn" failed: %d\n", xrfp.gpfn, rc);
+ return;
+ }
+ }
+ }
+}
+
+void set_vram_mapping(void *opaque, unsigned long begin, unsigned long end)
{
unsigned long i;
struct xen_add_to_physmap xatp;
int rc;
+ VGAState *s = (VGAState *) opaque;
if (end > begin + video_ram_size)
end = begin + video_ram_size;
#endif
vram_size = s->vram_size;
qemu_put_be32s(f, &vram_size);
+ qemu_put_be32(f, s->map_addr);
+ qemu_put_be32(f, s->map_end);
qemu_put_be64s(f, &s->stolen_vram_addr);
- if (!s->stolen_vram_addr)
+ if (!s->stolen_vram_addr && !s->map_addr)
/* Old guest: VRAM is not mapped, we have to save it ourselves */
qemu_put_buffer(f, s->vram_ptr, video_ram_size);
}
int i;
#endif
- if (version_id > 4)
+ if (version_id > 5)
return -EINVAL;
if (s->pci_dev && version_id >= 2) {
return -EINVAL;
#endif
if (version_id >= 3) {
- /* people who restore old images may be lucky ... */
- qemu_get_be32s(f, &vram_size);
- if (vram_size != s->vram_size)
- return -EINVAL;
+ /* people who restore old images may be lucky ... */
+ qemu_get_be32s(f, &vram_size);
+ if (vram_size != s->vram_size)
+ return -EINVAL;
+ if (version_id >= 5) {
+ qemu_get_be32s(f, &s->map_addr);
+ qemu_get_be32s(f, &s->map_end);
+ }
if (version_id >= 4) {
qemu_get_be64s(f, &s->stolen_vram_addr);
- if (s->stolen_vram_addr)
- xen_vga_vram_map(s->stolen_vram_addr, 0);
+ if (s->stolen_vram_addr || s->map_addr) {
+ xen_vga_vram_map(s->map_addr ? s->map_addr : s->stolen_vram_addr, 0);
+ } else {
+ qemu_get_buffer(f, s->vram_ptr, s->vram_size);
+ xen_vga_populate_vram(s->lfb_addr);
+ }
}
- /* Old guest, VRAM is not mapped, we have to restore it ourselves */
- if (!s->stolen_vram_addr)
- qemu_get_buffer(f, s->vram_ptr, s->vram_size);
}
/* force refresh */
{
int vga_io_memory;
- register_savevm("vga", 0, 4, vga_save, vga_load, s);
+ register_savevm("vga", 0, 5, vga_save, vga_load, s);
register_ioport_write(0x3c0, 16, 1, vga_ioport_write, s);