Commit 8454df8b1e7662bdbe423e6494200a5aa9d619ae

Authored by bellard
1 parent 99589bdc

support for Bochs VBE GETCAPS call so that -std-vga works again with new VGA BIO…

…Ses - added support for modes up to 1600x1200x32 in -std-vga case


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1957 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 2 changed files with 45 additions and 14 deletions
hw/vga.c
@@ -378,10 +378,29 @@ static uint32_t vbe_ioport_read_data(void *opaque, uint32_t addr) @@ -378,10 +378,29 @@ static uint32_t vbe_ioport_read_data(void *opaque, uint32_t addr)
378 VGAState *s = opaque; 378 VGAState *s = opaque;
379 uint32_t val; 379 uint32_t val;
380 380
381 - if (s->vbe_index <= VBE_DISPI_INDEX_NB)  
382 - val = s->vbe_regs[s->vbe_index];  
383 - else 381 + if (s->vbe_index <= VBE_DISPI_INDEX_NB) {
  382 + if (s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_GETCAPS) {
  383 + switch(s->vbe_index) {
  384 + /* XXX: do not hardcode ? */
  385 + case VBE_DISPI_INDEX_XRES:
  386 + val = VBE_DISPI_MAX_XRES;
  387 + break;
  388 + case VBE_DISPI_INDEX_YRES:
  389 + val = VBE_DISPI_MAX_YRES;
  390 + break;
  391 + case VBE_DISPI_INDEX_BPP:
  392 + val = VBE_DISPI_MAX_BPP;
  393 + break;
  394 + default:
  395 + val = s->vbe_regs[s->vbe_index];
  396 + break;
  397 + }
  398 + } else {
  399 + val = s->vbe_regs[s->vbe_index];
  400 + }
  401 + } else {
384 val = 0; 402 val = 0;
  403 + }
