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);
{
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);
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)
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);
} 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);
}
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))
"mipssim",
"MIPS MIPSsim platform",
mips_mipssim_init,
- BIOS_SIZE + VGA_RAM_SIZE /* unused */,
+ BIOS_SIZE /* unused */,
};
"mips",
"mips r4k platform",
mips_r4k_init,
- VGA_RAM_SIZE + BIOS_SIZE,
+ BIOS_SIZE,
};
"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,
};
/* 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);
"mac99",
"Mac99 based PowerMAC",
ppc_core99_init,
- BIOS_SIZE + VGA_RAM_SIZE,
+ BIOS_SIZE,
};
"g3bw",
"Heathrow based PowerMAC",
ppc_heathrow_init,
- BIOS_SIZE + VGA_RAM_SIZE,
+ BIOS_SIZE,
};
"prep",
"PowerPC PREP platform",
ppc_prep_init,
- BIOS_SIZE + VGA_RAM_SIZE,
+ BIOS_SIZE,
};
"sun4u",
"Sun4u platform",
sun4u_init,
- PROM_SIZE_MAX + VGA_RAM_SIZE,
+ PROM_SIZE_MAX,
};
//#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,
#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)
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;
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) {
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];
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];
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) {
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) {
static void vga_invalidate_display(void *opaque)
{
VGAState *s = (VGAState *)opaque;
-
s->last_width = -1;
s->last_height = -1;
}
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;
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)
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)
}
/* 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 */
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);
}
}
{
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,
s->graphic_mode = -1;
/* TODO: add vbe support if enabled */
+#ifdef CONFIG_BOCHS_VBE
+
+#endif
}
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);
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);
}
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);
}
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;
vga_reset(s);
s->vram_ptr = qemu_malloc(vga_ram_size);
+
s->vram_mfns = NULL;
xen_vga_state = s;
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,
#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
"xenfv",
"Xen Fully-virtualized PC",
xen_init_fv,
- (VGA_RAM_SIZE + BIOS_SIZE) | RAMSIZE_FIXED,
+ BIOS_SIZE | RAMSIZE_FIXED,
};
/*
"xenpv",
"Xen Para-virtualized PC",
xen_init_pv,
- (VGA_RAM_SIZE + BIOS_SIZE) | RAMSIZE_FIXED,
+ BIOS_SIZE | RAMSIZE_FIXED,
};
/*
#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;
switch (addr) {
case 4: /* VGA stolen memory address */
return d->vga_stolen_ram;
+ case 8:
+ return video_ram_size;
default:
return ~0u;
}
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;
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;
#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
QEMU_OPTION_vmsvga,
QEMU_OPTION_g,
QEMU_OPTION_std_vga,
+ QEMU_OPTION_videoram,
QEMU_OPTION_echr,
QEMU_OPTION_monitor,
QEMU_OPTION_domainname,
#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 },
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;
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;
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;
#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) {
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);
}
}
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;
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)
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)