From: Jean Guyader Date: Wed, 15 Oct 2008 17:20:23 +0000 (+0100) Subject: - Import vbe3 patch X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=4fefc4c69001cf392b12c24acf4eec565190b27b;p=xenclient%2Fioemu.git - Import vbe3 patch --- diff --git a/hw/cirrus_vga.c b/hw/cirrus_vga.c index 37e312d7..4ca6b99e 100644 --- a/hw/cirrus_vga.c +++ b/hw/cirrus_vga.c @@ -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)) diff --git a/hw/mips_mipssim.c b/hw/mips_mipssim.c index e29d8af4..0873c640 100644 --- a/hw/mips_mipssim.c +++ b/hw/mips_mipssim.c @@ -195,5 +195,5 @@ QEMUMachine mips_mipssim_machine = { "mipssim", "MIPS MIPSsim platform", mips_mipssim_init, - BIOS_SIZE + VGA_RAM_SIZE /* unused */, + BIOS_SIZE /* unused */, }; diff --git a/hw/mips_r4k.c b/hw/mips_r4k.c index 66ae1356..0007b772 100644 --- a/hw/mips_r4k.c +++ b/hw/mips_r4k.c @@ -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 bd5add73..3c4f8985 100644 --- 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 a78e0393..f57d1604 100644 --- 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); diff --git a/hw/ppc_chrp.c b/hw/ppc_chrp.c index deb97611..36d64472 100644 --- a/hw/ppc_chrp.c +++ b/hw/ppc_chrp.c @@ -335,5 +335,5 @@ QEMUMachine core99_machine = { "mac99", "Mac99 based PowerMAC", ppc_core99_init, - BIOS_SIZE + VGA_RAM_SIZE, + BIOS_SIZE, }; diff --git a/hw/ppc_oldworld.c b/hw/ppc_oldworld.c index be5ee671..3125162c 100644 --- a/hw/ppc_oldworld.c +++ b/hw/ppc_oldworld.c @@ -370,5 +370,5 @@ QEMUMachine heathrow_machine = { "g3bw", "Heathrow based PowerMAC", ppc_heathrow_init, - BIOS_SIZE + VGA_RAM_SIZE, + BIOS_SIZE, }; diff --git a/hw/ppc_prep.c b/hw/ppc_prep.c index 9238e6d4..fc58c715 100644 --- a/hw/ppc_prep.c +++ b/hw/ppc_prep.c @@ -764,5 +764,5 @@ QEMUMachine prep_machine = { "prep", "PowerPC PREP platform", ppc_prep_init, - BIOS_SIZE + VGA_RAM_SIZE, + BIOS_SIZE, }; diff --git a/hw/sun4u.c b/hw/sun4u.c index 0cc04f97..67356325 100644 --- a/hw/sun4u.c +++ b/hw/sun4u.c @@ -388,5 +388,5 @@ QEMUMachine sun4u_machine = { "sun4u", "Sun4u platform", sun4u_init, - PROM_SIZE_MAX + VGA_RAM_SIZE, + PROM_SIZE_MAX, }; diff --git a/hw/vga.c b/hw/vga.c index 8e5a2c17..c843821c 100644 --- a/hw/vga.c +++ b/hw/vga.c @@ -37,6 +37,11 @@ //#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, diff --git a/hw/vga_int.h b/hw/vga_int.h index 8aecbb76..0b441192 100644 --- a/hw/vga_int.h +++ b/hw/vga_int.h @@ -28,38 +28,41 @@ #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 diff --git a/hw/xen_machine_fv.c b/hw/xen_machine_fv.c index 1f85c5c9..88cb9084 100644 --- a/hw/xen_machine_fv.c +++ b/hw/xen_machine_fv.c @@ -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, }; /* diff --git a/hw/xen_machine_pv.c b/hw/xen_machine_pv.c index 798b7354..3a716160 100644 --- a/hw/xen_machine_pv.c +++ b/hw/xen_machine_pv.c @@ -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, }; /* diff --git a/hw/xen_platform.c b/hw/xen_platform.c index 099978e5..fe10cfa1 100644 --- a/hw/xen_platform.c +++ b/hw/xen_platform.c @@ -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; } diff --git a/sysemu.h b/sysemu.h index c294c12b..a9ba6cc9 100644 --- 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 006acb3e..8a5f877e 100644 --- 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) { diff --git a/xenfbfront.c b/xenfbfront.c index 3a67ada9..d6aa3336 100644 --- a/xenfbfront.c +++ b/xenfbfront.c @@ -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)