Changeset 33501 in vbox
- Timestamp:
- Oct 27, 2010 1:03:55 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Graphics/DevVGA.cpp
r33455 r33501 1 #ifdef VBOX2 1 /* $Id$ */ 3 2 /** @file … … 45 44 * Defined Constants And Macros * 46 45 *******************************************************************************/ 47 #ifndef VBOX48 /** The default amount of VRAM. */49 #define VGA_VRAM_DEFAULT (_4M)50 /** The maximum amount of VRAM. */51 #define VGA_VRAM_MAX (128 * _1M)52 /** The minimum amount of VRAM. */53 #define VGA_VRAM_MIN (_1M)54 #else55 /* moved to DevVGA.h */56 #endif57 46 58 47 /** The size of the VGA GC mapping. … … 387 376 } 388 377 389 #endif /* !VBOX_DEVICE_STRUCT_TESTCASE */390 #endif /* VBOX */391 #ifndef VBOX_DEVICE_STRUCT_TESTCASE392 393 #ifndef VBOX394 #include "vl.h"395 #include "vga_int.h"396 #endif /* !VBOX */397 398 378 #ifdef LOG_ENABLED 399 379 //#define DEBUG_VGA … … 406 386 407 387 /* force some bits to zero */ 408 #ifdef VBOX 409 static 410 #endif /* VBOX */ 411 const uint8_t sr_mask[8] = { 388 static const uint8_t sr_mask[8] = { 412 389 (uint8_t)~0xfc, 413 390 (uint8_t)~0xc2, … … 420 397 }; 421 398 422 #ifdef VBOX 423 static 424 #endif /* VBOX */ 425 const uint8_t gr_mask[16] = { 399 static const uint8_t gr_mask[16] = { 426 400 (uint8_t)~0xf0, /* 0x00 */ 427 401 (uint8_t)~0xf0, /* 0x01 */ … … 520 494 }; 521 495 522 #if defined( VBOX) && defined(IN_RING3)496 #if defined(IN_RING3) 523 497 static uint32_t expand4[256]; 524 498 static uint16_t expand2[256]; 525 499 static uint8_t expand4to8[16]; 526 #endif /* VBOX && IN_RING3 */ 527 528 #ifndef VBOX 529 VGAState *vga_state; 530 int vga_io_memory; 531 #endif /* !VBOX */ 500 #endif /* IN_RING3 */ 532 501 533 502 static uint32_t vga_ioport_read(void *opaque, uint32_t addr) … … 650 619 index = s->ar_index & 0x1f; 651 620 switch(index) { 652 #ifndef VBOX653 case 0x00 ... 0x0f:654 #else /* VBOX */655 621 case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: 656 622 case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f: 657 #endif /* VBOX */658 623 s->ar[index] = val & 0x3f; 659 624 break; … … 892 857 s->vbe_regs[s->vbe_index] = val; 893 858 } 894 #ifdef VBOX895 859 if (val == VBE_DISPI_ID_VBOX_VIDEO) { 896 860 s->vbe_regs[s->vbe_index] = val; … … 903 867 } 904 868 #endif /* VBOX_WITH_HGSMI */ 905 #endif /* VBOX */906 869 break; 907 870 case VBE_DISPI_INDEX_XRES: … … 977 940 !(s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED)) { 978 941 int h, shift_control; 979 #ifdef VBOX980 942 /* Check the values before we screw up with a resolution which is too big or small. */ 981 943 size_t cb = s->vbe_regs[VBE_DISPI_INDEX_XRES]; … … 1004 966 } 1005 967 #endif /* KEEP_SCAN_LINE_LENGTH defined */ 1006 #endif /* VBOX */1007 968 1008 969 #ifndef KEEP_SCAN_LINE_LENGTH … … 1021 982 /* clear the screen (should be done in BIOS) */ 1022 983 if (!(val & VBE_DISPI_NOCLEARMEM)) { 1023 #ifndef VBOX1024 memset(s->vram_ptr, 0,1025 s->vbe_regs[VBE_DISPI_INDEX_YRES] * s->vbe_line_offset);1026 #else /* VBOX */1027 984 memset(s->CTX_SUFF(vram_ptr), 0, 1028 985 s->vbe_regs[VBE_DISPI_INDEX_YRES] * s->vbe_line_offset); 1029 #endif /* VBOX */1030 986 } 1031 987 … … 1057 1013 s->gr[0x05] = (s->gr[0x05] & ~0x60) | (shift_control << 5); 1058 1014 s->cr[0x09] &= ~0x9f; /* no double scan */ 1059 #ifdef VBOX1060 1015 /* sunlover 30.05.2007 1061 1016 * The ar_index remains with bit 0x20 cleared after a switch from fullscreen … … 1064 1019 */ 1065 1020 s->ar_index |= 0x20; 1066 #endif /* VBOX */1067 1021 } else { 1068 1022 /* XXX: the bios should do that */ 1069 #ifdef VBOX1070 1023 /* sunlover 21.12.2006 1071 1024 * Here is probably more to reset. When this was executed in GC … … 1078 1031 * LFBChange callback. 1079 1032 */ 1080 #endif /* VBOX */1081 1033 s->bank_offset = 0; 1082 1034 } … … 1128 1080 break; 1129 1081 case VBE_DISPI_INDEX_VBOX_VIDEO: 1130 #ifdef VBOX1131 1082 #ifndef IN_RING3 1132 1083 return VINF_IOM_HC_IOPORT_WRITE; … … 1146 1097 } 1147 1098 #endif /* IN_RING3 */ 1148 #endif /* VBOX */1149 1099 break; 1150 1100 default: … … 1157 1107 1158 1108 /* called for accesses between 0xa0000 and 0xc0000 */ 1159 #ifdef VBOX1160 1109 static uint32_t vga_mem_readb(void *opaque, target_phys_addr_t addr, int *prc) 1161 #else1162 uint32_t vga_mem_readb(void *opaque, target_phys_addr_t addr)1163 #endif /* VBOX */1164 1110 { 1165 1111 VGAState *s = (VGAState*)opaque; … … 1172 1118 /* convert to VGA memory offset */ 1173 1119 memory_map_mode = (s->gr[6] >> 2) & 3; 1174 #ifdef VBOX1175 1120 RTGCPHYS GCPhys = addr; /* save original address */ 1176 #endif 1121 1177 1122 addr &= 0x1ffff; 1178 1123 switch(memory_map_mode) { … … 1199 1144 if (s->sr[4] & 0x08) { 1200 1145 /* chain 4 mode : simplest access */ 1201 #ifndef VBOX1202 ret = s->vram_ptr[addr];1203 #else /* VBOX */1204 1146 # ifndef IN_RC 1205 1147 /* If all planes are accessible, then map the page to the frame buffer and make it writable. */ … … 1217 1159 VERIFY_VRAM_READ_OFF_RETURN(s, addr, *prc); 1218 1160 ret = s->CTX_SUFF(vram_ptr)[addr]; 1219 #endif /* VBOX */1220 1161 } else if (!(s->sr[4] & 0x04)) { /* Host access is controlled by SR4, not GR5! */ 1221 1162 /* odd/even mode (aka text mode mapping) */ 1222 1163 plane = (s->gr[4] & 2) | (addr & 1); 1223 #ifndef VBOX1224 ret = s->vram_ptr[((addr & ~1) << 1) | plane];1225 #else /* VBOX */1226 1164 /* See the comment for a similar line in vga_mem_writeb. */ 1227 1165 RTGCPHYS off = ((addr & ~1) << 2) | plane; 1228 1166 VERIFY_VRAM_READ_OFF_RETURN(s, off, *prc); 1229 1167 ret = s->CTX_SUFF(vram_ptr)[off]; 1230 #endif /* VBOX */1231 1168 } else { 1232 1169 /* standard VGA latched access */ 1233 #ifndef VBOX1234 s->latch = ((uint32_t *)s->vram_ptr)[addr];1235 #else /* VBOX */1236 1170 VERIFY_VRAM_READ_OFF_RETURN(s, addr, *prc); 1237 1171 s->latch = ((uint32_t *)s->CTX_SUFF(vram_ptr))[addr]; 1238 #endif /* VBOX */1239 1172 1240 1173 if (!(s->gr[5] & 0x08)) { … … 1256 1189 } 1257 1190 1258 #ifndef VBOX1259 static uint32_t vga_mem_readw(void *opaque, target_phys_addr_t addr)1260 {1261 uint32_t v;1262 #ifdef TARGET_WORDS_BIGENDIAN1263 v = vga_mem_readb(opaque, addr) << 8;1264 v |= vga_mem_readb(opaque, addr + 1);1265 #else1266 v = vga_mem_readb(opaque, addr);1267 v |= vga_mem_readb(opaque, addr + 1) << 8;1268 #endif1269 return v;1270 }1271 1272 static uint32_t vga_mem_readl(void *opaque, target_phys_addr_t addr)1273 {1274 uint32_t v;1275 #ifdef TARGET_WORDS_BIGENDIAN1276 v = vga_mem_readb(opaque, addr) << 24;1277 v |= vga_mem_readb(opaque, addr + 1) << 16;1278 v |= vga_mem_readb(opaque, addr + 2) << 8;1279 v |= vga_mem_readb(opaque, addr + 3);1280 #else1281 v = vga_mem_readb(opaque, addr);1282 v |= vga_mem_readb(opaque, addr + 1) << 8;1283 v |= vga_mem_readb(opaque, addr + 2) << 16;1284 v |= vga_mem_readb(opaque, addr + 3) << 24;1285 #endif1286 return v;1287 }1288 #endif /* !VBOX */1289 1290 1191 /* called for accesses between 0xa0000 and 0xc0000 */ 1291 #ifdef VBOX 1292 static 1293 #endif /* VBOX */ 1294 int vga_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val) 1192 static int vga_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val) 1295 1193 { 1296 1194 VGAState *s = (VGAState*)opaque; … … 1303 1201 /* convert to VGA memory offset */ 1304 1202 memory_map_mode = (s->gr[6] >> 2) & 3; 1305 #ifdef VBOX1306 1203 RTGCPHYS GCPhys = addr; /* save original address */ 1307 #endif 1204 1308 1205 addr &= 0x1ffff; 1309 1206 switch(memory_map_mode) { … … 1333 1230 mask = (1 << plane); 1334 1231 if (s->sr[2] & mask) { 1335 #ifndef VBOX1336 s->vram_ptr[addr] = val;1337 #else /* VBOX */1338 1232 # ifndef IN_RC 1339 1233 /* If all planes are accessible, then map the page to the frame buffer and make it writable. */ … … 1349 1243 VERIFY_VRAM_WRITE_OFF_RETURN(s, addr); 1350 1244 s->CTX_SUFF(vram_ptr)[addr] = val; 1351 #endif /* VBOX */1352 1245 #ifdef DEBUG_VGA_MEM 1353 1246 Log(("vga: chain4: [0x%x]\n", addr)); 1354 1247 #endif 1355 1248 s->plane_updated |= mask; /* only used to detect font change */ 1356 #ifndef VBOX1357 cpu_physical_memory_set_dirty(s->vram_offset + addr);1358 #else /* VBOX */1359 1249 vga_set_dirty(s, addr); 1360 #endif /* VBOX */1361 1250 } 1362 1251 } else if (!(s->sr[4] & 0x04)) { /* Host access is controlled by SR4, not GR5! */ … … 1365 1254 mask = (1 << plane); 1366 1255 if (s->sr[2] & mask) { 1367 #ifndef VBOX1368 addr = ((addr & ~1) << 1) | plane;1369 #else1370 1256 /* 'addr' is offset in a plane, bit 0 selects the plane. 1371 1257 * Mask the bit 0, convert plane index to vram offset, … … 1374 1260 */ 1375 1261 addr = ((addr & ~1) << 2) | plane; 1376 #endif /* VBOX */1377 #ifndef VBOX1378 s->vram_ptr[addr] = val;1379 #else /* VBOX */1380 1262 VERIFY_VRAM_WRITE_OFF_RETURN(s, addr); 1381 1263 s->CTX_SUFF(vram_ptr)[addr] = val; 1382 #endif /* VBOX */1383 1264 #ifdef DEBUG_VGA_MEM 1384 1265 Log(("vga: odd/even: [0x%x]\n", addr)); 1385 1266 #endif 1386 1267 s->plane_updated |= mask; /* only used to detect font change */ 1387 #ifndef VBOX1388 cpu_physical_memory_set_dirty(s->vram_offset + addr);1389 #else /* VBOX */1390 1268 vga_set_dirty(s, addr); 1391 #endif /* VBOX */1392 1269 } 1393 1270 } else { … … 1497 1374 s->plane_updated |= mask; /* only used to detect font change */ 1498 1375 write_mask = mask16[mask]; 1499 #ifndef VBOX1500 ((uint32_t *)s->vram_ptr)[addr] =1501 (((uint32_t *)s->vram_ptr)[addr] & ~write_mask) |1502 (val & write_mask);1503 #else /* VBOX */1504 1376 ((uint32_t *)s->CTX_SUFF(vram_ptr))[addr] = 1505 1377 (((uint32_t *)s->CTX_SUFF(vram_ptr))[addr] & ~write_mask) | 1506 1378 (val & write_mask); 1507 #endif /* VBOX */1508 1379 #ifdef DEBUG_VGA_MEM 1509 1380 Log(("vga: latch: [0x%x] mask=0x%08x val=0x%08x\n", 1510 1381 addr * 4, write_mask, val)); 1511 1382 #endif 1512 #ifndef VBOX1513 cpu_physical_memory_set_dirty(s->vram_offset + (addr << 2));1514 #else /* VBOX */1515 1383 vga_set_dirty(s, (addr << 2)); 1516 #endif /* VBOX */1517 1384 } 1518 1385 … … 1520 1387 } 1521 1388 1522 #ifndef VBOX 1523 static void vga_mem_writew(void *opaque, target_phys_addr_t addr, uint32_t val) 1524 { 1525 #ifdef TARGET_WORDS_BIGENDIAN 1526 vga_mem_writeb(opaque, addr, (val >> 8) & 0xff); 1527 vga_mem_writeb(opaque, addr + 1, val & 0xff); 1528 #else 1529 vga_mem_writeb(opaque, addr, val & 0xff); 1530 vga_mem_writeb(opaque, addr + 1, (val >> 8) & 0xff); 1531 #endif 1532 } 1533 1534 static void vga_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val) 1535 { 1536 #ifdef TARGET_WORDS_BIGENDIAN 1537 vga_mem_writeb(opaque, addr, (val >> 24) & 0xff); 1538 vga_mem_writeb(opaque, addr + 1, (val >> 16) & 0xff); 1539 vga_mem_writeb(opaque, addr + 2, (val >> 8) & 0xff); 1540 vga_mem_writeb(opaque, addr + 3, val & 0xff); 1541 #else 1542 vga_mem_writeb(opaque, addr, val & 0xff); 1543 vga_mem_writeb(opaque, addr + 1, (val >> 8) & 0xff); 1544 vga_mem_writeb(opaque, addr + 2, (val >> 16) & 0xff); 1545 vga_mem_writeb(opaque, addr + 3, (val >> 24) & 0xff); 1546 #endif 1547 } 1548 #endif /* !VBOX */ 1549 1550 #if !defined(VBOX) || defined(IN_RING3) 1389 #if defined(IN_RING3) 1551 1390 typedef void vga_draw_glyph8_func(uint8_t *d, int linesize, 1552 1391 const uint8_t *font_ptr, int h, … … 1695 1534 line_offset = s->cr[0x13]; 1696 1535 line_offset <<= 3; 1697 #ifdef VBOX1698 1536 if (!(s->cr[0x14] & 0x40) && !(s->cr[0x17] & 0x40)) 1699 1537 { … … 1701 1539 line_offset *= 2; 1702 1540 } 1703 #endif /* VBOX */1704 1541 1705 1542 /* starting address */ … … 1800 1637 * - flashing 1801 1638 */ 1802 #ifndef VBOX1803 static void vga_draw_text(VGAState *s, int full_update)1804 #else1805 1639 static int vga_draw_text(VGAState *s, int full_update, bool fFailOnResize) 1806 #endif /* !VBOX */1807 1640 { 1808 1641 int cx, cy, cheight, cw, ch, cattr, height, width, ch_attr; … … 1828 1661 full_update = 1; 1829 1662 } 1830 #ifndef VBOX1831 font_base[0] = s->vram_ptr + offset;1832 #else /* VBOX */1833 1663 font_base[0] = s->CTX_SUFF(vram_ptr) + offset; 1834 #endif /* VBOX */1835 1664 1836 1665 offset = (((v >> 5) & 1) | ((v >> 1) & 6)) * 8192 * 4 + 2; 1837 #ifndef VBOX1838 font_base[1] = s->vram_ptr + offset;1839 #else /* VBOX */1840 1666 font_base[1] = s->CTX_SUFF(vram_ptr) + offset; 1841 #endif /* VBOX */1842 1667 if (offset != s->font_offsets[1]) { 1843 1668 s->font_offsets[1] = offset; … … 1853 1678 1854 1679 line_offset = s->line_offset; 1855 #ifndef VBOX1856 s1 = s->vram_ptr + (s->start_addr * 4);1857 #else /* VBOX */1858 1680 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... */ 1859 #endif /* VBOX */1860 1681 1861 1682 /* total width & height */ … … 1866 1687 if (s->sr[1] & 0x08) 1867 1688 cw = 16; /* NOTE: no 18 pixel wide */ 1868 #ifndef VBOX1869 x_incr = cw * ((s->ds->depth + 7) >> 3);1870 #else /* VBOX */1871 1689 x_incr = cw * ((s->pDrv->cBits + 7) >> 3); 1872 #endif /* VBOX */1873 1690 width = (s->cr[0x01] + 1); 1874 1691 if (s->cr[0x06] == 100) { … … 1883 1700 if ((height * width) > CH_ATTR_SIZE) { 1884 1701 /* better than nothing: exit if transient size is too big */ 1885 #ifndef VBOX1886 return;1887 #else1888 1702 return VINF_SUCCESS; 1889 #endif /* VBOX */1890 1703 } 1891 1704 1892 1705 if (width != (int)s->last_width || height != (int)s->last_height || 1893 1706 cw != s->last_cw || cheight != s->last_ch) { 1894 #ifdef VBOX1895 1707 if (fFailOnResize) 1896 1708 { … … 1898 1710 return VERR_TRY_AGAIN; 1899 1711 } 1900 #endif /* VBOX */1901 1712 s->last_scr_width = width * cw; 1902 1713 s->last_scr_height = height * cheight; 1903 #ifndef VBOX1904 dpy_resize(s->ds, s->last_scr_width, s->last_scr_height);1905 s->last_width = width;1906 s->last_height = height;1907 s->last_ch = cheight;1908 s->last_cw = cw;1909 full_update = 1;1910 #else /* VBOX */1911 1714 /* For text modes the direct use of guest VRAM is not implemented, so bpp and cbLine are 0 here. */ 1912 1715 int rc = s->pDrv->pfnResize(s->pDrv, 0, NULL, 0, s->last_scr_width, s->last_scr_height); … … 1919 1722 return rc; 1920 1723 AssertRC(rc); 1921 #endif /* VBOX */1922 1724 } 1923 1725 cursor_offset = ((s->cr[0x0e] << 8) | s->cr[0x0f]) - s->start_addr; … … 1935 1737 s->cursor_end = s->cr[0xb]; 1936 1738 } 1937 #ifndef VBOX1938 cursor_ptr = s->vram_ptr + (s->start_addr + cursor_offset) * 4;1939 1940 depth_index = get_depth_index(s->ds->depth);1941 #else /* VBOX */1942 1739 cursor_ptr = s->CTX_SUFF(vram_ptr) + (s->start_addr + cursor_offset) * 8; 1943 1740 depth_index = get_depth_index(s->pDrv->cBits); 1944 #endif /* VBOX */1945 1741 if (cw == 16) 1946 1742 vga_draw_glyph8 = vga_draw_glyph16_table[depth_index]; … … 1949 1745 vga_draw_glyph9 = vga_draw_glyph9_table[depth_index]; 1950 1746 1951 #ifndef VBOX1952 dest = s->ds->data;1953 linesize = s->ds->linesize;1954 #else /* VBOX */1955 1747 dest = s->pDrv->pu8Data; 1956 1748 linesize = s->pDrv->cbScanline; 1957 #endif /* VBOX */1958 1749 ch_attr_ptr = s->last_ch_attr; 1959 1750 cy_start = -1; … … 2018 1809 } 2019 1810 d1 += x_incr; 2020 #ifndef VBOX2021 src += 4;2022 #else2023 1811 src += 8; /* Every second byte of a plane is used in text mode. */ 2024 #endif2025 2026 1812 ch_attr_ptr++; 2027 1813 } 2028 #ifndef VBOX2029 if (cx_max != -1) {2030 dpy_update(s->ds, cx_min * cw, cy * cheight,2031 (cx_max - cx_min + 1) * cw, cheight);2032 }2033 #else2034 1814 if (cx_max != -1) { 2035 1815 /* Keep track of the bounding rectangle for updates. */ … … 2048 1828 cx_min_upd = width; 2049 1829 } 2050 #endif2051 1830 dest += linesize * cheight; 2052 1831 s1 += line_offset; 2053 1832 } 2054 #ifdef VBOX2055 1833 if (cy_start >= 0) 2056 1834 /* Flush any remaining changes to display. */ … … 2058 1836 (cx_max_upd - cx_min_upd + 1) * cw, (cy - cy_start) * cheight); 2059 1837 return VINF_SUCCESS; 2060 #endif /* VBOX */2061 1838 } 2062 1839 … … 2161 1938 } 2162 1939 2163 #ifndef VBOX2164 void vga_invalidate_scanlines(VGAState *s, int y1, int y2)2165 {2166 int y;2167 if (y1 >= VGA_MAX_HEIGHT)2168 return;2169 if (y2 >= VGA_MAX_HEIGHT)2170 y2 = VGA_MAX_HEIGHT;2171 for(y = y1; y < y2; y++) {2172 s->invalidated_y_table[y >> 5] |= 1 << (y & 0x1f);2173 }2174 }2175 #endif /* !VBOX*/2176 2177 #ifdef VBOX2178 1940 /** 2179 1941 * Performs the display driver resizing when in graphics mode. … … 2237 1999 return VINF_SUCCESS; 2238 2000 } 2239 #endif /* VBOX */2240 2001 2241 2002 /* 2242 2003 * graphic modes 2243 2004 */ 2244 #ifndef VBOX2245 static void vga_draw_graphic(VGAState *s, int full_update)2246 #else2247 2005 static int vga_draw_graphic(VGAState *s, int full_update, bool fFailOnResize) 2248 #endif /* !VBOX */2249 2006 { 2250 2007 int y1, y2, y, update, page_min, page_max, linesize, y_start, double_scan; … … 2322 2079 } 2323 2080 } 2324 #ifndef VBOX2325 vga_draw_line = vga_draw_line_table[v * 4 + get_depth_index(s->ds->depth)];2326 2327 if (disp_width != s->last_width ||2328 height != s->last_height) {2329 dpy_resize(s->ds, disp_width, height);2330 s->last_scr_width = disp_width;2331 s->last_scr_height = height;2332 s->last_width = disp_width;2333 s->last_height = height;2334 full_update = 1;2335 }2336 #else /* VBOX */2337 2081 if ( disp_width != (int)s->last_width 2338 2082 || height != (int)s->last_height … … 2352 2096 vga_draw_line = vga_draw_line_table[v * 4 + get_depth_index(s->pDrv->cBits)]; 2353 2097 2354 #endif /* VBOX */2355 2098 if (s->cursor_invalidate) 2356 2099 s->cursor_invalidate(s); … … 2362 2105 #endif 2363 2106 addr1 = (s->start_addr * 4); 2364 #ifndef VBOX2365 bwidth = width * 4;2366 #else /* VBOX */2367 2107 bwidth = (width * bits + 7) / 8; /* The visible width of a scanline. */ 2368 #endif /* VBOX */2369 2108 y_start = -1; 2370 2109 page_min = 0x7fffffff; 2371 2110 page_max = -1; 2372 #ifndef VBOX2373 d = s->ds->data;2374 linesize = s->ds->linesize;2375 #else /* VBOX */2376 2111 d = s->pDrv->pu8Data; 2377 2112 linesize = s->pDrv->cbScanline; 2378 #endif /* VBOX */2379 2113 2380 2114 y1 = 0; … … 2391 2125 addr = (addr & ~(1 << 16)) | ((y1 & 2) << 15); 2392 2126 } 2393 #ifndef VBOX2394 page0 = s->vram_offset + (addr & TARGET_PAGE_MASK);2395 page1 = s->vram_offset + ((addr + bwidth - 1) & TARGET_PAGE_MASK);2396 update = full_update |2397 cpu_physical_memory_get_dirty(page0, VGA_DIRTY_FLAG) |2398 cpu_physical_memory_get_dirty(page1, VGA_DIRTY_FLAG);2399 if ((page1 - page0) > TARGET_PAGE_SIZE) {2400 /* if wide line, can use another page */2401 update |= cpu_physical_memory_get_dirty(page0 + TARGET_PAGE_SIZE,2402 VGA_DIRTY_FLAG);2403 }2404 #else /* VBOX */2405 2127 page0 = addr & TARGET_PAGE_MASK; 2406 2128 page1 = (addr + bwidth - 1) & TARGET_PAGE_MASK; … … 2410 2132 update |= vga_is_dirty(s, page0 + TARGET_PAGE_SIZE); 2411 2133 } 2412 #endif /* VBOX */2413 2134 /* explicit invalidation for the hardware cursor */ 2414 2135 update |= (s->invalidated_y_table[y >> 5] >> (y & 0x1f)) & 1; … … 2420 2141 if (page1 > page_max) 2421 2142 page_max = page1; 2422 #ifndef VBOX2423 vga_draw_line(s, d, s->vram_ptr + addr, width);2424 #else /* VBOX */2425 2143 if (s->fRenderVRAM) 2426 2144 vga_draw_line(s, d, s->CTX_SUFF(vram_ptr) + addr, width); 2427 #endif /* VBOX */2428 2145 if (s->cursor_draw_line) 2429 2146 s->cursor_draw_line(s, d, y); … … 2431 2148 if (y_start >= 0) { 2432 2149 /* flush to display */ 2433 #ifndef VBOX2434 dpy_update(s->ds, 0, y_start,2435 disp_width, y - y_start);2436 #else /* VBOX */2437 2150 s->pDrv->pfnUpdateRect(s->pDrv, 0, y_start, disp_width, y - y_start); 2438 #endif /* VBOX */2439 2151 y_start = -1; 2440 2152 } … … 2460 2172 if (y_start >= 0) { 2461 2173 /* flush to display */ 2462 #ifndef VBOX2463 dpy_update(s->ds, 0, y_start,2464 disp_width, y - y_start);2465 #else /* VBOX */2466 2174 s->pDrv->pfnUpdateRect(s->pDrv, 0, y_start, disp_width, y - y_start); 2467 #endif /* VBOX */2468 2175 } 2469 2176 /* reset modified pages */ 2470 2177 if (page_max != -1) { 2471 #ifndef VBOX2472 cpu_physical_memory_reset_dirty(page_min, page_max + TARGET_PAGE_SIZE,2473 VGA_DIRTY_FLAG);2474 #else /* VBOX */2475 2178 vga_reset_dirty(s, page_min, page_max + TARGET_PAGE_SIZE); 2476 #endif /* VBOX */2477 2179 } 2478 2180 memset(s->invalidated_y_table, 0, ((height + 31) >> 5) * 4); 2479 #ifdef VBOX2480 2181 return VINF_SUCCESS; 2481 #endif /* VBOX */2482 2182 } 2483 2183 2484 2184 static void vga_draw_blank(VGAState *s, int full_update) 2485 2185 { 2486 #ifndef VBOX2487 int i, w, val;2488 uint8_t *d;2489 2490 if (!full_update)2491 return;2492 if (s->last_scr_width <= 0 || s->last_scr_height <= 0)2493 return;2494 if (s->ds->depth == 8)2495 val = s->rgb_to_pixel(0, 0, 0);2496 else2497 val = 0;2498 w = s->last_scr_width * ((s->ds->depth + 7) >> 3);2499 d = s->ds->data;2500 for(i = 0; i < s->last_scr_height; i++) {2501 memset(d, val, w);2502 d += s->ds->linesize;2503 }2504 dpy_update(s->ds, 0, 0,2505 s->last_scr_width, s->last_scr_height);2506 #else /* VBOX */2507 2508 2186 int i, w, val; 2509 2187 uint8_t *d; … … 2527 2205 } 2528 2206 s->pDrv->pfnUpdateRect(s->pDrv, 0, 0, s->last_scr_width, s->last_scr_height); 2529 #endif /* VBOX */ 2530 } 2531 2532 #ifdef VBOX 2207 } 2208 2533 2209 static DECLCALLBACK(void) voidUpdateRect(PPDMIDISPLAYCONNECTOR pInterface, uint32_t x, uint32_t y, uint32_t cx, uint32_t cy) 2534 2210 { 2535 2211 } 2536 #endif /* VBOX */2537 2212 2538 2213 … … 2541 2216 #define GMODE_BLANK 2 2542 2217 2543 #ifndef VBOX2544 void vga_update_display(void)2545 {2546 VGAState *s = vga_state;2547 #else /* VBOX */2548 2218 static int vga_update_display(PVGASTATE s, bool fUpdateAll, bool fFailOnResize) 2549 2219 { 2550 2220 int rc = VINF_SUCCESS; 2551 #endif /* VBOX */2552 2221 int full_update, graphic_mode; 2553 2222 2554 #ifndef VBOX2555 if (s->ds->depth == 0) {2556 #else /* VBOX */2557 2223 if (s->pDrv->cBits == 0) { 2558 #endif /* VBOX */2559 2224 /* nothing to do */ 2560 2225 } else { 2561 #ifndef VBOX2562 switch(s->ds->depth) {2563 #else /* VBOX */2564 2226 switch(s->pDrv->cBits) { 2565 #endif /* VBOX */2566 2227 case 8: 2567 2228 s->rgb_to_pixel = rgb_to_pixel8_dup; … … 2579 2240 } 2580 2241 2581 #ifdef VBOX2582 2242 if (fUpdateAll) { 2583 2243 /* A full update is requested. Special processing for a "blank" mode is required, because … … 2625 2285 return rc; 2626 2286 } 2627 #endif /* VBOX */2628 2287 2629 2288 full_update = 0; … … 2639 2298 switch(graphic_mode) { 2640 2299 case GMODE_TEXT: 2641 #ifdef VBOX 2642 rc = 2643 #endif /* VBOX */ 2644 vga_draw_text(s, full_update, fFailOnResize); 2300 rc = vga_draw_text(s, full_update, fFailOnResize); 2645 2301 break; 2646 2302 case GMODE_GRAPH: 2647 #ifdef VBOX 2648 rc = 2649 #endif /* VBOX */ 2650 vga_draw_graphic(s, full_update, fFailOnResize); 2303 rc = vga_draw_graphic(s, full_update, fFailOnResize); 2651 2304 break; 2652 2305 case GMODE_BLANK: … … 2656 2309 } 2657 2310 } 2658 #ifdef VBOX2659 2311 return rc; 2660 #endif /* VBOX */ 2661 } 2662 2663 /* force a full display refresh */ 2664 #ifndef VBOX 2665 void vga_invalidate_display(void) 2666 { 2667 VGAState *s = vga_state; 2668 2669 s->last_width = -1; 2670 s->last_height = -1; 2671 } 2672 #endif /* !VBOX */ 2673 2674 #ifndef VBOX /* see vgaR3Reset() */ 2675 static void vga_reset(VGAState *s) 2676 { 2677 memset(s, 0, sizeof(VGAState)); 2678 s->graphic_mode = -1; /* force full update */ 2679 } 2680 #endif /* !VBOX */ 2681 2682 #ifndef VBOX 2683 static CPUReadMemoryFunc *vga_mem_read[3] = { 2684 vga_mem_readb, 2685 vga_mem_readw, 2686 vga_mem_readl, 2687 }; 2688 2689 static CPUWriteMemoryFunc *vga_mem_write[3] = { 2690 vga_mem_writeb, 2691 vga_mem_writew, 2692 vga_mem_writel, 2693 }; 2694 #endif /* !VBOX */ 2312 } 2695 2313 2696 2314 static void vga_save(QEMUFile *f, void *opaque) … … 2740 2358 uint32_t u32Dummy; 2741 2359 2742 #ifndef VBOX /* checked by the caller. */2743 if (version_id > VGA_SAVEDSTATE_VERSION)2744 return -EINVAL;2745 #endif /* VBOX */2746 2747 2360 qemu_get_be32s(f, &s->latch); 2748 2361 qemu_get_8s(f, &s->sr_index); … … 2771 2384 #ifdef CONFIG_BOCHS_VBE 2772 2385 if (!is_vbe) 2773 # ifndef VBOX2774 return -EINVAL;2775 # else /* VBOX */2776 2386 { 2777 2387 Log(("vga_load: !is_vbe !!\n")); 2778 2388 return VERR_SSM_DATA_UNIT_FORMAT_CHANGED; 2779 2389 } 2780 # endif /* VBOX */2781 2390 qemu_get_be16s(f, &s->vbe_index); 2782 2391 for(i = 0; i < VBE_DISPI_INDEX_NB_SAVED; i++) … … 2789 2398 #else 2790 2399 if (is_vbe) 2791 # ifndef VBOX2792 return -EINVAL;2793 # else /* VBOX */2794 2400 { 2795 2401 Log(("vga_load: is_vbe !!\n")); 2796 2402 return VERR_SSM_DATA_UNIT_FORMAT_CHANGED; 2797 2403 } 2798 # endif /* VBOX */2799 2404 #endif 2800 2405 … … 2804 2409 } 2805 2410 2806 #ifndef VBOX /* see vgaR3IORegionMap */ 2807 static void vga_map(PCIDevice *pci_dev, int region_num, 2808 uint32_t addr, uint32_t size, int type) 2809 { 2810 VGAState *s = vga_state; 2811 2812 cpu_register_physical_memory(addr, s->vram_size, s->vram_offset); 2813 } 2814 #endif 2815 2816 #ifndef VBOX /* see vgaR3Construct */ 2817 void vga_common_init(VGAState *s, DisplayState *ds, uint8_t *vga_ram_base, 2818 unsigned long vga_ram_offset, int vga_ram_size) 2819 #else 2411 /* see vgaR3Construct */ 2820 2412 static void vga_init_expand(void) 2821 #endif2822 2413 { 2823 2414 int i, j, v, b; … … 2845 2436 expand4to8[i] = v; 2846 2437 } 2847 #ifdef VBOX 2848 } 2849 #else /* !VBOX */ 2850 vga_reset(s); 2851 2852 s->vram_ptr = vga_ram_base; 2853 s->vram_offset = vga_ram_offset; 2854 s->vram_size = vga_ram_size; 2855 s->ds = ds; 2856 s->get_bpp = vga_get_bpp; 2857 s->get_offsets = vga_get_offsets; 2858 s->get_resolution = vga_get_resolution; 2859 /* XXX: currently needed for display */ 2860 vga_state = s; 2861 } 2862 2863 2864 int vga_initialize(PCIBus *bus, DisplayState *ds, uint8_t *vga_ram_base, 2865 unsigned long vga_ram_offset, int vga_ram_size) 2866 { 2867 VGAState *s; 2868 2869 s = qemu_mallocz(sizeof(VGAState)); 2870 if (!s) 2871 return -1; 2872 2873 vga_common_init(s, ds, vga_ram_base, vga_ram_offset, vga_ram_size); 2874 2875 register_savevm("vga", 0, 1, vga_save, vga_load, s); 2876 2877 register_ioport_write(0x3c0, 16, 1, vga_ioport_write, s); 2878 2879 register_ioport_write(0x3b4, 2, 1, vga_ioport_write, s); 2880 register_ioport_write(0x3d4, 2, 1, vga_ioport_write, s); 2881 register_ioport_write(0x3ba, 1, 1, vga_ioport_write, s); 2882 register_ioport_write(0x3da, 1, 1, vga_ioport_write, s); 2883 2884 register_ioport_read(0x3c0, 16, 1, vga_ioport_read, s); 2885 2886 register_ioport_read(0x3b4, 2, 1, vga_ioport_read, s); 2887 register_ioport_read(0x3d4, 2, 1, vga_ioport_read, s); 2888 register_ioport_read(0x3ba, 1, 1, vga_ioport_read, s); 2889 register_ioport_read(0x3da, 1, 1, vga_ioport_read, s); 2890 s->bank_offset = 0; 2891 2892 #ifdef CONFIG_BOCHS_VBE 2893 s->vbe_regs[VBE_DISPI_INDEX_ID] = VBE_DISPI_ID0; 2894 s->vbe_bank_max = (s->vram_size >> 16) - 1; 2895 #if defined (TARGET_I386) 2896 register_ioport_read(0x1ce, 1, 2, vbe_ioport_read_index, s); 2897 register_ioport_read(0x1cf, 1, 2, vbe_ioport_read_data, s); 2898 2899 register_ioport_write(0x1ce, 1, 2, vbe_ioport_write_index, s); 2900 register_ioport_write(0x1cf, 1, 2, vbe_ioport_write_data, s); 2901 2902 /* old Bochs IO ports */ 2903 register_ioport_read(0xff80, 1, 2, vbe_ioport_read_index, s); 2904 register_ioport_read(0xff81, 1, 2, vbe_ioport_read_data, s); 2905 2906 register_ioport_write(0xff80, 1, 2, vbe_ioport_write_index, s); 2907 register_ioport_write(0xff81, 1, 2, vbe_ioport_write_data, s); 2908 #else 2909 register_ioport_read(0x1ce, 1, 2, vbe_ioport_read_index, s); 2910 register_ioport_read(0x1d0, 1, 2, vbe_ioport_read_data, s); 2911 2912 register_ioport_write(0x1ce, 1, 2, vbe_ioport_write_index, s); 2913 register_ioport_write(0x1d0, 1, 2, vbe_ioport_write_data, s); 2914 #endif 2915 #endif /* CONFIG_BOCHS_VBE */ 2916 2917 vga_io_memory = cpu_register_io_memory(0, vga_mem_read, vga_mem_write, s); 2918 cpu_register_physical_memory(isa_mem_base + 0x000a0000, 0x20000, 2919 vga_io_memory); 2920 2921 if (bus) { 2922 PCIDevice *d; 2923 uint8_t *pci_conf; 2924 2925 d = pci_register_device(bus, "VGA", 2926 sizeof(PCIDevice), 2927 -1, NULL, NULL); 2928 pci_conf = d->config; 2929 pci_conf[0x00] = 0x34; // dummy VGA (same as Bochs ID) 2930 pci_conf[0x01] = 0x12; 2931 pci_conf[0x02] = 0x11; 2932 pci_conf[0x03] = 0x11; 2933 pci_conf[0x0a] = 0x00; // VGA controller 2934 pci_conf[0x0b] = 0x03; 2935 pci_conf[0x0e] = 0x00; // header_type 2936 2937 /* XXX: vga_ram_size must be a power of two */ 2938 pci_register_io_region(d, 0, vga_ram_size, 2939 PCI_ADDRESS_SPACE_MEM_PREFETCH, vga_map); 2940 } else { 2941 #ifdef CONFIG_BOCHS_VBE 2942 /* XXX: use optimized standard vga accesses */ 2943 cpu_register_physical_memory(VBE_DISPI_LFB_PHYSICAL_ADDRESS, 2944 vga_ram_size, vga_ram_offset); 2945 #endif 2946 } 2947 return 0; 2948 } 2949 #endif /* !VBOX */ 2950 2951 #endif /* !VBOX || !IN_RC || !IN_RING0 */ 2952 2953 2954 2955 #ifdef VBOX /* VirtualBox code start */ 2438 } 2439 2440 #endif /* !IN_RING0 */ 2441 2956 2442 2957 2443 … … 5255 4741 if (x + w > s->pDrv->cx) 5256 4742 { 5257 #ifndef VBOX5258 w = s->pDrv->cx > x? s->pDrv->cx - x: 0;5259 #else5260 4743 // x < 0 is not possible here 5261 4744 w = s->pDrv->cx > (uint32_t)x? s->pDrv->cx - x: 0; 5262 #endif5263 4745 } 5264 4746 5265 4747 if (y + h > s->pDrv->cy) 5266 4748 { 5267 #ifndef VBOX5268 h = s->pDrv->cy > y? s->pDrv->cy - y: 0;5269 #else5270 4749 // y < 0 is not possible here 5271 4750 h = s->pDrv->cy > (uint32_t)y? s->pDrv->cy - y: 0; 5272 #endif5273 4751 } 5274 4752 … … 5798 5276 RTLogPrintf("%c", ch); 5799 5277 5800 #ifndef VBOX5801 src += 4;5802 #else5803 5278 src += 8; /* Every second byte of a plane is used in text mode. */ 5804 #endif5805 5279 } 5806 5280 if (cx_max != -1) … … 6294 5768 if (RT_FAILURE(rc)) 6295 5769 return rc; 6296 #if 06297 /* This now causes conflicts with Win2k & XP; it is not aware this range is taken6298 and tries to map other devices there */6299 /* Old Bochs. */6300 rc = PDMDevHlpIOPortRegister(pDevIns, 0xff80, 1, NULL, vgaIOPortWriteVBEIndex, vgaIOPortReadVBEIndex, "VGA/VBE - Index Old");6301 if (RT_FAILURE(rc))6302 return rc;6303 rc = PDMDevHlpIOPortRegister(pDevIns, 0xff81, 1, NULL, vgaIOPortWriteVBEData, vgaIOPortReadVBEData, "VGA/VBE - Data Old");6304 if (RT_FAILURE(rc))6305 return rc;6306 #endif6307 5770 #endif /* CONFIG_BOCHS_VBE */ 6308 5771 … … 6332 5795 if (RT_FAILURE(rc)) 6333 5796 return rc; 6334 6335 #if 06336 /* This now causes conflicts with Win2k & XP; they are not aware this range is taken6337 and try to map other devices there */6338 /* Old Bochs. */6339 rc = PDMDevHlpIOPortRegisterRC(pDevIns, 0xff80, 1, 0, "vgaIOPortWriteVBEIndex", "vgaIOPortReadVBEIndex", "VGA/VBE - Index Old (GC)");6340 if (RT_FAILURE(rc))6341 return rc;6342 rc = PDMDevHlpIOPortRegisterRC(pDevIns, 0xff81, 1, 0, "vgaIOPortWriteVBEData", "vgaIOPortReadVBEData", "VGA/VBE - Index Old (GC)");6343 if (RT_FAILURE(rc))6344 return rc;6345 #endif6346 6347 5797 #endif /* CONFIG_BOCHS_VBE */ 6348 5798 } … … 6373 5823 if (RT_FAILURE(rc)) 6374 5824 return rc; 6375 6376 #if 06377 /* This now causes conflicts with Win2k & XP; they are not aware this range is taken6378 and try to map other devices there */6379 /* Old Bochs. */6380 rc = PDMDevHlpIOPortRegisterR0(pDevIns, 0xff80, 1, 0, "vgaIOPortWriteVBEIndex", "vgaIOPortReadVBEIndex", "VGA/VBE - Index Old (GC)");6381 if (RT_FAILURE(rc))6382 return rc;6383 rc = PDMDevHlpIOPortRegisterR0(pDevIns, 0xff81, 1, 0, "vgaIOPortWriteVBEData", "vgaIOPortReadVBEData", "VGA/VBE - Index Old (GC)");6384 if (RT_FAILURE(rc))6385 return rc;6386 #endif6387 6388 5825 #endif /* CONFIG_BOCHS_VBE */ 6389 5826 } … … 7010 6447 7011 6448 #endif /* !IN_RING3 */ 7012 #endif /* VBOX */7013 6449 #endif /* !VBOX_DEVICE_STRUCT_TESTCASE */ 7014 6450
Note:
See TracChangeset
for help on using the changeset viewer.