Changeset 44876 in vbox
- Timestamp:
- Feb 28, 2013 8:56:09 PM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 84039
- Location:
- trunk/src/VBox/Devices
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Graphics/DevVGA.cpp
r44845 r44876 463 463 * Unless the CRTC is horribly misprogrammed, vsync implies vblank. 464 464 */ 465 static void vga_update_retrace_state(VGAState * s)465 static void vga_update_retrace_state(VGAState *pThis) 466 466 { 467 467 unsigned htotal_cclks, vtotal_lines, chars_per_sec; … … 471 471 unsigned char_dots, clock_doubled, clock_index; 472 472 const int clocks[] = {25175000, 28322000, 25175000, 25175000}; 473 vga_retrace_s *r = & s->retrace_state;473 vga_retrace_s *r = &pThis->retrace_state; 474 474 475 475 /* For horizontal timings, we only care about the blanking start/end. */ 476 htotal_cclks = s->cr[0x00] + 5;477 hblank_start_cclk = s->cr[0x02];478 hblank_end_cclk = ( s->cr[0x03] & 0x1f) + ((s->cr[0x05] & 0x80) >> 2);479 hblank_skew_cclks = ( s->cr[0x03] >> 5) & 3;476 htotal_cclks = pThis->cr[0x00] + 5; 477 hblank_start_cclk = pThis->cr[0x02]; 478 hblank_end_cclk = (pThis->cr[0x03] & 0x1f) + ((pThis->cr[0x05] & 0x80) >> 2); 479 hblank_skew_cclks = (pThis->cr[0x03] >> 5) & 3; 480 480 481 481 /* For vertical timings, we need both the blanking start/end... */ 482 vtotal_lines = s->cr[0x06] + ((s->cr[0x07] & 1) << 8) + ((s->cr[0x07] & 0x20) << 4) + 2;483 vblank_start_line = s->cr[0x15] + ((s->cr[0x07] & 8) << 5) + ((s->cr[0x09] & 0x20) << 4);484 vblank_end = s->cr[0x16];482 vtotal_lines = pThis->cr[0x06] + ((pThis->cr[0x07] & 1) << 8) + ((pThis->cr[0x07] & 0x20) << 4) + 2; 483 vblank_start_line = pThis->cr[0x15] + ((pThis->cr[0x07] & 8) << 5) + ((pThis->cr[0x09] & 0x20) << 4); 484 vblank_end = pThis->cr[0x16]; 485 485 /* ... and the vertical retrace (vsync) start/end. */ 486 vsync_start_line = s->cr[0x10] + ((s->cr[0x07] & 4) << 6) + ((s->cr[0x07] & 0x80) << 2);487 vsync_end = s->cr[0x11] & 0xf;486 vsync_start_line = pThis->cr[0x10] + ((pThis->cr[0x07] & 4) << 6) + ((pThis->cr[0x07] & 0x80) << 2); 487 vsync_end = pThis->cr[0x11] & 0xf; 488 488 489 489 /* Calculate the blanking and sync widths. The way it's implemented in … … 495 495 496 496 /* Calculate the dot and character clock rates. */ 497 clock_doubled = ( s->sr[0x01] >> 3) & 1; /* Clock doubling bit. */498 clock_index = ( s->msr >> 2) & 3;499 char_dots = ( s->sr[0x01] & 1) ? 8 : 9; /* 8 or 9 dots per cclk. */497 clock_doubled = (pThis->sr[0x01] >> 3) & 1; /* Clock doubling bit. */ 498 clock_index = (pThis->msr >> 2) & 3; 499 char_dots = (pThis->sr[0x01] & 1) ? 8 : 9; /* 8 or 9 dots per cclk. */ 500 500 501 501 chars_per_sec = clocks[clock_index] / char_dots; … … 539 539 } 540 540 541 static uint8_t vga_retrace(VGAState * s)542 { 543 vga_retrace_s *r = & s->retrace_state;541 static uint8_t vga_retrace(VGAState *pThis) 542 { 543 vga_retrace_s *r = &pThis->retrace_state; 544 544 545 545 if (r->frame_ns) { 546 uint8_t val = s->st01 & ~(ST01_V_RETRACE | ST01_DISP_ENABLE);546 uint8_t val = pThis->st01 & ~(ST01_V_RETRACE | ST01_DISP_ENABLE); 547 547 unsigned cur_frame_ns, cur_line_ns; 548 548 uint64_t time_ns; 549 549 550 time_ns = PDMDevHlpTMTimeVirtGetNano(VGASTATE2DEVINS( s));550 time_ns = PDMDevHlpTMTimeVirtGetNano(VGASTATE2DEVINS(pThis)); 551 551 552 552 /* Determine the time within the frame. */ … … 568 568 return val; 569 569 } else { 570 return s->st01 ^ (ST01_V_RETRACE | ST01_DISP_ENABLE);571 } 572 } 573 574 int vga_ioport_invalid(VGAState * s, uint32_t addr)575 { 576 if ( s->msr & MSR_COLOR_EMULATION) {570 return pThis->st01 ^ (ST01_V_RETRACE | ST01_DISP_ENABLE); 571 } 572 } 573 574 int vga_ioport_invalid(VGAState *pThis, uint32_t addr) 575 { 576 if (pThis->msr & MSR_COLOR_EMULATION) { 577 577 /* Color */ 578 578 return (addr >= 0x3b0 && addr <= 0x3bf); … … 585 585 static uint32_t vga_ioport_read(void *opaque, uint32_t addr) 586 586 { 587 VGAState * s = (VGAState*)opaque;587 VGAState *pThis = (VGAState*)opaque; 588 588 int val, index; 589 589 590 590 /* check port range access depending on color/monochrome mode */ 591 if (vga_ioport_invalid( s, addr)) {591 if (vga_ioport_invalid(pThis, addr)) { 592 592 val = 0xff; 593 593 Log(("VGA: following read ignored\n")); … … 595 595 switch(addr) { 596 596 case 0x3c0: 597 if ( s->ar_flip_flop == 0) {598 val = s->ar_index;597 if (pThis->ar_flip_flop == 0) { 598 val = pThis->ar_index; 599 599 } else { 600 600 val = 0; … … 602 602 break; 603 603 case 0x3c1: 604 index = s->ar_index & 0x1f;604 index = pThis->ar_index & 0x1f; 605 605 if (index < 21) 606 val = s->ar[index];606 val = pThis->ar[index]; 607 607 else 608 608 val = 0; 609 609 break; 610 610 case 0x3c2: 611 val = s->st00;611 val = pThis->st00; 612 612 break; 613 613 case 0x3c4: 614 val = s->sr_index;614 val = pThis->sr_index; 615 615 break; 616 616 case 0x3c5: 617 val = s->sr[s->sr_index];618 Log2(("vga: read SR%x = 0x%02x\n", s->sr_index, val));617 val = pThis->sr[pThis->sr_index]; 618 Log2(("vga: read SR%x = 0x%02x\n", pThis->sr_index, val)); 619 619 break; 620 620 case 0x3c7: 621 val = s->dac_state;621 val = pThis->dac_state; 622 622 break; 623 623 case 0x3c8: 624 val = s->dac_write_index;624 val = pThis->dac_write_index; 625 625 break; 626 626 case 0x3c9: 627 val = s->palette[s->dac_read_index * 3 +s->dac_sub_index];628 if (++ s->dac_sub_index == 3) {629 s->dac_sub_index = 0;630 s->dac_read_index++;627 val = pThis->palette[pThis->dac_read_index * 3 + pThis->dac_sub_index]; 628 if (++pThis->dac_sub_index == 3) { 629 pThis->dac_sub_index = 0; 630 pThis->dac_read_index++; 631 631 } 632 632 break; 633 633 case 0x3ca: 634 val = s->fcr;634 val = pThis->fcr; 635 635 break; 636 636 case 0x3cc: 637 val = s->msr;637 val = pThis->msr; 638 638 break; 639 639 case 0x3ce: 640 val = s->gr_index;640 val = pThis->gr_index; 641 641 break; 642 642 case 0x3cf: 643 val = s->gr[s->gr_index];644 Log2(("vga: read GR%x = 0x%02x\n", s->gr_index, val));643 val = pThis->gr[pThis->gr_index]; 644 Log2(("vga: read GR%x = 0x%02x\n", pThis->gr_index, val)); 645 645 break; 646 646 case 0x3b4: 647 647 case 0x3d4: 648 val = s->cr_index;648 val = pThis->cr_index; 649 649 break; 650 650 case 0x3b5: 651 651 case 0x3d5: 652 val = s->cr[s->cr_index];653 Log2(("vga: read CR%x = 0x%02x\n", s->cr_index, val));652 val = pThis->cr[pThis->cr_index]; 653 Log2(("vga: read CR%x = 0x%02x\n", pThis->cr_index, val)); 654 654 break; 655 655 case 0x3ba: 656 656 case 0x3da: 657 val = s->st01 = vga_retrace(s);658 s->ar_flip_flop = 0;657 val = pThis->st01 = vga_retrace(pThis); 658 pThis->ar_flip_flop = 0; 659 659 break; 660 660 default: … … 669 669 static void vga_ioport_write(void *opaque, uint32_t addr, uint32_t val) 670 670 { 671 VGAState * s = (VGAState*)opaque;671 VGAState *pThis = (VGAState*)opaque; 672 672 int index; 673 673 … … 675 675 676 676 /* check port range access depending on color/monochrome mode */ 677 if (vga_ioport_invalid( s, addr)) {677 if (vga_ioport_invalid(pThis, addr)) { 678 678 Log(("VGA: previous write ignored\n")); 679 679 return; … … 682 682 switch(addr) { 683 683 case 0x3c0: 684 if ( s->ar_flip_flop == 0) {684 if (pThis->ar_flip_flop == 0) { 685 685 val &= 0x3f; 686 s->ar_index = val;686 pThis->ar_index = val; 687 687 } else { 688 index = s->ar_index & 0x1f;688 index = pThis->ar_index & 0x1f; 689 689 switch(index) { 690 690 case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: 691 691 case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f: 692 s->ar[index] = val & 0x3f;692 pThis->ar[index] = val & 0x3f; 693 693 break; 694 694 case 0x10: 695 s->ar[index] = val & ~0x10;695 pThis->ar[index] = val & ~0x10; 696 696 break; 697 697 case 0x11: 698 s->ar[index] = val;698 pThis->ar[index] = val; 699 699 break; 700 700 case 0x12: 701 s->ar[index] = val & ~0xc0;701 pThis->ar[index] = val & ~0xc0; 702 702 break; 703 703 case 0x13: 704 s->ar[index] = val & ~0xf0;704 pThis->ar[index] = val & ~0xf0; 705 705 break; 706 706 case 0x14: 707 s->ar[index] = val & ~0xf0;707 pThis->ar[index] = val & ~0xf0; 708 708 break; 709 709 default: … … 711 711 } 712 712 } 713 s->ar_flip_flop ^= 1;713 pThis->ar_flip_flop ^= 1; 714 714 break; 715 715 case 0x3c2: 716 s->msr = val & ~0x10;717 if ( s->fRealRetrace)718 vga_update_retrace_state( s);719 s->st00 = (s->st00 & ~0x10) | (0x90 >> ((val >> 2) & 0x3));716 pThis->msr = val & ~0x10; 717 if (pThis->fRealRetrace) 718 vga_update_retrace_state(pThis); 719 pThis->st00 = (pThis->st00 & ~0x10) | (0x90 >> ((val >> 2) & 0x3)); 720 720 break; 721 721 case 0x3c4: 722 s->sr_index = val & 7;722 pThis->sr_index = val & 7; 723 723 break; 724 724 case 0x3c5: 725 Log2(("vga: write SR%x = 0x%02x\n", s->sr_index, val));726 s->sr[s->sr_index] = val & sr_mask[s->sr_index];725 Log2(("vga: write SR%x = 0x%02x\n", pThis->sr_index, val)); 726 pThis->sr[pThis->sr_index] = val & sr_mask[pThis->sr_index]; 727 727 /* Allow SR07 to disable VBE. */ 728 if ( s->sr_index == 0x07 && !(val & 1))728 if (pThis->sr_index == 0x07 && !(val & 1)) 729 729 { 730 s->vbe_regs[VBE_DISPI_INDEX_ENABLE] = VBE_DISPI_DISABLED;731 s->bank_offset = 0;732 } 733 if ( s->fRealRetrace &&s->sr_index == 0x01)734 vga_update_retrace_state( s);730 pThis->vbe_regs[VBE_DISPI_INDEX_ENABLE] = VBE_DISPI_DISABLED; 731 pThis->bank_offset = 0; 732 } 733 if (pThis->fRealRetrace && pThis->sr_index == 0x01) 734 vga_update_retrace_state(pThis); 735 735 #ifndef IN_RC 736 736 /* The VGA region is (could be) affected by this change; reset all aliases we've created. */ 737 if ( s->sr_index == 4 /* mode */738 || s->sr_index == 2 /* plane mask */)737 if ( pThis->sr_index == 4 /* mode */ 738 || pThis->sr_index == 2 /* plane mask */) 739 739 { 740 if ( s->fRemappedVGA)740 if (pThis->fRemappedVGA) 741 741 { 742 IOMMMIOResetRegion(PDMDevHlpGetVM( s->CTX_SUFF(pDevIns)), 0x000a0000);743 s->fRemappedVGA = false;742 IOMMMIOResetRegion(PDMDevHlpGetVM(pThis->CTX_SUFF(pDevIns)), 0x000a0000); 743 pThis->fRemappedVGA = false; 744 744 } 745 745 } … … 747 747 break; 748 748 case 0x3c7: 749 s->dac_read_index = val;750 s->dac_sub_index = 0;751 s->dac_state = 3;749 pThis->dac_read_index = val; 750 pThis->dac_sub_index = 0; 751 pThis->dac_state = 3; 752 752 break; 753 753 case 0x3c8: 754 s->dac_write_index = val;755 s->dac_sub_index = 0;756 s->dac_state = 0;754 pThis->dac_write_index = val; 755 pThis->dac_sub_index = 0; 756 pThis->dac_state = 0; 757 757 break; 758 758 case 0x3c9: 759 s->dac_cache[s->dac_sub_index] = val;760 if (++ s->dac_sub_index == 3) {761 memcpy(& s->palette[s->dac_write_index * 3],s->dac_cache, 3);762 s->dac_sub_index = 0;763 s->dac_write_index++;759 pThis->dac_cache[pThis->dac_sub_index] = val; 760 if (++pThis->dac_sub_index == 3) { 761 memcpy(&pThis->palette[pThis->dac_write_index * 3], pThis->dac_cache, 3); 762 pThis->dac_sub_index = 0; 763 pThis->dac_write_index++; 764 764 } 765 765 break; 766 766 case 0x3ce: 767 s->gr_index = val & 0x0f;767 pThis->gr_index = val & 0x0f; 768 768 break; 769 769 case 0x3cf: 770 Log2(("vga: write GR%x = 0x%02x\n", s->gr_index, val));771 s->gr[s->gr_index] = val & gr_mask[s->gr_index];770 Log2(("vga: write GR%x = 0x%02x\n", pThis->gr_index, val)); 771 pThis->gr[pThis->gr_index] = val & gr_mask[pThis->gr_index]; 772 772 773 773 #ifndef IN_RC 774 774 /* The VGA region is (could be) affected by this change; reset all aliases we've created. */ 775 if ( s->gr_index == 6 /* memory map mode */)775 if (pThis->gr_index == 6 /* memory map mode */) 776 776 { 777 if ( s->fRemappedVGA)777 if (pThis->fRemappedVGA) 778 778 { 779 IOMMMIOResetRegion(PDMDevHlpGetVM( s->CTX_SUFF(pDevIns)), 0x000a0000);780 s->fRemappedVGA = false;779 IOMMMIOResetRegion(PDMDevHlpGetVM(pThis->CTX_SUFF(pDevIns)), 0x000a0000); 780 pThis->fRemappedVGA = false; 781 781 } 782 782 } … … 786 786 case 0x3b4: 787 787 case 0x3d4: 788 s->cr_index = val;788 pThis->cr_index = val; 789 789 break; 790 790 case 0x3b5: 791 791 case 0x3d5: 792 Log2(("vga: write CR%x = 0x%02x\n", s->cr_index, val));792 Log2(("vga: write CR%x = 0x%02x\n", pThis->cr_index, val)); 793 793 /* handle CR0-7 protection */ 794 if (( s->cr[0x11] & 0x80) &&s->cr_index <= 7) {794 if ((pThis->cr[0x11] & 0x80) && pThis->cr_index <= 7) { 795 795 /* can always write bit 4 of CR7 */ 796 if ( s->cr_index == 7)797 s->cr[7] = (s->cr[7] & ~0x10) | (val & 0x10);796 if (pThis->cr_index == 7) 797 pThis->cr[7] = (pThis->cr[7] & ~0x10) | (val & 0x10); 798 798 return; 799 799 } 800 s->cr[s->cr_index] = val;801 802 if ( s->fRealRetrace) {800 pThis->cr[pThis->cr_index] = val; 801 802 if (pThis->fRealRetrace) { 803 803 /* The following registers are only updated during a mode set. */ 804 switch( s->cr_index) {804 switch(pThis->cr_index) { 805 805 case 0x00: 806 806 case 0x02: … … 814 814 case 0x15: 815 815 case 0x16: 816 vga_update_retrace_state( s);816 vga_update_retrace_state(pThis); 817 817 break; 818 818 } … … 821 821 case 0x3ba: 822 822 case 0x3da: 823 s->fcr = val & 0x10;823 pThis->fcr = val & 0x10; 824 824 break; 825 825 } … … 829 829 static uint32_t vbe_ioport_read_index(void *opaque, uint32_t addr) 830 830 { 831 VGAState * s = (VGAState*)opaque;832 uint32_t val = s->vbe_index;831 VGAState *pThis = (VGAState*)opaque; 832 uint32_t val = pThis->vbe_index; 833 833 NOREF(addr); 834 834 return val; … … 837 837 static uint32_t vbe_ioport_read_data(void *opaque, uint32_t addr) 838 838 { 839 VGAState * s = (VGAState*)opaque;839 VGAState *pThis = (VGAState*)opaque; 840 840 uint32_t val; 841 841 NOREF(addr); 842 842 843 if ( s->vbe_index < VBE_DISPI_INDEX_NB) {844 if ( s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_GETCAPS) {845 switch( s->vbe_index) {843 if (pThis->vbe_index < VBE_DISPI_INDEX_NB) { 844 if (pThis->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_GETCAPS) { 845 switch(pThis->vbe_index) { 846 846 /* XXX: do not hardcode ? */ 847 847 case VBE_DISPI_INDEX_XRES: … … 855 855 break; 856 856 default: 857 Assert( s->vbe_index < VBE_DISPI_INDEX_NB);858 val = s->vbe_regs[s->vbe_index];857 Assert(pThis->vbe_index < VBE_DISPI_INDEX_NB); 858 val = pThis->vbe_regs[pThis->vbe_index]; 859 859 break; 860 860 } 861 861 } else { 862 switch( s->vbe_index) {862 switch(pThis->vbe_index) { 863 863 case VBE_DISPI_INDEX_VBOX_VIDEO: 864 864 /* Reading from the port means that the old additions are requesting the number of monitors. */ … … 866 866 break; 867 867 default: 868 Assert( s->vbe_index < VBE_DISPI_INDEX_NB);869 val = s->vbe_regs[s->vbe_index];868 Assert(pThis->vbe_index < VBE_DISPI_INDEX_NB); 869 val = pThis->vbe_regs[pThis->vbe_index]; 870 870 break; 871 871 } … … 874 874 val = 0; 875 875 } 876 Log(("VBE: read index=0x%x val=0x%x\n", s->vbe_index, val));876 Log(("VBE: read index=0x%x val=0x%x\n", pThis->vbe_index, val)); 877 877 return val; 878 878 } … … 913 913 #endif 914 914 915 static void recalculate_data(VGAState * s, bool fVirtHeightOnly)916 { 917 uint16_t cBPP = s->vbe_regs[VBE_DISPI_INDEX_BPP];918 uint16_t cVirtWidth = s->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH];919 uint16_t cX = s->vbe_regs[VBE_DISPI_INDEX_XRES];915 static void recalculate_data(VGAState *pThis, bool fVirtHeightOnly) 916 { 917 uint16_t cBPP = pThis->vbe_regs[VBE_DISPI_INDEX_BPP]; 918 uint16_t cVirtWidth = pThis->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH]; 919 uint16_t cX = pThis->vbe_regs[VBE_DISPI_INDEX_XRES]; 920 920 if (!cBPP || !cX) 921 921 return; /* Not enough data has been set yet. */ … … 924 924 cbLinePitch = calc_line_pitch(cBPP, cX); 925 925 Assert(cbLinePitch != 0); 926 uint32_t cVirtHeight = s->vram_size / cbLinePitch;926 uint32_t cVirtHeight = pThis->vram_size / cbLinePitch; 927 927 if (!fVirtHeightOnly) 928 928 { 929 uint16_t offX = s->vbe_regs[VBE_DISPI_INDEX_X_OFFSET];930 uint16_t offY = s->vbe_regs[VBE_DISPI_INDEX_Y_OFFSET];929 uint16_t offX = pThis->vbe_regs[VBE_DISPI_INDEX_X_OFFSET]; 930 uint16_t offY = pThis->vbe_regs[VBE_DISPI_INDEX_Y_OFFSET]; 931 931 uint32_t offStart = cbLinePitch * offY; 932 932 if (cBPP == 4) … … 935 935 offStart += offX * ((cBPP + 7) >> 3); 936 936 offStart >>= 2; 937 s->vbe_line_offset = RT_MIN(cbLinePitch,s->vram_size);938 s->vbe_start_addr = RT_MIN(offStart,s->vram_size);937 pThis->vbe_line_offset = RT_MIN(cbLinePitch, pThis->vram_size); 938 pThis->vbe_start_addr = RT_MIN(offStart, pThis->vram_size); 939 939 } 940 940 941 941 /* The VBE_DISPI_INDEX_VIRT_HEIGHT is used to prevent setting resolution bigger than VRAM permits 942 942 * it is used instead of VBE_DISPI_INDEX_YRES *only* in case 943 * s->vbe_regs[VBE_DISPI_INDEX_VIRT_HEIGHT] <s->vbe_regs[VBE_DISPI_INDEX_YRES]944 * We can not simply do s->vbe_regs[VBE_DISPI_INDEX_VIRT_HEIGHT] = cVirtHeight since943 * pThis->vbe_regs[VBE_DISPI_INDEX_VIRT_HEIGHT] < pThis->vbe_regs[VBE_DISPI_INDEX_YRES] 944 * We can not simply do pThis->vbe_regs[VBE_DISPI_INDEX_VIRT_HEIGHT] = cVirtHeight since 945 945 * the cVirtHeight we calculated can exceed the 16bit value range 946 * instead we'll check if it's bigger than s->vbe_regs[VBE_DISPI_INDEX_YRES], and if yes, 947 * assign the s->vbe_regs[VBE_DISPI_INDEX_VIRT_HEIGHT] with a dummy UINT16_MAX value 948 * that is always bigger than s->vbe_regs[VBE_DISPI_INDEX_YRES] 949 * to just ensure the s->vbe_regs[VBE_DISPI_INDEX_YRES] is always used */ 950 s->vbe_regs[VBE_DISPI_INDEX_VIRT_HEIGHT] = (cVirtHeight >= (uint32_t)s->vbe_regs[VBE_DISPI_INDEX_YRES]) ? UINT16_MAX : (uint16_t)cVirtHeight; 946 * instead we'll check if it's bigger than pThis->vbe_regs[VBE_DISPI_INDEX_YRES], and if yes, 947 * assign the pThis->vbe_regs[VBE_DISPI_INDEX_VIRT_HEIGHT] with a dummy UINT16_MAX value 948 * that is always bigger than pThis->vbe_regs[VBE_DISPI_INDEX_YRES] 949 * to just ensure the pThis->vbe_regs[VBE_DISPI_INDEX_YRES] is always used */ 950 pThis->vbe_regs[VBE_DISPI_INDEX_VIRT_HEIGHT] = (cVirtHeight >= (uint32_t)pThis->vbe_regs[VBE_DISPI_INDEX_YRES]) 951 ? UINT16_MAX : (uint16_t)cVirtHeight; 951 952 } 952 953 953 954 static void vbe_ioport_write_index(void *opaque, uint32_t addr, uint32_t val) 954 955 { 955 VGAState * s = (VGAState*)opaque;956 s->vbe_index = val;956 VGAState *pThis = (VGAState*)opaque; 957 pThis->vbe_index = val; 957 958 NOREF(addr); 958 959 } … … 960 961 static int vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val) 961 962 { 962 VGAState * s = (VGAState*)opaque;963 VGAState *pThis = (VGAState*)opaque; 963 964 uint32_t max_bank; 964 965 NOREF(addr); 965 966 966 if ( s->vbe_index <= VBE_DISPI_INDEX_NB) {967 if (pThis->vbe_index <= VBE_DISPI_INDEX_NB) { 967 968 bool fRecalculate = false; 968 Log(("VBE: write index=0x%x val=0x%x\n", s->vbe_index, val));969 switch( s->vbe_index) {969 Log(("VBE: write index=0x%x val=0x%x\n", pThis->vbe_index, val)); 970 switch(pThis->vbe_index) { 970 971 case VBE_DISPI_INDEX_ID: 971 972 if (val == VBE_DISPI_ID0 || … … 974 975 val == VBE_DISPI_ID3 || 975 976 val == VBE_DISPI_ID4) { 976 s->vbe_regs[s->vbe_index] = val;977 pThis->vbe_regs[pThis->vbe_index] = val; 977 978 } 978 979 if (val == VBE_DISPI_ID_VBOX_VIDEO) { 979 s->vbe_regs[s->vbe_index] = val;980 pThis->vbe_regs[pThis->vbe_index] = val; 980 981 } else if (val == VBE_DISPI_ID_ANYX) { 981 s->vbe_regs[s->vbe_index] = val;982 pThis->vbe_regs[pThis->vbe_index] = val; 982 983 } 983 984 #ifdef VBOX_WITH_HGSMI 984 985 else if (val == VBE_DISPI_ID_HGSMI) { 985 s->vbe_regs[s->vbe_index] = val;986 pThis->vbe_regs[pThis->vbe_index] = val; 986 987 } 987 988 #endif /* VBOX_WITH_HGSMI */ … … 990 991 if (val <= VBE_DISPI_MAX_XRES) 991 992 { 992 s->vbe_regs[s->vbe_index] = val;993 s->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] = val;993 pThis->vbe_regs[pThis->vbe_index] = val; 994 pThis->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] = val; 994 995 fRecalculate = true; 995 996 } … … 997 998 case VBE_DISPI_INDEX_YRES: 998 999 if (val <= VBE_DISPI_MAX_YRES) 999 s->vbe_regs[s->vbe_index] = val;1000 pThis->vbe_regs[pThis->vbe_index] = val; 1000 1001 break; 1001 1002 case VBE_DISPI_INDEX_BPP: … … 1004 1005 if (val == 4 || val == 8 || val == 15 || 1005 1006 val == 16 || val == 24 || val == 32) { 1006 s->vbe_regs[s->vbe_index] = val;1007 pThis->vbe_regs[pThis->vbe_index] = val; 1007 1008 fRecalculate = true; 1008 1009 } 1009 1010 break; 1010 1011 case VBE_DISPI_INDEX_BANK: 1011 if ( s->vbe_regs[VBE_DISPI_INDEX_BPP] <= 4)1012 max_bank = s->vbe_bank_max >> 2; /* Each bank really covers 256K */1012 if (pThis->vbe_regs[VBE_DISPI_INDEX_BPP] <= 4) 1013 max_bank = pThis->vbe_bank_max >> 2; /* Each bank really covers 256K */ 1013 1014 else 1014 max_bank = s->vbe_bank_max;1015 max_bank = pThis->vbe_bank_max; 1015 1016 /* Old software may pass garbage in the high byte of bank. If the maximum 1016 1017 * bank fits into a single byte, toss the high byte the user supplied. … … 1020 1021 if (val > max_bank) 1021 1022 val = max_bank; 1022 s->vbe_regs[s->vbe_index] = val;1023 s->bank_offset = (val << 16);1023 pThis->vbe_regs[pThis->vbe_index] = val; 1024 pThis->bank_offset = (val << 16); 1024 1025 1025 1026 #ifndef IN_RC 1026 1027 /* The VGA region is (could be) affected by this change; reset all aliases we've created. */ 1027 if ( s->fRemappedVGA)1028 if (pThis->fRemappedVGA) 1028 1029 { 1029 IOMMMIOResetRegion(PDMDevHlpGetVM( s->CTX_SUFF(pDevIns)), 0x000a0000);1030 s->fRemappedVGA = false;1030 IOMMMIOResetRegion(PDMDevHlpGetVM(pThis->CTX_SUFF(pDevIns)), 0x000a0000); 1031 pThis->fRemappedVGA = false; 1031 1032 } 1032 1033 #endif … … 1038 1039 #else 1039 1040 if ((val & VBE_DISPI_ENABLED) && 1040 !( s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED)) {1041 !(pThis->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED)) { 1041 1042 int h, shift_control; 1042 1043 /* Check the values before we screw up with a resolution which is too big or small. */ 1043 size_t cb = s->vbe_regs[VBE_DISPI_INDEX_XRES];1044 if ( s->vbe_regs[VBE_DISPI_INDEX_BPP] == 4)1045 cb = s->vbe_regs[VBE_DISPI_INDEX_XRES] >> 1;1044 size_t cb = pThis->vbe_regs[VBE_DISPI_INDEX_XRES]; 1045 if (pThis->vbe_regs[VBE_DISPI_INDEX_BPP] == 4) 1046 cb = pThis->vbe_regs[VBE_DISPI_INDEX_XRES] >> 1; 1046 1047 else 1047 cb = s->vbe_regs[VBE_DISPI_INDEX_XRES] * ((s->vbe_regs[VBE_DISPI_INDEX_BPP] + 7) >> 3);1048 cb *= s->vbe_regs[VBE_DISPI_INDEX_YRES];1049 uint16_t cVirtWidth = s->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH];1048 cb = pThis->vbe_regs[VBE_DISPI_INDEX_XRES] * ((pThis->vbe_regs[VBE_DISPI_INDEX_BPP] + 7) >> 3); 1049 cb *= pThis->vbe_regs[VBE_DISPI_INDEX_YRES]; 1050 uint16_t cVirtWidth = pThis->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH]; 1050 1051 if (!cVirtWidth) 1051 cVirtWidth = s->vbe_regs[VBE_DISPI_INDEX_XRES];1052 cVirtWidth = pThis->vbe_regs[VBE_DISPI_INDEX_XRES]; 1052 1053 if ( !cVirtWidth 1053 || ! s->vbe_regs[VBE_DISPI_INDEX_YRES]1054 || cb > s->vram_size)1054 || !pThis->vbe_regs[VBE_DISPI_INDEX_YRES] 1055 || cb > pThis->vram_size) 1055 1056 { 1056 1057 AssertMsgFailed(("VIRT WIDTH=%d YRES=%d cb=%d vram_size=%d\n", 1057 s->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH], s->vbe_regs[VBE_DISPI_INDEX_YRES], cb,s->vram_size));1058 pThis->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH], pThis->vbe_regs[VBE_DISPI_INDEX_YRES], cb, pThis->vram_size)); 1058 1059 return VINF_SUCCESS; /* Note: silent failure like before */ 1059 1060 } 1060 1061 1061 1062 /* When VBE interface is enabled, it is reset. */ 1062 s->vbe_regs[VBE_DISPI_INDEX_X_OFFSET] = 0;1063 s->vbe_regs[VBE_DISPI_INDEX_Y_OFFSET] = 0;1063 pThis->vbe_regs[VBE_DISPI_INDEX_X_OFFSET] = 0; 1064 pThis->vbe_regs[VBE_DISPI_INDEX_Y_OFFSET] = 0; 1064 1065 fRecalculate = true; 1065 1066 1066 1067 /* clear the screen (should be done in BIOS) */ 1067 1068 if (!(val & VBE_DISPI_NOCLEARMEM)) { 1068 uint16_t cY = RT_MIN( s->vbe_regs[VBE_DISPI_INDEX_YRES],1069 s->vbe_regs[VBE_DISPI_INDEX_VIRT_HEIGHT]);1070 uint16_t cbLinePitch = s->vbe_line_offset;1071 memset( s->CTX_SUFF(vram_ptr), 0,1069 uint16_t cY = RT_MIN(pThis->vbe_regs[VBE_DISPI_INDEX_YRES], 1070 pThis->vbe_regs[VBE_DISPI_INDEX_VIRT_HEIGHT]); 1071 uint16_t cbLinePitch = pThis->vbe_line_offset; 1072 memset(pThis->CTX_SUFF(vram_ptr), 0, 1072 1073 cY * cbLinePitch); 1073 1074 } … … 1075 1076 /* we initialize the VGA graphic mode (should be done 1076 1077 in BIOS) */ 1077 s->gr[0x06] = (s->gr[0x06] & ~0x0c) | 0x05; /* graphic mode + memory map 1 */1078 s->cr[0x17] |= 3; /* no CGA modes */1079 s->cr[0x13] =s->vbe_line_offset >> 3;1078 pThis->gr[0x06] = (pThis->gr[0x06] & ~0x0c) | 0x05; /* graphic mode + memory map 1 */ 1079 pThis->cr[0x17] |= 3; /* no CGA modes */ 1080 pThis->cr[0x13] = pThis->vbe_line_offset >> 3; 1080 1081 /* width */ 1081 s->cr[0x01] = (cVirtWidth >> 3) - 1;1082 pThis->cr[0x01] = (cVirtWidth >> 3) - 1; 1082 1083 /* height (only meaningful if < 1024) */ 1083 h = s->vbe_regs[VBE_DISPI_INDEX_YRES] - 1;1084 s->cr[0x12] = h;1085 s->cr[0x07] = (s->cr[0x07] & ~0x42) |1084 h = pThis->vbe_regs[VBE_DISPI_INDEX_YRES] - 1; 1085 pThis->cr[0x12] = h; 1086 pThis->cr[0x07] = (pThis->cr[0x07] & ~0x42) | 1086 1087 ((h >> 7) & 0x02) | ((h >> 3) & 0x40); 1087 1088 /* line compare to 1023 */ 1088 s->cr[0x18] = 0xff;1089 s->cr[0x07] |= 0x10;1090 s->cr[0x09] |= 0x40;1091 1092 if ( s->vbe_regs[VBE_DISPI_INDEX_BPP] == 4) {1089 pThis->cr[0x18] = 0xff; 1090 pThis->cr[0x07] |= 0x10; 1091 pThis->cr[0x09] |= 0x40; 1092 1093 if (pThis->vbe_regs[VBE_DISPI_INDEX_BPP] == 4) { 1093 1094 shift_control = 0; 1094 s->sr[0x01] &= ~8; /* no double line */1095 pThis->sr[0x01] &= ~8; /* no double line */ 1095 1096 } else { 1096 1097 shift_control = 2; 1097 s->sr[4] |= 0x08; /* set chain 4 mode */1098 s->sr[2] |= 0x0f; /* activate all planes */1098 pThis->sr[4] |= 0x08; /* set chain 4 mode */ 1099 pThis->sr[2] |= 0x0f; /* activate all planes */ 1099 1100 /* Indicate non-VGA mode in SR07. */ 1100 s->sr[7] |= 1;1101 pThis->sr[7] |= 1; 1101 1102 } 1102 s->gr[0x05] = (s->gr[0x05] & ~0x60) | (shift_control << 5);1103 s->cr[0x09] &= ~0x9f; /* no double scan */1103 pThis->gr[0x05] = (pThis->gr[0x05] & ~0x60) | (shift_control << 5); 1104 pThis->cr[0x09] &= ~0x9f; /* no double scan */ 1104 1105 /* sunlover 30.05.2007 1105 1106 * The ar_index remains with bit 0x20 cleared after a switch from fullscreen … … 1107 1108 * But the VBE mode is graphics, so not a blank anymore. 1108 1109 */ 1109 s->ar_index |= 0x20;1110 pThis->ar_index |= 0x20; 1110 1111 } else { 1111 1112 /* XXX: the bios should do that */ … … 1113 1114 * Here is probably more to reset. When this was executed in GC 1114 1115 * then the *update* functions could not detect a mode change. 1115 * Or may be these update function should take the s->vbe_regs[s->vbe_index]1116 * Or may be these update function should take the pThis->vbe_regs[pThis->vbe_index] 1116 1117 * into account when detecting a mode change. 1117 1118 * … … 1120 1121 * LFBChange callback. 1121 1122 */ 1122 s->bank_offset = 0;1123 pThis->bank_offset = 0; 1123 1124 } 1124 s->vbe_regs[s->vbe_index] = val;1125 pThis->vbe_regs[pThis->vbe_index] = val; 1125 1126 /* 1126 1127 * LFB video mode is either disabled or changed. This notification 1127 1128 * is used by the display to disable VBVA. 1128 1129 */ 1129 s->pDrv->pfnLFBModeChange(s->pDrv, (val & VBE_DISPI_ENABLED) != 0);1130 pThis->pDrv->pfnLFBModeChange(pThis->pDrv, (val & VBE_DISPI_ENABLED) != 0); 1130 1131 1131 1132 /* The VGA region is (could be) affected by this change; reset all aliases we've created. */ 1132 if ( s->fRemappedVGA)1133 if (pThis->fRemappedVGA) 1133 1134 { 1134 IOMMMIOResetRegion(PDMDevHlpGetVM( s->CTX_SUFF(pDevIns)), 0x000a0000);1135 s->fRemappedVGA = false;1135 IOMMMIOResetRegion(PDMDevHlpGetVM(pThis->CTX_SUFF(pDevIns)), 0x000a0000); 1136 pThis->fRemappedVGA = false; 1136 1137 } 1137 1138 break; … … 1141 1142 case VBE_DISPI_INDEX_Y_OFFSET: 1142 1143 { 1143 s->vbe_regs[s->vbe_index] = val;1144 pThis->vbe_regs[pThis->vbe_index] = val; 1144 1145 fRecalculate = true; 1145 1146 } … … 1152 1153 if (val == VBOX_VIDEO_DISABLE_ADAPTER_MEMORY) 1153 1154 { 1154 s->pDrv->pfnProcessAdapterData(s->pDrv, NULL, 0);1155 pThis->pDrv->pfnProcessAdapterData(pThis->pDrv, NULL, 0); 1155 1156 } 1156 1157 else if (val == VBOX_VIDEO_INTERPRET_ADAPTER_MEMORY) 1157 1158 { 1158 s->pDrv->pfnProcessAdapterData(s->pDrv, s->CTX_SUFF(vram_ptr),s->vram_size);1159 pThis->pDrv->pfnProcessAdapterData(pThis->pDrv, pThis->CTX_SUFF(vram_ptr), pThis->vram_size); 1159 1160 } 1160 1161 else if ((val & 0xFFFF0000) == VBOX_VIDEO_INTERPRET_DISPLAY_MEMORY_BASE) 1161 1162 { 1162 s->pDrv->pfnProcessDisplayData(s->pDrv,s->CTX_SUFF(vram_ptr), val & 0xFFFF);1163 pThis->pDrv->pfnProcessDisplayData(pThis->pDrv, pThis->CTX_SUFF(vram_ptr), val & 0xFFFF); 1163 1164 } 1164 1165 #endif /* IN_RING3 */ … … 1169 1170 if (fRecalculate) 1170 1171 { 1171 recalculate_data( s, false);1172 recalculate_data(pThis, false); 1172 1173 } 1173 1174 } … … 1179 1180 static uint32_t vga_mem_readb(void *opaque, target_phys_addr_t addr, int *prc) 1180 1181 { 1181 VGAState * s = (VGAState*)opaque;1182 VGAState *pThis = (VGAState*)opaque; 1182 1183 int memory_map_mode, plane; 1183 1184 uint32_t ret; … … 1185 1186 Log3(("vga: read [0x%x] -> ", addr)); 1186 1187 /* convert to VGA memory offset */ 1187 memory_map_mode = ( s->gr[6] >> 2) & 3;1188 memory_map_mode = (pThis->gr[6] >> 2) & 3; 1188 1189 #ifndef IN_RC 1189 1190 RTGCPHYS GCPhys = addr; /* save original address */ … … 1197 1198 if (addr >= 0x10000) 1198 1199 return 0xff; 1199 addr += s->bank_offset;1200 addr += pThis->bank_offset; 1200 1201 break; 1201 1202 case 2: … … 1212 1213 } 1213 1214 1214 if ( s->sr[4] & 0x08) {1215 if (pThis->sr[4] & 0x08) { 1215 1216 /* chain 4 mode : simplest access */ 1216 1217 # ifndef IN_RC 1217 1218 /* If all planes are accessible, then map the page to the frame buffer and make it writable. */ 1218 if ( ( s->sr[2] & 3) == 31219 && !vga_is_dirty( s, addr))1219 if ( (pThis->sr[2] & 3) == 3 1220 && !vga_is_dirty(pThis, addr)) 1220 1221 { 1221 1222 /** @todo only allow read access (doesn't work now) */ 1222 STAM_COUNTER_INC(& s->StatMapPage);1223 IOMMMIOMapMMIO2Page(PDMDevHlpGetVM( s->CTX_SUFF(pDevIns)), GCPhys,s->GCPhysVRAM + addr, X86_PTE_RW|X86_PTE_P);1223 STAM_COUNTER_INC(&pThis->StatMapPage); 1224 IOMMMIOMapMMIO2Page(PDMDevHlpGetVM(pThis->CTX_SUFF(pDevIns)), GCPhys, pThis->GCPhysVRAM + addr, X86_PTE_RW|X86_PTE_P); 1224 1225 /* Set as dirty as write accesses won't be noticed now. */ 1225 vga_set_dirty( s, addr);1226 s->fRemappedVGA = true;1226 vga_set_dirty(pThis, addr); 1227 pThis->fRemappedVGA = true; 1227 1228 } 1228 1229 # endif /* IN_RC */ 1229 VERIFY_VRAM_READ_OFF_RETURN( s, addr, *prc);1230 ret = s->CTX_SUFF(vram_ptr)[addr];1231 } else if (!( s->sr[4] & 0x04)) { /* Host access is controlled by SR4, not GR5! */1230 VERIFY_VRAM_READ_OFF_RETURN(pThis, addr, *prc); 1231 ret = pThis->CTX_SUFF(vram_ptr)[addr]; 1232 } else if (!(pThis->sr[4] & 0x04)) { /* Host access is controlled by SR4, not GR5! */ 1232 1233 /* odd/even mode (aka text mode mapping) */ 1233 plane = ( s->gr[4] & 2) | (addr & 1);1234 plane = (pThis->gr[4] & 2) | (addr & 1); 1234 1235 /* See the comment for a similar line in vga_mem_writeb. */ 1235 1236 RTGCPHYS off = ((addr & ~1) << 2) | plane; 1236 VERIFY_VRAM_READ_OFF_RETURN( s, off, *prc);1237 ret = s->CTX_SUFF(vram_ptr)[off];1237 VERIFY_VRAM_READ_OFF_RETURN(pThis, off, *prc); 1238 ret = pThis->CTX_SUFF(vram_ptr)[off]; 1238 1239 } else { 1239 1240 /* standard VGA latched access */ 1240 VERIFY_VRAM_READ_OFF_RETURN( s, addr, *prc);1241 s->latch = ((uint32_t *)s->CTX_SUFF(vram_ptr))[addr];1242 1243 if (!( s->gr[5] & 0x08)) {1241 VERIFY_VRAM_READ_OFF_RETURN(pThis, addr, *prc); 1242 pThis->latch = ((uint32_t *)pThis->CTX_SUFF(vram_ptr))[addr]; 1243 1244 if (!(pThis->gr[5] & 0x08)) { 1244 1245 /* read mode 0 */ 1245 plane = s->gr[4];1246 ret = GET_PLANE( s->latch, plane);1246 plane = pThis->gr[4]; 1247 ret = GET_PLANE(pThis->latch, plane); 1247 1248 } else { 1248 1249 /* read mode 1 */ 1249 ret = ( s->latch ^ mask16[s->gr[2]]) & mask16[s->gr[7]];1250 ret = (pThis->latch ^ mask16[pThis->gr[2]]) & mask16[pThis->gr[7]]; 1250 1251 ret |= ret >> 16; 1251 1252 ret |= ret >> 8; … … 1260 1261 static int vga_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val) 1261 1262 { 1262 VGAState * s = (VGAState*)opaque;1263 VGAState *pThis = (VGAState*)opaque; 1263 1264 int memory_map_mode, plane, write_mode, b, func_select, mask; 1264 1265 uint32_t write_mask, bit_mask, set_mask; … … 1266 1267 Log3(("vga: [0x%x] = 0x%02x\n", addr, val)); 1267 1268 /* convert to VGA memory offset */ 1268 memory_map_mode = ( s->gr[6] >> 2) & 3;1269 memory_map_mode = (pThis->gr[6] >> 2) & 3; 1269 1270 #ifndef IN_RC 1270 1271 RTGCPHYS GCPhys = addr; /* save original address */ … … 1278 1279 if (addr >= 0x10000) 1279 1280 return VINF_SUCCESS; 1280 addr += s->bank_offset;1281 addr += pThis->bank_offset; 1281 1282 break; 1282 1283 case 2: … … 1293 1294 } 1294 1295 1295 if ( s->sr[4] & 0x08) {1296 if (pThis->sr[4] & 0x08) { 1296 1297 /* chain 4 mode : simplest access */ 1297 1298 plane = addr & 3; 1298 1299 mask = (1 << plane); 1299 if ( s->sr[2] & mask) {1300 if (pThis->sr[2] & mask) { 1300 1301 # ifndef IN_RC 1301 1302 /* If all planes are accessible, then map the page to the frame buffer and make it writable. */ 1302 if ( ( s->sr[2] & 3) == 31303 && !vga_is_dirty( s, addr))1303 if ( (pThis->sr[2] & 3) == 3 1304 && !vga_is_dirty(pThis, addr)) 1304 1305 { 1305 STAM_COUNTER_INC(& s->StatMapPage);1306 IOMMMIOMapMMIO2Page(PDMDevHlpGetVM( s->CTX_SUFF(pDevIns)), GCPhys,s->GCPhysVRAM + addr, X86_PTE_RW | X86_PTE_P);1307 s->fRemappedVGA = true;1306 STAM_COUNTER_INC(&pThis->StatMapPage); 1307 IOMMMIOMapMMIO2Page(PDMDevHlpGetVM(pThis->CTX_SUFF(pDevIns)), GCPhys, pThis->GCPhysVRAM + addr, X86_PTE_RW | X86_PTE_P); 1308 pThis->fRemappedVGA = true; 1308 1309 } 1309 1310 # endif /* IN_RC */ 1310 1311 1311 VERIFY_VRAM_WRITE_OFF_RETURN( s, addr);1312 s->CTX_SUFF(vram_ptr)[addr] = val;1312 VERIFY_VRAM_WRITE_OFF_RETURN(pThis, addr); 1313 pThis->CTX_SUFF(vram_ptr)[addr] = val; 1313 1314 Log3(("vga: chain4: [0x%x]\n", addr)); 1314 s->plane_updated |= mask; /* only used to detect font change */1315 vga_set_dirty( s, addr);1316 } 1317 } else if (!( s->sr[4] & 0x04)) { /* Host access is controlled by SR4, not GR5! */1315 pThis->plane_updated |= mask; /* only used to detect font change */ 1316 vga_set_dirty(pThis, addr); 1317 } 1318 } else if (!(pThis->sr[4] & 0x04)) { /* Host access is controlled by SR4, not GR5! */ 1318 1319 /* odd/even mode (aka text mode mapping) */ 1319 plane = ( s->gr[4] & 2) | (addr & 1);1320 plane = (pThis->gr[4] & 2) | (addr & 1); 1320 1321 mask = (1 << plane); 1321 if ( s->sr[2] & mask) {1322 if (pThis->sr[2] & mask) { 1322 1323 /* 'addr' is offset in a plane, bit 0 selects the plane. 1323 1324 * Mask the bit 0, convert plane index to vram offset, … … 1326 1327 */ 1327 1328 addr = ((addr & ~1) << 2) | plane; 1328 VERIFY_VRAM_WRITE_OFF_RETURN( s, addr);1329 s->CTX_SUFF(vram_ptr)[addr] = val;1329 VERIFY_VRAM_WRITE_OFF_RETURN(pThis, addr); 1330 pThis->CTX_SUFF(vram_ptr)[addr] = val; 1330 1331 Log3(("vga: odd/even: [0x%x]\n", addr)); 1331 s->plane_updated |= mask; /* only used to detect font change */1332 vga_set_dirty( s, addr);1332 pThis->plane_updated |= mask; /* only used to detect font change */ 1333 vga_set_dirty(pThis, addr); 1333 1334 } 1334 1335 } else { 1335 1336 /* standard VGA latched access */ 1336 VERIFY_VRAM_WRITE_OFF_RETURN( s, addr * 4 + 3);1337 VERIFY_VRAM_WRITE_OFF_RETURN(pThis, addr * 4 + 3); 1337 1338 1338 1339 #ifdef IN_RING0 1339 if (((++ s->cLatchAccesses) & s->uMaskLatchAccess) ==s->uMaskLatchAccess)1340 if (((++pThis->cLatchAccesses) & pThis->uMaskLatchAccess) == pThis->uMaskLatchAccess) 1340 1341 { 1341 1342 static uint32_t const s_aMask[5] = { 0x3ff, 0x1ff, 0x7f, 0x3f, 0x1f}; 1342 1343 static uint64_t const s_aDelta[5] = {10000000, 5000000, 2500000, 1250000, 625000}; 1343 if (PDMDevHlpCanEmulateIoBlock( s->CTX_SUFF(pDevIns)))1344 if (PDMDevHlpCanEmulateIoBlock(pThis->CTX_SUFF(pDevIns))) 1344 1345 { 1345 1346 uint64_t u64CurTime = RTTimeSystemNanoTS(); … … 1348 1349 * to the recompiler 1349 1350 */ 1350 if (u64CurTime - s->u64LastLatchedAccess < s_aDelta[s->iMask])1351 if (u64CurTime - pThis->u64LastLatchedAccess < s_aDelta[pThis->iMask]) 1351 1352 { 1352 s->u64LastLatchedAccess = 0;1353 s->iMask = RT_MIN(s->iMask + 1U, RT_ELEMENTS(s_aMask) - 1U);1354 s->uMaskLatchAccess = s_aMask[s->iMask];1355 s->cLatchAccesses =s->uMaskLatchAccess - 1;1353 pThis->u64LastLatchedAccess = 0; 1354 pThis->iMask = RT_MIN(pThis->iMask + 1U, RT_ELEMENTS(s_aMask) - 1U); 1355 pThis->uMaskLatchAccess = s_aMask[pThis->iMask]; 1356 pThis->cLatchAccesses = pThis->uMaskLatchAccess - 1; 1356 1357 return VINF_EM_RAW_EMULATE_IO_BLOCK; 1357 1358 } 1358 if ( s->u64LastLatchedAccess)1359 if (pThis->u64LastLatchedAccess) 1359 1360 { 1360 Log2(("Reset mask (was %d) delta %RX64 (limit %x)\n", s->iMask, u64CurTime - s->u64LastLatchedAccess, s_aDelta[s->iMask]));1361 if ( s->iMask)1362 s->iMask--;1363 s->uMaskLatchAccess = s_aMask[s->iMask];1361 Log2(("Reset mask (was %d) delta %RX64 (limit %x)\n", pThis->iMask, u64CurTime - pThis->u64LastLatchedAccess, s_aDelta[pThis->iMask])); 1362 if (pThis->iMask) 1363 pThis->iMask--; 1364 pThis->uMaskLatchAccess = s_aMask[pThis->iMask]; 1364 1365 } 1365 s->u64LastLatchedAccess = u64CurTime;1366 pThis->u64LastLatchedAccess = u64CurTime; 1366 1367 } 1367 1368 else 1368 1369 { 1369 s->u64LastLatchedAccess = 0;1370 s->iMask = 0;1371 s->uMaskLatchAccess = s_aMask[s->iMask];1372 s->cLatchAccesses = 0;1370 pThis->u64LastLatchedAccess = 0; 1371 pThis->iMask = 0; 1372 pThis->uMaskLatchAccess = s_aMask[pThis->iMask]; 1373 pThis->cLatchAccesses = 0; 1373 1374 } 1374 1375 } 1375 1376 #endif 1376 1377 1377 write_mode = s->gr[5] & 3;1378 write_mode = pThis->gr[5] & 3; 1378 1379 switch(write_mode) { 1379 1380 default: 1380 1381 case 0: 1381 1382 /* rotate */ 1382 b = s->gr[3] & 7;1383 b = pThis->gr[3] & 7; 1383 1384 val = ((val >> b) | (val << (8 - b))) & 0xff; 1384 1385 val |= val << 8; … … 1386 1387 1387 1388 /* apply set/reset mask */ 1388 set_mask = mask16[ s->gr[1]];1389 val = (val & ~set_mask) | (mask16[ s->gr[0]] & set_mask);1390 bit_mask = s->gr[8];1389 set_mask = mask16[pThis->gr[1]]; 1390 val = (val & ~set_mask) | (mask16[pThis->gr[0]] & set_mask); 1391 bit_mask = pThis->gr[8]; 1391 1392 break; 1392 1393 case 1: 1393 val = s->latch;1394 val = pThis->latch; 1394 1395 goto do_write; 1395 1396 case 2: 1396 1397 val = mask16[val & 0x0f]; 1397 bit_mask = s->gr[8];1398 bit_mask = pThis->gr[8]; 1398 1399 break; 1399 1400 case 3: 1400 1401 /* rotate */ 1401 b = s->gr[3] & 7;1402 b = pThis->gr[3] & 7; 1402 1403 val = (val >> b) | (val << (8 - b)); 1403 1404 1404 bit_mask = s->gr[8] & val;1405 val = mask16[ s->gr[0]];1405 bit_mask = pThis->gr[8] & val; 1406 val = mask16[pThis->gr[0]]; 1406 1407 break; 1407 1408 } 1408 1409 1409 1410 /* apply logical operation */ 1410 func_select = s->gr[3] >> 3;1411 func_select = pThis->gr[3] >> 3; 1411 1412 switch(func_select) { 1412 1413 case 0: … … 1416 1417 case 1: 1417 1418 /* and */ 1418 val &= s->latch;1419 val &= pThis->latch; 1419 1420 break; 1420 1421 case 2: 1421 1422 /* or */ 1422 val |= s->latch;1423 val |= pThis->latch; 1423 1424 break; 1424 1425 case 3: 1425 1426 /* xor */ 1426 val ^= s->latch;1427 val ^= pThis->latch; 1427 1428 break; 1428 1429 } … … 1431 1432 bit_mask |= bit_mask << 8; 1432 1433 bit_mask |= bit_mask << 16; 1433 val = (val & bit_mask) | ( s->latch & ~bit_mask);1434 val = (val & bit_mask) | (pThis->latch & ~bit_mask); 1434 1435 1435 1436 do_write: 1436 1437 /* mask data according to sr[2] */ 1437 mask = s->sr[2];1438 s->plane_updated |= mask; /* only used to detect font change */1438 mask = pThis->sr[2]; 1439 pThis->plane_updated |= mask; /* only used to detect font change */ 1439 1440 write_mask = mask16[mask]; 1440 ((uint32_t *) s->CTX_SUFF(vram_ptr))[addr] =1441 (((uint32_t *) s->CTX_SUFF(vram_ptr))[addr] & ~write_mask) |1441 ((uint32_t *)pThis->CTX_SUFF(vram_ptr))[addr] = 1442 (((uint32_t *)pThis->CTX_SUFF(vram_ptr))[addr] & ~write_mask) | 1442 1443 (val & write_mask); 1443 1444 Log3(("vga: latch: [0x%x] mask=0x%08x val=0x%08x\n", 1444 1445 addr * 4, write_mask, val)); 1445 vga_set_dirty( s, (addr << 2));1446 vga_set_dirty(pThis, (addr << 2)); 1446 1447 } 1447 1448 … … 1458 1459 uint32_t fgcol, uint32_t bgcol, int dup9); 1459 1460 typedef void vga_draw_line_func(VGAState *s1, uint8_t *d, 1460 const uint8_t * s, int width);1461 const uint8_t *pThis, int width); 1461 1462 1462 1463 static inline unsigned int rgb_to_pixel8(unsigned int r, unsigned int g, unsigned b) … … 1525 1526 1526 1527 /* return true if the palette was modified */ 1527 static bool update_palette16(VGAState * s)1528 static bool update_palette16(VGAState *pThis) 1528 1529 { 1529 1530 bool full_update = false; … … 1531 1532 uint32_t v, col, *palette; 1532 1533 1533 palette = s->last_palette;1534 palette = pThis->last_palette; 1534 1535 for(i = 0; i < 16; i++) { 1535 v = s->ar[i];1536 if ( s->ar[0x10] & 0x80)1537 v = (( s->ar[0x14] & 0xf) << 4) | (v & 0xf);1536 v = pThis->ar[i]; 1537 if (pThis->ar[0x10] & 0x80) 1538 v = ((pThis->ar[0x14] & 0xf) << 4) | (v & 0xf); 1538 1539 else 1539 v = (( s->ar[0x14] & 0xc) << 4) | (v & 0x3f);1540 v = ((pThis->ar[0x14] & 0xc) << 4) | (v & 0x3f); 1540 1541 v = v * 3; 1541 col = s->rgb_to_pixel(c6_to_8(s->palette[v]),1542 c6_to_8( s->palette[v + 1]),1543 c6_to_8( s->palette[v + 2]));1542 col = pThis->rgb_to_pixel(c6_to_8(pThis->palette[v]), 1543 c6_to_8(pThis->palette[v + 1]), 1544 c6_to_8(pThis->palette[v + 2])); 1544 1545 if (col != palette[i]) { 1545 1546 full_update = true; … … 1551 1552 1552 1553 /* return true if the palette was modified */ 1553 static bool update_palette256(VGAState * s)1554 static bool update_palette256(VGAState *pThis) 1554 1555 { 1555 1556 bool full_update = false; … … 1558 1559 int wide_dac; 1559 1560 1560 palette = s->last_palette;1561 palette = pThis->last_palette; 1561 1562 v = 0; 1562 wide_dac = ( s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & (VBE_DISPI_ENABLED | VBE_DISPI_8BIT_DAC))1563 wide_dac = (pThis->vbe_regs[VBE_DISPI_INDEX_ENABLE] & (VBE_DISPI_ENABLED | VBE_DISPI_8BIT_DAC)) 1563 1564 == (VBE_DISPI_ENABLED | VBE_DISPI_8BIT_DAC); 1564 1565 for(i = 0; i < 256; i++) { 1565 1566 if (wide_dac) 1566 col = s->rgb_to_pixel(s->palette[v],1567 s->palette[v + 1],1568 s->palette[v + 2]);1567 col = pThis->rgb_to_pixel(pThis->palette[v], 1568 pThis->palette[v + 1], 1569 pThis->palette[v + 2]); 1569 1570 else 1570 col = s->rgb_to_pixel(c6_to_8(s->palette[v]),1571 c6_to_8( s->palette[v + 1]),1572 c6_to_8( s->palette[v + 2]));1571 col = pThis->rgb_to_pixel(c6_to_8(pThis->palette[v]), 1572 c6_to_8(pThis->palette[v + 1]), 1573 c6_to_8(pThis->palette[v + 2])); 1573 1574 if (col != palette[i]) { 1574 1575 full_update = true; … … 1580 1581 } 1581 1582 1582 static void vga_get_offsets(VGAState * s,1583 static void vga_get_offsets(VGAState *pThis, 1583 1584 uint32_t *pline_offset, 1584 1585 uint32_t *pstart_addr, … … 1587 1588 uint32_t start_addr, line_offset, line_compare; 1588 1589 #ifdef CONFIG_BOCHS_VBE 1589 if ( s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED) {1590 line_offset = s->vbe_line_offset;1591 start_addr = s->vbe_start_addr;1590 if (pThis->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED) { 1591 line_offset = pThis->vbe_line_offset; 1592 start_addr = pThis->vbe_start_addr; 1592 1593 line_compare = 65535; 1593 1594 } else … … 1595 1596 { 1596 1597 /* compute line_offset in bytes */ 1597 line_offset = s->cr[0x13];1598 line_offset = pThis->cr[0x13]; 1598 1599 line_offset <<= 3; 1599 if (!( s->cr[0x14] & 0x40) && !(s->cr[0x17] & 0x40))1600 if (!(pThis->cr[0x14] & 0x40) && !(pThis->cr[0x17] & 0x40)) 1600 1601 { 1601 1602 /* Word mode. Used for odd/even modes. */ … … 1604 1605 1605 1606 /* starting address */ 1606 start_addr = s->cr[0x0d] | (s->cr[0x0c] << 8);1607 start_addr = pThis->cr[0x0d] | (pThis->cr[0x0c] << 8); 1607 1608 1608 1609 /* line compare */ 1609 line_compare = s->cr[0x18] |1610 (( s->cr[0x07] & 0x10) << 4) |1611 (( s->cr[0x09] & 0x40) << 3);1610 line_compare = pThis->cr[0x18] | 1611 ((pThis->cr[0x07] & 0x10) << 4) | 1612 ((pThis->cr[0x09] & 0x40) << 3); 1612 1613 } 1613 1614 *pline_offset = line_offset; … … 1617 1618 1618 1619 /* update start_addr and line_offset. Return TRUE if modified */ 1619 static bool update_basic_params(VGAState * s)1620 static bool update_basic_params(VGAState *pThis) 1620 1621 { 1621 1622 bool full_update = false; 1622 1623 uint32_t start_addr, line_offset, line_compare; 1623 1624 1624 s->get_offsets(s, &line_offset, &start_addr, &line_compare);1625 1626 if (line_offset != s->line_offset ||1627 start_addr != s->start_addr ||1628 line_compare != s->line_compare) {1629 s->line_offset = line_offset;1630 s->start_addr = start_addr;1631 s->line_compare = line_compare;1625 pThis->get_offsets(pThis, &line_offset, &start_addr, &line_compare); 1626 1627 if (line_offset != pThis->line_offset || 1628 start_addr != pThis->start_addr || 1629 line_compare != pThis->line_compare) { 1630 pThis->line_offset = line_offset; 1631 pThis->start_addr = start_addr; 1632 pThis->line_compare = line_compare; 1632 1633 full_update = true; 1633 1634 } … … 1696 1697 * - flashing 1697 1698 */ 1698 static int vga_draw_text(VGAState * s, bool full_update, bool fFailOnResize, bool reset_dirty)1699 static int vga_draw_text(VGAState *pThis, bool full_update, bool fFailOnResize, bool reset_dirty) 1699 1700 { 1700 1701 int cx, cy, cheight, cw, ch, cattr, height, width, ch_attr; … … 1710 1711 vga_draw_glyph9_func *vga_draw_glyph9; 1711 1712 1712 full_update |= update_palette16( s);1713 palette = s->last_palette;1713 full_update |= update_palette16(pThis); 1714 palette = pThis->last_palette; 1714 1715 1715 1716 /* compute font data address (in plane 2) */ 1716 v = s->sr[3];1717 v = pThis->sr[3]; 1717 1718 offset = (((v >> 4) & 1) | ((v << 1) & 6)) * 8192 * 4 + 2; 1718 if (offset != s->font_offsets[0]) {1719 s->font_offsets[0] = offset;1719 if (offset != pThis->font_offsets[0]) { 1720 pThis->font_offsets[0] = offset; 1720 1721 full_update = true; 1721 1722 } 1722 font_base[0] = s->CTX_SUFF(vram_ptr) + offset;1723 font_base[0] = pThis->CTX_SUFF(vram_ptr) + offset; 1723 1724 1724 1725 offset = (((v >> 5) & 1) | ((v >> 1) & 6)) * 8192 * 4 + 2; 1725 font_base[1] = s->CTX_SUFF(vram_ptr) + offset;1726 if (offset != s->font_offsets[1]) {1727 s->font_offsets[1] = offset;1726 font_base[1] = pThis->CTX_SUFF(vram_ptr) + offset; 1727 if (offset != pThis->font_offsets[1]) { 1728 pThis->font_offsets[1] = offset; 1728 1729 full_update = true; 1729 1730 } 1730 if ( s->plane_updated & (1 << 2)) {1731 if (pThis->plane_updated & (1 << 2)) { 1731 1732 /* if the plane 2 was modified since the last display, it 1732 1733 indicates the font may have been modified */ 1733 s->plane_updated = 0;1734 pThis->plane_updated = 0; 1734 1735 full_update = true; 1735 1736 } 1736 full_update |= update_basic_params( s);1737 1738 line_offset = s->line_offset;1739 s1 = s->CTX_SUFF(vram_ptr) + (s->start_addr * 8); /** @todo r=bird: Add comment why we do *8 instead of *4, it's not so obvious... */1737 full_update |= update_basic_params(pThis); 1738 1739 line_offset = pThis->line_offset; 1740 s1 = pThis->CTX_SUFF(vram_ptr) + (pThis->start_addr * 8); /** @todo r=bird: Add comment why we do *8 instead of *4, it's not so obvious... */ 1740 1741 1741 1742 /* double scanning - not for 9-wide modes */ 1742 dscan = ( s->cr[9] >> 7) & 1;1743 dscan = (pThis->cr[9] >> 7) & 1; 1743 1744 1744 1745 /* total width & height */ 1745 cheight = ( s->cr[9] & 0x1f) + 1;1746 cheight = (pThis->cr[9] & 0x1f) + 1; 1746 1747 cw = 8; 1747 if (!( s->sr[1] & 0x01))1748 if (!(pThis->sr[1] & 0x01)) 1748 1749 cw = 9; 1749 if ( s->sr[1] & 0x08)1750 if (pThis->sr[1] & 0x08) 1750 1751 cw = 16; /* NOTE: no 18 pixel wide */ 1751 x_incr = cw * (( s->pDrv->cBits + 7) >> 3);1752 width = ( s->cr[0x01] + 1);1753 if ( s->cr[0x06] == 100) {1752 x_incr = cw * ((pThis->pDrv->cBits + 7) >> 3); 1753 width = (pThis->cr[0x01] + 1); 1754 if (pThis->cr[0x06] == 100) { 1754 1755 /* ugly hack for CGA 160x100x16 - explain me the logic */ 1755 1756 height = 100; 1756 1757 } else { 1757 height = s->cr[0x12] |1758 (( s->cr[0x07] & 0x02) << 7) |1759 (( s->cr[0x07] & 0x40) << 3);1758 height = pThis->cr[0x12] | 1759 ((pThis->cr[0x07] & 0x02) << 7) | 1760 ((pThis->cr[0x07] & 0x40) << 3); 1760 1761 height = (height + 1) / cheight; 1761 1762 } … … 1765 1766 } 1766 1767 1767 if (width != (int) s->last_width || height != (int)s->last_height ||1768 cw != s->last_cw || cheight !=s->last_ch) {1768 if (width != (int)pThis->last_width || height != (int)pThis->last_height || 1769 cw != pThis->last_cw || cheight != pThis->last_ch) { 1769 1770 if (fFailOnResize) 1770 1771 { … … 1772 1773 return VERR_TRY_AGAIN; 1773 1774 } 1774 s->last_scr_width = width * cw;1775 s->last_scr_height = height * cheight;1775 pThis->last_scr_width = width * cw; 1776 pThis->last_scr_height = height * cheight; 1776 1777 /* For text modes the direct use of guest VRAM is not implemented, so bpp and cbLine are 0 here. */ 1777 int rc = s->pDrv->pfnResize(s->pDrv, 0, NULL, 0, s->last_scr_width,s->last_scr_height);1778 s->last_width = width;1779 s->last_height = height;1780 s->last_ch = cheight;1781 s->last_cw = cw;1778 int rc = pThis->pDrv->pfnResize(pThis->pDrv, 0, NULL, 0, pThis->last_scr_width, pThis->last_scr_height); 1779 pThis->last_width = width; 1780 pThis->last_height = height; 1781 pThis->last_ch = cheight; 1782 pThis->last_cw = cw; 1782 1783 full_update = true; 1783 1784 if (rc == VINF_VGA_RESIZE_IN_PROGRESS) … … 1785 1786 AssertRC(rc); 1786 1787 } 1787 cursor_offset = (( s->cr[0x0e] << 8) | s->cr[0x0f]) -s->start_addr;1788 if (cursor_offset != s->cursor_offset ||1789 s->cr[0xa] !=s->cursor_start ||1790 s->cr[0xb] !=s->cursor_end) {1788 cursor_offset = ((pThis->cr[0x0e] << 8) | pThis->cr[0x0f]) - pThis->start_addr; 1789 if (cursor_offset != pThis->cursor_offset || 1790 pThis->cr[0xa] != pThis->cursor_start || 1791 pThis->cr[0xb] != pThis->cursor_end) { 1791 1792 /* if the cursor position changed, we update the old and new 1792 1793 chars */ 1793 if ( s->cursor_offset < CH_ATTR_SIZE)1794 s->last_ch_attr[s->cursor_offset] = ~0;1794 if (pThis->cursor_offset < CH_ATTR_SIZE) 1795 pThis->last_ch_attr[pThis->cursor_offset] = ~0; 1795 1796 if (cursor_offset < CH_ATTR_SIZE) 1796 s->last_ch_attr[cursor_offset] = ~0;1797 s->cursor_offset = cursor_offset;1798 s->cursor_start =s->cr[0xa];1799 s->cursor_end =s->cr[0xb];1800 } 1801 cursor_ptr = s->CTX_SUFF(vram_ptr) + (s->start_addr + cursor_offset) * 8;1802 depth_index = get_depth_index( s->pDrv->cBits);1797 pThis->last_ch_attr[cursor_offset] = ~0; 1798 pThis->cursor_offset = cursor_offset; 1799 pThis->cursor_start = pThis->cr[0xa]; 1800 pThis->cursor_end = pThis->cr[0xb]; 1801 } 1802 cursor_ptr = pThis->CTX_SUFF(vram_ptr) + (pThis->start_addr + cursor_offset) * 8; 1803 depth_index = get_depth_index(pThis->pDrv->cBits); 1803 1804 if (cw == 16) 1804 1805 vga_draw_glyph8 = vga_draw_glyph16_table[depth_index]; … … 1807 1808 vga_draw_glyph9 = vga_draw_glyph9_table[depth_index]; 1808 1809 1809 dest = s->pDrv->pu8Data;1810 linesize = s->pDrv->cbScanline;1811 ch_attr_ptr = s->last_ch_attr;1810 dest = pThis->pDrv->pu8Data; 1811 linesize = pThis->pDrv->cbScanline; 1812 ch_attr_ptr = pThis->last_ch_attr; 1812 1813 cy_start = -1; 1813 1814 cx_max_upd = -1; … … 1844 1845 } else { 1845 1846 dup9 = 0; 1846 if (ch >= 0xb0 && ch <= 0xdf && ( s->ar[0x10] & 0x04))1847 if (ch >= 0xb0 && ch <= 0xdf && (pThis->ar[0x10] & 0x04)) 1847 1848 dup9 = 1; 1848 1849 vga_draw_glyph9(d1, linesize, … … 1850 1851 } 1851 1852 if (src == cursor_ptr && 1852 !( s->cr[0x0a] & 0x20)) {1853 !(pThis->cr[0x0a] & 0x20)) { 1853 1854 int line_start, line_last, h; 1854 1855 /* draw the cursor */ 1855 line_start = s->cr[0x0a] & 0x1f;1856 line_last = s->cr[0x0b] & 0x1f;1856 line_start = pThis->cr[0x0a] & 0x1f; 1857 line_last = pThis->cr[0x0b] & 0x1f; 1857 1858 /* XXX: check that */ 1858 1859 if (line_last > cheight - 1) … … 1885 1886 } else if (cy_start >= 0) { 1886 1887 /* Flush updates to display. */ 1887 s->pDrv->pfnUpdateRect(s->pDrv, cx_min_upd * cw, cy_start * cheight,1888 (cx_max_upd - cx_min_upd + 1) * cw, (cy - cy_start) * cheight);1888 pThis->pDrv->pfnUpdateRect(pThis->pDrv, cx_min_upd * cw, cy_start * cheight, 1889 (cx_max_upd - cx_min_upd + 1) * cw, (cy - cy_start) * cheight); 1889 1890 cy_start = -1; 1890 1891 cx_max_upd = -1; … … 1896 1897 if (cy_start >= 0) 1897 1898 /* Flush any remaining changes to display. */ 1898 s->pDrv->pfnUpdateRect(s->pDrv, cx_min_upd * cw, cy_start * cheight,1899 (cx_max_upd - cx_min_upd + 1) * cw, (cy - cy_start) * cheight);1899 pThis->pDrv->pfnUpdateRect(pThis->pDrv, cx_min_upd * cw, cy_start * cheight, 1900 (cx_max_upd - cx_min_upd + 1) * cw, (cy - cy_start) * cheight); 1900 1901 return VINF_SUCCESS; 1901 1902 } … … 1967 1968 }; 1968 1969 1969 static int vga_get_bpp(VGAState * s)1970 static int vga_get_bpp(VGAState *pThis) 1970 1971 { 1971 1972 int ret; 1972 1973 #ifdef CONFIG_BOCHS_VBE 1973 if ( s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED) {1974 ret = s->vbe_regs[VBE_DISPI_INDEX_BPP];1974 if (pThis->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED) { 1975 ret = pThis->vbe_regs[VBE_DISPI_INDEX_BPP]; 1975 1976 } else 1976 1977 #endif … … 1981 1982 } 1982 1983 1983 static void vga_get_resolution(VGAState * s, int *pwidth, int *pheight)1984 static void vga_get_resolution(VGAState *pThis, int *pwidth, int *pheight) 1984 1985 { 1985 1986 int width, height; 1986 1987 #ifdef CONFIG_BOCHS_VBE 1987 if ( s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED) {1988 width = s->vbe_regs[VBE_DISPI_INDEX_XRES];1989 height = RT_MIN( s->vbe_regs[VBE_DISPI_INDEX_YRES],1990 s->vbe_regs[VBE_DISPI_INDEX_VIRT_HEIGHT]);1988 if (pThis->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED) { 1989 width = pThis->vbe_regs[VBE_DISPI_INDEX_XRES]; 1990 height = RT_MIN(pThis->vbe_regs[VBE_DISPI_INDEX_YRES], 1991 pThis->vbe_regs[VBE_DISPI_INDEX_VIRT_HEIGHT]); 1991 1992 } else 1992 1993 #endif 1993 1994 { 1994 width = ( s->cr[0x01] + 1) * 8;1995 height = s->cr[0x12] |1996 (( s->cr[0x07] & 0x02) << 7) |1997 (( s->cr[0x07] & 0x40) << 3);1995 width = (pThis->cr[0x01] + 1) * 8; 1996 height = pThis->cr[0x12] | 1997 ((pThis->cr[0x07] & 0x02) << 7) | 1998 ((pThis->cr[0x07] & 0x40) << 3); 1998 1999 height = (height + 1); 1999 2000 } … … 2010 2011 * @returns VINF_SUCCESS on success. 2011 2012 * @returns VINF_VGA_RESIZE_IN_PROGRESS if the operation wasn't complete. 2012 * @param s Pointer to the vga status.2013 * @param pThis Pointer to the vga state. 2013 2014 * @param cx The width. 2014 2015 * @param cy The height. 2015 2016 */ 2016 static int vga_resize_graphic(VGAState * s, int cx, int cy)2017 { 2018 const unsigned cBits = s->get_bpp(s);2017 static int vga_resize_graphic(VGAState *pThis, int cx, int cy) 2018 { 2019 const unsigned cBits = pThis->get_bpp(pThis); 2019 2020 2020 2021 int rc; 2021 2022 AssertReturn(cx, VERR_INVALID_PARAMETER); 2022 2023 AssertReturn(cy, VERR_INVALID_PARAMETER); 2023 AssertPtrReturn( s, VERR_INVALID_POINTER);2024 AssertReturn( s->line_offset, VERR_INTERNAL_ERROR);2024 AssertPtrReturn(pThis, VERR_INVALID_POINTER); 2025 AssertReturn(pThis->line_offset, VERR_INTERNAL_ERROR); 2025 2026 2026 2027 #if 0 //def VBOX_WITH_VDMA … … 2032 2033 * 2033 2034 * The reason for doing this for WDDM driver only now is to avoid regressions of the current code */ 2034 PVBOXVDMAHOST pVdma = s->pVdma;2035 PVBOXVDMAHOST pVdma = pThis->pVdma; 2035 2036 if (pVdma && vboxVDMAIsEnabled(pVdma)) 2036 2037 rc = VINF_SUCCESS; … … 2039 2040 { 2040 2041 /* Skip the resize if the values are not valid. */ 2041 if ( s->start_addr * 4 + s->line_offset * cy <s->vram_size)2042 if (pThis->start_addr * 4 + pThis->line_offset * cy < pThis->vram_size) 2042 2043 /* Take into account the programmed start address (in DWORDs) of the visible screen. */ 2043 rc = s->pDrv->pfnResize(s->pDrv, cBits, s->CTX_SUFF(vram_ptr) + s->start_addr * 4,s->line_offset, cx, cy);2044 rc = pThis->pDrv->pfnResize(pThis->pDrv, cBits, pThis->CTX_SUFF(vram_ptr) + pThis->start_addr * 4, pThis->line_offset, cx, cy); 2044 2045 else 2045 2046 { … … 2050 2051 2051 2052 /* last stuff */ 2052 s->last_bpp = cBits;2053 s->last_scr_width = cx;2054 s->last_scr_height = cy;2055 s->last_width = cx;2056 s->last_height = cy;2053 pThis->last_bpp = cBits; 2054 pThis->last_scr_width = cx; 2055 pThis->last_scr_height = cy; 2056 pThis->last_width = cx; 2057 pThis->last_height = cy; 2057 2058 2058 2059 if (rc == VINF_VGA_RESIZE_IN_PROGRESS) … … 2061 2062 2062 2063 /* update palette */ 2063 switch ( s->pDrv->cBits)2064 { 2065 case 32: s->rgb_to_pixel = rgb_to_pixel32_dup; break;2064 switch (pThis->pDrv->cBits) 2065 { 2066 case 32: pThis->rgb_to_pixel = rgb_to_pixel32_dup; break; 2066 2067 case 16: 2067 default: s->rgb_to_pixel = rgb_to_pixel16_dup; break;2068 case 15: s->rgb_to_pixel = rgb_to_pixel15_dup; break;2069 case 8: s->rgb_to_pixel = rgb_to_pixel8_dup; break;2070 } 2071 if ( s->shift_control == 0)2072 update_palette16( s);2073 else if ( s->shift_control == 1)2074 update_palette16( s);2068 default: pThis->rgb_to_pixel = rgb_to_pixel16_dup; break; 2069 case 15: pThis->rgb_to_pixel = rgb_to_pixel15_dup; break; 2070 case 8: pThis->rgb_to_pixel = rgb_to_pixel8_dup; break; 2071 } 2072 if (pThis->shift_control == 0) 2073 update_palette16(pThis); 2074 else if (pThis->shift_control == 1) 2075 update_palette16(pThis); 2075 2076 return VINF_SUCCESS; 2076 2077 } … … 2079 2080 * graphic modes 2080 2081 */ 2081 static int vga_draw_graphic(VGAState * s, bool full_update, bool fFailOnResize, bool reset_dirty)2082 static int vga_draw_graphic(VGAState *pThis, bool full_update, bool fFailOnResize, bool reset_dirty) 2082 2083 { 2083 2084 int y1, y2, y, page_min, page_max, linesize, y_start, double_scan; … … 2088 2089 vga_draw_line_func *vga_draw_line; 2089 2090 2090 bool offsets_changed = update_basic_params( s);2091 bool offsets_changed = update_basic_params(pThis); 2091 2092 2092 2093 full_update |= offsets_changed; 2093 2094 2094 s->get_resolution(s, &width, &height);2095 pThis->get_resolution(pThis, &width, &height); 2095 2096 disp_width = width; 2096 2097 2097 shift_control = ( s->gr[0x05] >> 5) & 3;2098 double_scan = ( s->cr[0x09] >> 7);2098 shift_control = (pThis->gr[0x05] >> 5) & 3; 2099 double_scan = (pThis->cr[0x09] >> 7); 2099 2100 multi_run = double_scan; 2100 if (shift_control != s->shift_control ||2101 double_scan != s->double_scan) {2101 if (shift_control != pThis->shift_control || 2102 double_scan != pThis->double_scan) { 2102 2103 full_update = true; 2103 s->shift_control = shift_control;2104 s->double_scan = double_scan;2104 pThis->shift_control = shift_control; 2105 pThis->double_scan = double_scan; 2105 2106 } 2106 2107 2107 2108 if (shift_control == 0) { 2108 full_update |= update_palette16( s);2109 if ( s->sr[0x01] & 8) {2109 full_update |= update_palette16(pThis); 2110 if (pThis->sr[0x01] & 8) { 2110 2111 v = VGA_DRAW_LINE4D2; 2111 2112 disp_width <<= 1; … … 2115 2116 bits = 4; 2116 2117 } else if (shift_control == 1) { 2117 full_update |= update_palette16( s);2118 if ( s->sr[0x01] & 8) {2118 full_update |= update_palette16(pThis); 2119 if (pThis->sr[0x01] & 8) { 2119 2120 v = VGA_DRAW_LINE2D2; 2120 2121 disp_width <<= 1; … … 2124 2125 bits = 4; 2125 2126 } else { 2126 switch( s->get_bpp(s)) {2127 switch(pThis->get_bpp(pThis)) { 2127 2128 default: 2128 2129 case 0: 2129 full_update |= update_palette256( s);2130 full_update |= update_palette256(pThis); 2130 2131 v = VGA_DRAW_LINE8D2; 2131 2132 bits = 4; 2132 2133 break; 2133 2134 case 8: 2134 full_update |= update_palette256( s);2135 full_update |= update_palette256(pThis); 2135 2136 v = VGA_DRAW_LINE8; 2136 2137 bits = 8; … … 2154 2155 } 2155 2156 } 2156 if ( disp_width != (int) s->last_width2157 || height != (int) s->last_height2158 || s->get_bpp(s) != (int)s->last_bpp2159 || (offsets_changed && ! s->fRenderVRAM))2157 if ( disp_width != (int)pThis->last_width 2158 || height != (int)pThis->last_height 2159 || pThis->get_bpp(pThis) != (int)pThis->last_bpp 2160 || (offsets_changed && !pThis->fRenderVRAM)) 2160 2161 { 2161 2162 if (fFailOnResize) … … 2164 2165 return VERR_TRY_AGAIN; 2165 2166 } 2166 int rc = vga_resize_graphic( s, disp_width, height);2167 int rc = vga_resize_graphic(pThis, disp_width, height); 2167 2168 if (rc != VINF_SUCCESS) /* Return any rc, particularly VINF_VGA_RESIZE_IN_PROGRESS, to the caller. */ 2168 2169 return rc; 2169 2170 full_update = true; 2170 2171 } 2171 vga_draw_line = vga_draw_line_table[v * 4 + get_depth_index( s->pDrv->cBits)];2172 2173 if ( s->cursor_invalidate)2174 s->cursor_invalidate(s);2175 2176 line_offset = s->line_offset;2172 vga_draw_line = vga_draw_line_table[v * 4 + get_depth_index(pThis->pDrv->cBits)]; 2173 2174 if (pThis->cursor_invalidate) 2175 pThis->cursor_invalidate(pThis); 2176 2177 line_offset = pThis->line_offset; 2177 2178 #if 0 2178 2179 Log(("w=%d h=%d v=%d line_offset=%d cr[0x09]=0x%02x cr[0x17]=0x%02x linecmp=%d sr[0x01]=0x%02x\n", 2179 width, height, v, line_offset, s->cr[9], s->cr[0x17], s->line_compare,s->sr[0x01]));2180 width, height, v, line_offset, pThis->cr[9], pThis->cr[0x17], pThis->line_compare, pThis->sr[0x01])); 2180 2181 #endif 2181 addr1 = ( s->start_addr * 4);2182 addr1 = (pThis->start_addr * 4); 2182 2183 bwidth = (width * bits + 7) / 8; /* The visible width of a scanline. */ 2183 2184 y_start = -1; 2184 2185 page_min = 0x7fffffff; 2185 2186 page_max = -1; 2186 d = s->pDrv->pu8Data;2187 linesize = s->pDrv->cbScanline;2187 d = pThis->pDrv->pu8Data; 2188 linesize = pThis->pDrv->cbScanline; 2188 2189 2189 2190 y1 = 0; 2190 y2 = s->cr[0x09] & 0x1F; /* starting row scan count */2191 y2 = pThis->cr[0x09] & 0x1F; /* starting row scan count */ 2191 2192 for(y = 0; y < height; y++) { 2192 2193 addr = addr1; … … 2194 2195 * shifted left by two compared to VGA specs. 2195 2196 */ 2196 if (!( s->cr[0x17] & 1)) {2197 if (!(pThis->cr[0x17] & 1)) { 2197 2198 addr = (addr & ~(1 << 15)) | ((y1 & 1) << 15); 2198 2199 } 2199 if (!( s->cr[0x17] & 2)) {2200 if (!(pThis->cr[0x17] & 2)) { 2200 2201 addr = (addr & ~(1 << 16)) | ((y1 & 2) << 15); 2201 2202 } 2202 2203 page0 = addr & TARGET_PAGE_MASK; 2203 2204 page1 = (addr + bwidth - 1) & TARGET_PAGE_MASK; 2204 bool update = full_update | vga_is_dirty( s, page0) | vga_is_dirty(s, page1);2205 bool update = full_update | vga_is_dirty(pThis, page0) | vga_is_dirty(pThis, page1); 2205 2206 if (page1 - page0 > TARGET_PAGE_SIZE) { 2206 2207 /* if wide line, can use another page */ 2207 update |= vga_is_dirty( s, page0 + TARGET_PAGE_SIZE);2208 update |= vga_is_dirty(pThis, page0 + TARGET_PAGE_SIZE); 2208 2209 } 2209 2210 /* explicit invalidation for the hardware cursor */ 2210 update |= ( s->invalidated_y_table[y >> 5] >> (y & 0x1f)) & 1;2211 update |= (pThis->invalidated_y_table[y >> 5] >> (y & 0x1f)) & 1; 2211 2212 if (update) { 2212 2213 if (y_start < 0) … … 2216 2217 if (page1 > page_max) 2217 2218 page_max = page1; 2218 if ( s->fRenderVRAM)2219 vga_draw_line( s, d,s->CTX_SUFF(vram_ptr) + addr, width);2220 if ( s->cursor_draw_line)2221 s->cursor_draw_line(s, d, y);2219 if (pThis->fRenderVRAM) 2220 vga_draw_line(pThis, d, pThis->CTX_SUFF(vram_ptr) + addr, width); 2221 if (pThis->cursor_draw_line) 2222 pThis->cursor_draw_line(pThis, d, y); 2222 2223 } else { 2223 2224 if (y_start >= 0) { 2224 2225 /* flush to display */ 2225 s->pDrv->pfnUpdateRect(s->pDrv, 0, y_start, disp_width, y - y_start);2226 pThis->pDrv->pfnUpdateRect(pThis->pDrv, 0, y_start, disp_width, y - y_start); 2226 2227 y_start = -1; 2227 2228 } … … 2232 2233 2233 2234 if (y2 == 0) { 2234 y2 = s->cr[0x09] & 0x1F;2235 y2 = pThis->cr[0x09] & 0x1F; 2235 2236 addr1 += line_offset; 2236 2237 } else { … … 2241 2242 } 2242 2243 /* line compare acts on the displayed lines */ 2243 if ((uint32_t)y == s->line_compare)2244 if ((uint32_t)y == pThis->line_compare) 2244 2245 addr1 = 0; 2245 2246 d += linesize; … … 2247 2248 if (y_start >= 0) { 2248 2249 /* flush to display */ 2249 s->pDrv->pfnUpdateRect(s->pDrv, 0, y_start, disp_width, y - y_start);2250 pThis->pDrv->pfnUpdateRect(pThis->pDrv, 0, y_start, disp_width, y - y_start); 2250 2251 } 2251 2252 /* reset modified pages */ 2252 2253 if (page_max != -1 && reset_dirty) { 2253 vga_reset_dirty( s, page_min, page_max + TARGET_PAGE_SIZE);2254 } 2255 memset( s->invalidated_y_table, 0, ((height + 31) >> 5) * 4);2254 vga_reset_dirty(pThis, page_min, page_max + TARGET_PAGE_SIZE); 2255 } 2256 memset(pThis->invalidated_y_table, 0, ((height + 31) >> 5) * 4); 2256 2257 return VINF_SUCCESS; 2257 2258 } 2258 2259 2259 static void vga_draw_blank(VGAState * s, int full_update)2260 static void vga_draw_blank(VGAState *pThis, int full_update) 2260 2261 { 2261 2262 int i, w, val; 2262 2263 uint8_t *d; 2263 uint32_t cbScanline = s->pDrv->cbScanline;2264 2265 if ( s->pDrv->pu8Data ==s->vram_ptrR3) /* Do not clear the VRAM itself. */2264 uint32_t cbScanline = pThis->pDrv->cbScanline; 2265 2266 if (pThis->pDrv->pu8Data == pThis->vram_ptrR3) /* Do not clear the VRAM itself. */ 2266 2267 return; 2267 2268 if (!full_update) 2268 2269 return; 2269 if ( s->last_scr_width <= 0 ||s->last_scr_height <= 0)2270 if (pThis->last_scr_width <= 0 || pThis->last_scr_height <= 0) 2270 2271 return; 2271 if ( s->pDrv->cBits == 8)2272 val = s->rgb_to_pixel(0, 0, 0);2272 if (pThis->pDrv->cBits == 8) 2273 val = pThis->rgb_to_pixel(0, 0, 0); 2273 2274 else 2274 2275 val = 0; 2275 w = s->last_scr_width * ((s->pDrv->cBits + 7) >> 3);2276 d = s->pDrv->pu8Data;2277 for(i = 0; i < (int) s->last_scr_height; i++) {2276 w = pThis->last_scr_width * ((pThis->pDrv->cBits + 7) >> 3); 2277 d = pThis->pDrv->pu8Data; 2278 for(i = 0; i < (int)pThis->last_scr_height; i++) { 2278 2279 memset(d, val, w); 2279 2280 d += cbScanline; 2280 2281 } 2281 s->pDrv->pfnUpdateRect(s->pDrv, 0, 0, s->last_scr_width,s->last_scr_height);2282 pThis->pDrv->pfnUpdateRect(pThis->pDrv, 0, 0, pThis->last_scr_width, pThis->last_scr_height); 2282 2283 } 2283 2284 … … 2292 2293 #define GMODE_BLANK 2 2293 2294 2294 static int vga_update_display(PVGASTATE s, bool fUpdateAll, bool fFailOnResize, bool reset_dirty)2295 static int vga_update_display(PVGASTATE pThis, bool fUpdateAll, bool fFailOnResize, bool reset_dirty) 2295 2296 { 2296 2297 int rc = VINF_SUCCESS; 2297 2298 int graphic_mode; 2298 2299 2299 if ( s->pDrv->cBits == 0) {2300 if (pThis->pDrv->cBits == 0) { 2300 2301 /* nothing to do */ 2301 2302 } else { 2302 switch( s->pDrv->cBits) {2303 switch(pThis->pDrv->cBits) { 2303 2304 case 8: 2304 s->rgb_to_pixel = rgb_to_pixel8_dup;2305 pThis->rgb_to_pixel = rgb_to_pixel8_dup; 2305 2306 break; 2306 2307 case 15: 2307 s->rgb_to_pixel = rgb_to_pixel15_dup;2308 pThis->rgb_to_pixel = rgb_to_pixel15_dup; 2308 2309 break; 2309 2310 default: 2310 2311 case 16: 2311 s->rgb_to_pixel = rgb_to_pixel16_dup;2312 pThis->rgb_to_pixel = rgb_to_pixel16_dup; 2312 2313 break; 2313 2314 case 32: 2314 s->rgb_to_pixel = rgb_to_pixel32_dup;2315 pThis->rgb_to_pixel = rgb_to_pixel32_dup; 2315 2316 break; 2316 2317 } … … 2331 2332 /* Detect the "screen blank" conditions. */ 2332 2333 int fBlank = 0; 2333 if (!( s->ar_index & 0x20) || (s->sr[0x01] & 0x20)) {2334 if (!(pThis->ar_index & 0x20) || (pThis->sr[0x01] & 0x20)) { 2334 2335 fBlank = 1; 2335 2336 } … … 2337 2338 if (fBlank) { 2338 2339 /* Provide a void pfnUpdateRect callback. */ 2339 if ( s->pDrv) {2340 pfnUpdateRect = s->pDrv->pfnUpdateRect;2341 s->pDrv->pfnUpdateRect = voidUpdateRect;2340 if (pThis->pDrv) { 2341 pfnUpdateRect = pThis->pDrv->pfnUpdateRect; 2342 pThis->pDrv->pfnUpdateRect = voidUpdateRect; 2342 2343 } 2343 2344 } 2344 2345 2345 2346 /* Do a complete redraw, which will pick up a new screen resolution. */ 2346 if ( s->gr[6] & 1) {2347 s->graphic_mode = GMODE_GRAPH;2348 rc = vga_draw_graphic( s, 1, false, reset_dirty);2347 if (pThis->gr[6] & 1) { 2348 pThis->graphic_mode = GMODE_GRAPH; 2349 rc = vga_draw_graphic(pThis, 1, false, reset_dirty); 2349 2350 } else { 2350 s->graphic_mode = GMODE_TEXT;2351 rc = vga_draw_text( s, 1, false, reset_dirty);2351 pThis->graphic_mode = GMODE_TEXT; 2352 rc = vga_draw_text(pThis, 1, false, reset_dirty); 2352 2353 } 2353 2354 2354 2355 if (fBlank) { 2355 2356 /* Set the current mode and restore the callback. */ 2356 s->graphic_mode = GMODE_BLANK;2357 if ( s->pDrv) {2358 s->pDrv->pfnUpdateRect = pfnUpdateRect;2357 pThis->graphic_mode = GMODE_BLANK; 2358 if (pThis->pDrv) { 2359 pThis->pDrv->pfnUpdateRect = pfnUpdateRect; 2359 2360 } 2360 2361 } … … 2362 2363 } 2363 2364 2364 if (!( s->ar_index & 0x20) || (s->sr[0x01] & 0x20)) {2365 if (!(pThis->ar_index & 0x20) || (pThis->sr[0x01] & 0x20)) { 2365 2366 graphic_mode = GMODE_BLANK; 2366 2367 } else { 2367 graphic_mode = s->gr[6] & 1;2368 } 2369 bool full_update = graphic_mode != s->graphic_mode;2368 graphic_mode = pThis->gr[6] & 1; 2369 } 2370 bool full_update = graphic_mode != pThis->graphic_mode; 2370 2371 if (full_update) { 2371 s->graphic_mode = graphic_mode;2372 pThis->graphic_mode = graphic_mode; 2372 2373 } 2373 2374 switch(graphic_mode) { 2374 2375 case GMODE_TEXT: 2375 rc = vga_draw_text( s, full_update, fFailOnResize, reset_dirty);2376 rc = vga_draw_text(pThis, full_update, fFailOnResize, reset_dirty); 2376 2377 break; 2377 2378 case GMODE_GRAPH: 2378 rc = vga_draw_graphic( s, full_update, fFailOnResize, reset_dirty);2379 rc = vga_draw_graphic(pThis, full_update, fFailOnResize, reset_dirty); 2379 2380 break; 2380 2381 case GMODE_BLANK: 2381 2382 default: 2382 vga_draw_blank( s, full_update);2383 vga_draw_blank(pThis, full_update); 2383 2384 break; 2384 2385 } … … 2389 2390 static void vga_save(QEMUFile *f, void *opaque) 2390 2391 { 2391 VGAState * s = (VGAState*)opaque;2392 VGAState *pThis = (VGAState*)opaque; 2392 2393 int i; 2393 2394 2394 qemu_put_be32s(f, & s->latch);2395 qemu_put_8s(f, & s->sr_index);2396 qemu_put_buffer(f, s->sr, 8);2397 qemu_put_8s(f, & s->gr_index);2398 qemu_put_buffer(f, s->gr, 16);2399 qemu_put_8s(f, & s->ar_index);2400 qemu_put_buffer(f, s->ar, 21);2401 qemu_put_be32s(f, & s->ar_flip_flop);2402 qemu_put_8s(f, & s->cr_index);2403 qemu_put_buffer(f, s->cr, 256);2404 qemu_put_8s(f, & s->msr);2405 qemu_put_8s(f, & s->fcr);2406 qemu_put_8s(f, & s->st00);2407 qemu_put_8s(f, & s->st01);2408 2409 qemu_put_8s(f, & s->dac_state);2410 qemu_put_8s(f, & s->dac_sub_index);2411 qemu_put_8s(f, & s->dac_read_index);2412 qemu_put_8s(f, & s->dac_write_index);2413 qemu_put_buffer(f, s->dac_cache, 3);2414 qemu_put_buffer(f, s->palette, 768);2415 2416 qemu_put_be32s(f, & s->bank_offset);2395 qemu_put_be32s(f, &pThis->latch); 2396 qemu_put_8s(f, &pThis->sr_index); 2397 qemu_put_buffer(f, pThis->sr, 8); 2398 qemu_put_8s(f, &pThis->gr_index); 2399 qemu_put_buffer(f, pThis->gr, 16); 2400 qemu_put_8s(f, &pThis->ar_index); 2401 qemu_put_buffer(f, pThis->ar, 21); 2402 qemu_put_be32s(f, &pThis->ar_flip_flop); 2403 qemu_put_8s(f, &pThis->cr_index); 2404 qemu_put_buffer(f, pThis->cr, 256); 2405 qemu_put_8s(f, &pThis->msr); 2406 qemu_put_8s(f, &pThis->fcr); 2407 qemu_put_8s(f, &pThis->st00); 2408 qemu_put_8s(f, &pThis->st01); 2409 2410 qemu_put_8s(f, &pThis->dac_state); 2411 qemu_put_8s(f, &pThis->dac_sub_index); 2412 qemu_put_8s(f, &pThis->dac_read_index); 2413 qemu_put_8s(f, &pThis->dac_write_index); 2414 qemu_put_buffer(f, pThis->dac_cache, 3); 2415 qemu_put_buffer(f, pThis->palette, 768); 2416 2417 qemu_put_be32s(f, &pThis->bank_offset); 2417 2418 #ifdef CONFIG_BOCHS_VBE 2418 2419 qemu_put_byte(f, 1); 2419 qemu_put_be16s(f, & s->vbe_index);2420 qemu_put_be16s(f, &pThis->vbe_index); 2420 2421 for(i = 0; i < VBE_DISPI_INDEX_NB_SAVED; i++) 2421 qemu_put_be16s(f, & s->vbe_regs[i]);2422 qemu_put_be32s(f, & s->vbe_start_addr);2423 qemu_put_be32s(f, & s->vbe_line_offset);2422 qemu_put_be16s(f, &pThis->vbe_regs[i]); 2423 qemu_put_be32s(f, &pThis->vbe_start_addr); 2424 qemu_put_be32s(f, &pThis->vbe_line_offset); 2424 2425 #else 2425 2426 qemu_put_byte(f, 0); … … 2429 2430 static int vga_load(QEMUFile *f, void *opaque, int version_id) 2430 2431 { 2431 VGAState * s = (VGAState*)opaque;2432 VGAState *pThis = (VGAState*)opaque; 2432 2433 int is_vbe, i; 2433 2434 uint32_t u32Dummy; 2434 2435 2435 qemu_get_be32s(f, & s->latch);2436 qemu_get_8s(f, & s->sr_index);2437 qemu_get_buffer(f, s->sr, 8);2438 qemu_get_8s(f, & s->gr_index);2439 qemu_get_buffer(f, s->gr, 16);2440 qemu_get_8s(f, & s->ar_index);2441 qemu_get_buffer(f, s->ar, 21);2442 qemu_get_be32s(f, (uint32_t *)& s->ar_flip_flop);2443 qemu_get_8s(f, & s->cr_index);2444 qemu_get_buffer(f, s->cr, 256);2445 qemu_get_8s(f, & s->msr);2446 qemu_get_8s(f, & s->fcr);2447 qemu_get_8s(f, & s->st00);2448 qemu_get_8s(f, & s->st01);2449 2450 qemu_get_8s(f, & s->dac_state);2451 qemu_get_8s(f, & s->dac_sub_index);2452 qemu_get_8s(f, & s->dac_read_index);2453 qemu_get_8s(f, & s->dac_write_index);2454 qemu_get_buffer(f, s->dac_cache, 3);2455 qemu_get_buffer(f, s->palette, 768);2456 2457 qemu_get_be32s(f, (uint32_t *)& s->bank_offset);2436 qemu_get_be32s(f, &pThis->latch); 2437 qemu_get_8s(f, &pThis->sr_index); 2438 qemu_get_buffer(f, pThis->sr, 8); 2439 qemu_get_8s(f, &pThis->gr_index); 2440 qemu_get_buffer(f, pThis->gr, 16); 2441 qemu_get_8s(f, &pThis->ar_index); 2442 qemu_get_buffer(f, pThis->ar, 21); 2443 qemu_get_be32s(f, (uint32_t *)&pThis->ar_flip_flop); 2444 qemu_get_8s(f, &pThis->cr_index); 2445 qemu_get_buffer(f, pThis->cr, 256); 2446 qemu_get_8s(f, &pThis->msr); 2447 qemu_get_8s(f, &pThis->fcr); 2448 qemu_get_8s(f, &pThis->st00); 2449 qemu_get_8s(f, &pThis->st01); 2450 2451 qemu_get_8s(f, &pThis->dac_state); 2452 qemu_get_8s(f, &pThis->dac_sub_index); 2453 qemu_get_8s(f, &pThis->dac_read_index); 2454 qemu_get_8s(f, &pThis->dac_write_index); 2455 qemu_get_buffer(f, pThis->dac_cache, 3); 2456 qemu_get_buffer(f, pThis->palette, 768); 2457 2458 qemu_get_be32s(f, (uint32_t *)&pThis->bank_offset); 2458 2459 is_vbe = qemu_get_byte(f); 2459 2460 #ifdef CONFIG_BOCHS_VBE … … 2463 2464 return VERR_SSM_DATA_UNIT_FORMAT_CHANGED; 2464 2465 } 2465 qemu_get_be16s(f, & s->vbe_index);2466 qemu_get_be16s(f, &pThis->vbe_index); 2466 2467 for(i = 0; i < VBE_DISPI_INDEX_NB_SAVED; i++) 2467 qemu_get_be16s(f, & s->vbe_regs[i]);2468 qemu_get_be16s(f, &pThis->vbe_regs[i]); 2468 2469 if (version_id <= VGA_SAVEDSTATE_VERSION_INV_VHEIGHT) 2469 recalculate_data( s, false); /* <- re-calculate thes->vbe_regs[VBE_DISPI_INDEX_VIRT_HEIGHT] since it might be invalid */2470 qemu_get_be32s(f, & s->vbe_start_addr);2471 qemu_get_be32s(f, & s->vbe_line_offset);2470 recalculate_data(pThis, false); /* <- re-calculate the pThis->vbe_regs[VBE_DISPI_INDEX_VIRT_HEIGHT] since it might be invalid */ 2471 qemu_get_be32s(f, &pThis->vbe_start_addr); 2472 qemu_get_be32s(f, &pThis->vbe_line_offset); 2472 2473 if (version_id < 2) 2473 2474 qemu_get_be32s(f, &u32Dummy); 2474 s->vbe_bank_max = (s->vram_size >> 16) - 1;2475 pThis->vbe_bank_max = (pThis->vram_size >> 16) - 1; 2475 2476 #else 2476 2477 if (is_vbe) … … 2482 2483 2483 2484 /* force refresh */ 2484 s->graphic_mode = -1;2485 pThis->graphic_mode = -1; 2485 2486 return 0; 2486 2487 } … … 2534 2535 PDMBOTHCBDECL(int) vgaIOPortWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t u32, unsigned cb) 2535 2536 { 2536 VGAState *s = PDMINS_2_DATA(pDevIns, PVGASTATE); 2537 2538 int rc = PDMCritSectEnter(&s->lock, VINF_IOM_R3_IOPORT_WRITE); 2539 if (rc != VINF_SUCCESS) 2540 return rc; 2537 PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE); 2538 Assert(PDMCritSectIsOwner(pDevIns->CTX_SUFF(pCritSectRo))); 2541 2539 2542 2540 NOREF(pvUser); 2543 2541 if (cb == 1) 2544 vga_ioport_write( s, Port, u32);2542 vga_ioport_write(pThis, Port, u32); 2545 2543 else if (cb == 2) 2546 2544 { 2547 vga_ioport_write(s, Port, u32 & 0xff); 2548 vga_ioport_write(s, Port + 1, u32 >> 8); 2549 } 2550 PDMCritSectLeave(&s->lock); 2545 vga_ioport_write(pThis, Port, u32 & 0xff); 2546 vga_ioport_write(pThis, Port + 1, u32 >> 8); 2547 } 2551 2548 return VINF_SUCCESS; 2552 2549 } … … 2566 2563 PDMBOTHCBDECL(int) vgaIOPortRead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t *pu32, unsigned cb) 2567 2564 { 2568 VGAState *s = PDMINS_2_DATA(pDevIns, PVGASTATE); 2565 PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE); 2566 Assert(PDMCritSectIsOwner(pDevIns->CTX_SUFF(pCritSectRo))); 2569 2567 NOREF(pvUser); 2570 2568 2571 int rc = PDMCritSectEnter(&s->lock, VINF_IOM_R3_IOPORT_READ); 2572 if (rc != VINF_SUCCESS) 2573 return rc; 2574 2575 rc = VERR_IOM_IOPORT_UNUSED; 2569 int rc = VINF_SUCCESS; 2576 2570 if (cb == 1) 2577 { 2578 *pu32 = vga_ioport_read(s, Port); 2579 rc = VINF_SUCCESS; 2580 } 2571 *pu32 = vga_ioport_read(pThis, Port); 2581 2572 else if (cb == 2) 2582 { 2583 *pu32 = vga_ioport_read(s, Port) 2584 | (vga_ioport_read(s, Port + 1) << 8); 2585 rc = VINF_SUCCESS; 2586 } 2587 PDMCritSectLeave(&s->lock); 2573 *pu32 = vga_ioport_read(pThis, Port) 2574 | (vga_ioport_read(pThis, Port + 1) << 8); 2575 else 2576 rc = VERR_IOM_IOPORT_UNUSED; 2588 2577 return rc; 2589 2578 } … … 2603 2592 PDMBOTHCBDECL(int) vgaIOPortWriteVBEData(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t u32, unsigned cb) 2604 2593 { 2605 VGAState *s = PDMINS_2_DATA(pDevIns, PVGASTATE); 2606 2607 int rc = PDMCritSectEnter(&s->lock, VINF_IOM_R3_IOPORT_WRITE); 2608 if (rc != VINF_SUCCESS) 2609 return rc; 2594 PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE); 2595 Assert(PDMCritSectIsOwner(pDevIns->CTX_SUFF(pCritSectRo))); 2610 2596 2611 2597 NOREF(pvUser); … … 2615 2601 * This has to be done on the host in order to execute the connector callbacks. 2616 2602 */ 2617 if ( s->vbe_index == VBE_DISPI_INDEX_ENABLE2618 || s->vbe_index == VBE_DISPI_INDEX_VBOX_VIDEO)2603 if ( pThis->vbe_index == VBE_DISPI_INDEX_ENABLE 2604 || pThis->vbe_index == VBE_DISPI_INDEX_VBOX_VIDEO) 2619 2605 { 2620 2606 Log(("vgaIOPortWriteVBEData: VBE_DISPI_INDEX_ENABLE - Switching to host...\n")); 2621 PDMCritSectLeave(&s->lock);2622 2607 return VINF_IOM_R3_IOPORT_WRITE; 2623 2608 } … … 2626 2611 if (cb == 1) 2627 2612 { 2628 if (! s->fWriteVBEData)2613 if (!pThis->fWriteVBEData) 2629 2614 { 2630 if ( ( s->vbe_index == VBE_DISPI_INDEX_ENABLE)2615 if ( (pThis->vbe_index == VBE_DISPI_INDEX_ENABLE) 2631 2616 && (u32 & VBE_DISPI_ENABLED)) 2632 2617 { 2633 s->fWriteVBEData = false; 2634 rc = vbe_ioport_write_data(s, Port, u32 & 0xFF); 2635 PDMCritSectLeave(&s->lock); 2636 return rc; 2618 pThis->fWriteVBEData = false; 2619 return vbe_ioport_write_data(pThis, Port, u32 & 0xFF); 2637 2620 } 2638 else 2639 { 2640 s->cbWriteVBEData = u32 & 0xFF; 2641 s->fWriteVBEData = true; 2642 PDMCritSectLeave(&s->lock); 2643 return VINF_SUCCESS; 2644 } 2645 } 2646 else 2647 { 2648 u32 = (s->cbWriteVBEData << 8) | (u32 & 0xFF); 2649 s->fWriteVBEData = false; 2650 cb = 2; 2651 } 2621 2622 pThis->cbWriteVBEData = u32 & 0xFF; 2623 pThis->fWriteVBEData = true; 2624 return VINF_SUCCESS; 2625 } 2626 2627 u32 = (pThis->cbWriteVBEData << 8) | (u32 & 0xFF); 2628 pThis->fWriteVBEData = false; 2629 cb = 2; 2652 2630 } 2653 2631 #endif … … 2660 2638 // * has to be done on the host. 2661 2639 // */ 2662 // if ( ( s->vbe_index == VBE_DISPI_INDEX_ENABLE)2640 // if ( (pThis->vbe_index == VBE_DISPI_INDEX_ENABLE) 2663 2641 // && (u32 & VBE_DISPI_ENABLED)) 2664 2642 // { … … 2667 2645 // } 2668 2646 //#endif 2669 rc = vbe_ioport_write_data(s, Port, u32); 2670 PDMCritSectLeave(&s->lock); 2671 return rc; 2672 } 2673 else 2674 AssertMsgFailed(("vgaIOPortWriteVBEData: Port=%#x cb=%d u32=%#x\n", Port, cb, u32)); 2675 2676 PDMCritSectLeave(&s->lock); 2647 return vbe_ioport_write_data(pThis, Port, u32); 2648 } 2649 AssertMsgFailed(("vgaIOPortWriteVBEData: Port=%#x cb=%d u32=%#x\n", Port, cb, u32)); 2650 2677 2651 return VINF_SUCCESS; 2678 2652 } … … 2692 2666 PDMBOTHCBDECL(int) vgaIOPortWriteVBEIndex(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t u32, unsigned cb) 2693 2667 { 2694 NOREF(pvUser); 2695 VGAState *s = PDMINS_2_DATA(pDevIns, PVGASTATE); 2696 2697 int rc = PDMCritSectEnter(&s->lock, VINF_IOM_R3_IOPORT_WRITE); 2698 if (rc != VINF_SUCCESS) 2699 return rc; 2668 PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE); NOREF(pvUser); 2669 Assert(PDMCritSectIsOwner(pDevIns->CTX_SUFF(pCritSectRo))); 2700 2670 2701 2671 #ifdef VBE_BYTEWISE_IO 2702 2672 if (cb == 1) 2703 2673 { 2704 if (! s->fWriteVBEIndex)2674 if (!pThis->fWriteVBEIndex) 2705 2675 { 2706 s->cbWriteVBEIndex = u32 & 0x00FF; 2707 s->fWriteVBEIndex = true; 2708 PDMCritSectLeave(&s->lock); 2676 pThis->cbWriteVBEIndex = u32 & 0x00FF; 2677 pThis->fWriteVBEIndex = true; 2709 2678 return VINF_SUCCESS; 2710 2679 } 2711 else 2712 { 2713 s->fWriteVBEIndex = false; 2714 vbe_ioport_write_index(s, Port, (s->cbWriteVBEIndex << 8) | (u32 & 0x00FF)); 2715 PDMCritSectLeave(&s->lock); 2716 return VINF_SUCCESS; 2717 } 2718 } 2719 else 2680 pThis->fWriteVBEIndex = false; 2681 vbe_ioport_write_index(pThis, Port, (pThis->cbWriteVBEIndex << 8) | (u32 & 0x00FF)); 2682 return VINF_SUCCESS; 2683 } 2720 2684 #endif 2685 2721 2686 if (cb == 2) 2722 vbe_ioport_write_index( s, Port, u32);2687 vbe_ioport_write_index(pThis, Port, u32); 2723 2688 else 2724 2689 AssertMsgFailed(("vgaIOPortWriteVBEIndex: Port=%#x cb=%d u32=%#x\n", Port, cb, u32)); 2725 PDMCritSectLeave(&s->lock);2726 2690 return VINF_SUCCESS; 2727 2691 } … … 2741 2705 PDMBOTHCBDECL(int) vgaIOPortReadVBEData(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t *pu32, unsigned cb) 2742 2706 { 2743 NOREF(pvUser); 2744 VGAState *s = PDMINS_2_DATA(pDevIns, PVGASTATE); 2745 2746 int rc = PDMCritSectEnter(&s->lock, VINF_IOM_R3_IOPORT_READ); 2747 if (rc != VINF_SUCCESS) 2748 return rc; 2707 PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE); NOREF(pvUser); 2708 Assert(PDMCritSectIsOwner(pDevIns->CTX_SUFF(pCritSectRo))); 2709 2749 2710 2750 2711 #ifdef VBE_BYTEWISE_IO 2751 2712 if (cb == 1) 2752 2713 { 2753 if (! s->fReadVBEData)2714 if (!pThis->fReadVBEData) 2754 2715 { 2755 *pu32 = (vbe_ioport_read_data(s, Port) >> 8) & 0xFF; 2756 s->fReadVBEData = true; 2757 PDMCritSectLeave(&s->lock); 2716 *pu32 = (vbe_ioport_read_data(pThis, Port) >> 8) & 0xFF; 2717 pThis->fReadVBEData = true; 2758 2718 return VINF_SUCCESS; 2759 2719 } 2760 else 2761 { 2762 *pu32 = vbe_ioport_read_data(s, Port) & 0xFF; 2763 s->fReadVBEData = false; 2764 PDMCritSectLeave(&s->lock); 2765 return VINF_SUCCESS; 2766 } 2767 } 2768 else 2720 *pu32 = vbe_ioport_read_data(pThis, Port) & 0xFF; 2721 pThis->fReadVBEData = false; 2722 return VINF_SUCCESS; 2723 } 2769 2724 #endif 2770 2725 if (cb == 2) 2771 2726 { 2772 *pu32 = vbe_ioport_read_data(s, Port); 2773 PDMCritSectLeave(&s->lock); 2727 *pu32 = vbe_ioport_read_data(pThis, Port); 2774 2728 return VINF_SUCCESS; 2775 2729 } 2776 elseif (cb == 4)2730 if (cb == 4) 2777 2731 { 2778 2732 /* Quick hack for getting the vram size. */ 2779 *pu32 = s->vram_size; 2780 PDMCritSectLeave(&s->lock); 2733 *pu32 = pThis->vram_size; 2781 2734 return VINF_SUCCESS; 2782 2735 } 2783 2736 AssertMsgFailed(("vgaIOPortReadVBEData: Port=%#x cb=%d\n", Port, cb)); 2784 PDMCritSectLeave(&s->lock);2785 2737 return VERR_IOM_IOPORT_UNUSED; 2786 2738 } … … 2801 2753 { 2802 2754 NOREF(pvUser); 2803 VGAState *s = PDMINS_2_DATA(pDevIns, PVGASTATE); 2804 2805 int rc = PDMCritSectEnter(&s->lock, VINF_IOM_R3_IOPORT_READ); 2806 if (rc != VINF_SUCCESS) 2807 return rc; 2755 VGAState *pThis = PDMINS_2_DATA(pDevIns, PVGASTATE); 2756 Assert(PDMCritSectIsOwner(pDevIns->CTX_SUFF(pCritSectRo))); 2808 2757 2809 2758 #ifdef VBE_BYTEWISE_IO 2810 2759 if (cb == 1) 2811 2760 { 2812 if (! s->fReadVBEIndex)2761 if (!pThis->fReadVBEIndex) 2813 2762 { 2814 *pu32 = (vbe_ioport_read_index(s, Port) >> 8) & 0xFF; 2815 s->fReadVBEIndex = true; 2816 PDMCritSectLeave(&s->lock); 2763 *pu32 = (vbe_ioport_read_index(pThis, Port) >> 8) & 0xFF; 2764 pThis->fReadVBEIndex = true; 2817 2765 return VINF_SUCCESS; 2818 2766 } 2819 else 2820 { 2821 *pu32 = vbe_ioport_read_index(s, Port) & 0xFF; 2822 s->fReadVBEIndex = false; 2823 PDMCritSectLeave(&s->lock); 2824 return VINF_SUCCESS; 2825 } 2826 } 2827 else 2767 *pu32 = vbe_ioport_read_index(pThis, Port) & 0xFF; 2768 pThis->fReadVBEIndex = false; 2769 return VINF_SUCCESS; 2770 } 2828 2771 #endif 2829 2772 if (cb == 2) 2830 2773 { 2831 *pu32 = vbe_ioport_read_index(s, Port); 2832 PDMCritSectLeave(&s->lock); 2774 *pu32 = vbe_ioport_read_index(pThis, Port); 2833 2775 return VINF_SUCCESS; 2834 2776 } 2835 PDMCritSectLeave(&s->lock);2836 2777 AssertMsgFailed(("vgaIOPortReadVBEIndex: Port=%#x cb=%d\n", Port, cb)); 2837 2778 return VERR_IOM_IOPORT_UNUSED; … … 2853 2794 static DECLCALLBACK(int) vgaR3IOPortHGSMIWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t u32, unsigned cb) 2854 2795 { 2796 VGAState *pThis = PDMINS_2_DATA(pDevIns, PVGASTATE); 2797 Assert(PDMCritSectIsOwner(pDevIns->CTX_SUFF(pCritSectRo))); 2855 2798 LogFlowFunc(("Port 0x%x, u32 0x%x, cb %d\n", Port, u32, cb)); 2856 VGAState *s = PDMINS_2_DATA(pDevIns, PVGASTATE); 2857 2858 int rc = PDMCritSectEnter(&s->lock, VERR_SEM_BUSY); 2859 if (rc != VINF_SUCCESS) 2860 return rc; 2799 2861 2800 2862 2801 NOREF(pvUser); … … 2869 2808 { 2870 2809 #if defined(VBOX_WITH_VIDEOHWACCEL) || defined(VBOX_WITH_VDMA) || defined(VBOX_WITH_WDDM) 2871 if (u32 == HGSMIOFFSET_VOID)2810 if (u32 == HGSMIOFFSET_VOID) 2872 2811 { 2873 2812 PDMDevHlpPCISetIrq(pDevIns, 0, PDM_IRQ_LEVEL_LOW); 2874 HGSMIClearHostGuestFlags( s->pHGSMI, HGSMIHOSTFLAGS_IRQ2813 HGSMIClearHostGuestFlags(pThis->pHGSMI, HGSMIHOSTFLAGS_IRQ 2875 2814 #ifdef VBOX_VDMA_WITH_WATCHDOG 2876 2815 | HGSMIHOSTFLAGS_WATCHDOG … … 2882 2821 #endif 2883 2822 { 2884 HGSMIHostWrite( s->pHGSMI, u32);2823 HGSMIHostWrite(pThis->pHGSMI, u32); 2885 2824 } 2886 } break; 2825 break; 2826 } 2887 2827 2888 2828 case VGA_PORT_HGSMI_GUEST: /* Guest */ 2889 { 2890 HGSMIGuestWrite(s->pHGSMI, u32); 2891 } break; 2829 HGSMIGuestWrite(pThis->pHGSMI, u32); 2830 break; 2892 2831 2893 2832 default: 2894 {2895 2833 #ifdef DEBUG_sunlover 2896 2834 AssertMsgFailed(("vgaR3IOPortHGSMIWrite: Port=%#x cb=%d u32=%#x\n", Port, cb, u32)); 2897 2835 #endif 2898 }break;2836 break; 2899 2837 } 2900 2838 } … … 2906 2844 } 2907 2845 2908 PDMCritSectLeave(&s->lock);2909 2846 return VINF_SUCCESS; 2910 2847 } … … 2923 2860 static DECLCALLBACK(int) vgaR3IOPortHGSMIRead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t *pu32, unsigned cb) 2924 2861 { 2862 VGAState *pThis = PDMINS_2_DATA(pDevIns, PVGASTATE); 2863 Assert(PDMCritSectIsOwner(pDevIns->CTX_SUFF(pCritSectRo))); 2925 2864 LogFlowFunc(("Port 0x%x, cb %d\n", Port, cb)); 2926 VGAState *s = PDMINS_2_DATA(pDevIns, PVGASTATE);2927 2928 int rc = PDMCritSectEnter(&s->lock, VERR_SEM_BUSY);2929 if (rc != VINF_SUCCESS)2930 return rc;2931 2865 2932 2866 NOREF(pvUser); 2933 2867 2868 int rc = VINF_SUCCESS; 2934 2869 if (cb == 4) 2935 2870 { … … 2937 2872 { 2938 2873 case VGA_PORT_HGSMI_HOST: /* Host */ 2939 { 2940 *pu32 = HGSMIHostRead(s->pHGSMI); 2941 } break; 2874 *pu32 = HGSMIHostRead(pThis->pHGSMI); 2875 break; 2942 2876 case VGA_PORT_HGSMI_GUEST: /* Guest */ 2943 { 2944 *pu32 = HGSMIGuestRead(s->pHGSMI); 2945 } break; 2877 *pu32 = HGSMIGuestRead(pThis->pHGSMI); 2878 break; 2946 2879 default: 2947 {2948 2880 #ifdef DEBUG_sunlover 2949 2881 AssertMsgFailed(("vgaR3IOPortHGSMIRead: Port=%#x cb=%d\n", Port, cb)); 2950 2882 #endif 2951 2883 rc = VERR_IOM_IOPORT_UNUSED; 2952 }break;2884 break; 2953 2885 } 2954 2886 } … … 2961 2893 } 2962 2894 2963 PDMCritSectLeave(&s->lock);2964 2895 return rc; 2965 2896 } … … 2976 2907 * Macro for apply logical operation and bit mask. 2977 2908 */ 2978 #define APPLY_LOGICAL_AND_MASK( s, val, bit_mask) \2909 #define APPLY_LOGICAL_AND_MASK(pThis, val, bit_mask) \ 2979 2910 /* apply logical operation */ \ 2980 switch( s->gr[3] >> 3) \2911 switch(pThis->gr[3] >> 3) \ 2981 2912 { \ 2982 2913 case 0: \ … … 2986 2917 case 1: \ 2987 2918 /* and */ \ 2988 val &= s->latch; \2919 val &= pThis->latch; \ 2989 2920 break; \ 2990 2921 case 2: \ 2991 2922 /* or */ \ 2992 val |= s->latch; \2923 val |= pThis->latch; \ 2993 2924 break; \ 2994 2925 case 3: \ 2995 2926 /* xor */ \ 2996 val ^= s->latch; \2927 val ^= pThis->latch; \ 2997 2928 break; \ 2998 2929 } \ 2999 2930 /* apply bit mask */ \ 3000 val = (val & bit_mask) | ( s->latch & ~bit_mask)2931 val = (val & bit_mask) | (pThis->latch & ~bit_mask) 3001 2932 3002 2933 /** … … 3195 3126 { 3196 3127 PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE); 3197 3198 int rc = PDMCritSectEnter(&pThis->lock, VINF_IOM_R3_MMIO_WRITE); 3199 if (rc != VINF_SUCCESS) 3200 return rc; 3201 3202 rc = vgaInternalMMIOFill(pThis, pvUser, GCPhysAddr, u32Item, cbItem, cItems); 3203 PDMCritSectLeave(&pThis->lock); 3204 return rc; 3128 Assert(PDMCritSectIsOwner(pDevIns->CTX_SUFF(pCritSectRo))); 3129 3130 return vgaInternalMMIOFill(pThis, pvUser, GCPhysAddr, u32Item, cbItem, cItems); 3205 3131 } 3206 3132 #undef APPLY_LOGICAL_AND_MASK … … 3221 3147 PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE); 3222 3148 STAM_PROFILE_START(&pThis->CTX_MID_Z(Stat,MemoryRead), a); 3149 Assert(PDMCritSectIsOwner(pDevIns->CTX_SUFF(pCritSectRo))); 3223 3150 NOREF(pvUser); 3224 3151 3225 int rc = PDMCritSectEnter(&pThis->lock, VINF_IOM_R3_MMIO_READ); 3226 if (rc != VINF_SUCCESS) 3227 return rc; 3228 3152 int rc = VINF_SUCCESS; 3229 3153 switch (cb) 3230 3154 { 3231 3155 case 1: 3232 *(uint8_t *)pv = vga_mem_readb(pThis, GCPhysAddr, &rc); break; 3156 *(uint8_t *)pv = vga_mem_readb(pThis, GCPhysAddr, &rc); 3157 break; 3233 3158 case 2: 3234 3159 *(uint16_t *)pv = vga_mem_readb(pThis, GCPhysAddr, &rc) … … 3264 3189 } 3265 3190 } 3191 3266 3192 STAM_PROFILE_STOP(&pThis->CTX_MID_Z(Stat,MemoryRead), a); 3267 PDMCritSectLeave(&pThis->lock);3268 3193 return rc; 3269 3194 } … … 3285 3210 NOREF(pvUser); 3286 3211 STAM_PROFILE_START(&pThis->CTX_MID_Z(Stat,MemoryWrite), a); 3287 3288 int rc = PDMCritSectEnter(&pThis->lock, VINF_IOM_R3_MMIO_WRITE); 3289 if (rc != VINF_SUCCESS) 3290 return rc; 3291 3212 Assert(PDMCritSectIsOwner(pDevIns->CTX_SUFF(pCritSectRo))); 3213 3214 int rc; 3292 3215 switch (cb) 3293 3216 { … … 3339 3262 #endif 3340 3263 default: 3264 rc = VINF_SUCCESS; 3341 3265 while (cb-- > 0 && rc == VINF_SUCCESS) 3342 3266 rc = vga_mem_writeb(pThis, GCPhysAddr++, *pu8++); … … 3345 3269 } 3346 3270 STAM_PROFILE_STOP(&pThis->CTX_MID_Z(Stat,MemoryWrite), a); 3347 PDMCritSectLeave(&pThis->lock);3348 3271 return rc; 3349 3272 } … … 3360 3283 static int vgaLFBAccess(PVM pVM, PVGASTATE pThis, RTGCPHYS GCPhys, RTGCPTR GCPtr) 3361 3284 { 3362 int rc = PDMCritSectEnter(&pThis-> lock, VINF_EM_RAW_EMULATE_INSTR);3285 int rc = PDMCritSectEnter(&pThis->CritSect, VINF_EM_RAW_EMULATE_INSTR); 3363 3286 if (rc != VINF_SUCCESS) 3364 3287 return rc; … … 3381 3304 rc = PGMShwMakePageWritable(PDMDevHlpGetVMCPU(pThis->CTX_SUFF(pDevIns)), GCPtr, 3382 3305 PGM_MK_PG_IS_MMIO2 | PGM_MK_PG_IS_WRITE_FAULT); 3383 PDMCritSectLeave(&pThis-> lock);3306 PDMCritSectLeave(&pThis->CritSect); 3384 3307 AssertMsgReturn( rc == VINF_SUCCESS 3385 3308 /* In the SMP case the page table might be removed while we wait for the PGM lock in the trap handler. */ … … 3389 3312 rc); 3390 3313 #else /* IN_RING3 : We don't have any virtual page address of the access here. */ 3391 PDMCritSectLeave(&pThis-> lock);3314 PDMCritSectLeave(&pThis->CritSect); 3392 3315 Assert(GCPtr == 0); 3393 3316 #endif … … 3395 3318 } 3396 3319 3397 PDMCritSectLeave(&pThis-> lock);3320 PDMCritSectLeave(&pThis->CritSect); 3398 3321 AssertMsgFailed(("PGMHandlerPhysicalPageTempOff -> rc=%d\n", rc)); 3399 3322 return rc; … … 3518 3441 PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE); 3519 3442 NOREF(pvUser); 3520 3521 int rc = PDMCritSectEnter(&pThis->lock, VINF_IOM_R3_IOPORT_WRITE); 3522 if (rc != VINF_SUCCESS) 3523 return rc; 3443 Assert(PDMCritSectIsOwner(pDevIns->CTX_SUFF(pCritSectRo))); 3524 3444 3525 3445 /* … … 3548 3468 lastWasNotNewline = 1; 3549 3469 #endif 3550 PDMCritSectLeave(&pThis->lock);3551 3470 return VINF_SUCCESS; 3552 3471 } 3553 3472 3554 PDMCritSectLeave(&pThis->lock);3555 3473 /* not in use. */ 3556 3474 return VERR_IOM_IOPORT_UNUSED; … … 3577 3495 { 3578 3496 PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE); 3579 NOREF(pvUser); 3580 NOREF(Port); 3581 3582 int rc = PDMCritSectEnter(&pThis->lock, VINF_IOM_R3_IOPORT_WRITE); 3583 if (rc != VINF_SUCCESS) 3584 return rc; 3497 Assert(PDMCritSectIsOwner(pDevIns->CTX_SUFF(pCritSectRo))); 3498 NOREF(pvUser); NOREF(Port); 3585 3499 3586 3500 if (cb == 2) … … 3591 3505 else 3592 3506 Log(("vbeIOPortWriteVBEExtra: Ignoring invalid cb=%d writes to the VBE Extra port!!!\n", cb)); 3593 PDMCritSectLeave(&pThis->lock);3594 3507 3595 3508 return VINF_SUCCESS; … … 3611 3524 { 3612 3525 PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE); 3613 NOREF(pvUser); 3614 NOREF(Port); 3615 3616 int rc = PDMCritSectEnter(&pThis->lock, VINF_IOM_R3_IOPORT_READ); 3617 if (rc != VINF_SUCCESS) 3618 return rc; 3619 3526 NOREF(pvUser); NOREF(Port); 3527 Assert(PDMCritSectIsOwner(pDevIns->CTX_SUFF(pCritSectRo))); 3528 3529 int rc = VINF_SUCCESS; 3620 3530 if (pThis->u16VBEExtraAddress == 0xffff) 3621 3531 { 3622 3532 Log(("vbeIOPortReadVBEExtra: Requested number of 64k video banks\n")); 3623 3533 *pu32 = pThis->vram_size / _64K; 3624 rc = VINF_SUCCESS; 3625 } 3626 else 3627 if ( pThis->u16VBEExtraAddress >= pThis->cbVBEExtraData 3628 || pThis->u16VBEExtraAddress + cb > pThis->cbVBEExtraData) 3534 } 3535 else if ( pThis->u16VBEExtraAddress >= pThis->cbVBEExtraData 3536 || pThis->u16VBEExtraAddress + cb > pThis->cbVBEExtraData) 3629 3537 { 3630 3538 *pu32 = 0; 3631 3539 Log(("vbeIOPortReadVBEExtra: Requested address is out of VBE data!!! Address=%#x(%d) cbVBEExtraData=%#x(%d)\n", 3632 3540 pThis->u16VBEExtraAddress, pThis->u16VBEExtraAddress, pThis->cbVBEExtraData, pThis->cbVBEExtraData)); 3633 rc = VINF_SUCCESS; 3634 } 3635 else 3636 if (cb == 1) 3541 } 3542 else if (cb == 1) 3637 3543 { 3638 3544 *pu32 = pThis->pu8VBEExtraData[pThis->u16VBEExtraAddress] & 0xFF; 3639 3545 3640 3546 Log(("vbeIOPortReadVBEExtra: cb=%#x %.*Rhxs\n", cb, cb, pu32)); 3641 rc = VINF_SUCCESS; 3642 } 3643 else 3644 if (cb == 2) 3547 } 3548 else if (cb == 2) 3645 3549 { 3646 3550 *pu32 = pThis->pu8VBEExtraData[pThis->u16VBEExtraAddress] … … 3648 3552 3649 3553 Log(("vbeIOPortReadVBEExtra: cb=%#x %.*Rhxs\n", cb, cb, pu32)); 3650 rc = VINF_SUCCESS;3651 3554 } 3652 3555 else … … 3656 3559 } 3657 3560 3658 PDMCritSectLeave(&pThis->lock);3659 3561 return rc; 3660 3562 } … … 4089 3991 static DECLCALLBACK(void) vgaInfoState(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs) 4090 3992 { 4091 PVGASTATE s = PDMINS_2_DATA(pDevIns, PVGASTATE);3993 PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE); 4092 3994 int is_graph, double_scan; 4093 3995 int w, h, char_height, char_dots; 4094 3996 int val, vfreq_hz, hfreq_hz; 4095 vga_retrace_s *r = & s->retrace_state;3997 vga_retrace_s *r = &pThis->retrace_state; 4096 3998 const char *clocks[] = { "25.175 MHz", "28.322 MHz", "External", "Reserved?!" }; 4097 3999 NOREF(pszArgs); 4098 4000 4099 is_graph = s->gr[6] & 1;4100 char_dots = ( s->sr[0x01] & 1) ? 8 : 9;4101 double_scan = s->cr[9] >> 7;4102 pHlp->pfnPrintf(pHlp, "pixel clock: %s\n", clocks[( s->msr >> 2) & 3]);4001 is_graph = pThis->gr[6] & 1; 4002 char_dots = (pThis->sr[0x01] & 1) ? 8 : 9; 4003 double_scan = pThis->cr[9] >> 7; 4004 pHlp->pfnPrintf(pHlp, "pixel clock: %s\n", clocks[(pThis->msr >> 2) & 3]); 4103 4005 pHlp->pfnPrintf(pHlp, "double scanning %s\n", double_scan ? "on" : "off"); 4104 pHlp->pfnPrintf(pHlp, "double clocking %s\n", s->sr[1] & 0x08 ? "on" : "off");4105 val = s->cr[0] + 5;4006 pHlp->pfnPrintf(pHlp, "double clocking %s\n", pThis->sr[1] & 0x08 ? "on" : "off"); 4007 val = pThis->cr[0] + 5; 4106 4008 pHlp->pfnPrintf(pHlp, "htotal: %d px (%d cclk)\n", val * char_dots, val); 4107 val = s->cr[6] + ((s->cr[7] & 1) << 8) + ((s->cr[7] & 0x20) << 4) + 2;4009 val = pThis->cr[6] + ((pThis->cr[7] & 1) << 8) + ((pThis->cr[7] & 0x20) << 4) + 2; 4108 4010 pHlp->pfnPrintf(pHlp, "vtotal: %d px\n", val); 4109 val = s->cr[1] + 1;4011 val = pThis->cr[1] + 1; 4110 4012 w = val * char_dots; 4111 4013 pHlp->pfnPrintf(pHlp, "hdisp : %d px (%d cclk)\n", w, val); 4112 val = s->cr[0x12] + ((s->cr[7] & 2) << 7) + ((s->cr[7] & 0x40) << 4) + 1;4014 val = pThis->cr[0x12] + ((pThis->cr[7] & 2) << 7) + ((pThis->cr[7] & 0x40) << 4) + 1; 4113 4015 h = val; 4114 4016 pHlp->pfnPrintf(pHlp, "vdisp : %d px\n", val); 4115 val = (( s->cr[9] & 0x40) << 3) + ((s->cr[7] & 0x10) << 4) +s->cr[0x18];4017 val = ((pThis->cr[9] & 0x40) << 3) + ((pThis->cr[7] & 0x10) << 4) + pThis->cr[0x18]; 4116 4018 pHlp->pfnPrintf(pHlp, "split : %d ln\n", val); 4117 val = ( s->cr[0xc] << 8) +s->cr[0xd];4019 val = (pThis->cr[0xc] << 8) + pThis->cr[0xd]; 4118 4020 pHlp->pfnPrintf(pHlp, "start : %#x\n", val); 4119 4021 if (!is_graph) 4120 4022 { 4121 val = ( s->cr[9] & 0x1f) + 1;4023 val = (pThis->cr[9] & 0x1f) + 1; 4122 4024 char_height = val; 4123 4025 pHlp->pfnPrintf(pHlp, "char height %d\n", val); 4124 4026 pHlp->pfnPrintf(pHlp, "text mode %dx%d\n", w / char_dots, h / (char_height << double_scan)); 4125 4027 } 4126 if ( s->fRealRetrace)4028 if (pThis->fRealRetrace) 4127 4029 { 4128 4030 val = r->hb_start; … … 4139 4041 vfreq_hz, hfreq_hz / 1000, hfreq_hz % 1000); 4140 4042 } 4141 pHlp->pfnPrintf(pHlp, "display refresh interval: %u ms\n", s->cMilliesRefreshInterval);4043 pHlp->pfnPrintf(pHlp, "display refresh interval: %u ms\n", pThis->cMilliesRefreshInterval); 4142 4044 } 4143 4045 … … 4323 4225 static DECLCALLBACK(void) vgaInfoSR(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs) 4324 4226 { 4325 PVGASTATE s = PDMINS_2_DATA(pDevIns, PVGASTATE);4227 PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE); 4326 4228 unsigned i; 4327 4229 NOREF(pszArgs); 4328 4230 4329 pHlp->pfnPrintf(pHlp, "VGA Sequencer (3C5): SR index 3C4:%02X\n", s->sr_index);4330 Assert(sizeof( s->sr) >= 8);4231 pHlp->pfnPrintf(pHlp, "VGA Sequencer (3C5): SR index 3C4:%02X\n", pThis->sr_index); 4232 Assert(sizeof(pThis->sr) >= 8); 4331 4233 for (i = 0; i < 5; ++i) 4332 pHlp->pfnPrintf(pHlp, " SR%02X:%02X", i, s->sr[i]);4234 pHlp->pfnPrintf(pHlp, " SR%02X:%02X", i, pThis->sr[i]); 4333 4235 pHlp->pfnPrintf(pHlp, "\n"); 4334 4236 } … … 4344 4246 static DECLCALLBACK(void) vgaInfoCR(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs) 4345 4247 { 4346 PVGASTATE s = PDMINS_2_DATA(pDevIns, PVGASTATE);4248 PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE); 4347 4249 unsigned i; 4348 4250 NOREF(pszArgs); 4349 4251 4350 pHlp->pfnPrintf(pHlp, "VGA CRTC (3D5): CRTC index 3D4:%02X\n", s->cr_index);4351 Assert(sizeof( s->cr) >= 24);4252 pHlp->pfnPrintf(pHlp, "VGA CRTC (3D5): CRTC index 3D4:%02X\n", pThis->cr_index); 4253 Assert(sizeof(pThis->cr) >= 24); 4352 4254 for (i = 0; i < 10; ++i) 4353 4255 { 4354 pHlp->pfnPrintf(pHlp, " CR%02X:%02X", i, s->cr[i]);4256 pHlp->pfnPrintf(pHlp, " CR%02X:%02X", i, pThis->cr[i]); 4355 4257 } 4356 4258 pHlp->pfnPrintf(pHlp, "\n"); 4357 4259 for (i = 10; i < 20; ++i) 4358 4260 { 4359 pHlp->pfnPrintf(pHlp, " CR%02X:%02X", i, s->cr[i]);4261 pHlp->pfnPrintf(pHlp, " CR%02X:%02X", i, pThis->cr[i]); 4360 4262 } 4361 4263 pHlp->pfnPrintf(pHlp, "\n"); 4362 4264 for (i = 20; i < 25; ++i) 4363 4265 { 4364 pHlp->pfnPrintf(pHlp, " CR%02X:%02X", i, s->cr[i]);4266 pHlp->pfnPrintf(pHlp, " CR%02X:%02X", i, pThis->cr[i]); 4365 4267 } 4366 4268 pHlp->pfnPrintf(pHlp, "\n"); … … 4377 4279 static DECLCALLBACK(void) vgaInfoGR(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs) 4378 4280 { 4379 PVGASTATE s = PDMINS_2_DATA(pDevIns, PVGASTATE);4281 PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE); 4380 4282 unsigned i; 4381 4283 NOREF(pszArgs); 4382 4284 4383 pHlp->pfnPrintf(pHlp, "VGA Graphics Controller (3CF): GR index 3CE:%02X\n", s->gr_index);4384 Assert(sizeof( s->gr) >= 9);4285 pHlp->pfnPrintf(pHlp, "VGA Graphics Controller (3CF): GR index 3CE:%02X\n", pThis->gr_index); 4286 Assert(sizeof(pThis->gr) >= 9); 4385 4287 for (i = 0; i < 9; ++i) 4386 4288 { 4387 pHlp->pfnPrintf(pHlp, " GR%02X:%02X", i, s->gr[i]);4289 pHlp->pfnPrintf(pHlp, " GR%02X:%02X", i, pThis->gr[i]); 4388 4290 } 4389 4291 pHlp->pfnPrintf(pHlp, "\n"); … … 4400 4302 static DECLCALLBACK(void) vgaInfoAR(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs) 4401 4303 { 4402 PVGASTATE s = PDMINS_2_DATA(pDevIns, PVGASTATE);4304 PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE); 4403 4305 unsigned i; 4404 4306 NOREF(pszArgs); 4405 4307 4406 4308 pHlp->pfnPrintf(pHlp, "VGA Attribute Controller (3C0): index reg %02X, flip-flop: %d (%s)\n", 4407 s->ar_index, s->ar_flip_flop,s->ar_flip_flop ? "data" : "index" );4408 Assert(sizeof( s->ar) >= 0x14);4309 pThis->ar_index, pThis->ar_flip_flop, pThis->ar_flip_flop ? "data" : "index" ); 4310 Assert(sizeof(pThis->ar) >= 0x14); 4409 4311 pHlp->pfnPrintf(pHlp, " Palette:"); 4410 4312 for (i = 0; i < 0x10; ++i) 4411 4313 { 4412 pHlp->pfnPrintf(pHlp, " %02X", s->ar[i]);4314 pHlp->pfnPrintf(pHlp, " %02X", pThis->ar[i]); 4413 4315 } 4414 4316 pHlp->pfnPrintf(pHlp, "\n"); 4415 4317 for (i = 0x10; i <= 0x14; ++i) 4416 4318 { 4417 pHlp->pfnPrintf(pHlp, " AR%02X:%02X", i, s->ar[i]);4319 pHlp->pfnPrintf(pHlp, " AR%02X:%02X", i, pThis->ar[i]); 4418 4320 } 4419 4321 pHlp->pfnPrintf(pHlp, "\n"); … … 4429 4331 static DECLCALLBACK(void) vgaInfoDAC(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs) 4430 4332 { 4431 PVGASTATE s = PDMINS_2_DATA(pDevIns, PVGASTATE);4333 PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE); 4432 4334 unsigned i; 4433 4335 NOREF(pszArgs); … … 4437 4339 { 4438 4340 pHlp->pfnPrintf(pHlp, " %02X: %02X %02X %02X\n", 4439 i, s->palette[i*3+0], s->palette[i*3+1],s->palette[i*3+2]);4341 i, pThis->palette[i*3+0], pThis->palette[i*3+1], pThis->palette[i*3+2]); 4440 4342 } 4441 4343 } … … 4451 4353 static DECLCALLBACK(void) vgaInfoVBE(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs) 4452 4354 { 4453 PVGASTATE s = PDMINS_2_DATA(pDevIns, PVGASTATE);4355 PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE); 4454 4356 NOREF(pszArgs); 4455 4357 4456 pHlp->pfnPrintf(pHlp, "LFB at %RGp\n", s->GCPhysVRAM);4457 4458 if (!( s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED))4358 pHlp->pfnPrintf(pHlp, "LFB at %RGp\n", pThis->GCPhysVRAM); 4359 4360 if (!(pThis->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED)) 4459 4361 { 4460 4362 pHlp->pfnPrintf(pHlp, "VBE disabled\n"); … … 4462 4364 } 4463 4365 4464 pHlp->pfnPrintf(pHlp, "VBE state (chip ID 0x%04x):\n", s->vbe_regs[VBE_DISPI_INDEX_ID]);4366 pHlp->pfnPrintf(pHlp, "VBE state (chip ID 0x%04x):\n", pThis->vbe_regs[VBE_DISPI_INDEX_ID]); 4465 4367 pHlp->pfnPrintf(pHlp, " Display resolution: %d x %d @ %dbpp\n", 4466 s->vbe_regs[VBE_DISPI_INDEX_XRES],s->vbe_regs[VBE_DISPI_INDEX_YRES],4467 s->vbe_regs[VBE_DISPI_INDEX_BPP]);4368 pThis->vbe_regs[VBE_DISPI_INDEX_XRES], pThis->vbe_regs[VBE_DISPI_INDEX_YRES], 4369 pThis->vbe_regs[VBE_DISPI_INDEX_BPP]); 4468 4370 pHlp->pfnPrintf(pHlp, " Virtual resolution: %d x %d\n", 4469 s->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH],s->vbe_regs[VBE_DISPI_INDEX_VIRT_HEIGHT]);4371 pThis->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH], pThis->vbe_regs[VBE_DISPI_INDEX_VIRT_HEIGHT]); 4470 4372 pHlp->pfnPrintf(pHlp, " Display start addr: %d, %d\n", 4471 s->vbe_regs[VBE_DISPI_INDEX_X_OFFSET],s->vbe_regs[VBE_DISPI_INDEX_Y_OFFSET]);4472 pHlp->pfnPrintf(pHlp, " Linear scanline pitch: 0x%04x\n", s->vbe_line_offset);4473 pHlp->pfnPrintf(pHlp, " Linear display start : 0x%04x\n", s->vbe_start_addr);4474 pHlp->pfnPrintf(pHlp, " Selected bank: 0x%04x\n", s->vbe_regs[VBE_DISPI_INDEX_BANK]);4373 pThis->vbe_regs[VBE_DISPI_INDEX_X_OFFSET], pThis->vbe_regs[VBE_DISPI_INDEX_Y_OFFSET]); 4374 pHlp->pfnPrintf(pHlp, " Linear scanline pitch: 0x%04x\n", pThis->vbe_line_offset); 4375 pHlp->pfnPrintf(pHlp, " Linear display start : 0x%04x\n", pThis->vbe_start_addr); 4376 pHlp->pfnPrintf(pHlp, " Selected bank: 0x%04x\n", pThis->vbe_regs[VBE_DISPI_INDEX_BANK]); 4475 4377 } 4476 4378 … … 4486 4388 static DECLCALLBACK(void) vgaInfoPlanar(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs) 4487 4389 { 4488 PVGASTATE s = PDMINS_2_DATA(pDevIns, PVGASTATE);4390 PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE); 4489 4391 int val1, val2; 4490 4392 NOREF(pszArgs); 4491 4393 4492 val1 = ( s->gr[5] >> 3) & 1;4493 val2 = s->gr[5] & 3;4394 val1 = (pThis->gr[5] >> 3) & 1; 4395 val2 = pThis->gr[5] & 3; 4494 4396 pHlp->pfnPrintf(pHlp, "read mode : %d write mode: %d\n", val1, val2); 4495 val1 = s->gr[0];4496 val2 = s->gr[1];4397 val1 = pThis->gr[0]; 4398 val2 = pThis->gr[1]; 4497 4399 pHlp->pfnPrintf(pHlp, "set/reset data: %02X S/R enable: %02X\n", val1, val2); 4498 val1 = s->gr[2];4499 val2 = s->gr[4] & 3;4400 val1 = pThis->gr[2]; 4401 val2 = pThis->gr[4] & 3; 4500 4402 pHlp->pfnPrintf(pHlp, "color compare : %02X read map : %d\n", val1, val2); 4501 val1 = s->gr[3] & 7;4502 val2 = ( s->gr[3] >> 3) & 3;4403 val1 = pThis->gr[3] & 7; 4404 val2 = (pThis->gr[3] >> 3) & 3; 4503 4405 pHlp->pfnPrintf(pHlp, "rotate : %d function : %d\n", val1, val2); 4504 val1 = s->gr[7];4505 val2 = s->gr[8];4406 val1 = pThis->gr[7]; 4407 val2 = pThis->gr[8]; 4506 4408 pHlp->pfnPrintf(pHlp, "don't care : %02X bit mask : %02X\n", val1, val2); 4507 val1 = s->sr[2];4508 val2 = s->sr[4] & 8;4409 val1 = pThis->sr[2]; 4410 val2 = pThis->sr[4] & 8; 4509 4411 pHlp->pfnPrintf(pHlp, "seq plane mask: %02X chain-4 : %s\n", val1, val2 ? "on" : "off"); 4510 4412 } … … 4601 4503 PPDMDEVINS pDevIns = pThis->CTX_SUFF(pDevIns); 4602 4504 4603 int rc = PDMCritSectEnter(&pThis-> lock, VERR_SEM_BUSY);4505 int rc = PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY); 4604 4506 AssertRC(rc); 4605 4507 … … 4609 4511 if (VBVAUpdateDisplay (pThis) == VINF_SUCCESS) 4610 4512 { 4611 PDMCritSectLeave(&pThis-> lock);4513 PDMCritSectLeave(&pThis->CritSect); 4612 4514 return VINF_SUCCESS; 4613 4515 } … … 4627 4529 4628 4530 rc = vga_update_display(pThis, false, false, true); 4629 if (rc != VINF_SUCCESS) 4630 { 4631 PDMCritSectLeave(&pThis->lock); 4632 return rc; 4633 } 4634 PDMCritSectLeave(&pThis->lock); 4635 return VINF_SUCCESS; 4531 PDMCritSectLeave(&pThis->CritSect); 4532 return rc; 4636 4533 } 4637 4534 4638 4535 4639 4536 /** 4640 * Internal vgaPortUpdateDisplayAll worker called under pThis-> lock.4537 * Internal vgaPortUpdateDisplayAll worker called under pThis->CritSect. 4641 4538 */ 4642 4539 static int updateDisplayAll(PVGASTATE pThis) … … 4676 4573 #endif /* DEBUG_sunlover */ 4677 4574 4678 int rc = PDMCritSectEnter(&pThis-> lock, VERR_SEM_BUSY);4575 int rc = PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY); 4679 4576 AssertRC(rc); 4680 4577 4681 4578 rc = updateDisplayAll(pThis); 4682 4579 4683 PDMCritSectLeave(&pThis-> lock);4580 PDMCritSectLeave(&pThis->CritSect); 4684 4581 return rc; 4685 4582 } … … 4740 4637 return VERR_INVALID_PARAMETER; 4741 4638 4742 int rc = PDMCritSectEnter(&pThis-> lock, VERR_SEM_BUSY);4639 int rc = PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY); 4743 4640 AssertRCReturn(rc, rc); 4744 4641 … … 4827 4724 rc = VERR_NOT_SUPPORTED; 4828 4725 4829 PDMCritSectLeave(&pThis-> lock);4726 PDMCritSectLeave(&pThis->CritSect); 4830 4727 4831 4728 LogFlow(("vgaPortTakeScreenshot: returns %Rrc (cbData=%d cx=%d cy=%d)\n", rc, *pcbData, *pcx, *pcy)); … … 4867 4764 LogFlow(("vgaPortDisplayBlt: pvData=%p x=%d y=%d cx=%d cy=%d\n", pvData, x, y, cx, cy)); 4868 4765 4869 rc = PDMCritSectEnter(&pThis-> lock, VERR_SEM_BUSY);4766 rc = PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY); 4870 4767 AssertRC(rc); 4871 4768 … … 4932 4829 rc = VERR_INVALID_PARAMETER; 4933 4830 4934 PDMCritSectLeave(&pThis-> lock);4831 PDMCritSectLeave(&pThis->CritSect); 4935 4832 4936 4833 LogFlow(("vgaPortDisplayBlt: returns %Rrc\n", rc)); … … 4938 4835 } 4939 4836 4940 static DECLCALLBACK(void) vgaPortUpdateDisplayRect 4837 static DECLCALLBACK(void) vgaPortUpdateDisplayRect(PPDMIDISPLAYPORT pInterface, int32_t x, int32_t y, uint32_t w, uint32_t h) 4941 4838 { 4942 4839 uint32_t v; … … 4953 4850 uint32_t u32OffsetSrc, u32Dummy; 4954 4851 4955 PVGASTATE s = IDISPLAYPORT_2_VGASTATE(pInterface);4852 PVGASTATE pThis = IDISPLAYPORT_2_VGASTATE(pInterface); 4956 4853 4957 4854 #ifdef DEBUG_sunlover … … 4960 4857 4961 4858 Assert(pInterface); 4962 Assert( s->pDrv);4963 Assert( s->pDrv->pu8Data);4859 Assert(pThis->pDrv); 4860 Assert(pThis->pDrv->pu8Data); 4964 4861 4965 4862 /* Check if there is something to do at all. */ 4966 if (! s->fRenderVRAM)4863 if (!pThis->fRenderVRAM) 4967 4864 { 4968 4865 /* The framebuffer uses the guest VRAM directly. */ … … 4973 4870 } 4974 4871 4975 int rc = PDMCritSectEnter(& s->lock, VERR_SEM_BUSY);4872 int rc = PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY); 4976 4873 AssertRC(rc); 4977 4874 … … 4992 4889 4993 4890 /* Also check if coords are greater than the display resolution. */ 4994 if (x + w > s->pDrv->cx)4891 if (x + w > pThis->pDrv->cx) 4995 4892 { 4996 4893 // x < 0 is not possible here 4997 w = s->pDrv->cx > (uint32_t)x?s->pDrv->cx - x: 0;4998 } 4999 5000 if (y + h > s->pDrv->cy)4894 w = pThis->pDrv->cx > (uint32_t)x? pThis->pDrv->cx - x: 0; 4895 } 4896 4897 if (y + h > pThis->pDrv->cy) 5001 4898 { 5002 4899 // y < 0 is not possible here 5003 h = s->pDrv->cy > (uint32_t)y?s->pDrv->cy - y: 0;4900 h = pThis->pDrv->cy > (uint32_t)y? pThis->pDrv->cy - y: 0; 5004 4901 } 5005 4902 … … 5015 4912 LogFlow(("vgaPortUpdateDisplayRect: nothing to do: %dx%d\n", w, h)); 5016 4913 #endif /* DEBUG_sunlover */ 5017 PDMCritSectLeave(& s->lock);4914 PDMCritSectLeave(&pThis->CritSect); 5018 4915 return; 5019 4916 } … … 5025 4922 5026 4923 /* Choose the rendering function. */ 5027 switch( s->get_bpp(s))4924 switch(pThis->get_bpp(pThis)) 5028 4925 { 5029 4926 default: … … 5033 4930 * Nothing to do, just return. 5034 4931 */ 5035 PDMCritSectLeave(& s->lock);4932 PDMCritSectLeave(&pThis->CritSect); 5036 4933 return; 5037 4934 case 8: … … 5052 4949 } 5053 4950 5054 vga_draw_line = vga_draw_line_table[v * 4 + get_depth_index( s->pDrv->cBits)];4951 vga_draw_line = vga_draw_line_table[v * 4 + get_depth_index(pThis->pDrv->cBits)]; 5055 4952 5056 4953 /* Compute source and destination addresses and pitches. */ 5057 cbPixelDst = ( s->pDrv->cBits + 7) / 8;5058 cbLineDst = s->pDrv->cbScanline;5059 pu8Dst = s->pDrv->pu8Data + y * cbLineDst + x * cbPixelDst;5060 5061 cbPixelSrc = ( s->get_bpp(s) + 7) / 8;5062 s->get_offsets(s, &cbLineSrc, &u32OffsetSrc, &u32Dummy);4954 cbPixelDst = (pThis->pDrv->cBits + 7) / 8; 4955 cbLineDst = pThis->pDrv->cbScanline; 4956 pu8Dst = pThis->pDrv->pu8Data + y * cbLineDst + x * cbPixelDst; 4957 4958 cbPixelSrc = (pThis->get_bpp(pThis) + 7) / 8; 4959 pThis->get_offsets(pThis, &cbLineSrc, &u32OffsetSrc, &u32Dummy); 5063 4960 5064 4961 /* Assume that rendering is performed only on visible part of VRAM. 5065 4962 * This is true because coordinates were verified. 5066 4963 */ 5067 pu8Src = s->vram_ptrR3;4964 pu8Src = pThis->vram_ptrR3; 5068 4965 pu8Src += u32OffsetSrc * 4 + y * cbLineSrc + x * cbPixelSrc; 5069 4966 … … 5076 4973 while (h-- > 0) 5077 4974 { 5078 vga_draw_line ( s, pu8Dst, pu8Src, w);4975 vga_draw_line (pThis, pu8Dst, pu8Src, w); 5079 4976 pu8Dst += cbLineDst; 5080 4977 pu8Src += cbLineSrc; 5081 4978 } 5082 PDMCritSectLeave(&s->lock); 5083 4979 4980 PDMCritSectLeave(&pThis->CritSect); 5084 4981 #ifdef DEBUG_sunlover 5085 4982 LogFlow(("vgaPortUpdateDisplayRect: completed.\n")); … … 5120 5017 #endif /* DEBUG_sunlover */ 5121 5018 5122 PVGASTATE s = IDISPLAYPORT_2_VGASTATE(pInterface);5019 PVGASTATE pThis = IDISPLAYPORT_2_VGASTATE(pInterface); 5123 5020 5124 5021 Assert(pInterface); 5125 Assert( s->pDrv);5022 Assert(pThis->pDrv); 5126 5023 5127 5024 int32_t xSrcCorrected = xSrc; … … 5207 5104 } 5208 5105 5209 int rc = PDMCritSectEnter(& s->lock, VERR_SEM_BUSY);5106 int rc = PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY); 5210 5107 AssertRC(rc); 5211 5108 … … 5227 5124 while (hCorrected-- > 0) 5228 5125 { 5229 vga_draw_line ( s, pu8DstPtr, pu8SrcPtr, wCorrected);5126 vga_draw_line (pThis, pu8DstPtr, pu8SrcPtr, wCorrected); 5230 5127 pu8DstPtr += cbLineDst; 5231 5128 pu8SrcPtr += cbLineSrc; 5232 5129 } 5233 PDMCritSectLeave(&s->lock); 5234 5130 5131 PDMCritSectLeave(&pThis->CritSect); 5235 5132 #ifdef DEBUG_sunlover 5236 5133 LogFlow(("vgaPortCopyRect: completed.\n")); … … 5242 5139 static DECLCALLBACK(void) vgaPortSetRenderVRAM(PPDMIDISPLAYPORT pInterface, bool fRender) 5243 5140 { 5244 PVGASTATE s = IDISPLAYPORT_2_VGASTATE(pInterface);5141 PVGASTATE pThis = IDISPLAYPORT_2_VGASTATE(pInterface); 5245 5142 5246 5143 LogFlow(("vgaPortSetRenderVRAM: fRender = %d\n", fRender)); 5247 5144 5248 s->fRenderVRAM = fRender;5145 pThis->fRenderVRAM = fRender; 5249 5146 } 5250 5147 … … 5747 5644 } 5748 5645 5749 PDMR3CritSectDelete(&pThis-> lock);5646 PDMR3CritSectDelete(&pThis->CritSect); 5750 5647 return VINF_SUCCESS; 5751 5648 } … … 5921 5818 5922 5819 /* 5820 * We use our own critical section to avoid unncessary pointer indirections 5821 * in interface methods (as we all as for historical reasons). 5822 */ 5823 rc = PDMDevHlpCritSectInit(pDevIns, &pThis->CritSect, RT_SRC_POS, "VGA#%u", iInstance); 5824 AssertRCReturn(rc, rc); 5825 rc = PDMDevHlpSetDeviceCritSect(pDevIns, &pThis->CritSect); 5826 AssertRCReturn(rc, rc); 5827 5828 /* 5923 5829 * Allocate the VRAM and map the first 512KB of it into GC so we can speed up VGA support. 5924 5830 */ … … 6194 6100 if (RT_FAILURE(rc)) 6195 6101 return rc; 6196 6197 /* Initialize the PDM lock. */6198 rc = PDMDevHlpCritSectInit(pDevIns, &pThis->lock, RT_SRC_POS, "VGA#%u", iInstance);6199 if (RT_FAILURE(rc))6200 {6201 Log(("%s: Failed to create critical section.\n", __FUNCTION__));6202 return rc;6203 }6204 6102 6205 6103 /* -
trunk/src/VBox/Devices/Graphics/DevVGA.h
r44528 r44876 317 317 /** The physical address the VRAM was assigned. */ 318 318 RTGCPHYS GCPhysVRAM; 319 /** The critical section . */320 PDMCRITSECT lock;319 /** The critical section protect the instance data. */ 320 PDMCRITSECT CritSect; 321 321 /** The PCI device. */ 322 322 PCIDEVICE Dev; -
trunk/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp
r44528 r44876 1 /* $Id$ */ 1 2 /** @file 2 3 * VirtualBox Video Acceleration (VBVA). … … 4 5 5 6 /* 6 * Copyright (C) 2006-201 2Oracle Corporation7 * Copyright (C) 2006-2013 Oracle Corporation 7 8 * 8 9 * This file is part of VirtualBox Open Source Edition (OSE), as … … 15 16 */ 16 17 18 /******************************************************************************* 19 * Header Files * 20 *******************************************************************************/ 17 21 #define LOG_GROUP LOG_GROUP_DEV_VGA 18 22 #include <VBox/vmm/pdmifs.h> … … 37 41 #define LOGVBVABUFFER(a) LogFlow(a) 38 42 #else 39 #define LOGVBVABUFFER(a) do {} while (0)43 #define LOGVBVABUFFER(a) do {} while (0) 40 44 #endif 41 45 46 /******************************************************************************* 47 * Structures and Typedefs * 48 *******************************************************************************/ 42 49 typedef struct VBVAPARTIALRECORD 43 50 { … … 69 76 } VBVAMOUSESHAPEINFO; 70 77 71 /* @todo saved state: save and restore VBVACONTEXT */78 /** @todo saved state: save and restore VBVACONTEXT */ 72 79 typedef struct VBVACONTEXT 73 80 { … … 77 84 } VBVACONTEXT; 78 85 79 /* Copies 'cb' bytes from the VBVA ring buffer to the 'pu8Dst'. 86 87 88 /** Copies @a cb bytes from the VBVA ring buffer to the @a pu8Dst. 80 89 * Used for partial records or for records which cross the ring boundary. 81 90 */ 82 91 static void vbvaFetchBytes (VBVABUFFER *pVBVA, uint8_t *pu8Dst, uint32_t cb) 83 92 { 84 /* @todo replace the 'if' with an assert. The caller must ensure this condition. */93 /** @todo replace the 'if' with an assert. The caller must ensure this condition. */ 85 94 if (cb >= pVBVA->cbData) 86 95 { … … 1633 1642 { 1634 1643 PPDMDEVINS pDevIns = pVGAState->pDevInsR3; 1635 PDMCritSectEnter(&pVGAState->lock, VERR_SEM_BUSY); 1644 PDMCritSectEnter(&pVGAState->CritSect, VERR_SEM_BUSY); 1645 1636 1646 HGSMISetHostGuestFlags(pVGAState->pHGSMI, HGSMIHOSTFLAGS_IRQ | fFlags); 1637 1647 PDMDevHlpPCISetIrq(pDevIns, 0, PDM_IRQ_LEVEL_HIGH); 1638 PDMCritSectLeave(&pVGAState->lock); 1648 1649 PDMCritSectLeave(&pVGAState->CritSect); 1639 1650 } 1640 1651 -
trunk/src/VBox/Devices/testcase/tstDeviceStructSize.cpp
r44806 r44876 316 316 CHECK_MEMBER_ALIGNMENT(SerialState, CritSect, 8); 317 317 CHECK_MEMBER_ALIGNMENT(VGASTATE, Dev, 8); 318 CHECK_MEMBER_ALIGNMENT(VGASTATE, lock, 8);318 CHECK_MEMBER_ALIGNMENT(VGASTATE, CritSect, 8); 319 319 CHECK_MEMBER_ALIGNMENT(VGASTATE, StatRZMemoryRead, 8); 320 320 CHECK_MEMBER_ALIGNMENT(VMMDevState, CritSect, 8); -
trunk/src/VBox/Devices/testcase/tstDeviceStructSizeRC.cpp
r44852 r44876 313 313 GEN_CHECK_OFF(VGASTATE, fRenderVRAM); 314 314 GEN_CHECK_OFF(VGASTATE, GCPhysVRAM); 315 GEN_CHECK_OFF(VGASTATE, lock);315 GEN_CHECK_OFF(VGASTATE, CritSect); 316 316 GEN_CHECK_OFF(VGASTATE, Dev); 317 317 GEN_CHECK_OFF(VGASTATE, StatRZMemoryRead);
Note:
See TracChangeset
for help on using the changeset viewer.