]> xenbits.xensource.com Git - xenclient/ioemu.git/commitdiff
- Import vbe3 patch
authorJean Guyader <jean.guyader@eu.citrix.com>
Wed, 15 Oct 2008 17:20:23 +0000 (18:20 +0100)
committerVincent Hanquez <vincent@snarc.org>
Fri, 31 Oct 2008 12:10:56 +0000 (12:10 +0000)
17 files changed:
hw/cirrus_vga.c
hw/mips_mipssim.c
hw/mips_r4k.c
hw/pc.c
hw/pc.h
hw/ppc_chrp.c
hw/ppc_oldworld.c
hw/ppc_prep.c
hw/sun4u.c
hw/vga.c
hw/vga_int.h
hw/xen_machine_fv.c
hw/xen_machine_pv.c
hw/xen_platform.c
sysemu.h
vl.c
xenfbfront.c

index 37e312d744a2fb74621e25674a168a3d16510006..4ca6b99efac92eb63303b0193d257b64f2159bd1 100644 (file)
@@ -2648,8 +2648,8 @@ static void set_vram_mapping(CirrusVGAState *s, unsigned long begin, unsigned lo
     struct xen_add_to_physmap xatp;
     int rc;
 
-    if (end > begin + VGA_RAM_SIZE)
-        end = begin + VGA_RAM_SIZE;
+    if (end > begin + video_ram_size)
+        end = begin + video_ram_size;
 
     fprintf(logfile,"mapping vram to %lx - %lx\n", begin, end);
 
@@ -2680,15 +2680,15 @@ static void unset_vram_mapping(CirrusVGAState *s, unsigned long begin, unsigned
 {
     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 + VGA_RAM_SIZE);
+        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 + VGA_RAM_SIZE)
-            end = begin + VGA_RAM_SIZE;
+        if (end > begin + video_ram_size)
+            end = begin + video_ram_size;
 
         fprintf(logfile,"unmapping vram from %lx - %lx\n", begin, end);
 
@@ -3155,7 +3155,7 @@ static void cirrus_vga_save(QEMUFile *f, void *opaque)
     qemu_put_be64s(f, &s->stolen_vram_addr);
     if (!s->stolen_vram_addr && !vga_acc)
         /* Old guest: VRAM is not mapped, we have to save it ourselves */
-        qemu_put_buffer(f, s->vram_ptr, VGA_RAM_SIZE);
+        qemu_put_buffer(f, s->vram_ptr, video_ram_size);
 }
 
 static int cirrus_vga_load(QEMUFile *f, void *opaque, int version_id)
@@ -3218,7 +3218,7 @@ static int cirrus_vga_load(QEMUFile *f, void *opaque, int version_id)
         qemu_get_be64s(f, &s->stolen_vram_addr);
         if (!s->stolen_vram_addr && !vga_acc) {
             /* Old guest, VRAM is not mapped, we have to restore it ourselves */
-            qemu_get_buffer(f, s->vram_ptr, VGA_RAM_SIZE);
+            qemu_get_buffer(f, s->vram_ptr, video_ram_size);
             xen_vga_populate_vram(s->lfb_addr);
         } else
             xen_vga_vram_map(vga_acc ? s->lfb_addr : s->stolen_vram_addr, 0);
@@ -3230,7 +3230,7 @@ static int cirrus_vga_load(QEMUFile *f, void *opaque, int version_id)
     } else {
         /* Old image, we have to populate and restore VRAM ourselves */
         xen_vga_populate_vram(s->lfb_addr);
-        qemu_get_buffer(f, s->vram_ptr, VGA_RAM_SIZE); 
+        qemu_get_buffer(f, s->vram_ptr, video_ram_size);
         if (vga_acc)
             cirrus_restart_acc(s);
     }
