IOMemoryDescriptor ** descriptors,
UInt32 withCount,
IODirection withDirection,
- bool asReference = false )
+ bool asReference )
{
//
// Create a new IOMultiMemoryDescriptor. The "buffer" is made up of several
IOMemoryDescriptor ** descriptors,
UInt32 withCount,
IODirection withDirection,
- bool asReference = false )
+ bool asReference )
{
//
// Initialize an IOMultiMemoryDescriptor. The "buffer" is made up of several
assert(descriptors);
assert(withCount);
- // Ask our superclass' opinion.
-
- if ( super::init() == false ) return false;
+ // Release existing descriptors, if any
+ if ( _descriptors )
+ {
+ for ( unsigned index = 0; index < _descriptorsCount; index++ )
+ _descriptors[index]->release();
+ if ( _descriptorsIsAllocated )
+ IODelete(_descriptors, IOMemoryDescriptor *, _descriptorsCount);
+ } else {
+ // Ask our superclass' opinion.
+ if ( super::init() == false ) return false;
+ }
+
// Initialize our minimal state.
_descriptors = 0;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+IOPhysicalAddress IOMultiMemoryDescriptor::getSourceSegment(
+ IOByteCount offset,
+ IOByteCount * length )
+{
+ //
+ // This method returns the physical address of the byte at the given offset
+ // into the memory, and optionally the length of the physically contiguous
+ // segment from that offset.
+ //
+
+ assert(offset <= _length);
+
+ for ( unsigned index = 0; index < _descriptorsCount; index++ )
+ {
+ if ( offset < _descriptors[index]->getLength() )
+ {
+ return _descriptors[index]->getSourceSegment(offset, length);
+ }
+ offset -= _descriptors[index]->getLength();
+ }
+
+ if ( length ) *length = 0;
+
+ return 0;
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
void * IOMultiMemoryDescriptor::getVirtualSegment( IOByteCount /* offset */ ,
IOByteCount * /* length */ )
{