Changeset 41811 in vbox
- Timestamp:
- Jun 18, 2012 9:50:23 AM (12 years ago)
- Location:
- trunk
- Files:
-
- 3 edited
-
include/VBox/pci.h (modified) (2 diffs)
-
src/VBox/Devices/Bus/DevPCI.cpp (modified) (2 diffs)
-
src/VBox/Devices/Storage/DevATA.cpp (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/pci.h
r41699 r41811 538 538 } PCIDEVICE; 539 539 540 #ifdef IN_RING3 541 int PCIDevPhysRead(PPCIDEVICE pPciDev, RTGCPHYS GCPhys, void *pvBuf, size_t cbRead); 542 int PCIDevPhysWrite(PPCIDEVICE pPciDev, RTGCPHYS GCPhys, const void *pvBuf, size_t cbWrite); 543 #endif 544 540 545 /* @todo: handle extended space access */ 541 546 DECLINLINE(void) PCIDevSetByte(PPCIDEVICE pPciDev, uint32_t uOffset, uint8_t u8Value) … … 643 648 { 644 649 return PCIDevGetWord(pPciDev, VBOX_PCI_COMMAND); 650 } 651 652 /** 653 * Checks if the given PCI device is a bus master. 654 * @returns true if the device is a bus master, false if not. 655 * @param pPciDev The PCI device. 656 */ 657 DECLINLINE(bool) PCIDevIsBusmaster(PPCIDEVICE pPciDev) 658 { 659 return (PCIDevGetCommand(pPciDev) & VBOX_PCI_COMMAND_MASTER) != 0; 645 660 } 646 661 -
trunk/src/VBox/Devices/Bus/DevPCI.cpp
r41697 r41811 242 242 243 243 #ifdef IN_RING3 244 /** 245 * Reads data via bus mastering, if enabled. If no bus mastering is available, 246 * this function does nothing and returns VINF_SUCCESS. 247 * 248 * @return IPRT status code. 249 */ 250 int PCIDevPhysRead(PPCIDEVICE pPciDev, RTGCPHYS GCPhys, void *pvBuf, size_t cbRead) 251 { 252 AssertPtrReturn(pPciDev, VERR_INVALID_POINTER); 253 AssertPtrReturn(pvBuf, VERR_INVALID_POINTER); 254 AssertReturn(cbRead, VERR_INVALID_PARAMETER); 255 256 if (!PCIDevIsBusmaster(pPciDev)) 257 { 258 #ifdef DEBUG 259 Log2(("%s: %RU16:%RU16: No bus master (anymore), skipping read %p (%z)\n", __FUNCTION__, 260 PCIDevGetVendorId(pPciDev), PCIDevGetDeviceId(pPciDev), pvBuf, cbRead)); 261 #endif 262 return VINF_SUCCESS; 263 } 264 265 return PDMDevHlpPhysRead(pPciDev->pDevIns, GCPhys, pvBuf, cbRead); 266 } 267 268 /** 269 * Writes data via bus mastering, if enabled. If no bus mastering is available, 270 * this function does nothing and returns VINF_SUCCESS. 271 * 272 * @return IPRT status code. 273 */ 274 int PCIDevPhysWrite(PPCIDEVICE pPciDev, RTGCPHYS GCPhys, const void *pvBuf, size_t cbWrite) 275 { 276 AssertPtrReturn(pPciDev, VERR_INVALID_POINTER); 277 AssertPtrReturn(pvBuf, VERR_INVALID_POINTER); 278 AssertReturn(cbWrite, VERR_INVALID_PARAMETER); 279 280 if (!PCIDevIsBusmaster(pPciDev)) 281 { 282 #ifdef DEBUG 283 Log2(("%s: %RU16:%RU16: No bus master (anymore), skipping write %p (%z)\n", __FUNCTION__, 284 PCIDevGetVendorId(pPciDev), PCIDevGetDeviceId(pPciDev), pvBuf, cbWrite)); 285 #endif 286 return VINF_SUCCESS; 287 } 288 289 return PDMDevHlpPhysWrite(pPciDev->pDevIns, GCPhys, pvBuf, cbWrite); 290 } 244 291 245 292 static void pci_update_mappings(PCIDevice *d) … … 758 805 759 806 #ifdef IN_RING3 760 761 807 /** 762 808 * Finds a bridge on the bus which contains the destination bus. -
trunk/src/VBox/Devices/Storage/DevATA.cpp
r41099 r41811 5013 5013 Log2(("%s: DMA desc %#010x: addr=%#010x size=%#010x orig_size=%#010x\n", __FUNCTION__, 5014 5014 (int)pDesc, pBuffer, cbBuffer, RT_LE2H_U32(DMADesc.cbBuffer) & 0xfffe)); 5015 5016 PCIATAState *pATAState = PDMINS_2_DATA(pDevIns, PCIATAState *); 5017 AssertPtr(pATAState); 5015 5018 if (uTxDir == PDMBLOCKTXDIR_FROM_DEVICE) 5016 P DMDevHlpPhysWrite(pDevIns, pBuffer, s->CTX_SUFF(pbIOBuffer) + iIOBufferCur, dmalen);5019 PCIDevPhysWrite(&pATAState->dev, pBuffer, s->CTX_SUFF(pbIOBuffer) + iIOBufferCur, dmalen); 5017 5020 else 5018 PDMDevHlpPhysRead(pDevIns, pBuffer, s->CTX_SUFF(pbIOBuffer) + iIOBufferCur, dmalen); 5021 PCIDevPhysRead(&pATAState->dev, pBuffer, s->CTX_SUFF(pbIOBuffer) + iIOBufferCur, dmalen); 5022 5019 5023 iIOBufferCur += dmalen; 5020 5024 cbTotalTransfer -= dmalen; … … 5739 5743 PCIATAState *pThis = PDMINS_2_DATA(pDevIns, PCIATAState *); 5740 5744 PATACONTROLLER pCtl = &pThis->aCts[i]; 5741 int rc; 5742 5743 rc = PDMCritSectEnter(&pCtl->lock, VINF_IOM_R3_IOPORT_READ); 5745 5746 bool fBm = PCIDevIsBusmaster(&pThis->dev); 5747 #ifdef DEBUG_andy 5748 Log2(("%s: Ctl#%d: Bus master = %RTbool\n", 5749 __FUNCTION__, ATACONTROLLER_IDX(pCtl), fBm)); 5750 #endif 5751 if (!fBm) 5752 return VINF_SUCCESS; /** @todo Correct? */ 5753 5754 int rc = PDMCritSectEnter(&pCtl->lock, VINF_IOM_R3_IOPORT_READ); 5744 5755 if (rc != VINF_SUCCESS) 5745 5756 return rc; … … 5773 5784 PCIATAState *pThis = PDMINS_2_DATA(pDevIns, PCIATAState *); 5774 5785 PATACONTROLLER pCtl = &pThis->aCts[i]; 5775 int rc; 5776 5777 rc = PDMCritSectEnter(&pCtl->lock, VINF_IOM_R3_IOPORT_WRITE); 5786 5787 bool fBm = PCIDevIsBusmaster(&pThis->dev); 5788 #ifdef DEBUG_andy 5789 Log2(("%s: Ctl#%d: Bus master = %RTbool\n", 5790 __FUNCTION__, ATACONTROLLER_IDX(pCtl), fBm)); 5791 #endif 5792 if (!fBm) 5793 return VINF_SUCCESS; /** @todo Correct? */ 5794 5795 int rc = PDMCritSectEnter(&pCtl->lock, VINF_IOM_R3_IOPORT_WRITE); 5778 5796 if (rc != VINF_SUCCESS) 5779 5797 return rc;
Note:
See TracChangeset
for help on using the changeset viewer.

