IOFWUserPhysicalAddressSpace.cpp [plain text]
#import "IOFWUserPhysicalAddressSpace.h"
#import "FWDebugging.h"
OSDefineMetaClassAndStructors(IOFWUserPhysicalAddressSpace, IOFWPhysicalAddressSpace) ;
bool
IOFWUserPhysicalAddressSpace::initWithDesc(
IOFireWireBus* bus,
IOMemoryDescriptor* mem)
{
DebugLog("+IOFWUserPhysicalAddressSpace::initWithDesc\n" ) ;
if (!IOFWPhysicalAddressSpace::initWithDesc(bus, mem))
return false ;
if ( kIOReturnSuccess != mem->prepare() )
{
fMemPrepared = false ;
return false ;
}
fMemPrepared = true ;
fSegmentCount = 0 ;
{ UInt32 currentOffset = 0 ;
IOByteCount length ;
while (0 != fMem->getPhysicalSegment(currentOffset, & length))
{
currentOffset += length ;
++fSegmentCount ;
}
}
DebugLog("new phys addr space - segmentCount=%ld length=0x%lx\n", fSegmentCount, (UInt32)fMem->getLength() ) ;
return true ;
}
void
IOFWUserPhysicalAddressSpace::free()
{
if (fMemPrepared)
fMem->complete() ;
IOFWPhysicalAddressSpace::free() ;
}
void
IOFWUserPhysicalAddressSpace::exporterCleanup ()
{
DebugLog("IOFWUserPseudoAddressSpace::exporterCleanup\n");
deactivate();
}
IOReturn
IOFWUserPhysicalAddressSpace::getSegmentCount( UInt32 * outSegmentCount )
{
*outSegmentCount = fSegmentCount ;
return kIOReturnSuccess ;
}
IOReturn
IOFWUserPhysicalAddressSpace :: getSegments (
UInt32* ioSegmentCount,
IOMemoryCursor::IOPhysicalSegment outSegments[] )
{
unsigned segmentCount = *ioSegmentCount <? fSegmentCount ; IOByteCount currentOffset = 0 ;
for( unsigned index = 0; index < segmentCount; ++index )
{
outSegments[ index ].location = fMem->getPhysicalSegment( currentOffset, & outSegments[ index ].length ) ;
currentOffset += outSegments[ index ].length ;
}
return kIOReturnSuccess ;
}