diff -r 538db54a451d -r 5d2844f35677 kernel/eka/memmodel/epoc/flexible/mmu/mmapping.h --- a/kernel/eka/memmodel/epoc/flexible/mmu/mmapping.h Mon Jan 18 21:31:10 2010 +0200 +++ b/kernel/eka/memmodel/epoc/flexible/mmu/mmapping.h Tue Jan 26 13:13:38 2010 +0200 @@ -273,6 +273,33 @@ */ void UnlinkFromMemory(TMappingList& aMappingList); + /** + Get the physical address(es) for a region of pages in this mapping. + + @param aIndex Page index, within the mapping, for start of the region. + @param aCount Number of pages in the region. + @param aPhysicalAddress On success, this value is set to one of two values. + If the specified region is physically contiguous, + the value is the physical address of the first page + in the region. If the region is discontiguous, the + value is set to KPhysAddrInvalid. + @param aPhysicalPageList If not zero, this points to an array of TPhysAddr + objects. On success, this array will be filled + with the addresses of the physical pages which + contain the specified region. If aPageList is + zero, then the function will fail with + KErrNotFound if the specified region is not + physically contiguous. + + @return 0 if successful and the whole region is physically contiguous. + 1 if successful but the region isn't physically contiguous. + KErrNotFound, if any page in the region is not present, + otherwise one of the system wide error codes. + + @pre This mapping must have been attached to a memory object with #Pin. + */ + TInt PhysAddr(TUint aIndex, TUint aCount, TPhysAddr& aPhysicalAddress, TPhysAddr* aPhysicalPageList); + protected: /** @param aType Initial value for #Flags. @@ -676,6 +703,12 @@ ~DMemoryMapping(); /** + Free any resources owned by this mapping, i.e. allow Construct() to be used + on this mapping at a new address etc. + */ + void Destruct(); + + /** Allocatate virtual addresses for this mapping to use. This is called from #Construct and the arguments to this function are the same. @@ -872,6 +905,25 @@ }; +/** +A mapping which maps any memory into the kernel address space and provides access to +the physical address used by a memory object. + +These mappings are always of the 'pinned' type to prevent the obtained physical addresses +from becoming invalid. +*/ +class DKernelPinMapping : public DFineMapping + { +public: + DKernelPinMapping(); + TInt Construct(TUint aReserveSize); + TInt MapAndPin(DMemoryObject* aMemory, TUint aIndex, TUint aCount, TMappingPermissions aPermissions); + void UnmapAndUnpin(); + +public: + TInt iReservePages; ///< The number of pages this mapping is able to map with its reserved resources(page tables etc). + }; + /** A mapping which provides access to the physical address used by a memory object @@ -914,32 +966,6 @@ */ virtual void Unpin(); - /** - Get the physical address(es) for a region of pages in this mapping. - - @param aIndex Page index, within the mapping, for start of the region. - @param aCount Number of pages in the region. - @param aPhysicalAddress On success, this value is set to one of two values. - If the specified region is physically contiguous, - the value is the physical address of the first page - in the region. If the region is discontiguous, the - value is set to KPhysAddrInvalid. - @param aPhysicalPageList If not zero, this points to an array of TPhysAddr - objects. On success, this array will be filled - with the addresses of the physical pages which - contain the specified region. If aPageList is - zero, then the function will fail with - KErrNotFound if the specified region is not - physically contiguous. - - @return 0 if successful and the whole region is physically contiguous. - 1 if successful but the region isn't physically contiguous. - KErrNotFound, if any page in the region is not present, - otherwise one of the system wide error codes. - - @pre This mapping must have been attached to a memory object with #Pin. - */ - TInt PhysAddr(TUint aIndex, TUint aCount, TPhysAddr& aPhysicalAddress, TPhysAddr* aPhysicalPageList); private: // from DMemoryMappingBase... virtual TInt MapPages(RPageArray::TIter aPages, TUint aMapInstanceCount); ///< Not implemented. Faults in debug builds.