@@ -3391,7 +3391,7 @@ static void cirrus_pci_lfb_map(PCIDevice *d, int region_num,
     cpu_register_physical_memory(addr, s->vram_size,
                                 s->cirrus_linear_io_addr);
     s->lfb_addr = addr;
-    s->lfb_end = addr + VGA_RAM_SIZE;
+    s->lfb_end = addr + video_ram_size;
 
     if (s->map_addr && (s->lfb_addr != s->map_addr) &&
         (s->lfb_end != s->map_end))
index e29d8af468414e5294ca1c8476d4890947d5d4bc..0873c640ad3997cfa6c249565c4dcaee03a7312b 100644 (file)
@@ -195,5 +195,5 @@ QEMUMachine mips_mipssim_machine = {
     "mipssim",
     "MIPS MIPSsim platform",
     mips_mipssim_init,
-    BIOS_SIZE + VGA_RAM_SIZE /* unused */,
+    BIOS_SIZE /* unused */,
 };
index 66ae135617786465a94cdc17b31772e4b333d4aa..0007b772b71fe37d1b984b9913acd0bc9187baaf 100644 (file)
@@ -287,5 +287,5 @@ QEMUMachine mips_machine = {
     "mips",
     "mips r4k platform",
     mips_r4k_init,
-    VGA_RAM_SIZE + BIOS_SIZE,
+    BIOS_SIZE,
 };
diff --git a/hw/pc.c b/hw/pc.c
index bd5add73b105dd322afc888978d78b32eeb5464f..3c4f8985726feb6d09267c91ed7ec32078239066 100644 (file)
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -1168,14 +1168,14 @@ QEMUMachine pc_machine = {
     "pc",
     "Standard PC",
     pc_init_pci,
-    VGA_RAM_SIZE + PC_MAX_BIOS_SIZE,
+    PC_MAX_BIOS_SIZE,
 };
 
 QEMUMachine isapc_machine = {
     "isapc",
     "ISA-only PC",
     pc_init_isa,
-    VGA_RAM_SIZE + PC_MAX_BIOS_SIZE,
+    PC_MAX_BIOS_SIZE,
 };
 
 
diff --git a/hw/pc.h b/hw/pc.h
index a78e0393bdb739ee46e925868e1a4faa5bcecdee..f57d160400ec05f1dbad7b6f68bfe08e4d1ad348 100644 (file)
--- a/hw/pc.h
+++ b/hw/pc.h
@@ -115,11 +115,7 @@ int piix4_init(PCIBus *bus, int devfn);
 
 /* vga.c */
 
-#ifndef TARGET_SPARC
-#define VGA_RAM_SIZE (8192 * 1024)
-#else
-#define VGA_RAM_SIZE (9 * 1024 * 1024)
-#endif
+extern uint32_t video_ram_size;
 
 int isa_vga_init(DisplayState *ds, uint8_t *vga_ram_base,
                  unsigned long vga_ram_offset, int vga_ram_size);
index deb97611b8ad6b8914f363a2c5a42059f2b3a5c6..36d644725aaf0f75435f0be70dacabe16e2113c2 100644 (file)
@@ -335,5 +335,5 @@ QEMUMachine core99_machine = {
     "mac99",
     "Mac99 based PowerMAC",
     ppc_core99_init,
-    BIOS_SIZE + VGA_RAM_SIZE,
+    BIOS_SIZE,
 };
index be5ee6710a7f8c0558705c0e06c7cff8c4470f0b..3125162c09456f036e8842743e9d70d04c4c565d 100644 (file)
@@ -370,5 +370,5 @@ QEMUMachine heathrow_machine = {
     "g3bw",
     "Heathrow based PowerMAC",
     ppc_heathrow_init,
-    BIOS_SIZE + VGA_RAM_SIZE,
+    BIOS_SIZE,
 };
index 9238e6d43324ce04ded042a84390d82947c6f9c1..fc58c715e793d9f49304988d0a920fc6a3308062 100644 (file)
@@ -764,5 +764,5 @@ QEMUMachine prep_machine = {
     "prep",
     "PowerPC PREP platform",
     ppc_prep_init,
-    BIOS_SIZE + VGA_RAM_SIZE,
+    BIOS_SIZE,
 };
index 0cc04f97de9f5cf12b3d8274ccd93059fb6ae9d4..673563252bfa68ae9444c201b283e9d7f8fa54bd 100644 (file)
@@ -388,5 +388,5 @@ QEMUMachine sun4u_machine = {
     "sun4u",
     "Sun4u platform",
     sun4u_init,
-    PROM_SIZE_MAX + VGA_RAM_SIZE,
+    PROM_SIZE_MAX,
 };
index 8e5a2c1768fa6bbebcb40851093ce83699c403d3..c843821cb1f3c0050df62c0bd082dce2b5c93f56 100644 (file)
--- a/hw/vga.c
+++ b/hw/vga.c
 
 //#define DEBUG_BOCHS_VBE
 
+// PCI 0x04: command(word), 0x06(word): status
+#define PCI_COMMAND_IOACCESS                0x0001
+#define PCI_COMMAND_MEMACCESS               0x0002
+#define PCI_COMMAND_BUSMASTER               0x0004
+
 /* force some bits to zero */
 const uint8_t sr_mask[8] = {
     (uint8_t)~0xfc,
@@ -70,10 +75,10 @@ const uint8_t gr_mask[16] = {
 
 #define cbswap_32(__x) \
 ((uint32_t)( \
-               (((uint32_t)(__x) & (uint32_t)0x000000ffUL) << 24) | \
-               (((uint32_t)(__x) & (uint32_t)0x0000ff00UL) <<  8) | \
-               (((uint32_t)(__x) & (uint32_t)0x00ff0000UL) >>  8) | \
-               (((uint32_t)(__x) & (uint32_t)0xff000000UL) >> 24) ))
+        (((uint32_t)(__x) & (uint32_t)0x000000ffUL) << 24) | \
+        (((uint32_t)(__x) & (uint32_t)0x0000ff00UL) <<  8) | \
+        (((uint32_t)(__x) & (uint32_t)0x00ff0000UL) >>  8) | \
+        (((uint32_t)(__x) & (uint32_t)0xff000000UL) >> 24) ))
 
 #ifdef WORDS_BIGENDIAN
 #define PAT(x) cbswap_32(x)
@@ -152,6 +157,8 @@ static uint8_t expand4to8[16];
 
 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;
@@ -192,9 +199,9 @@ static uint32_t vga_ioport_read(void *opaque, uint32_t addr)
         case 0x3c7:
             val = s->dac_state;
             break;
-       case 0x3c8:
-           val = s->dac_write_index;
-           break;
+    case 0x3c8:
+        val = s->dac_write_index;
+        break;
         case 0x3c9:
             val = s->palette[s->dac_read_index * 3 + s->dac_sub_index];
             if (++s->dac_sub_index == 3) {
@@ -466,6 +473,9 @@ static void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val)
             if ((val & VBE_DISPI_ENABLED) &&
                 !(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);
 
                 s->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] =
                     s->vbe_regs[VBE_DISPI_INDEX_XRES];
@@ -1131,12 +1141,12 @@ static void vga_draw_text(VGAState *s, int full_update)
     s->last_ch = cheight;
     s->last_cw = cw;
 
-    s->rgb_to_pixel = 
+    s->rgb_to_pixel =
         rgb_to_pixel_dup_table[get_depth_index(s->ds)];
 
     full_update |= update_palette16(s);
     palette = s->last_palette;
-    
+
     x_incr = cw * ((s->ds->depth + 7) >> 3);
     /* compute font data address (in plane 2) */
     v = s->sr[3];
@@ -1433,7 +1443,7 @@ static void vga_draw_graphic(VGAState *s, int full_update)
     ds_depth = s->ds->depth;
     depth = s->get_bpp(s);
     if (s->ds->dpy_resize_shared) {
-        if (s->line_offset != s->last_line_offset || 
+        if (s->line_offset != s->last_line_offset ||
             disp_width != s->last_width ||
             height != s->last_height ||
             s->last_depth != depth) {
@@ -1457,7 +1467,7 @@ static void vga_draw_graphic(VGAState *s, int full_update)
         full_update = 1;
     }
 
-    s->rgb_to_pixel = 
+    s->rgb_to_pixel =
         rgb_to_pixel_dup_table[get_depth_index(s->ds)];
 
     if (shift_control == 0) {
@@ -1713,7 +1723,6 @@ static void vga_update_display(void *opaque)
 static void vga_invalidate_display(void *opaque)
 {
     VGAState *s = (VGAState *)opaque;
-
     s->last_width = -1;
     s->last_height = -1;
 }
@@ -1736,6 +1745,40 @@ static CPUWriteMemoryFunc *vga_mem_write[3] = {
     vga_mem_writel,
 };
 
+static void set_vram_mapping(VGAState *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 vga_save(QEMUFile *f, void *opaque)
 {
     VGAState *s = opaque;
@@ -1786,7 +1829,7 @@ static void vga_save(QEMUFile *f, void *opaque)
     qemu_put_be64s(f, &s->stolen_vram_addr);
     if (!s->stolen_vram_addr)
         /* Old guest: VRAM is not mapped, we have to save it ourselves */
-        qemu_put_buffer(f, s->vram_ptr, VGA_RAM_SIZE);
+        qemu_put_buffer(f, s->vram_ptr, video_ram_size);
 }
 
 static int vga_load(QEMUFile *f, void *opaque, int version_id)
@@ -1845,10 +1888,10 @@ static int vga_load(QEMUFile *f, void *opaque, int version_id)
         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 >= 4) {
             qemu_get_be64s(f, &s->stolen_vram_addr);
             if (s->stolen_vram_addr)
@@ -1856,7 +1899,7 @@ static int vga_load(QEMUFile *f, void *opaque, int version_id)
         }
         /* 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); 
+            qemu_get_buffer(f, s->vram_ptr, s->vram_size);
     }
 
     /* force refresh */
@@ -1878,6 +1921,18 @@ 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);
+        s->lfb_addr = addr;
+        s->lfb_end = addr + video_ram_size;
+#ifdef CONFIG_BOCHS_VBE
+        s->vbe_regs[VBE_DISPI_INDEX_LFB_ADDRESS_H] = s->lfb_addr >> 16;
+        s->vbe_regs[VBE_DISPI_INDEX_LFB_ADDRESS_L] = s->lfb_addr & 0xFFFF;
+        s->vbe_regs[VBE_DISPI_INDEX_VIDEO_MEMORY_64K] = video_ram_size >> 16;
+#endif
+
+        fprintf(stderr, "vga s->lfb_addr = %lx s->lfb_end = %lx \n",s->lfb_addr,s->lfb_end);
+
+        if (size != s->vram_size)
+            fprintf(stderr, "vga map with size %x != %x\n", size, s->vram_size);
     }
 }
 
@@ -1886,7 +1941,7 @@ void vga_bios_init(VGAState *s)
 {
     uint8_t palette_model[192] = {
         0,   0,   0,   0,   0, 170,   0, 170,
-       0,   0, 170, 170, 170,   0,   0, 170,
+    0,   0, 170, 170, 170,   0,   0, 170,
         0, 170, 170,  85,   0, 170, 170, 170,
        85,  85,  85,  85,  85, 255,  85, 255,
        85,  85, 255, 255, 255,  85,  85, 255,
@@ -2009,6 +2064,9 @@ void vga_bios_init(VGAState *s)
     s->graphic_mode = -1;
 
     /* TODO: add vbe support if enabled */
+#ifdef CONFIG_BOCHS_VBE
+
+#endif
 }
 
 
@@ -2024,9 +2082,9 @@ void xen_vga_populate_vram(uint64_t vram_addr)
     int rc;
 
     fprintf(logfile, "populating video RAM at %llx\n",
-           (unsigned long long)vram_addr);
+        (unsigned long long)vram_addr);
 
-    nr_pfn = VGA_RAM_SIZE >> TARGET_PAGE_BITS;
+    nr_pfn = video_ram_size >> TARGET_PAGE_BITS;
 
     pfn_list = malloc(sizeof(*pfn_list) * nr_pfn);
 
@@ -2062,9 +2120,9 @@ void xen_vga_vram_map(uint64_t vram_addr, int copy)
     void *vram;
 
     fprintf(logfile, "mapping video RAM from %llx\n",
-           (unsigned long long)vram_addr);
+        (unsigned long long)vram_addr);
 
