Changeset 13373
- Timestamp:
- 10/17/08 14:36:57 (3 months ago)
- Files:
-
- trunk/include/VBox/iom.h (modified) (2 diffs)
- trunk/include/VBox/pdmdev.h (modified) (2 diffs)
- trunk/src/VBox/VMM/IOM.cpp (modified) (5 diffs)
- trunk/src/VBox/VMM/IOMInternal.h (modified) (1 diff)
- trunk/src/VBox/VMM/PDMDevHlp.cpp (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/include/VBox/iom.h
r13368 r13373 84 84 ) \ 85 85 ) 86 87 /**88 * MMIO type89 */90 typedef enum IOMMMIOTYPE91 {92 /** 'Normal' MMIO. Reads and writes always fault. */93 IOMMMIOTYPE_MMIO = 1,94 /** MMIO region backed by memory; protection can be turned off temporarily. */95 IOMMMIOTYPE_MMIO_WITH_RAM_BACKING,96 /** The usual 32-bit type size hack. */97 IOMMMIOTYPE_32BIT_HACK = 0x7fffffff98 } IOMMMIOTYPE;99 86 100 87 /** … … 262 249 VMMR3DECL(int) IOMR3IOPortDeregister(PVM pVM, PPDMDEVINS pDevIns, RTIOPORT PortStart, RTUINT cPorts); 263 250 264 VMMR3DECL(int) IOMR3MMIORegisterR3(PVM pVM, PPDMDEVINS pDevIns, IOMMMIOTYPE enmMMIOType,RTGCPHYS GCPhysStart, RTUINT cbRange, RTHCPTR pvUser,251 VMMR3DECL(int) IOMR3MMIORegisterR3(PVM pVM, PPDMDEVINS pDevIns, RTGCPHYS GCPhysStart, RTUINT cbRange, RTHCPTR pvUser, 265 252 R3PTRTYPE(PFNIOMMMIOWRITE) pfnWriteCallback, 266 253 R3PTRTYPE(PFNIOMMMIOREAD) pfnReadCallback, trunk/include/VBox/pdmdev.h
r13371 r13373 2767 2767 DECLR3CALLBACKMEMBER(int, pfnUnregisterVMMDevHeap,(PPDMDEVINS pDevIns, RTGCPHYS GCPhys)); 2768 2768 2769 /**2770 * Register a Memory Mapped I/O (MMIO) region with backing memory (or use existing memory if part of guest ram)2771 *2772 * These callbacks are of course for the host context (HC).2773 * Register HC handlers before guest context (GC) handlers! There must be a2774 * HC handler for every GC handler!2775 *2776 * @returns VBox status.2777 * @param pDevIns The device instance to register the MMIO with.2778 * @param enmMMIOType MMIO Type2779 * @param GCPhysStart First physical address in the range.2780 * @param cbRange The size of the range (in bytes).2781 * @param pvUser User argument.2782 * @param pfnWrite Pointer to function which is gonna handle Write operations.2783 * @param pfnRead Pointer to function which is gonna handle Read operations.2784 * @param pfnFill Pointer to function which is gonna handle Fill/memset operations. (optional)2785 * @param pszDesc Pointer to description string. This must not be freed.2786 */2787 DECLR3CALLBACKMEMBER(int, pfnMMIORegisterEx,(PPDMDEVINS pDevIns, IOMMMIOTYPE enmMMIOType, RTGCPHYS GCPhysStart, RTUINT cbRange, RTHCPTR pvUser,2788 PFNIOMMMIOWRITE pfnWrite, PFNIOMMMIOREAD pfnRead, PFNIOMMMIOFILL pfnFill,2789 const char *pszDesc));2790 2791 2769 /** @} */ 2792 2770 … … 3266 3244 3267 3245 /** 3268 * @copydoc PDMDEVHLPR3::pfnMMIORegisterEx3269 */3270 DECLINLINE(int) PDMDevHlpMMIORegisterEx(PPDMDEVINS pDevIns, IOMMMIOTYPE enmMMIOType, RTGCPHYS GCPhysStart, RTUINT cbRange, RTHCPTR pvUser,3271 PFNIOMMMIOWRITE pfnWrite, PFNIOMMMIOREAD pfnRead, PFNIOMMMIOFILL pfnFill,3272 const char *pszDesc)3273 {3274 return pDevIns->pDevHlpR3->pfnMMIORegisterEx(pDevIns, enmMMIOType, GCPhysStart, cbRange, pvUser, pfnWrite, pfnRead, pfnFill, pszDesc);3275 }3276 3277 /**3278 3246 * @copydoc PDMDEVHLPR3::pfnMMIORegisterGC 3279 3247 */ trunk/src/VBox/VMM/IOM.cpp
r13371 r13373 1351 1351 * @param pVM VM handle. 1352 1352 * @param pDevIns PDM device instance owning the MMIO range. 1353 * @param enmMMIOType MMIO Type1354 1353 * @param GCPhysStart First physical address in the range. 1355 1354 * @param cbRange The size of the range (in bytes). … … 1360 1359 * @param pszDesc Pointer to description string. This must not be freed. 1361 1360 */ 1362 VMMR3DECL(int) IOMR3MMIORegisterR3(PVM pVM, PPDMDEVINS pDevIns, IOMMMIOTYPE enmMMIOType,RTGCPHYS GCPhysStart, RTUINT cbRange, RTHCPTR pvUser,1361 VMMR3DECL(int) IOMR3MMIORegisterR3(PVM pVM, PPDMDEVINS pDevIns, RTGCPHYS GCPhysStart, RTUINT cbRange, RTHCPTR pvUser, 1363 1362 R3PTRTYPE(PFNIOMMMIOWRITE) pfnWriteCallback, R3PTRTYPE(PFNIOMMMIOREAD) pfnReadCallback, 1364 1363 R3PTRTYPE(PFNIOMMMIOFILL) pfnFillCallback, const char *pszDesc) … … 1399 1398 pRange->GCPhys = GCPhysStart; 1400 1399 pRange->cb = cbRange; 1401 pRange->enmType = enmMMIOType;1402 1400 pRange->pszDesc = pszDesc; 1403 1401 … … 1423 1421 * Try register it with PGM and then insert it into the tree. 1424 1422 */ 1425 if (pRange->enmType == IOMMMIOTYPE_MMIO) 1426 { 1427 rc = PGMR3PhysMMIORegister(pVM, GCPhysStart, cbRange, 1428 IOMR3MMIOHandler, pRange, 1429 pVM->iom.s.pfnMMIOHandlerR0, MMHyperR3ToR0(pVM, pRange), 1430 pVM->iom.s.pfnMMIOHandlerRC, MMHyperR3ToRC(pVM, pRange), pszDesc); 1431 } 1432 else 1433 { 1434 /** @todo Currently assumes it's for existing memory *only*! */ 1435 rc = PGMHandlerPhysicalRegisterEx(pVM, PGMPHYSHANDLERTYPE_PHYSICAL_ALL, GCPhysStart, GCPhysStart + (cbRange - 1), 1436 IOMR3MMIOHandler, pRange, 1437 pVM->iom.s.pfnMMIOHandlerR0, MMHyperR3ToR0(pVM, pRange), 1438 pVM->iom.s.pfnMMIOHandlerRC, MMHyperR3ToRC(pVM, pRange), pszDesc); 1439 } 1423 rc = PGMR3PhysMMIORegister(pVM, GCPhysStart, cbRange, 1424 IOMR3MMIOHandler, pRange, 1425 pVM->iom.s.pfnMMIOHandlerR0, MMHyperR3ToR0(pVM, pRange), 1426 pVM->iom.s.pfnMMIOHandlerRC, MMHyperR3ToRC(pVM, pRange), pszDesc); 1440 1427 1441 1428 if (RT_SUCCESS(rc)) … … 1624 1611 1625 1612 /* remove it from PGM */ 1626 if (pRange->enmType == IOMMMIOTYPE_MMIO) 1627 rc = PGMR3PhysMMIODeregister(pVM, GCPhys, pRange->cb); 1628 else 1629 rc = PGMHandlerPhysicalDeregister(pVM, GCPhys); 1613 rc = PGMR3PhysMMIODeregister(pVM, GCPhys, pRange->cb); 1630 1614 1631 1615 /* advance and free. */ trunk/src/VBox/VMM/IOMInternal.h
r13371 r13373 50 50 /** Size of the range. */ 51 51 uint32_t cb; 52 /** MMIO type. */ 53 IOMMMIOTYPE enmType; 52 uint32_t uAlignmnet; 54 53 55 54 /** Pointer to user argument - R3. */ trunk/src/VBox/VMM/PDMDevHlp.cpp
r13368 r13373 211 211 pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, GCPhysStart, cbRange, pvUser, pfnWrite, pfnRead, pfnFill, pszDesc, pszDesc)); 212 212 213 int rc = IOMR3MMIORegisterR3(pDevIns->Internal.s.pVMR3, pDevIns, IOMMMIOTYPE_MMIO, GCPhysStart, cbRange, pvUser, pfnWrite, pfnRead, pfnFill, pszDesc); 214 215 LogFlow(("pdmR3DevHlp_MMIORegister: caller='%s'/%d: returns %Vrc\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, rc)); 216 return rc; 217 } 218 219 /** 220 * @copydoc PDMDEVHLPR3::pfnMMIORegisterEx 221 */ 222 static DECLCALLBACK(int) pdmR3DevHlp_MMIORegisterEx(PPDMDEVINS pDevIns, IOMMMIOTYPE enmMMIOType, RTGCPHYS GCPhysStart, RTUINT cbRange, RTHCPTR pvUser, 223 PFNIOMMMIOWRITE pfnWrite, PFNIOMMMIOREAD pfnRead, PFNIOMMMIOFILL pfnFill, 224 const char *pszDesc) 225 { 226 PDMDEV_ASSERT_DEVINS(pDevIns); 227 VM_ASSERT_EMT(pDevIns->Internal.s.pVMR3); 228 LogFlow(("pdmR3DevHlp_MMIORegister: caller='%s'/%d: GCPhysStart=%VGp cbRange=%#x pvUser=%p pfnWrite=%p pfnRead=%p pfnFill=%p pszDesc=%p:{%s}\n", 229 pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, GCPhysStart, cbRange, pvUser, pfnWrite, pfnRead, pfnFill, pszDesc, pszDesc)); 230 231 int rc = IOMR3MMIORegisterR3(pDevIns->Internal.s.pVMR3, pDevIns, enmMMIOType, GCPhysStart, cbRange, pvUser, pfnWrite, pfnRead, pfnFill, pszDesc); 213 int rc = IOMR3MMIORegisterR3(pDevIns->Internal.s.pVMR3, pDevIns, GCPhysStart, cbRange, pvUser, pfnWrite, pfnRead, pfnFill, pszDesc); 232 214 233 215 LogFlow(("pdmR3DevHlp_MMIORegister: caller='%s'/%d: returns %Vrc\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, rc)); … … 2715 2697 pdmR3DevHlp_RegisterVMMDevHeap, 2716 2698 pdmR3DevHlp_UnregisterVMMDevHeap, 2717 pdmR3DevHlp_MMIORegisterEx,2718 2699 PDM_DEVHLP_VERSION /* the end */ 2719 2700 }; … … 3186 3167 pdmR3DevHlp_Untrusted_RegisterVMMDevHeap, 3187 3168 pdmR3DevHlp_Untrusted_UnregisterVMMDevHeap, 3188 pdmR3DevHlp_MMIORegisterEx,3189 3169 PDM_DEVHLP_VERSION /* the end */ 3190 3170 };

