- parentEntry = regEntry->getParentEntry( gIODTPlane );
- addressProperty = (OSData *) regEntry->getProperty( addressPropertyName );
- if( (0 == addressProperty) || (0 == parentEntry))
- return( 0);
-
- IODTGetCellCounts( parentEntry, &sizeCells, &addressCells );
- if( 0 == sizeCells)
- return( 0);
-
- cells = sizeCells + addressCells;
- reg = (UInt32 *) addressProperty->getBytesNoCopy();
- num = addressProperty->getLength() / (4 * cells);
-
- array = OSArray::withCapacity( 1 );
- if( 0 == array)
- return( 0);
-
- for( i = 0; i < num; i++) {
- if( IODTResolveAddressCell( parentEntry, reg, &phys, &len )) {
- range = 0;
- if( parent)
- range = IODeviceMemory::withSubRange( parent,
- phys - parent->getPhysicalSegment(0, 0, kIOMemoryMapperNone), len );
- if( 0 == range)
- range = IODeviceMemory::withRange( phys, len );
- if( range)
- array->setObject( range );
+ array = 0;
+ do
+ {
+ parentEntry = regEntry->copyParentEntry( gIODTPlane );
+ addressProperty = (OSData *) regEntry->getProperty( addressPropertyName );
+ if( (0 == addressProperty) || (0 == parentEntry)) break;
+
+ IODTGetCellCounts( parentEntry, &sizeCells, &addressCells );
+ if( 0 == sizeCells) break;
+
+ cells = sizeCells + addressCells;
+ reg = (UInt32 *) addressProperty->getBytesNoCopy();
+ num = addressProperty->getLength() / (4 * cells);
+
+ array = OSArray::withCapacity( 1 );
+ if( 0 == array) break;
+
+ for( i = 0; i < num; i++) {
+ if( IODTResolveAddressCell( parentEntry, reg, &phys, &len )) {
+ range = 0;
+ if( parent)
+ range = IODeviceMemory::withSubRange( parent,
+ phys - parent->getPhysicalSegment(0, 0, kIOMemoryMapperNone), len );
+ if( 0 == range)
+ range = IODeviceMemory::withRange( phys, len );
+ if( range)
+ array->setObject( range );
+ }
+ reg += cells;