385 #ifdef DEBUG_BOCHS_VBE 404 #ifdef DEBUG_BOCHS_VBE
386 printf("VBE: read index=0x%x val=0x%x\n", s->vbe_index, val); 405 printf("VBE: read index=0x%x val=0x%x\n", s->vbe_index, val);
387 #endif 406 #endif
@@ -434,7 +453,8 @@ static void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val) @@ -434,7 +453,8 @@ static void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val)
434 s->bank_offset = (val << 16); 453 s->bank_offset = (val << 16);
435 break; 454 break;
436 case VBE_DISPI_INDEX_ENABLE: 455 case VBE_DISPI_INDEX_ENABLE:
437 - if (val & VBE_DISPI_ENABLED) { 456 + if ((val & VBE_DISPI_ENABLED) &&
  457 + !(s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED)) {
438 int h, shift_control; 458 int h, shift_control;
439 459
440 s->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] = 460 s->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] =
@@ -450,7 +470,7 @@ static void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val) @@ -450,7 +470,7 @@ static void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val)
450 s->vbe_line_offset = s->vbe_regs[VBE_DISPI_INDEX_XRES] * 470 s->vbe_line_offset = s->vbe_regs[VBE_DISPI_INDEX_XRES] *
451 ((s->vbe_regs[VBE_DISPI_INDEX_BPP] + 7) >> 3); 471 ((s->vbe_regs[VBE_DISPI_INDEX_BPP] + 7) >> 3);
452 s->vbe_start_addr = 0; 472 s->vbe_start_addr = 0;
453 - 473 +
454 /* clear the screen (should be done in BIOS) */ 474 /* clear the screen (should be done in BIOS) */
455 if (!(val & VBE_DISPI_NOCLEARMEM)) { 475 if (!(val & VBE_DISPI_NOCLEARMEM)) {
456 memset(s->vram_ptr, 0, 476 memset(s->vram_ptr, 0,
@@ -464,7 +484,7 @@ static void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val) @@ -464,7 +484,7 @@ static void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val)
464 s->cr[0x13] = s->vbe_line_offset >> 3; 484 s->cr[0x13] = s->vbe_line_offset >> 3;
465 /* width */ 485 /* width */
466 s->cr[0x01] = (s->vbe_regs[VBE_DISPI_INDEX_XRES] >> 3) - 1; 486 s->cr[0x01] = (s->vbe_regs[VBE_DISPI_INDEX_XRES] >> 3) - 1;
467 - /* height */ 487 + /* height (only meaningful if < 1024) */
468 h = s->vbe_regs[VBE_DISPI_INDEX_YRES] - 1; 488 h = s->vbe_regs[VBE_DISPI_INDEX_YRES] - 1;
469 s->cr[0x12] = h; 489 s->cr[0x12] = h;
470 s->cr[0x07] = (s->cr[0x07] & ~0x42) | 490 s->cr[0x07] = (s->cr[0x07] & ~0x42) |
@@ -1310,11 +1330,19 @@ static void vga_get_resolution(VGAState *s, int *pwidth, int *pheight) @@ -1310,11 +1330,19 @@ static void vga_get_resolution(VGAState *s, int *pwidth, int *pheight)
1310 { 1330 {
1311 int width, height; 1331 int width, height;
1312 1332
1313 - width = (s->cr[0x01] + 1) * 8;  
1314 - height = s->cr[0x12] |  
1315 - ((s->cr[0x07] & 0x02) << 7) |  
1316 - ((s->cr[0x07] & 0x40) << 3);  
1317 - height = (height + 1); 1333 +#ifdef CONFIG_BOCHS_VBE
  1334 + if (s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED) {
  1335 + width = s->vbe_regs[VBE_DISPI_INDEX_XRES];
  1336 + height = s->vbe_regs[VBE_DISPI_INDEX_YRES];
  1337 + } else
  1338 +#endif
  1339 + {
  1340 + width = (s->cr[0x01] + 1) * 8;
  1341 + height = s->cr[0x12] |
  1342 + ((s->cr[0x07] & 0x02) << 7) |
  1343 + ((s->cr[0x07] & 0x40) << 3);
  1344 + height = (height + 1);
  1345 + }
1318 *pwidth = width; 1346 *pwidth = width;
1319 *pheight = height; 1347 *pheight = height;
1320 } 1348 }
hw/vga_int.h
@@ -30,8 +30,9 @@ @@ -30,8 +30,9 @@
30 /* bochs VBE support */ 30 /* bochs VBE support */
31 #define CONFIG_BOCHS_VBE 31 #define CONFIG_BOCHS_VBE
32 32
33 -#define VBE_DISPI_MAX_XRES 1024  
34 -#define VBE_DISPI_MAX_YRES 768 33 +#define VBE_DISPI_MAX_XRES 1600
  34 +#define VBE_DISPI_MAX_YRES 1200
  35 +#define VBE_DISPI_MAX_BPP 32
35 36
36 #define VBE_DISPI_INDEX_ID 0x0 37 #define VBE_DISPI_INDEX_ID 0x0
37 #define VBE_DISPI_INDEX_XRES 0x1 38 #define VBE_DISPI_INDEX_XRES 0x1
@@ -51,6 +52,8 @@ @@ -51,6 +52,8 @@
51 52
52 #define VBE_DISPI_DISABLED 0x00 53 #define VBE_DISPI_DISABLED 0x00
53 #define VBE_DISPI_ENABLED 0x01 54 #define VBE_DISPI_ENABLED 0x01
  55 +#define VBE_DISPI_GETCAPS 0x02
  56 +#define VBE_DISPI_8BIT_DAC 0x20
54 #define VBE_DISPI_LFB_ENABLED 0x40 57 #define VBE_DISPI_LFB_ENABLED 0x40
55 #define VBE_DISPI_NOCLEARMEM 0x80 58 #define VBE_DISPI_NOCLEARMEM 0x80
56 59
@@ -72,7 +75,7 @@ @@ -72,7 +75,7 @@
72 #endif /* !CONFIG_BOCHS_VBE */ 75 #endif /* !CONFIG_BOCHS_VBE */
73 76
74 #define CH_ATTR_SIZE (160 * 100) 77 #define CH_ATTR_SIZE (160 * 100)
75 -#define VGA_MAX_HEIGHT 1024 78 +#define VGA_MAX_HEIGHT 2048
76 79
77 #define VGA_STATE_COMMON \ 80 #define VGA_STATE_COMMON \
78 uint8_t *vram_ptr; \ 81 uint8_t *vram_ptr; \