diff -uNr trunk/hw/cirrus_vga.c trunk-patched/hw/cirrus_vga.c --- trunk/hw/cirrus_vga.c 2009-01-22 13:56:24.179095213 -0500 +++ trunk-patched/hw/cirrus_vga.c 2009-01-22 14:00:36.536346261 -0500 @@ -3299,6 +3299,12 @@ s = qemu_mallocz(sizeof(CirrusVGAState)); + if ( vga_ram_size != 4*1024*1024 ) + { + fprintf(stderr,"The -videoram option does not work with the cirrus vga model. Video ram set to 4M. \n"); + vga_ram_size=4*1024*1024; + } + vga_common_init((VGAState *)s, vga_ram_base, vga_ram_offset, vga_ram_size); cirrus_init_common(s, CIRRUS_ID_CLGD5430, 0); @@ -3328,10 +3334,10 @@ s->map_addr = s->map_end = 0; s->lfb_addr = addr & TARGET_PAGE_MASK; - s->lfb_end = ((addr + VGA_RAM_SIZE) + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK; + s->lfb_end = ((addr + s->vram_size) + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK; /* account for overflow */ - if (s->lfb_end < addr + VGA_RAM_SIZE) - s->lfb_end = addr + VGA_RAM_SIZE; + if (s->lfb_end < addr + s->vram_size) + s->lfb_end = addr + s->vram_size; vga_dirty_log_start((VGAState *)s); } @@ -3387,6 +3393,13 @@ /* setup VGA */ s = &d->cirrus_vga; + + if ( vga_ram_size != 4*1024*1024 ) + { + fprintf(stderr,"The -videoram option does not work with the cirrus vga model. Video ram set to 4M. \n"); + vga_ram_size=4*1024*1024; + } + vga_common_init((VGAState *)s, vga_ram_base, vga_ram_offset, vga_ram_size); cirrus_init_common(s, device_id, 1); diff -uNr trunk/hw/mips_jazz.c trunk-patched/hw/mips_jazz.c --- trunk/hw/mips_jazz.c 2009-01-19 18:04:34.482293278 -0500 +++ trunk-patched/hw/mips_jazz.c 2009-01-22 13:58:26.532346492 -0500 @@ -293,7 +293,7 @@ .name = "magnum", .desc = "MIPS Magnum", .init = mips_magnum_init, - .ram_require = MAGNUM_BIOS_SIZE + VGA_RAM_SIZE, + .ram_require = MAGNUM_BIOS_SIZE, .nodisk_ok = 1, .use_scsi = 1, }; @@ -302,7 +302,7 @@ .name = "pica61", .desc = "Acer Pica 61", .init = mips_pica61_init, - .ram_require = MAGNUM_BIOS_SIZE + VGA_RAM_SIZE, + .ram_require = MAGNUM_BIOS_SIZE, .nodisk_ok = 1, .use_scsi = 1, }; diff -uNr trunk/hw/mips_malta.c trunk-patched/hw/mips_malta.c --- trunk/hw/mips_malta.c 2009-01-19 18:04:34.514292790 -0500 +++ trunk-patched/hw/mips_malta.c 2009-01-22 13:58:26.550097093 -0500 @@ -943,6 +943,6 @@ .name = "malta", .desc = "MIPS Malta Core LV", .init = mips_malta_init, - .ram_require = VGA_RAM_SIZE + BIOS_SIZE, + .ram_require = BIOS_SIZE, .nodisk_ok = 1, }; diff -uNr trunk/hw/mips_mipssim.c trunk-patched/hw/mips_mipssim.c --- trunk/hw/mips_mipssim.c 2009-01-19 18:04:34.495297312 -0500 +++ trunk-patched/hw/mips_mipssim.c 2009-01-22 13:58:26.558347388 -0500 @@ -184,6 +184,6 @@ .name = "mipssim", .desc = "MIPS MIPSsim platform", .init = mips_mipssim_init, - .ram_require = BIOS_SIZE + VGA_RAM_SIZE /* unused */, + .ram_require = BIOS_SIZE /* unused */, .nodisk_ok = 1, }; diff -uNr trunk/hw/mips_r4k.c trunk-patched/hw/mips_r4k.c --- trunk/hw/mips_r4k.c 2009-01-19 18:04:34.523310792 -0500 +++ trunk-patched/hw/mips_r4k.c 2009-01-22 13:58:26.564119313 -0500 @@ -275,6 +275,6 @@ .name = "mips", .desc = "mips r4k platform", .init = mips_r4k_init, - .ram_require = VGA_RAM_SIZE + BIOS_SIZE, + .ram_require = BIOS_SIZE, .nodisk_ok = 1, }; diff -uNr trunk/hw/pc.c trunk-patched/hw/pc.c --- trunk/hw/pc.c 2009-01-19 18:04:34.518294675 -0500 +++ trunk-patched/hw/pc.c 2009-01-22 13:58:26.582346647 -0500 @@ -852,29 +852,29 @@ exit(1); } - if (cirrus_vga_enabled || std_vga_enabled || vmsvga_enabled) { - /* VGA BIOS load */ - if (cirrus_vga_enabled) { - snprintf(buf, sizeof(buf), "%s/%s", bios_dir, VGABIOS_CIRRUS_FILENAME); - } else { - snprintf(buf, sizeof(buf), "%s/%s", bios_dir, VGABIOS_FILENAME); - } - vga_bios_size = get_image_size(buf); - if (vga_bios_size <= 0 || vga_bios_size > 65536) - goto vga_bios_error; - vga_bios_offset = qemu_ram_alloc(65536); - - ret = load_image(buf, phys_ram_base + vga_bios_offset); - if (ret != vga_bios_size) { -vga_bios_error: - fprintf(stderr, "qemu: could not load VGA BIOS '%s'\n", buf); - exit(1); - } + if (vgahw_model != VGAHW_NONE) { + /* VGA BIOS load */ + if (vgahw_model == VGAHW_CIRRUS) + snprintf(buf, sizeof(buf), "%s/%s", bios_dir, VGABIOS_CIRRUS_FILENAME); + else + snprintf(buf, sizeof(buf), "%s/%s", bios_dir, VGABIOS_FILENAME); + + vga_bios_size = get_image_size(buf); + if (vga_bios_size <= 0 || vga_bios_size > 65536) + goto vga_bios_error; + vga_bios_offset = qemu_ram_alloc(65536); + + ret = load_image(buf, phys_ram_base + vga_bios_offset); + if (ret != vga_bios_size) { + vga_bios_error: + fprintf(stderr, "qemu: could not load VGA BIOS '%s'\n", buf); + exit(1); + } + } - /* setup basic memory access */ - cpu_register_physical_memory(0xc0000, 0x10000, + /* setup basic memory access */ + cpu_register_physical_memory(0xc0000, 0x10000, vga_bios_offset | IO_MEM_ROM); - } /* map the last 128KB of the BIOS in ISA space */ isa_bios_size = bios_size; @@ -943,29 +943,35 @@ register_ioport_write(0xf0, 1, 1, ioportF0_write, NULL); - if (cirrus_vga_enabled) { - if (pci_enabled) { - pci_cirrus_vga_init(pci_bus, + switch(vgahw_model) { + case VGAHW_NONE: + break; + case VGAHW_CIRRUS: + if (pci_enabled) + pci_cirrus_vga_init(pci_bus, + phys_ram_base + vga_ram_addr, + vga_ram_addr, vga_ram_size); + else + isa_cirrus_vga_init(phys_ram_base + vga_ram_addr, + vga_ram_addr, vga_ram_size); + break; + case VGAHW_VMWARE: + if (pci_enabled) + pci_vmsvga_init(pci_bus, phys_ram_base + vga_ram_addr, vga_ram_addr, vga_ram_size); - } else { - isa_cirrus_vga_init(phys_ram_base + vga_ram_addr, - vga_ram_addr, vga_ram_size); - } - } else if (vmsvga_enabled) { - if (pci_enabled) - pci_vmsvga_init(pci_bus, phys_ram_base + vga_ram_addr, - vga_ram_addr, vga_ram_size); - else - fprintf(stderr, "%s: vmware_vga: no PCI bus\n", __FUNCTION__); - } else if (std_vga_enabled) { - if (pci_enabled) { - pci_vga_init(pci_bus, phys_ram_base + vga_ram_addr, - vga_ram_addr, vga_ram_size, 0, 0); - } else { - isa_vga_init(phys_ram_base + vga_ram_addr, - vga_ram_addr, vga_ram_size); - } + else + fprintf(stderr, "%s: vmware_vga: no PCI bus\n", __FUNCTION__); + break; + case VGAHW_STD: + if (pci_enabled) + pci_vga_init(pci_bus, + phys_ram_base + vga_ram_addr, + vga_ram_addr, vga_ram_size, 0, 0); + else + isa_vga_init(phys_ram_base + vga_ram_addr, + vga_ram_addr, vga_ram_size); + break; } rtc_state = rtc_init(0x70, i8259[8]); @@ -1146,7 +1152,7 @@ .name = "pc", .desc = "Standard PC", .init = pc_init_pci, - .ram_require = VGA_RAM_SIZE + PC_MAX_BIOS_SIZE, + .ram_require = PC_MAX_BIOS_SIZE, .max_cpus = 255, }; @@ -1154,6 +1160,6 @@ .name = "isapc", .desc = "ISA-only PC", .init = pc_init_isa, - .ram_require = VGA_RAM_SIZE + PC_MAX_BIOS_SIZE, + .ram_require = PC_MAX_BIOS_SIZE, .max_cpus = 1, }; diff -uNr trunk/hw/pc.h trunk-patched/hw/pc.h --- trunk/hw/pc.h 2009-01-19 18:04:34.518294675 -0500 +++ trunk-patched/hw/pc.h 2009-01-22 13:58:26.586385471 -0500 @@ -126,12 +126,6 @@ extern enum vga_retrace_method vga_retrace_method; -#ifndef TARGET_SPARC -#define VGA_RAM_SIZE (8192 * 1024) -#else -#define VGA_RAM_SIZE (9 * 1024 * 1024) -#endif - int isa_vga_init(uint8_t *vga_ram_base, unsigned long vga_ram_offset, int vga_ram_size); int pci_vga_init(PCIBus *bus, uint8_t *vga_ram_base, diff -uNr trunk/hw/ppc_chrp.c trunk-patched/hw/ppc_chrp.c --- trunk/hw/ppc_chrp.c 2009-01-19 18:04:34.414289295 -0500 +++ trunk-patched/hw/ppc_chrp.c 2009-01-22 13:58:26.597102403 -0500 @@ -334,6 +334,6 @@ .name = "mac99", .desc = "Mac99 based PowerMAC", .init = ppc_core99_init, - .ram_require = BIOS_SIZE + VGA_RAM_SIZE, + .ram_require = BIOS_SIZE, .max_cpus = MAX_CPUS, }; diff -uNr trunk/hw/ppc_oldworld.c trunk-patched/hw/ppc_oldworld.c --- trunk/hw/ppc_oldworld.c 2009-01-19 18:04:34.505293366 -0500 +++ trunk-patched/hw/ppc_oldworld.c 2009-01-22 13:58:26.605097431 -0500 @@ -383,6 +383,6 @@ .name = "g3beige", .desc = "Heathrow based PowerMAC", .init = ppc_heathrow_init, - .ram_require = BIOS_SIZE + VGA_BIOS_SIZE + VGA_RAM_SIZE, + .ram_require = BIOS_SIZE + VGA_BIOS_SIZE, .max_cpus = MAX_CPUS, }; diff -uNr trunk/hw/ppc_prep.c trunk-patched/hw/ppc_prep.c --- trunk/hw/ppc_prep.c 2009-01-19 18:04:34.430293137 -0500 +++ trunk-patched/hw/ppc_prep.c 2009-01-22 13:58:26.616177257 -0500 @@ -760,6 +760,6 @@ .name = "prep", .desc = "PowerPC PREP platform", .init = ppc_prep_init, - .ram_require = BIOS_SIZE + VGA_RAM_SIZE, + .ram_require = BIOS_SIZE, .max_cpus = MAX_CPUS, }; diff -uNr trunk/hw/sun4u.c trunk-patched/hw/sun4u.c --- trunk/hw/sun4u.c 2009-01-19 18:04:34.486295094 -0500 +++ trunk-patched/hw/sun4u.c 2009-01-22 13:58:26.625136018 -0500 @@ -644,7 +644,7 @@ .name = "sun4u", .desc = "Sun4u platform", .init = sun4u_init, - .ram_require = PROM_SIZE_MAX + VGA_RAM_SIZE, + .ram_require = PROM_SIZE_MAX, .nodisk_ok = 1, .max_cpus = 1, // XXX for now }; @@ -653,7 +653,7 @@ .name = "sun4v", .desc = "Sun4v platform", .init = sun4v_init, - .ram_require = PROM_SIZE_MAX + VGA_RAM_SIZE, + .ram_require = PROM_SIZE_MAX, .nodisk_ok = 1, .max_cpus = 1, // XXX for now }; @@ -662,7 +662,7 @@ .name = "Niagara", .desc = "Sun4v platform, Niagara", .init = niagara_init, - .ram_require = PROM_SIZE_MAX + VGA_RAM_SIZE, + .ram_require = PROM_SIZE_MAX, .nodisk_ok = 1, .max_cpus = 1, // XXX for now }; diff -uNr trunk/hw/vga.c trunk-patched/hw/vga.c --- trunk/hw/vga.c 2009-01-19 18:04:34.484284722 -0500 +++ trunk-patched/hw/vga.c 2009-01-22 13:58:26.628133586 -0500 @@ -36,6 +36,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, @@ -2246,10 +2251,20 @@ 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 + 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] = s->vram_size >> 16; +#endif + + if (size != s->vram_size) + fprintf(stderr, "vga map with size %x != %x\n", size, s->vram_size); } s->map_addr = addr; - s->map_end = addr + VGA_RAM_SIZE; + s->map_end = addr + s->vram_size; vga_dirty_log_start(s); } @@ -2509,6 +2524,7 @@ 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 diff -uNr trunk/hw/vga_int.h trunk-patched/hw/vga_int.h --- trunk/hw/vga_int.h 2009-01-19 18:04:34.421284633 -0500 +++ trunk-patched/hw/vga_int.h 2009-01-22 13:58:26.640133704 -0500 @@ -30,36 +30,39 @@ /* 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_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 0xE0000000 +#define VBE_DISPI_LFB_PHYSICAL_ADDRESS 0xE0000000 #ifdef CONFIG_BOCHS_VBE diff -uNr trunk/sysemu.h trunk-patched/sysemu.h --- trunk/sysemu.h 2009-01-22 13:56:24.262095128 -0500 +++ trunk-patched/sysemu.h 2009-01-22 13:58:26.641095482 -0500 @@ -77,10 +77,12 @@ /* SLIRP */ void do_info_slirp(void); +typedef enum { + VGAHW_NONE, VGAHW_CIRRUS, VGAHW_STD, VGAHW_VMWARE +} VGAHardwareModel; + +extern VGAHardwareModel vgahw_model; extern int bios_size; -extern int cirrus_vga_enabled; -extern int std_vga_enabled; -extern int vmsvga_enabled; extern int graphic_width; extern int graphic_height; extern int graphic_depth; diff -uNr trunk/vl.c trunk-patched/vl.c --- trunk/vl.c 2009-01-22 13:56:24.255095556 -0500 +++ trunk-patched/vl.c 2009-01-22 13:58:26.646133380 -0500 @@ -185,7 +185,8 @@ to store the VM snapshots */ DriveInfo drives_table[MAX_DRIVES+1]; int nb_drives; -static int vga_ram_size; +static int vga_ram_size = 0; +VGAHardwareModel vgahw_model = VGAHW_CIRRUS; enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB; static DisplayState *display_state; int nographic; @@ -3899,7 +3900,10 @@ " use -soundhw ? to get the list of supported cards\n" " use -soundhw all to enable all of them\n" #endif +#if !defined(TARGET_SPARC) || defined(TARGET_SPARC64) "-vga [std|cirrus|vmware|none]\n" + "-videoram set amount of memory available to virtual video adapter\n" +#endif " select video card type\n" "-localtime set the real time clock to local time [default=utc]\n" "-full-screen start in full screen\n" @@ -4087,6 +4091,7 @@ QEMU_OPTION_localtime, QEMU_OPTION_g, QEMU_OPTION_vga, + QEMU_OPTION_videoram, QEMU_OPTION_echr, QEMU_OPTION_monitor, QEMU_OPTION_serial, @@ -4199,6 +4204,7 @@ #endif { "localtime", 0, QEMU_OPTION_localtime }, { "vga", HAS_ARG, QEMU_OPTION_vga }, + { "videoram", HAS_ARG, QEMU_OPTION_videoram }, { "echr", HAS_ARG, QEMU_OPTION_echr }, { "monitor", HAS_ARG, QEMU_OPTION_monitor }, { "serial", HAS_ARG, QEMU_OPTION_serial }, @@ -4435,21 +4441,13 @@ const char *opts; if (strstart(p, "std", &opts)) { - std_vga_enabled = 1; - cirrus_vga_enabled = 0; - vmsvga_enabled = 0; + vgahw_model = VGAHW_STD; } else if (strstart(p, "cirrus", &opts)) { - cirrus_vga_enabled = 1; - std_vga_enabled = 0; - vmsvga_enabled = 0; + vgahw_model = VGAHW_CIRRUS; } else if (strstart(p, "vmware", &opts)) { - cirrus_vga_enabled = 0; - std_vga_enabled = 0; - vmsvga_enabled = 1; + vgahw_model = VGAHW_VMWARE; } else if (strstart(p, "none", &opts)) { - cirrus_vga_enabled = 0; - std_vga_enabled = 0; - vmsvga_enabled = 0; + vgahw_model = VGAHW_NONE; } else { invalid_vga: fprintf(stderr, "Unknown vga type: %s\n", p); @@ -4596,7 +4594,6 @@ cpu_model = NULL; initrd_filename = NULL; ram_size = 0; - vga_ram_size = VGA_RAM_SIZE; #ifdef CONFIG_GDBSTUB use_gdbstub = 0; gdbstub_port = DEFAULT_GDBSTUB_PORT; @@ -4958,6 +4955,13 @@ case QEMU_OPTION_vga: select_vgahw (optarg); break; + case QEMU_OPTION_videoram: + { + char *ptr; + vga_ram_size = strtol(optarg,&ptr,10); + vga_ram_size *= 1024 * 1024; + } + break; case QEMU_OPTION_g: { const char *p; @@ -5386,7 +5390,30 @@ exit(1); /* init the memory */ - phys_ram_size = machine->ram_require & ~RAMSIZE_FIXED; + + /* Set defaults according to model, if -videoram has not been used. */ +#if !defined(TARGET_SPARC) || defined(TARGET_SPARC64) + if (vga_ram_size && vgahw_model == VGAHW_NONE) { + fprintf(stderr, "Nonsensical options: -vga none & -videoram used together. \n"); + vga_ram_size = 0; + } else if (!vga_ram_size && vgahw_model != VGAHW_NONE) { + switch(vgahw_model) { + case VGAHW_CIRRUS: + vga_ram_size=4 * 1024 * 1024; + break; + case VGAHW_STD: + vga_ram_size=8 * 1024 * 1024; + break; + case VGAHW_VMWARE: + vga_ram_size=8 * 1024 * 1024; + break; + } + } +#else + vga_ram_size = 9 * 1024 * 1024; +#endif + + phys_ram_size = (machine->ram_require + vga_ram_size) & ~RAMSIZE_FIXED; if (machine->ram_require & RAMSIZE_FIXED) { if (ram_size > 0) {