-    nr_pfn = VGA_RAM_SIZE >> TARGET_PAGE_BITS;
+    nr_pfn = video_ram_size >> TARGET_PAGE_BITS;
 
     pfn_list = malloc(sizeof(*pfn_list) * nr_pfn);
 
@@ -2088,11 +2146,12 @@ void xen_vga_vram_map(uint64_t vram_addr, int copy)
     }
 
     if (copy)
-        memcpy(vram, xen_vga_state->vram_ptr, VGA_RAM_SIZE);
+        memcpy(vram, xen_vga_state->vram_ptr, video_ram_size);
+
     if (xen_vga_state->vram_mfns) {
         /* In case this function is called more than once */
         free(xen_vga_state->vram_mfns);
-        munmap(xen_vga_state->vram_ptr, VGA_RAM_SIZE);
+        munmap(xen_vga_state->vram_ptr, video_ram_size);
     } else {
         qemu_free(xen_vga_state->vram_ptr);
     }
@@ -2107,7 +2166,7 @@ void xen_vga_vram_map(uint64_t vram_addr, int copy)
 void xen_vga_stolen_vram_addr(uint64_t stolen_vram_addr)
 {
     fprintf(logfile, "stolen video RAM at %llx\n",
-           (unsigned long long)stolen_vram_addr);
+        (unsigned long long)stolen_vram_addr);
 
     xen_vga_state->stolen_vram_addr = stolen_vram_addr;
 
