Changeset 81984 in vbox for trunk/src/VBox/Devices/PC/DevDMA.cpp
- Timestamp:
- Nov 19, 2019 10:43:45 AM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 134783
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/PC/DevDMA.cpp
r81979 r81984 126 126 uint32_t is16bit; /* True for 16-bit DMA. */ 127 127 uint8_t abPadding1[4]; 128 } DMAControl; 128 /** The base abd current address I/O port registration. */ 129 IOMIOPORTHANDLE hIoPortBase; 130 /** The control register I/O port registration. */ 131 IOMIOPORTHANDLE hIoPortCtl; 132 /** The page registers I/O port registration. */ 133 IOMIOPORTHANDLE hIoPortPage; 134 /** The EISA style high page registers I/O port registration. */ 135 IOMIOPORTHANDLE hIoPortHi; 136 } DMAControl, DMACONTROLLER; 137 /** Pointer to the shared DMA controller state. */ 138 typedef DMACONTROLLER *PDMACONTROLLER; 129 139 130 140 /* Complete DMA state information. */ … … 245 255 * @callback_method_impl{FNIOMIOPORTOUT, Ports 0-7 & 0xc0-0xcf} 246 256 */ 247 PDMBOTHCBDECL(int) dmaWriteAddr(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT port, uint32_t u32, unsigned cb)257 static DECLCALLBACK(VBOXSTRICTRC) dmaWriteAddr(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t u32, unsigned cb) 248 258 { 249 259 RT_NOREF(pDevIns); … … 255 265 256 266 Assert(!(u32 & ~0xff)); /* Check for garbage in high bits. */ 257 reg = ( port >> dc->is16bit) & 0x0f;267 reg = (offPort >> dc->is16bit) & 0x0f; 258 268 chidx = reg >> 1; 259 269 is_count = reg & 1; … … 278 288 ch->u16BaseAddr = RT_MAKE_U16(u32, RT_HIBYTE(ch->u16BaseAddr)); 279 289 } 280 Log2(("dmaWriteAddr: port %#06x, chidx %d, data %#02x\n", 281 port, chidx, u32)); 290 Log2(("dmaWriteAddr: offPort %#06x, chidx %d, data %#02x\n", offPort, chidx, u32)); 282 291 } 283 292 else 284 293 { 285 294 /* Likely a guest bug. */ 286 Log(("Bad size write to count register %#x (size %d, data %#x)\n", 287 port, cb, u32)); 295 Log(("Bad size write to count register %#x (size %d, data %#x)\n", offPort, cb, u32)); 288 296 } 289 297 return VINF_SUCCESS; … … 294 302 * @callback_method_impl{FNIOMIOPORTIN, Ports 0-7 & 0xc0-0xcf} 295 303 */ 296 PDMBOTHCBDECL(int) dmaReadAddr(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT port, uint32_t *pu32, unsigned cb)304 static DECLCALLBACK(VBOXSTRICTRC) dmaReadAddr(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t *pu32, unsigned cb) 297 305 { 298 306 RT_NOREF(pDevIns); … … 304 312 int bptr; 305 313 306 reg = ( port >> dc->is16bit) & 0x0f;314 reg = (offPort >> dc->is16bit) & 0x0f; 307 315 chidx = reg >> 1; 308 316 ch = &dc->ChState[chidx]; … … 317 325 *pu32 = RT_LOBYTE(val >> (bptr * 8)); 318 326 319 Log(("Count read: port %#06x, reg %#04x, data %#x\n", port, reg, val));327 Log(("Count read: offPort %#06x, reg %#04x, data %#x\n", offPort, reg, val)); 320 328 return VINF_SUCCESS; 321 329 } … … 328 336 * @callback_method_impl{FNIOMIOPORTOUT, Ports 0x8-0xf & 0xd0-0xdf} 329 337 */ 330 PDMBOTHCBDECL(int) dmaWriteCtl(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT port, uint32_t u32, unsigned cb)338 static DECLCALLBACK(VBOXSTRICTRC) dmaWriteCtl(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t u32, unsigned cb) 331 339 { 332 340 RT_NOREF(pDevIns); … … 334 342 { 335 343 DMAControl *dc = (DMAControl *)pvUser; 336 int chidx = 0; 337 int reg; 338 339 reg = ((port >> dc->is16bit) & 0x0f) - 8; 340 Assert((reg >= CTL_W_CMD && reg <= CTL_W_MASK)); 344 unsigned chidx = 0; 345 346 unsigned const reg = (offPort >> dc->is16bit) & 0x0f; 347 Assert((int)reg >= CTL_W_CMD && reg <= CTL_W_MASK); 341 348 Assert(!(u32 & ~0xff)); /* Check for garbage in high bits. */ 342 349 … … 396 403 break; 397 404 } 398 Log(("dmaWriteCtl: port %#06x, chidx %d, data %#02x\n", 399 port, chidx, u32)); 405 Log(("dmaWriteCtl: offPort %#06x, chidx %d, data %#02x\n", offPort, chidx, u32)); 400 406 } 401 407 else 402 408 { 403 409 /* Likely a guest bug. */ 404 Log(("Bad size write to controller register %#x (size %d, data %#x)\n", 405 port, cb, u32)); 410 Log(("Bad size write to controller register %#x (size %d, data %#x)\n", offPort, cb, u32)); 406 411 } 407 412 return VINF_SUCCESS; … … 412 417 * @callback_method_impl{FNIOMIOPORTIN, Ports 0x8-0xf & 0xd0-0xdf} 413 418 */ 414 PDMBOTHCBDECL(int) dmaReadCtl(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT port, uint32_t *pu32, unsigned cb)419 static DECLCALLBACK(VBOXSTRICTRC) dmaReadCtl(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t *pu32, unsigned cb) 415 420 { 416 421 RT_NOREF(pDevIns); … … 419 424 DMAControl *dc = (DMAControl *)pvUser; 420 425 uint8_t val = 0; 421 int reg; 422 423 reg = ((port >> dc->is16bit) & 0x0f) - 8; 424 Assert((reg >= CTL_R_STAT && reg <= CTL_R_MASK)); 426 427 unsigned const reg = (offPort >> dc->is16bit) & 0x0f; 428 Assert((int)reg >= CTL_R_STAT && reg <= CTL_R_MASK); 425 429 426 430 switch (reg) … … 457 461 } 458 462 459 Log(("Ctrl read: port %#06x, reg %#04x, data %#x\n", port, reg, val));463 Log(("Ctrl read: offPort %#06x, reg %#04x, data %#x\n", offPort, reg, val)); 460 464 *pu32 = val; 461 465 … … 476 480 * a BIOS. 477 481 */ 478 PDMBOTHCBDECL(int) dmaReadPage(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT port, uint32_t *pu32, unsigned cb)482 static DECLCALLBACK(VBOXSTRICTRC) dmaReadPage(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t *pu32, unsigned cb) 479 483 { 480 484 RT_NOREF(pDevIns); … … 484 488 if (cb == 1) 485 489 { 486 reg = port & 7;490 reg = offPort & 7; 487 491 *pu32 = dc->au8Page[reg]; 488 Log2(("Read %#x (byte) from page register %#x (channel %d)\n", 489 *pu32, port, DMAPG2CX(reg))); 492 Log2(("Read %#x (byte) from page register %#x (channel %d)\n", *pu32, offPort, DMAPG2CX(reg))); 490 493 return VINF_SUCCESS; 491 494 } … … 493 496 if (cb == 2) 494 497 { 495 reg = port & 7;498 reg = offPort & 7; 496 499 *pu32 = dc->au8Page[reg] | (dc->au8Page[(reg + 1) & 7] << 8); 497 Log2(("Read %#x (word) from page register %#x (channel %d)\n", 498 *pu32, port, DMAPG2CX(reg))); 500 Log2(("Read %#x (word) from page register %#x (channel %d)\n", *pu32, offPort, DMAPG2CX(reg))); 499 501 return VINF_SUCCESS; 500 502 } … … 508 510 * DMA page registers - Ports 0x80-0x87 & 0x88-0x8f} 509 511 */ 510 PDMBOTHCBDECL(int) dmaWritePage(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT port, uint32_t u32, unsigned cb)512 static DECLCALLBACK(VBOXSTRICTRC) dmaWritePage(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t u32, unsigned cb) 511 513 { 512 514 RT_NOREF(pDevIns); … … 517 519 { 518 520 Assert(!(u32 & ~0xff)); /* Check for garbage in high bits. */ 519 reg = port & 7;521 reg = offPort & 7; 520 522 dc->au8Page[reg] = u32; 521 523 dc->au8PageHi[reg] = 0; /* Corresponding high page cleared. */ 522 Log2(("Wrote %#x to page register %#x (channel %d)\n", 523 u32, port, DMAPG2CX(reg))); 524 Log2(("Wrote %#x to page register %#x (channel %d)\n", u32, offPort, DMAPG2CX(reg))); 524 525 } 525 526 else if (cb == 2) 526 527 { 527 528 Assert(!(u32 & ~0xffff)); /* Check for garbage in high bits. */ 528 reg = port & 7;529 reg = offPort & 7; 529 530 dc->au8Page[reg] = u32; 530 531 dc->au8PageHi[reg] = 0; /* Corresponding high page cleared. */ 531 reg = ( port + 1) & 7;532 reg = (offPort + 1) & 7; 532 533 dc->au8Page[reg] = u32 >> 8; 533 534 dc->au8PageHi[reg] = 0; /* Corresponding high page cleared. */ … … 536 537 { 537 538 /* Likely a guest bug. */ 538 Log(("Bad size write to page register %#x (size %d, data %#x)\n", 539 port, cb, u32)); 539 Log(("Bad size write to page register %#x (size %d, data %#x)\n", offPort, cb, u32)); 540 540 } 541 541 return VINF_SUCCESS; … … 548 548 * the entire 32-bit address space. Ports 0x480-0x487 & 0x488-0x48f} 549 549 */ 550 PDMBOTHCBDECL(int) dmaReadHiPage(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT port, uint32_t *pu32, unsigned cb)550 static DECLCALLBACK(VBOXSTRICTRC) dmaReadHiPage(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t *pu32, unsigned cb) 551 551 { 552 552 RT_NOREF(pDevIns); … … 556 556 int reg; 557 557 558 reg = port & 7;558 reg = offPort & 7; 559 559 *pu32 = dc->au8PageHi[reg]; 560 Log2(("Read %#x to from high page register %#x (channel %d)\n", 561 *pu32, port, DMAPG2CX(reg))); 560 Log2(("Read %#x to from high page register %#x (channel %d)\n", *pu32, offPort, DMAPG2CX(reg))); 562 561 return VINF_SUCCESS; 563 562 } … … 569 568 * @callback_method_impl{FNIOMIOPORTOUT, Ports 0x480-0x487 & 0x488-0x48f} 570 569 */ 571 PDMBOTHCBDECL(int) dmaWriteHiPage(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT port, uint32_t u32, unsigned cb)570 static DECLCALLBACK(VBOXSTRICTRC) dmaWriteHiPage(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t u32, unsigned cb) 572 571 { 573 572 RT_NOREF(pDevIns); … … 578 577 579 578 Assert(!(u32 & ~0xff)); /* Check for garbage in high bits. */ 580 reg = port & 7;579 reg = offPort & 7; 581 580 dc->au8PageHi[reg] = u32; 582 Log2(("Wrote %#x to high page register %#x (channel %d)\n", 583 u32, port, DMAPG2CX(reg))); 581 Log2(("Wrote %#x to high page register %#x (channel %d)\n", u32, offPort, DMAPG2CX(reg))); 584 582 } 585 583 else 586 584 { 587 585 /* Likely a guest bug. */ 588 Log(("Bad size write to high page register %#x (size %d, data %#x)\n", 589 port, cb, u32)); 586 Log(("Bad size write to high page register %#x (size %d, data %#x)\n", offPort, cb, u32)); 590 587 } 591 588 return VINF_SUCCESS; … … 846 843 dmaClear(&pThis->DMAC[0]); 847 844 dmaClear(&pThis->DMAC[1]); 848 }849 850 /** Register DMA I/O port handlers. */851 static int dmaIORegister(PPDMDEVINS pDevIns, bool fHighPage)852 {853 DMAState *pThis = PDMDEVINS_2_DATA(pDevIns, PDMASTATE);854 DMAControl *dc8 = &pThis->DMAC[0];855 DMAControl *dc16 = &pThis->DMAC[1];856 int rc;857 858 dc8->is16bit = false;859 dc16->is16bit = true;860 861 /* Base and current address for each channel. */862 rc = PDMDevHlpIOPortRegister(pThis->pDevIns, 0x00, 8, dc8, dmaWriteAddr, dmaReadAddr, NULL, NULL, "DMA8 Address");863 AssertLogRelRCReturn(rc, rc);864 rc = PDMDevHlpIOPortRegister(pThis->pDevIns, 0xC0, 16, dc16, dmaWriteAddr, dmaReadAddr, NULL, NULL, "DMA16 Address");865 AssertLogRelRCReturn(rc, rc);866 867 /* Control registers for both DMA controllers. */868 rc = PDMDevHlpIOPortRegister(pThis->pDevIns, 0x08, 8, dc8, dmaWriteCtl, dmaReadCtl, NULL, NULL, "DMA8 Control");869 AssertLogRelRCReturn(rc, rc);870 rc = PDMDevHlpIOPortRegister(pThis->pDevIns, 0xD0, 16, dc16, dmaWriteCtl, dmaReadCtl, NULL, NULL, "DMA16 Control");871 AssertLogRelRCReturn(rc, rc);872 873 /* Page registers for each channel (plus a few unused ones). */874 rc = PDMDevHlpIOPortRegister(pThis->pDevIns, 0x80, 8, dc8, dmaWritePage, dmaReadPage, NULL, NULL, "DMA8 Page");875 AssertLogRelRCReturn(rc, rc);876 rc = PDMDevHlpIOPortRegister(pThis->pDevIns, 0x88, 8, dc16, dmaWritePage, dmaReadPage, NULL, NULL, "DMA16 Page");877 AssertLogRelRCReturn(rc, rc);878 879 /* Optional EISA style high page registers (address bits 24-31). */880 if (fHighPage)881 {882 rc = PDMDevHlpIOPortRegister(pThis->pDevIns, 0x480, 8, dc8, dmaWriteHiPage, dmaReadHiPage, NULL, NULL, "DMA8 Page High");883 AssertLogRelRCReturn(rc, rc);884 rc = PDMDevHlpIOPortRegister(pThis->pDevIns, 0x488, 8, dc16, dmaWriteHiPage, dmaReadHiPage, NULL, NULL, "DMA16 Page High");885 AssertLogRelRCReturn(rc, rc);886 }887 888 if (pDevIns->fRCEnabled)889 {890 /*891 * Ditto for raw-mode.892 */893 RTRCPTR RCPtrDc8 = PDMINS_2_DATA_RCPTR(pDevIns) + RT_OFFSETOF(DMAState, DMAC[0]);894 RTRCPTR RCPtrDc16 = PDMINS_2_DATA_RCPTR(pDevIns) + RT_OFFSETOF(DMAState, DMAC[1]);895 896 /* Base and current address for each channel. */897 rc = PDMDevHlpIOPortRegisterRC(pThis->pDevIns, 0x00, 8, RCPtrDc8, "dmaWriteAddr", "dmaReadAddr", NULL, NULL, "DMA8 Address");898 AssertLogRelRCReturn(rc, rc);899 rc = PDMDevHlpIOPortRegisterRC(pThis->pDevIns, 0xC0, 16, RCPtrDc16, "dmaWriteAddr", "dmaReadAddr", NULL, NULL, "DMA16 Address");900 AssertLogRelRCReturn(rc, rc);901 902 /* Control registers for both DMA controllers. */903 rc = PDMDevHlpIOPortRegisterRC(pThis->pDevIns, 0x08, 8, RCPtrDc8, "dmaWriteCtl", "dmaReadCtl", NULL, NULL, "DMA8 Control");904 AssertLogRelRCReturn(rc, rc);905 rc = PDMDevHlpIOPortRegisterRC(pThis->pDevIns, 0xD0, 16, RCPtrDc16, "dmaWriteCtl", "dmaReadCtl", NULL, NULL, "DMA16 Control");906 AssertLogRelRCReturn(rc, rc);907 908 /* Page registers for each channel (plus a few unused ones). */909 rc = PDMDevHlpIOPortRegisterRC(pThis->pDevIns, 0x80, 8, RCPtrDc8, "dmaWritePage", "dmaReadPage", NULL, NULL, "DMA8 Page");910 AssertLogRelRCReturn(rc, rc);911 rc = PDMDevHlpIOPortRegisterRC(pThis->pDevIns, 0x88, 8, RCPtrDc16, "dmaWritePage", "dmaReadPage", NULL, NULL, "DMA16 Page");912 AssertLogRelRCReturn(rc, rc);913 914 /* Optional EISA style high page registers (address bits 24-31). */915 if (fHighPage)916 {917 rc = PDMDevHlpIOPortRegisterRC(pThis->pDevIns, 0x480, 8, RCPtrDc8, "dmaWriteHiPage", "dmaReadHiPage", NULL, NULL, "DMA8 Page High");918 AssertLogRelRCReturn(rc, rc);919 rc = PDMDevHlpIOPortRegisterRC(pThis->pDevIns, 0x488, 8, RCPtrDc16, "dmaWriteHiPage", "dmaReadHiPage", NULL, NULL, "DMA16 Page High");920 AssertLogRelRCReturn(rc, rc);921 }922 }923 if (pDevIns->fR0Enabled)924 {925 /*926 * Ditto for ring-0.927 */928 RTR0PTR R0PtrDc8 = PDMINS_2_DATA_R0PTR(pDevIns) + RT_OFFSETOF(DMAState, DMAC[0]);929 RTR0PTR R0PtrDc16 = PDMINS_2_DATA_R0PTR(pDevIns) + RT_OFFSETOF(DMAState, DMAC[1]);930 931 /* Base and current address for each channel. */932 rc = PDMDevHlpIOPortRegisterR0(pThis->pDevIns, 0x00, 8, R0PtrDc8, "dmaWriteAddr", "dmaReadAddr", NULL, NULL, "DMA8 Address");933 AssertLogRelRCReturn(rc, rc);934 rc = PDMDevHlpIOPortRegisterR0(pThis->pDevIns, 0xC0, 16, R0PtrDc16, "dmaWriteAddr", "dmaReadAddr", NULL, NULL, "DMA16 Address");935 AssertLogRelRCReturn(rc, rc);936 937 /* Control registers for both DMA controllers. */938 rc = PDMDevHlpIOPortRegisterR0(pThis->pDevIns, 0x08, 8, R0PtrDc8, "dmaWriteCtl", "dmaReadCtl", NULL, NULL, "DMA8 Control");939 AssertLogRelRCReturn(rc, rc);940 rc = PDMDevHlpIOPortRegisterR0(pThis->pDevIns, 0xD0, 16, R0PtrDc16, "dmaWriteCtl", "dmaReadCtl", NULL, NULL, "DMA16 Control");941 AssertLogRelRCReturn(rc, rc);942 943 /* Page registers for each channel (plus a few unused ones). */944 rc = PDMDevHlpIOPortRegisterR0(pThis->pDevIns, 0x80, 8, R0PtrDc8, "dmaWritePage", "dmaReadPage", NULL, NULL, "DMA8 Page");945 AssertLogRelRCReturn(rc, rc);946 rc = PDMDevHlpIOPortRegisterR0(pThis->pDevIns, 0x88, 8, R0PtrDc16, "dmaWritePage", "dmaReadPage", NULL, NULL, "DMA16 Page");947 AssertLogRelRCReturn(rc, rc);948 949 /* Optional EISA style high page registers (address bits 24-31). */950 if (fHighPage)951 {952 rc = PDMDevHlpIOPortRegisterR0(pThis->pDevIns, 0x480, 8, R0PtrDc8, "dmaWriteHiPage", "dmaReadHiPage", NULL, NULL, "DMA8 Page High");953 AssertLogRelRCReturn(rc, rc);954 rc = PDMDevHlpIOPortRegisterR0(pThis->pDevIns, 0x488, 8, R0PtrDc16, "dmaWriteHiPage", "dmaReadHiPage", NULL, NULL, "DMA16 Page High");955 AssertLogRelRCReturn(rc, rc);956 }957 }958 959 return VINF_SUCCESS;960 845 } 961 846 … … 1083 968 pThis->pDevIns = pDevIns; 1084 969 970 DMAControl *pDC8 = &pThis->DMAC[0]; 971 DMAControl *pDC16 = &pThis->DMAC[1]; 972 pDC8->is16bit = false; 973 pDC16->is16bit = true; 974 1085 975 /* 1086 976 * Validate and read the configuration. … … 1090 980 bool fHighPage = false; 1091 981 int rc = pHlp->pfnCFGMQueryBoolDef(pCfg, "HighPageEnable", &fHighPage, false); 1092 AssertR eturn(rc, rc);982 AssertRCReturn(rc, rc); 1093 983 1094 984 /* 1095 985 * Register I/O callbacks. 1096 986 */ 1097 rc = dmaIORegister(pDevIns, fHighPage); 987 /* Base and current address for each channel. */ 988 rc = PDMDevHlpIoPortCreateUAndMap(pDevIns, 0x00, 8, dmaWriteAddr, dmaReadAddr, pDC8, "DMA8 Address", NULL, &pDC8->hIoPortBase); 1098 989 AssertLogRelRCReturn(rc, rc); 990 rc = PDMDevHlpIoPortCreateUAndMap(pDevIns, 0xc0, 16, dmaWriteAddr, dmaReadAddr, pDC16, "DMA16 Address", NULL, &pDC16->hIoPortBase); 991 AssertLogRelRCReturn(rc, rc); 992 993 /* Control registers for both DMA controllers. */ 994 rc = PDMDevHlpIoPortCreateUAndMap(pDevIns, 0x08, 8, dmaWriteCtl, dmaReadCtl, pDC8, "DMA8 Control", NULL, &pDC8->hIoPortCtl); 995 AssertLogRelRCReturn(rc, rc); 996 rc = PDMDevHlpIoPortCreateUAndMap(pDevIns, 0xd0, 16, dmaWriteCtl, dmaReadCtl, pDC16, "DMA16 Control", NULL, &pDC16->hIoPortCtl); 997 AssertLogRelRCReturn(rc, rc); 998 999 /* Page registers for each channel (plus a few unused ones). */ 1000 rc = PDMDevHlpIoPortCreateUAndMap(pDevIns, 0x80, 8, dmaWritePage, dmaReadPage, pDC8, "DMA8 Page", NULL, &pDC8->hIoPortPage); 1001 AssertLogRelRCReturn(rc, rc); 1002 rc = PDMDevHlpIoPortCreateUAndMap(pDevIns, 0x88, 8, dmaWritePage, dmaReadPage, pDC16, "DMA16 Page", NULL, &pDC16->hIoPortPage); 1003 AssertLogRelRCReturn(rc, rc); 1004 1005 /* Optional EISA style high page registers (address bits 24-31). */ 1006 if (fHighPage) 1007 { 1008 rc = PDMDevHlpIoPortCreateUAndMap(pDevIns, 0x480, 8, dmaWriteHiPage, dmaReadHiPage, pDC8, "DMA8 Page High", NULL, &pDC8->hIoPortHi); 1009 AssertLogRelRCReturn(rc, rc); 1010 rc = PDMDevHlpIoPortCreateUAndMap(pDevIns, 0x488, 8, dmaWriteHiPage, dmaReadHiPage, pDC16, "DMA16 Page High", NULL, &pDC16->hIoPortHi); 1011 AssertLogRelRCReturn(rc, rc); 1012 } 1013 else 1014 { 1015 pDC8->hIoPortHi = NIL_IOMIOPORTHANDLE; 1016 pDC16->hIoPortHi = NIL_IOMIOPORTHANDLE; 1017 } 1099 1018 1100 1019 /* … … 1116 1035 1117 1036 rc = PDMDevHlpDMACRegister(pDevIns, &Reg, &pThis->pHlp); 1118 AssertR eturn(rc, rc);1037 AssertRCReturn(rc, rc); 1119 1038 1120 1039 /* … … 1122 1041 */ 1123 1042 rc = PDMDevHlpSSMRegister(pDevIns, DMA_SAVESTATE_CURRENT, sizeof(*pThis), dmaSaveExec, dmaLoadExec); 1124 AssertR eturn(rc, rc);1043 AssertRCReturn(rc, rc); 1125 1044 1126 1045 return VINF_SUCCESS; 1127 1046 } 1128 1047 1129 #endif /* IN_RING3 */ 1048 #else /* !IN_RING3 */ 1049 1050 /** 1051 * @callback_method_impl{PDMDEVREGR0,pfnConstruct} 1052 */ 1053 static DECLCALLBACK(int) dmaRZConstruct(PPDMDEVINS pDevIns) 1054 { 1055 PDMDEV_CHECK_VERSIONS_RETURN(pDevIns); 1056 PDMASTATE pThis = PDMDEVINS_2_DATA(pDevIns, PDMASTATE); 1057 int rc; 1058 1059 for (unsigned i = 0; i < RT_ELEMENTS(pThis->DMAC); i++) 1060 { 1061 PDMACONTROLLER pCtl = &pThis->DMAC[i]; 1062 1063 rc = PDMDevHlpIoPortSetUpContext(pDevIns, pCtl->hIoPortBase, dmaWriteAddr, dmaReadAddr, pCtl); 1064 AssertLogRelRCReturn(rc, rc); 1065 1066 rc = PDMDevHlpIoPortSetUpContext(pDevIns, pCtl->hIoPortCtl, dmaWriteCtl, dmaReadCtl, pCtl); 1067 AssertLogRelRCReturn(rc, rc); 1068 1069 rc = PDMDevHlpIoPortSetUpContext(pDevIns, pCtl->hIoPortPage, dmaWritePage, dmaReadPage, pCtl); 1070 AssertLogRelRCReturn(rc, rc); 1071 1072 if (pCtl->hIoPortHi != NIL_IOMIOPORTHANDLE) 1073 { 1074 rc = PDMDevHlpIoPortSetUpContext(pDevIns, pCtl->hIoPortHi, dmaWriteHiPage, dmaReadHiPage, pCtl); 1075 AssertLogRelRCReturn(rc, rc); 1076 } 1077 } 1078 1079 return VINF_SUCCESS; 1080 } 1081 1082 #endif /* !IN_RING3 */ 1130 1083 1131 1084 /** … … 1174 1127 #elif defined(IN_RING0) 1175 1128 /* .pfnEarlyConstruct = */ NULL, 1176 /* .pfnConstruct = */ NULL,1129 /* .pfnConstruct = */ dmaRZConstruct, 1177 1130 /* .pfnDestruct = */ NULL, 1178 1131 /* .pfnFinalDestruct = */ NULL, … … 1187 1140 /* .pfnReserved7 = */ NULL, 1188 1141 #elif defined(IN_RC) 1189 /* .pfnConstruct = */ NULL,1142 /* .pfnConstruct = */ dmaRZConstruct, 1190 1143 /* .pfnReserved0 = */ NULL, 1191 1144 /* .pfnReserved1 = */ NULL,
Note:
See TracChangeset
for help on using the changeset viewer.