Revision 8454df8b

b/hw/vga.c
378 378
    VGAState *s = opaque;
379 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 402
        val = 0;
403
    }
385 404
#ifdef DEBUG_BOCHS_VBE
386 405
    printf("VBE: read index=0x%x val=0x%x\n", s->vbe_index, val);
387 406
#endif
......
434 453
            s->bank_offset = (val << 16);
435 454
            break;
436 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 458
                int h, shift_control;
439 459

  
440 460
                s->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] = 
......
450 470
                    s->vbe_line_offset = s->vbe_regs[VBE_DISPI_INDEX_XRES] * 
451 471
                        ((s->vbe_regs[VBE_DISPI_INDEX_BPP] + 7) >> 3);
452 472
                s->vbe_start_addr = 0;
453
                
473

  
454 474
                /* clear the screen (should be done in BIOS) */
455 475
                if (!(val & VBE_DISPI_NOCLEARMEM)) {
456 476
                    memset(s->vram_ptr, 0, 
......
464 484
                s->cr[0x13] = s->vbe_line_offset >> 3;
465 485
                /* width */
466 486
                s->cr[0x01] = (s->vbe_regs[VBE_DISPI_INDEX_XRES] >> 3) - 1;
467
                /* height */
487
                /* height (only meaningful if < 1024) */
468 488
                h = s->vbe_regs[VBE_DISPI_INDEX_YRES] - 1;
469 489
                s->cr[0x12] = h;
470 490
                s->cr[0x07] = (s->cr[0x07] & ~0x42) | 
......
1310 1330
{
1311 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 1346
    *pwidth = width;
1319 1347
    *pheight = height;
1320 1348
}
b/hw/vga_int.h
30 30
/* bochs VBE support */
31 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 37
#define VBE_DISPI_INDEX_ID              0x0
37 38
#define VBE_DISPI_INDEX_XRES            0x1
......
51 52
  
52 53
#define VBE_DISPI_DISABLED              0x00
53 54
#define VBE_DISPI_ENABLED               0x01
55
#define VBE_DISPI_GETCAPS               0x02
56
#define VBE_DISPI_8BIT_DAC              0x20
54 57
#define VBE_DISPI_LFB_ENABLED           0x40
55 58
#define VBE_DISPI_NOCLEARMEM            0x80
56 59
  
......
72 75
#endif /* !CONFIG_BOCHS_VBE */
73 76

  
74 77
#define CH_ATTR_SIZE (160 * 100)
75
#define VGA_MAX_HEIGHT 1024
78
#define VGA_MAX_HEIGHT 2048
76 79

  
77 80
#define VGA_STATE_COMMON                                                \
78 81
    uint8_t *vram_ptr;                                                  \

Also available in: Unified diff