@@ -2147,6 +2206,7 @@ void vga_common_init(VGAState *s, DisplayState *ds, uint8_t *vga_ram_base,
     vga_reset(s);
 
     s->vram_ptr = qemu_malloc(vga_ram_size);
+
     s->vram_mfns = NULL;
     xen_vga_state = s;
 
@@ -2259,9 +2319,14 @@ int pci_vga_init(PCIBus *bus, DisplayState *ds, uint8_t *vga_ram_base,
     pci_conf[0x01] = 0x12;
     pci_conf[0x02] = 0x11;
     pci_conf[0x03] = 0x11;
+    pci_conf[0x04] = PCI_COMMAND_IOACCESS | PCI_COMMAND_MEMACCESS /* | PCI_COMMAND_BUSMASTER */;
     pci_conf[0x0a] = 0x00; // VGA controller
     pci_conf[0x0b] = 0x03;
     pci_conf[0x0e] = 0x00; // header_type
+    pci_conf[0x2c] = 0x53; /* subsystem vendor: XenSource */
+    pci_conf[0x2d] = 0x58;
+    pci_conf[0x2e] = 0x01; /* subsystem device */
+    pci_conf[0x2f] = 0x00;
 
     /* XXX: vga_ram_size must be a power of two */
     pci_register_io_region(&d->dev, 0, vga_ram_size,
index 8aecbb7653995db28574e8394dc372a6ac98980e..0b441192cfc60031cfa9d1cb9f86f474bb8058f9 100644 (file)
 #define ST01_DISP_ENABLE    0x01
 
 /* bochs VBE support */
-//#define CONFIG_BOCHS_VBE
-
-#define VBE_DISPI_MAX_XRES              1600
-#define VBE_DISPI_MAX_YRES              1200
-#define VBE_DISPI_MAX_BPP               32
-
-#define VBE_DISPI_INDEX_ID              0x0
-#define VBE_DISPI_INDEX_XRES            0x1
-#define VBE_DISPI_INDEX_YRES            0x2
-#define VBE_DISPI_INDEX_BPP             0x3
-#define VBE_DISPI_INDEX_ENABLE          0x4
-#define VBE_DISPI_INDEX_BANK            0x5
-#define VBE_DISPI_INDEX_VIRT_WIDTH      0x6
-#define VBE_DISPI_INDEX_VIRT_HEIGHT     0x7
-#define VBE_DISPI_INDEX_X_OFFSET        0x8
-#define VBE_DISPI_INDEX_Y_OFFSET        0x9
-#define VBE_DISPI_INDEX_NB              0xa
-
-#define VBE_DISPI_ID0                   0xB0C0
-#define VBE_DISPI_ID1                   0xB0C1
-#define VBE_DISPI_ID2                   0xB0C2
-#define VBE_DISPI_ID3                   0xB0C3
-#define VBE_DISPI_ID4                   0xB0C4
-
-#define VBE_DISPI_DISABLED              0x00
-#define VBE_DISPI_ENABLED               0x01
-#define VBE_DISPI_GETCAPS               0x02
-#define VBE_DISPI_8BIT_DAC              0x20
-#define VBE_DISPI_LFB_ENABLED           0x40
-#define VBE_DISPI_NOCLEARMEM            0x80
-
-#define VBE_DISPI_LFB_PHYSICAL_ADDRESS  0xE0000000
+#define CONFIG_BOCHS_VBE
+
+#define VBE_DISPI_MAX_XRES               2560
+#define VBE_DISPI_MAX_YRES               1600
+#define VBE_DISPI_MAX_BPP                32
+
+#define VBE_DISPI_INDEX_ID               0x0
+#define VBE_DISPI_INDEX_XRES             0x1
+#define VBE_DISPI_INDEX_YRES             0x2
+#define VBE_DISPI_INDEX_BPP              0x3
+#define VBE_DISPI_INDEX_ENABLE           0x4
+#define VBE_DISPI_INDEX_BANK             0x5
+#define VBE_DISPI_INDEX_VIRT_WIDTH       0x6
+#define VBE_DISPI_INDEX_VIRT_HEIGHT      0x7
+#define VBE_DISPI_INDEX_X_OFFSET         0x8
+#define VBE_DISPI_INDEX_Y_OFFSET         0x9
+#define VBE_DISPI_INDEX_VIDEO_MEMORY_64K 0xa
+#define VBE_DISPI_INDEX_LFB_ADDRESS_H    0xb
+#define VBE_DISPI_INDEX_LFB_ADDRESS_L    0xc
+#define VBE_DISPI_INDEX_NB               0xd
+
+#define VBE_DISPI_ID0                    0xB0C0
+#define VBE_DISPI_ID1                    0xB0C1
+#define VBE_DISPI_ID2                    0xB0C2
+#define VBE_DISPI_ID3                    0xB0C3
+#define VBE_DISPI_ID4                    0xB0C4
+
+#define VBE_DISPI_DISABLED               0x00
+#define VBE_DISPI_ENABLED                0x01
+#define VBE_DISPI_GETCAPS                0x02
+#define VBE_DISPI_8BIT_DAC               0x20
+#define VBE_DISPI_LFB_ENABLED            0x40
+#define VBE_DISPI_NOCLEARMEM             0x80
+
+#define VBE_DISPI_LFB_PHYSICAL_ADDRESS   0xF1000000
 
 #ifdef CONFIG_BOCHS_VBE
 
index 1f85c5c933ab072d8ffdd768dc79c3c6f99776f6..88cb9084518a073b68c0f4dc97ffa7ee2adf6f15 100644 (file)
@@ -288,7 +288,7 @@ QEMUMachine xenfv_machine = {
     "xenfv",
     "Xen Fully-virtualized PC",
     xen_init_fv,
-    (VGA_RAM_SIZE + BIOS_SIZE) | RAMSIZE_FIXED,
+    BIOS_SIZE | RAMSIZE_FIXED,
 };
 
 /*
index 798b73540e36a7a9ed8507f724eb5b8d4bd12a8e..3a716160f239345cecabb040822fd041199e0126 100644 (file)
@@ -77,7 +77,7 @@ QEMUMachine xenpv_machine = {
     "xenpv",
     "Xen Para-virtualized PC",
     xen_init_pv,
-    (VGA_RAM_SIZE + BIOS_SIZE) | RAMSIZE_FIXED,
+    BIOS_SIZE | RAMSIZE_FIXED,
 };
 
 /*
index 099978e5d111ed5a430df12c54b4823586643dcb..fe10cfa19bd5edb0f55e3d7cc411064e3d2e1ca0 100644 (file)
@@ -38,6 +38,8 @@ static int log_buffer_off;
 
 #define PFFLAG_ROM_LOCK 1 /* Sets whether ROM memory area is RW or RO */
 
+extern uint32_t video_ram_size;
+
 typedef struct PCIXenPlatformState
 {
   PCIDevice  pci_dev;
@@ -182,6 +184,8 @@ static uint32_t xen_platform_ioport_readl(void *opaque, uint32_t addr)
     switch (addr) {
     case 4: /* VGA stolen memory address */
         return d->vga_stolen_ram;
+    case 8:
+        return video_ram_size;
     default:
         return ~0u;
     }
index c294c12b9b5202dad42963bd3c70473580efacba..a9ba6cc90ea2260715e57576a8d113849261779d 100644 (file)
--- a/sysemu.h
+++ b/sysemu.h
@@ -79,6 +79,7 @@ extern int vmsvga_enabled;
 extern int graphic_width;
 extern int graphic_height;
 extern int graphic_depth;
+/* extern uint32_t video_ram_size; */
 extern const char *keyboard_layout;
 extern int win2k_install_hack;
 extern int alt_grab;
diff --git a/vl.c b/vl.c
index 006acb3e477fc733ca26ffae3a3696db19d54ab5..8a5f877e1304c9a1eb2838f45373f39b877ca54f 100644 (file)
--- a/vl.c
+++ b/vl.c
@@ -190,7 +190,9 @@ static int rtc_utc = 1;
 static int rtc_date_offset = -1; /* -1 means no change */
 int cirrus_vga_enabled = 1;
 int vmsvga_enabled = 0;
+uint32_t video_ram_size = 8 * 1024 * 1024;
 #ifdef TARGET_SPARC
+video_ram_size += 1024 * 1024;
 int graphic_width = 1024;
 int graphic_height = 768;
 int graphic_depth = 8;
@@ -7440,6 +7442,7 @@ static void help(int exitcode)
 #ifdef TARGET_I386
            "-std-vga        simulate a standard VGA card with VESA Bochs Extensions\n"
            "                (default is CL-GD5446 PCI VGA)\n"
+           "-videoram       set amount of memory available to virtual video adapter\n"
            "-no-acpi        disable ACPI\n"
 #endif
 #ifdef CONFIG_CURSES
@@ -7533,6 +7536,7 @@ enum {
     QEMU_OPTION_vmsvga,
     QEMU_OPTION_g,
     QEMU_OPTION_std_vga,
+     QEMU_OPTION_videoram,
     QEMU_OPTION_echr,
     QEMU_OPTION_monitor,
     QEMU_OPTION_domainname,
@@ -7643,6 +7647,7 @@ const QEMUOption qemu_options[] = {
 #endif
     { "localtime", 0, QEMU_OPTION_localtime },
     { "std-vga", 0, QEMU_OPTION_std_vga },
+     { "videoram", HAS_ARG, QEMU_OPTION_videoram },
     { "echr", HAS_ARG, QEMU_OPTION_echr },
     { "monitor", HAS_ARG, QEMU_OPTION_monitor },
     { "domain-name", 1, QEMU_OPTION_domainname },
@@ -7974,7 +7979,7 @@ int main(int argc, char **argv)
     cpu_model = NULL;
     initrd_filename = NULL;
     ram_size = 0;
-    vga_ram_size = VGA_RAM_SIZE;
+    vga_ram_size = video_ram_size;
 #ifdef CONFIG_GDBSTUB
     use_gdbstub = 0;
     gdbstub_port = DEFAULT_GDBSTUB_PORT;
@@ -8329,9 +8334,9 @@ int main(int argc, char **argv)
             case QEMU_OPTION_S:
                 autostart = 0;
                 break;
-           case QEMU_OPTION_k:
-               keyboard_layout = optarg;
-               break;
+            case QEMU_OPTION_k:
+                keyboard_layout = optarg;
+                break;
             case QEMU_OPTION_localtime:
                 rtc_utc = 0;
                 break;
@@ -8347,6 +8352,18 @@ int main(int argc, char **argv)
                 cirrus_vga_enabled = 0;
                 vmsvga_enabled = 0;
                 break;
+            case QEMU_OPTION_videoram:
+                {
+                    char *ptr;
+                    video_ram_size = strtol(optarg,&ptr,10);
+                    video_ram_size *= 1024 * 1024;
+                    /* FIXME: Sanity check on vram size */
+#ifdef TARGET_SPARC
+                    video_ram_size += (1024 * 1024);
+#endif
+                    vga_ram_size = video_ram_size;
+                }
+                break;
             case QEMU_OPTION_g:
                 {
                     const char *p;
@@ -8730,7 +8747,7 @@ int main(int argc, char **argv)
 #endif
 
     /* init the memory */
-    phys_ram_size = machine->ram_require & ~RAMSIZE_FIXED;
+    phys_ram_size = (machine->ram_require + video_ram_size) & ~RAMSIZE_FIXED;
 
     if (machine->ram_require & RAMSIZE_FIXED) {
         if (ram_size > 0) {
index 3a67ada9a1b4c14d776f2ac61687bafb823370c2..d6aa3336c6343d3f6a7db334988405a72136e8ec 100644 (file)
@@ -74,7 +74,7 @@ static void xenfb_pv_resize_shared(DisplayState *ds, int w, int h, int depth, in
         fbfront_resize(fb_dev, ds->width, ds->height, ds->linesize, ds->depth, offset);
     } else {
         ds->data = xs->nonshared_vram;
-        fbfront_resize(fb_dev, w, h, linesize, ds->depth, VGA_RAM_SIZE);
+        fbfront_resize(fb_dev, w, h, linesize, ds->depth, video_ram_size);
     }
 }
 
@@ -248,8 +248,8 @@ int xenfb_pv_display_init(DisplayState *ds)
 
     create_thread("kbdfront", kbdfront_thread, (void*) xs);
 
-    ds->data = xs->nonshared_vram = qemu_memalign(PAGE_SIZE, VGA_RAM_SIZE);
-    memset(ds->data, 0, VGA_RAM_SIZE);
+    ds->data = xs->nonshared_vram = qemu_memalign(PAGE_SIZE, video_ram_size);
+    memset(ds->data, 0, video_ram_size);
     ds->opaque = xs;
     ds->depth = 32;
     ds->bgr = 0;
@@ -271,7 +271,7 @@ int xenfb_pv_display_start(void *data)
     int kbd_fd, fb_fd;
     int offset = 0;
     unsigned long *mfns;
-    int n = VGA_RAM_SIZE / PAGE_SIZE;
+    int n = video_ram_size / PAGE_SIZE;
     int i;
 
     if (!fb_path || !kbd_path)
@@ -296,7 +296,7 @@ int xenfb_pv_display_start(void *data)
     if (ds->shared_buf) {
         offset = (void*) ds->data - xs->vga_vram;
     } else {
-        offset = VGA_RAM_SIZE;
+        offset = video_ram_size;
         ds->data = xs->nonshared_vram;
     }
     if (offset)