Loading...
iokit/Kernel/IODeviceTreeSupport.cpp xnu-3248.50.21 xnu-1699.32.7
--- xnu/xnu-3248.50.21/iokit/Kernel/IODeviceTreeSupport.cpp
+++ xnu/xnu-1699.32.7/iokit/Kernel/IODeviceTreeSupport.cpp
@@ -37,8 +37,6 @@
 
 #include <pexpert/device_tree.h>
 
-typedef UInt32  dtptr_t;
-
 #include <machine/machine_routines.h>
 
 extern "C" {
@@ -63,7 +61,6 @@
 const OSSymbol *	gIODTCompatibleKey;
 const OSSymbol * 	gIODTTypeKey;
 const OSSymbol * 	gIODTModelKey;
-const OSSymbol * 	gIODTTargetTypeKey;
 
 const OSSymbol * 	gIODTSizeCellKey;
 const OSSymbol * 	gIODTAddressCellKey;
@@ -109,7 +106,6 @@
     gIODTCompatibleKey 	= OSSymbol::withCStringNoCopy( "compatible" );
     gIODTTypeKey 		= OSSymbol::withCStringNoCopy( "device_type" );
     gIODTModelKey 		= OSSymbol::withCStringNoCopy( "model" );
-    gIODTTargetTypeKey		= OSSymbol::withCStringNoCopy( "target-type" );
     gIODTSizeCellKey 	= OSSymbol::withCStringNoCopy( "#size-cells" );
     gIODTAddressCellKey = OSSymbol::withCStringNoCopy( "#address-cells" );
     gIODTRangeKey 		= OSSymbol::withCStringNoCopy( "ranges" );
@@ -255,7 +251,7 @@
 {
     IORegistryEntry		*chosen;
     OSData				*propObj;
-    dtptr_t				*propPtr;
+    unsigned int		*propPtr;
     unsigned int		propSize;
 
     chosen = IORegistryEntry::fromPath( "/chosen/memory-map", gIODTPlane );
@@ -265,13 +261,13 @@
     if ( propObj == 0 ) return -1;
 
     propSize = propObj->getLength();
-    if ( propSize != (2 * sizeof(dtptr_t)) ) return -1;
+    if ( propSize != (2 * sizeof(UInt32)) ) return -1;
  
-    propPtr = (dtptr_t *)propObj->getBytesNoCopy();
+    propPtr = (unsigned int *)propObj->getBytesNoCopy();
     if ( propPtr == 0 ) return -1;
 
-    *infoAddr = (void *)(uintptr_t) (propPtr[0]);
-    *infoSize = (int)               (propPtr[1]);
+    *infoAddr = (void *)propPtr[0] ;
+    *infoSize = (int)   propPtr[1]; 
 
     return 0;
 }
@@ -780,7 +776,6 @@
     OSString		*string;
     const char		*ckey;
     UInt32			keyLen;
-    UInt32          nlen;
     const char		*names;
     const char		*lastName;
     bool			wild;
@@ -805,16 +800,16 @@
 
     do {
         // for each name in the property
-        nlen = strnlen(names, lastName - names);
         if( wild)
-            matched = ((nlen >= (keyLen - 1)) && (0 == strncmp(ckey, names, keyLen - 1)));
+            matched = (0 == strncmp( ckey, names, keyLen - 1 ));
         else
-            matched = (keyLen == nlen) && (0 == strncmp(ckey, names, keyLen));
+            matched = (keyLen == strlen( names ))
+                    && (0 == strncmp( ckey, names, keyLen ));
 
         if( matched)
             result = names;
 
-        names = names + nlen + 1;
+        names = names + strlen( names) + 1;
 
     } while( (names < lastName) && (false == matched));
 
@@ -902,7 +897,7 @@
     }
 
     cIter = OSCollectionIterator::withCollection( result);
-    if (result) result->release();
+    result->release();
 
     return( cIter);
 }
@@ -926,44 +921,15 @@
     if( !prop)
         return;
 
-    prop->setSerializable(false);
     regEntry->setProperty( gIODTPersistKey, prop);
     prop->release();
     return;
 }
 
