Changeset 81986 in vbox for trunk/src/VBox/Devices
- Timestamp:
- Nov 19, 2019 11:15:22 AM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 134785
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/PC/DevDMA.cpp
r81985 r81986 260 260 static DECLCALLBACK(VBOXSTRICTRC) dmaWriteAddr(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t u32, unsigned cb) 261 261 { 262 PDMACONTROLLER dc = (PDMACONTROLLER)pvUser; 262 263 RT_NOREF(pDevIns); 263 264 if (cb == 1) 264 265 { 265 PDMACONTROLLER dc = (PDMACONTROLLER)pvUser;266 266 unsigned const reg = (offPort >> dc->is16bit) & 0x0f; 267 267 unsigned const chidx = reg >> 1; … … 289 289 ch->u16BaseAddr = RT_MAKE_U16(u32, RT_HIBYTE(ch->u16BaseAddr)); 290 290 } 291 Log2(("dmaWriteAddr : offPort %#06x, chidx %d, data %#02x\n", offPort, chidx, u32));291 Log2(("dmaWriteAddr/%u: offPort %#06x, chidx %d, data %#02x\n", dc->is16bit, offPort, chidx, u32)); 292 292 } 293 293 else 294 294 { 295 295 /* Likely a guest bug. */ 296 Log((" Bad size write to count register %#x (size %d, data %#x)\n", offPort, cb, u32));296 Log(("dmaWriteAddr/%u: Bad size write to count register %#x (size %d, data %#x)\n", dc->is16bit, offPort, cb, u32)); 297 297 } 298 298 return VINF_SUCCESS; … … 324 324 *pu32 = RT_LOBYTE(val >> (bptr * 8)); 325 325 326 Log((" Count read: offPort %#06x, reg %#04x, data %#x\n", offPort, reg, val));326 Log(("dmaReadAddr/%u: Count read: offPort %#06x, reg %#04x, data %#x\n", dc->is16bit, offPort, reg, val)); 327 327 return VINF_SUCCESS; 328 328 } … … 337 337 static DECLCALLBACK(VBOXSTRICTRC) dmaWriteCtl(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t u32, unsigned cb) 338 338 { 339 PDMACONTROLLER dc = (PDMACONTROLLER)pvUser; 339 340 RT_NOREF(pDevIns); 340 341 if (cb == 1) 341 342 { 342 PDMACONTROLLER dc = (PDMACONTROLLER)pvUser;343 343 unsigned chidx = 0; 344 345 344 unsigned const reg = (offPort >> dc->is16bit) & 0x0f; 346 345 Assert((int)reg >= CTL_W_CMD && reg <= CTL_W_MASK); … … 352 351 if (u32 & CMD_UNSUPPORTED) 353 352 { 354 Log((" DMA command %#x is not supported, ignoring!\n", u32));353 Log(("dmaWriteCtl/%u: DMA command %#x is not supported, ignoring!\n", dc->is16bit, u32)); 355 354 break; 356 355 } … … 375 374 chidx = u32 & 3; 376 375 dc->ChState[chidx].u8Mode = u32; 377 Log2((" chidx %d, op %d, %sauto-init, %screment, opmode %d\n",376 Log2(("dmaWriteCtl/%u: chidx %d, op %d, %sauto-init, %screment, opmode %d\n", dc->is16bit, 378 377 chidx, (u32 >> 2) & 3, IS_MODE_AI(u32) ? "" : "no ", IS_MODE_DEC(u32) ? "de" : "in", (u32 >> 6) & 3)); 379 378 break; … … 394 393 break; 395 394 } 396 Log(("dmaWriteCtl : offPort %#06x, chidx %d, data %#02x\n", offPort, chidx, u32));395 Log(("dmaWriteCtl/%u: offPort %#06x, chidx %d, data %#02x\n", dc->is16bit, offPort, chidx, u32)); 397 396 } 398 397 else 399 398 { 400 399 /* Likely a guest bug. */ 401 Log((" Bad size write to controller register %#x (size %d, data %#x)\n", offPort, cb, u32));400 Log(("dmaWriteCtl/%u: Bad size write to controller register %#x (size %d, data %#x)\n", dc->is16bit, offPort, cb, u32)); 402 401 } 403 402 return VINF_SUCCESS; … … 452 451 } 453 452 454 Log((" Ctrl read: offPort %#06x, reg %#04x, data %#x\n", offPort, reg, val));453 Log(("dmaReadCtl/%u: Ctrl read: offPort %#06x, reg %#04x, data %#x\n", dc->is16bit, offPort, reg, val)); 455 454 *pu32 = val; 456 455 … … 481 480 reg = offPort & 7; 482 481 *pu32 = dc->au8Page[reg]; 483 Log2((" Read %#x (byte) from page register %#x (channel %d)\n", *pu32, offPort, DMAPG2CX(reg)));482 Log2(("dmaReadPage/%u: Read %#x (byte) from page register %#x (channel %d)\n", dc->is16bit, *pu32, offPort, DMAPG2CX(reg))); 484 483 return VINF_SUCCESS; 485 484 } … … 489 488 reg = offPort & 7; 490 489 *pu32 = dc->au8Page[reg] | (dc->au8Page[(reg + 1) & 7] << 8); 491 Log2((" Read %#x (word) from page register %#x (channel %d)\n", *pu32, offPort, DMAPG2CX(reg)));490 Log2(("dmaReadPage/%u: Read %#x (word) from page register %#x (channel %d)\n", dc->is16bit, *pu32, offPort, DMAPG2CX(reg))); 492 491 return VINF_SUCCESS; 493 492 } … … 513 512 dc->au8Page[reg] = u32; 514 513 dc->au8PageHi[reg] = 0; /* Corresponding high page cleared. */ 515 Log2((" Wrote %#x to page register %#x (channel %d)\n", u32, offPort, DMAPG2CX(reg)));514 Log2(("dmaWritePage/%u: Wrote %#x to page register %#x (channel %d)\n", dc->is16bit, u32, offPort, DMAPG2CX(reg))); 516 515 } 517 516 else if (cb == 2) … … 528 527 { 529 528 /* Likely a guest bug. */ 530 Log((" Bad size write to page register %#x (size %d, data %#x)\n", offPort, cb, u32));529 Log(("dmaWritePage/%u: Bad size write to page register %#x (size %d, data %#x)\n", dc->is16bit, offPort, cb, u32)); 531 530 } 532 531 return VINF_SUCCESS; … … 548 547 549 548 *pu32 = dc->au8PageHi[reg]; 550 Log2((" Read %#x to from high page register %#x (channel %d)\n", *pu32, offPort, DMAPG2CX(reg)));549 Log2(("dmaReadHiPage/%u: Read %#x to from high page register %#x (channel %d)\n", dc->is16bit, *pu32, offPort, DMAPG2CX(reg))); 551 550 return VINF_SUCCESS; 552 551 } … … 561 560 { 562 561 RT_NOREF(pDevIns); 562 PDMACONTROLLER dc = (PDMACONTROLLER)pvUser; 563 563 if (cb == 1) 564 564 { 565 PDMACONTROLLER dc = (PDMACONTROLLER)pvUser;566 565 unsigned const reg = offPort & 7; 567 566 568 567 Assert(!(u32 & ~0xff)); /* Check for garbage in high bits. */ 569 568 dc->au8PageHi[reg] = u32; 570 Log2((" Wrote %#x to high page register %#x (channel %d)\n", u32, offPort, DMAPG2CX(reg)));569 Log2(("dmaWriteHiPage/%u: Wrote %#x to high page register %#x (channel %d)\n", dc->is16bit, u32, offPort, DMAPG2CX(reg))); 571 570 } 572 571 else 573 572 { 574 573 /* Likely a guest bug. */ 575 Log(("Bad size write to high page register %#x (size %d, data %#x)\n", offPort, cb, u32));574 Log(("Bad size write to high page register %#x (size %d, data %#x)\n", dc->is16bit, offPort, cb, u32)); 576 575 } 577 576 return VINF_SUCCESS; … … 620 619 * @interface_method_impl{PDMDMAREG,pfnRun} 621 620 */ 622 static DECLCALLBACK(bool) dmaR un(PPDMDEVINS pDevIns)621 static DECLCALLBACK(bool) dmaR3Run(PPDMDEVINS pDevIns) 623 622 { 624 623 DMAState *pThis = PDMDEVINS_2_DATA(pDevIns, PDMASTATE); … … 653 652 * @interface_method_impl{PDMDMAREG,pfnRegister} 654 653 */ 655 static DECLCALLBACK(void) dmaR egister(PPDMDEVINS pDevIns, unsigned uChannel,656 PFNDMATRANSFERHANDLER pfnTransferHandler, void *pvUser)654 static DECLCALLBACK(void) dmaR3Register(PPDMDEVINS pDevIns, unsigned uChannel, 655 PFNDMATRANSFERHANDLER pfnTransferHandler, void *pvUser) 657 656 { 658 657 DMAState *pThis = PDMDEVINS_2_DATA(pDevIns, PDMASTATE); 659 658 DMAChannel *ch = &pThis->DMAC[DMACH2C(uChannel)].ChState[uChannel & 3]; 660 659 661 LogFlow(("dmaR egister: pThis=%p uChannel=%u pfnTransferHandler=%p pvUser=%p\n", pThis, uChannel, pfnTransferHandler, pvUser));660 LogFlow(("dmaR3Register: pThis=%p uChannel=%u pfnTransferHandler=%p pvUser=%p\n", pThis, uChannel, pfnTransferHandler, pvUser)); 662 661 663 662 PDMCritSectEnter(pDevIns->pCritSectRoR3, VERR_IGNORED); … … 704 703 * @interface_method_impl{PDMDMAREG,pfnReadMemory} 705 704 */ 706 static DECLCALLBACK(uint32_t) dmaR eadMemory(PPDMDEVINS pDevIns, unsigned uChannel,707 void *pvBuffer, uint32_t off, uint32_t cbBlock)705 static DECLCALLBACK(uint32_t) dmaR3ReadMemory(PPDMDEVINS pDevIns, unsigned uChannel, 706 void *pvBuffer, uint32_t off, uint32_t cbBlock) 708 707 { 709 708 DMAState *pThis = PDMDEVINS_2_DATA(pDevIns, PDMASTATE); … … 713 712 uint32_t addr; 714 713 715 LogFlow(("dmaR eadMemory: pThis=%p uChannel=%u pvBuffer=%p off=%u cbBlock=%u\n", pThis, uChannel, pvBuffer, off, cbBlock));714 LogFlow(("dmaR3ReadMemory: pThis=%p uChannel=%u pvBuffer=%p off=%u cbBlock=%u\n", pThis, uChannel, pvBuffer, off, cbBlock)); 716 715 717 716 PDMCritSectEnter(pDevIns->pCritSectRoR3, VERR_IGNORED); … … 740 739 * @interface_method_impl{PDMDMAREG,pfnWriteMemory} 741 740 */ 742 static DECLCALLBACK(uint32_t) dma WriteMemory(PPDMDEVINS pDevIns, unsigned uChannel,743 const void *pvBuffer, uint32_t off, uint32_t cbBlock)741 static DECLCALLBACK(uint32_t) dmaR3WriteMemory(PPDMDEVINS pDevIns, unsigned uChannel, 742 const void *pvBuffer, uint32_t off, uint32_t cbBlock) 744 743 { 745 744 DMAState *pThis = PDMDEVINS_2_DATA(pDevIns, PDMASTATE); … … 749 748 uint32_t addr; 750 749 751 LogFlow(("dma WriteMemory: pThis=%p uChannel=%u pvBuffer=%p off=%u cbBlock=%u\n", pThis, uChannel, pvBuffer, off, cbBlock));750 LogFlow(("dmaR3WriteMemory: pThis=%p uChannel=%u pvBuffer=%p off=%u cbBlock=%u\n", pThis, uChannel, pvBuffer, off, cbBlock)); 752 751 if (GET_MODE_XTYP(ch->u8Mode) == DTYPE_VERIFY) 753 752 { … … 785 784 * @interface_method_impl{PDMDMAREG,pfnSetDREQ} 786 785 */ 787 static DECLCALLBACK(void) dma SetDREQ(PPDMDEVINS pDevIns, unsigned uChannel, unsigned uLevel)786 static DECLCALLBACK(void) dmaR3SetDREQ(PPDMDEVINS pDevIns, unsigned uChannel, unsigned uLevel) 788 787 { 789 788 DMAState *pThis = PDMDEVINS_2_DATA(pDevIns, PDMASTATE); … … 791 790 int chidx; 792 791 793 LogFlow(("dma SetDREQ: pThis=%p uChannel=%u uLevel=%u\n", pThis, uChannel, uLevel));792 LogFlow(("dmaR3SetDREQ: pThis=%p uChannel=%u uLevel=%u\n", pThis, uChannel, uLevel)); 794 793 795 794 PDMCritSectEnter(pDevIns->pCritSectRoR3, VERR_IGNORED); … … 805 804 * @interface_method_impl{PDMDMAREG,pfnGetChannelMode} 806 805 */ 807 static DECLCALLBACK(uint8_t) dma GetChannelMode(PPDMDEVINS pDevIns, unsigned uChannel)806 static DECLCALLBACK(uint8_t) dmaR3GetChannelMode(PPDMDEVINS pDevIns, unsigned uChannel) 808 807 { 809 808 PDMASTATE pThis = PDMDEVINS_2_DATA(pDevIns, PDMASTATE); 810 809 811 LogFlow(("dma GetChannelMode: pThis=%p uChannel=%u\n", pThis, uChannel));810 LogFlow(("dmaR3GetChannelMode: pThis=%p uChannel=%u\n", pThis, uChannel)); 812 811 813 812 PDMCritSectEnter(pDevIns->pCritSectRoR3, VERR_IGNORED); … … 818 817 819 818 820 /** 821 * @interface_method_impl{PDMDEVREG,pfnReset} 822 */ 823 static DECLCALLBACK(void) dmaReset(PPDMDEVINS pDevIns) 824 { 825 PDMASTATE pThis = PDMDEVINS_2_DATA(pDevIns, PDMASTATE); 826 827 LogFlow(("dmaReset: pThis=%p\n", pThis)); 828 829 /* NB: The page and address registers are unaffected by a reset 830 * and in an undefined state after power-up. 831 */ 832 dmaClear(&pThis->DMAC[0]); 833 dmaClear(&pThis->DMAC[1]); 834 } 835 836 static void dmaSaveController(PCPDMDEVHLPR3 pHlp, PSSMHANDLE pSSM, DMAControl *dc) 837 { 838 int chidx; 839 819 static void dmaR3SaveController(PCPDMDEVHLPR3 pHlp, PSSMHANDLE pSSM, DMAControl *dc) 820 { 840 821 /* Save controller state... */ 841 822 pHlp->pfnSSMPutU8(pSSM, dc->u8Command); … … 850 831 851 832 /* ...and all four of its channels. */ 852 for ( chidx = 0; chidx < 4; ++chidx)833 for (unsigned chidx = 0; chidx < RT_ELEMENTS(dc->ChState); ++chidx) 853 834 { 854 835 DMAChannel *ch = &dc->ChState[chidx]; … … 862 843 } 863 844 864 static int dma LoadController(PCPDMDEVHLPR3 pHlp, PSSMHANDLE pSSM, DMAControl *dc, int version)845 static int dmaR3LoadController(PCPDMDEVHLPR3 pHlp, PSSMHANDLE pSSM, DMAControl *dc, int version) 865 846 { 866 847 uint8_t u8val; 867 848 uint32_t u32val; 868 int chidx;869 849 870 850 pHlp->pfnSSMGetU8(pSSM, &dc->u8Command); … … 882 862 } 883 863 884 for ( chidx = 0; chidx < 4; ++chidx)864 for (unsigned chidx = 0; chidx < RT_ELEMENTS(dc->ChState); ++chidx) 885 865 { 886 866 DMAChannel *ch = &dc->ChState[chidx]; … … 919 899 920 900 /** @callback_method_impl{FNSSMDEVSAVEEXEC} */ 921 static DECLCALLBACK(int) dma SaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)901 static DECLCALLBACK(int) dmaR3SaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) 922 902 { 923 903 PDMASTATE pThis = PDMDEVINS_2_DATA(pDevIns, PDMASTATE); 924 904 PCPDMDEVHLPR3 pHlp = pDevIns->pHlpR3; 925 905 926 dma SaveController(pHlp, pSSM, &pThis->DMAC[0]);927 dma SaveController(pHlp, pSSM, &pThis->DMAC[1]);906 dmaR3SaveController(pHlp, pSSM, &pThis->DMAC[0]); 907 dmaR3SaveController(pHlp, pSSM, &pThis->DMAC[1]); 928 908 return VINF_SUCCESS; 929 909 } 930 910 931 911 /** @callback_method_impl{FNSSMDEVLOADEXEC} */ 932 static DECLCALLBACK(int) dma LoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass)912 static DECLCALLBACK(int) dmaR3LoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass) 933 913 { 934 914 PDMASTATE pThis = PDMDEVINS_2_DATA(pDevIns, PDMASTATE); … … 938 918 Assert(uPass == SSM_PASS_FINAL); NOREF(uPass); 939 919 940 dmaLoadController(pHlp, pSSM, &pThis->DMAC[0], uVersion); 941 return dmaLoadController(pHlp, pSSM, &pThis->DMAC[1], uVersion); 920 dmaR3LoadController(pHlp, pSSM, &pThis->DMAC[0], uVersion); 921 return dmaR3LoadController(pHlp, pSSM, &pThis->DMAC[1], uVersion); 922 } 923 924 /** 925 * @interface_method_impl{PDMDEVREG,pfnReset} 926 */ 927 static DECLCALLBACK(void) dmaR3Reset(PPDMDEVINS pDevIns) 928 { 929 PDMASTATE pThis = PDMDEVINS_2_DATA(pDevIns, PDMASTATE); 930 931 LogFlow(("dmaR3Reset: pThis=%p\n", pThis)); 932 933 /* NB: The page and address registers are unaffected by a reset 934 * and in an undefined state after power-up. 935 */ 936 dmaClear(&pThis->DMAC[0]); 937 dmaClear(&pThis->DMAC[1]); 942 938 } 943 939 … … 945 941 * @interface_method_impl{PDMDEVREG,pfnConstruct} 946 942 */ 947 static DECLCALLBACK(int) dma Construct(PPDMDEVINS pDevIns, int iInstance, PCFGMNODE pCfg)943 static DECLCALLBACK(int) dmaR3Construct(PPDMDEVINS pDevIns, int iInstance, PCFGMNODE pCfg) 948 944 { 949 945 PDMDEV_CHECK_VERSIONS_RETURN(pDevIns); … … 1009 1005 * Reset controller state. 1010 1006 */ 1011 dmaR eset(pDevIns);1007 dmaR3Reset(pDevIns); 1012 1008 1013 1009 /* … … 1016 1012 PDMDMACREG Reg; 1017 1013 Reg.u32Version = PDM_DMACREG_VERSION; 1018 Reg.pfnRun = dmaR un;1019 Reg.pfnRegister = dmaR egister;1020 Reg.pfnReadMemory = dmaR eadMemory;1021 Reg.pfnWriteMemory = dma WriteMemory;1022 Reg.pfnSetDREQ = dma SetDREQ;1023 Reg.pfnGetChannelMode = dma GetChannelMode;1014 Reg.pfnRun = dmaR3Run; 1015 Reg.pfnRegister = dmaR3Register; 1016 Reg.pfnReadMemory = dmaR3ReadMemory; 1017 Reg.pfnWriteMemory = dmaR3WriteMemory; 1018 Reg.pfnSetDREQ = dmaR3SetDREQ; 1019 Reg.pfnGetChannelMode = dmaR3GetChannelMode; 1024 1020 1025 1021 rc = PDMDevHlpDMACRegister(pDevIns, &Reg, &pThis->pHlp); … … 1029 1025 * Register the saved state. 1030 1026 */ 1031 rc = PDMDevHlpSSMRegister(pDevIns, DMA_SAVESTATE_CURRENT, sizeof(*pThis), dma SaveExec, dmaLoadExec);1027 rc = PDMDevHlpSSMRegister(pDevIns, DMA_SAVESTATE_CURRENT, sizeof(*pThis), dmaR3SaveExec, dmaR3LoadExec); 1032 1028 AssertRCReturn(rc, rc); 1033 1029 … … 1035 1031 * Statistics. 1036 1032 */ 1037 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatRun, STAMTYPE_PROFILE, "DmaRun", STAMUNIT_TICKS_PER_CALL, "Profiling dmaR un().");1033 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatRun, STAMTYPE_PROFILE, "DmaRun", STAMUNIT_TICKS_PER_CALL, "Profiling dmaR3Run()."); 1038 1034 1039 1035 return VINF_SUCCESS; … … 1097 1093 /* .pszRCMod = */ "VBoxDDRC.rc", 1098 1094 /* .pszR0Mod = */ "VBoxDDR0.r0", 1099 /* .pfnConstruct = */ dma Construct,1095 /* .pfnConstruct = */ dmaR3Construct, 1100 1096 /* .pfnDestruct = */ NULL, 1101 1097 /* .pfnRelocate = */ NULL, 1102 1098 /* .pfnMemSetup = */ NULL, 1103 1099 /* .pfnPowerOn = */ NULL, 1104 /* .pfnReset = */ dmaR eset,1100 /* .pfnReset = */ dmaR3Reset, 1105 1101 /* .pfnSuspend = */ NULL, 1106 1102 /* .pfnResume = */ NULL,
Note:
See TracChangeset
for help on using the changeset viewer.