-#if   defined(__arm__) || defined(__i386__) || defined(__x86_64__)
 static SInt32 DefaultCompare( UInt32 cellCount, UInt32 left[], UInt32 right[] )
 {
-	cellCount--;
-	return( left[ cellCount ] - right[ cellCount ] ); 
-}
-#else
-#error Unknown architecture.
-#endif
-
-static void AddLengthToCells( UInt32 numCells, UInt32 *cells, UInt64 offset)
-{
-    if (numCells == 1)
-    {
-        cells[0] += (UInt32)offset;
-    }
-    else {
-        UInt64 sum = cells[numCells - 1] + offset;
-        cells[numCells - 1] = (UInt32)sum;
-        if (sum > UINT32_MAX) {
-            cells[numCells - 2] += (UInt32)(sum >> 32);
-        }
-    }
-}
-
-static IOPhysicalAddress CellsValue( UInt32 numCells, UInt32 *cells)
-{
-    if (numCells == 1) {
-        return IOPhysical32( 0, cells[0] );
-    } else {
-        return IOPhysical32( cells[numCells - 2], cells[numCells - 1] );
-    }
+    cellCount--;
+    return( left[ cellCount ] - right[ cellCount ] );
 }
 
 void IODTGetCellCounts( IORegistryEntry * regEntry,
@@ -984,7 +950,7 @@
 
 bool IODTResolveAddressCell( IORegistryEntry * regEntry,
                              UInt32 cellsIn[],
-                             IOPhysicalAddress * phys, IOPhysicalLength * lenOut )
+                             IOPhysicalAddress * phys, IOPhysicalLength * len )
 {
     IORegistryEntry	*parent;
     OSData		*prop;
@@ -993,16 +959,14 @@
     // cells in addresses below regEntry
     UInt32		childSizeCells, childAddressCells;
     UInt32		childCells;
-    UInt32		cell[ 8 ], propLen;
-    UInt64		offset = 0;
-    UInt32		endCell[ 8 ];
+    UInt32		cell[ 5 ], offset = 0, length;
+    UInt32		endCell[ 5 ];
     UInt32		*range;
     UInt32		*lookRange;
     UInt32		*startRange;
     UInt32		*endRanges;
     bool		ok = true;
-    SInt64		diff, diff2, endDiff;
-    UInt64		len, rangeLen;
+    SInt32		diff, diff2, endDiff;
 
     IODTPersistent	*persist;
     IODTCompareAddressCellFunc	compare;
@@ -1010,109 +974,91 @@
     IODTGetCellCounts( regEntry, &childSizeCells, &childAddressCells );
     childCells = childAddressCells + childSizeCells;
 
-    if (childCells > sizeof(cell)/sizeof(cell[0]))
-        panic("IODTResolveAddressCell: Invalid device tree (%u,%u)", (uint32_t)childAddressCells, (uint32_t)childSizeCells);
-
     bcopy( cellsIn, cell, sizeof(UInt32) * childCells );
-    *lenOut = CellsValue( childSizeCells, cellsIn + childAddressCells );
+    if( childSizeCells > 1)
+        *len = IOPhysical32( cellsIn[ childAddressCells ],
+                             cellsIn[ childAddressCells + 1 ] );
+    else
+        *len = IOPhysical32( 0, cellsIn[ childAddressCells ] );
 
     do
     {
-        prop = OSDynamicCast( OSData, regEntry->getProperty( gIODTRangeKey ));
-        if( 0 == prop) {
-            /* end of the road */
-            *phys = CellsValue( childAddressCells, cell );
-            *phys += offset;
-            break;
-        }
-
-        parent = regEntry->getParentEntry( gIODTPlane );
-        IODTGetCellCounts( parent, &sizeCells, &addressCells );
-
-        if( (propLen = prop->getLength())) {
-            // search
-            startRange = (UInt32 *) prop->getBytesNoCopy();
-            range = startRange;
-            endRanges = range + (propLen / sizeof(UInt32));
-
-            prop = (OSData *) regEntry->getProperty( gIODTPersistKey );
-            if( prop) {
-                persist = (IODTPersistent *) prop->getBytesNoCopy();
-                compare = persist->compareFunc;
-            } else if (addressCells == childAddressCells) {
-                compare = DefaultCompare;
-            } else {
-                panic("There is no mixed comparison function yet...");
-            }
-
-            for( ok = false;
-                    range < endRanges;
-                    range += (childCells + addressCells) ) {
-
-                // is cell start within range?
-                diff = (*compare)( childAddressCells, cell, range );
-
-                if (childAddressCells > sizeof(endCell)/sizeof(endCell[0]))
-                    panic("IODTResolveAddressCell: Invalid device tree (%u)", (uint32_t)childAddressCells);
-
-                bcopy(range, endCell, childAddressCells * sizeof(UInt32));
-
-                rangeLen = CellsValue(childSizeCells, range + childAddressCells + addressCells);
-                AddLengthToCells(childAddressCells, endCell, rangeLen);
-
-                diff2 = (*compare)( childAddressCells, cell, endCell );
-
-                // if start of cell < start of range, or end of range >= start of cell, skip
-                if ((diff < 0) || (diff2 >= 0))
-                    continue;
-
-                len = CellsValue(childSizeCells, cell + childAddressCells);
-                ok = (0 == len);
-
-                if (!ok)
-                {
-                    // search for cell end
-                    bcopy(cell, endCell, childAddressCells * sizeof(UInt32));
-
-                    AddLengthToCells(childAddressCells, endCell, len - 1);
-
-                    for( lookRange = startRange;
-                            lookRange < endRanges;
-                            lookRange += (childCells + addressCells) )
-                    {
-                        // make sure end of cell >= range start
-                        endDiff = (*compare)( childAddressCells, endCell, lookRange );
-                        if( endDiff < 0)
-                            continue;
-
-                        UInt64 rangeStart = CellsValue(addressCells, range + childAddressCells);
-                        UInt64 lookRangeStart = CellsValue(addressCells, lookRange + childAddressCells);
-                        if ((endDiff - len + 1 + lookRangeStart) == (diff + rangeStart))
-                        {
-                            ok = true;
-                            break;
-                        }
-                    }
-                    if (!ok)
-                        continue;
-                }
-                offset += diff;
-                break;
-            }
-
-            if (addressCells + sizeCells > sizeof(cell)/sizeof(cell[0]))
-                panic("IODTResolveAddressCell: Invalid device tree (%u, %u)", (uint32_t)addressCells, (uint32_t)sizeCells);
-
-            // Get the physical start of the range from our parent
-            bcopy( range + childAddressCells, cell, sizeof(UInt32) * addressCells );
-            bzero( cell + addressCells, sizeof(UInt32) * sizeCells );
-
-        } /* else zero length range => pass thru to parent */
-
-        regEntry		= parent;
-        childSizeCells		= sizeCells;
-        childAddressCells	= addressCells;
-        childCells		= childAddressCells + childSizeCells;
+	prop = OSDynamicCast( OSData, regEntry->getProperty( gIODTRangeKey ));
+	if( 0 == prop) {
+	    /* end of the road */
+	    *phys = IOPhysical32( 0,  cell[ childAddressCells - 1 ] + offset);
+	    break;
+	}
+
+	parent = regEntry->getParentEntry( gIODTPlane );
+	IODTGetCellCounts( parent, &sizeCells, &addressCells );
+
+	if( (length = prop->getLength())) {
+	    // search
+	    startRange = (UInt32 *) prop->getBytesNoCopy();
+	    range = startRange;
+	    endRanges = range + (length / sizeof(UInt32));
+
+	    prop = (OSData *) regEntry->getProperty( gIODTPersistKey );
+	    if( prop) {
+		persist = (IODTPersistent *) prop->getBytesNoCopy();
+		compare = persist->compareFunc;
+	    } else
+		compare = DefaultCompare;
+
+	    for( ok = false;
+		 range < endRanges;
+		 range += (childCells + addressCells) ) {
+
+		// is cell start within range?
+		diff = (*compare)( childAddressCells, cell, range );
+
+		bcopy(range, endCell, childAddressCells * sizeof(UInt32));
+		endCell[childAddressCells - 1] += range[childCells + addressCells - 1];
+		diff2 = (*compare)( childAddressCells, cell, endCell );
+
+		if ((diff < 0) || (diff2 >= 0))
+		    continue;
+
+		ok = (0 == cell[childCells - 1]);
+		if (!ok)
+		{
+		    // search for cell end
+		    bcopy(cell, endCell, childAddressCells * sizeof(UInt32));
+		    endCell[childAddressCells - 1] += cell[childCells - 1] - 1;
+		    lookRange = startRange;
+		    for( ;
+			 lookRange < endRanges;
+			 lookRange += (childCells + addressCells) )
+		     {
+			// is cell >= range start?
+			endDiff = (*compare)( childAddressCells, endCell, lookRange );
+			if( endDiff < 0)
+			    continue;
+			if ((endDiff - cell[childCells - 1] + 1 + lookRange[childAddressCells + addressCells - 1])
+			    == (diff + range[childAddressCells + addressCells - 1]))
+			{
+			    ok = true;
+			    break;
+			}
+		    }
+		    if (!ok)
+			continue;
+		}
+		offset += diff;
+		break;
+	    }
+
+	    // Get the physical start of the range from our parent
+	    bcopy( range + childAddressCells, cell, sizeof(UInt32) * addressCells );
+	    bzero( cell + addressCells, sizeof(UInt32) * sizeCells );
+
+	} /* else zero length range => pass thru to parent */
+
+	regEntry		= parent;
+	childSizeCells		= sizeCells;
+	childAddressCells	= addressCells;
+	childCells		= childAddressCells + childSizeCells;
     }
     while( ok && regEntry);
 
@@ -1244,7 +1190,6 @@
     OSData				*ret = 0;
     UInt32				*bits;
     UInt32				i;
-    size_t              nlen;
     char				*names;
     char				*lastName;
     UInt32				mask;
@@ -1272,16 +1217,15 @@
     for( i = 0; (i <= deviceNumber) && (names < lastName); i++ ) {
 
         if( mask & (1 << i)) {
-            nlen = 1 + strnlen(names, lastName - names);
             if( i == deviceNumber) {
-                data = OSData::withBytesNoCopy(names, nlen);
+                data = OSData::withBytesNoCopy( names, 1 + strlen( names));
                 if( data) {
                     regEntry->setProperty("AAPL,slot-name", data);
                     ret = data;
                     data->release();
                 }
             } else
-                names += nlen;
+                names += 1 + strlen( names);
         }
     }