]> git.saurik.com Git - apple/xnu.git/blobdiff - iokit/Kernel/IOSubMemoryDescriptor.cpp
xnu-3248.30.4.tar.gz
[apple/xnu.git] / iokit / Kernel / IOSubMemoryDescriptor.cpp
index 3e06210fb96aff53356da1fad2f5c14361478fa3..5b377141abb4b62bc8a07748c23af44910ca89e0 100644 (file)
@@ -61,10 +61,7 @@ bool IOSubMemoryDescriptor::initSubRange( IOMemoryDescriptor * parent,
                                        IOByteCount offset, IOByteCount length,
                                        IODirection direction )
 {
-    if( !parent)
-       return( false);
-
-    if( (offset + length) > parent->getLength())
+    if( parent && ((offset + length) > parent->getLength()))
        return( false);
 
     /*
@@ -83,18 +80,24 @@ bool IOSubMemoryDescriptor::initSubRange( IOMemoryDescriptor * parent,
         */
 
        _parent->release();
-       _parent = 0;
     }
 
-    parent->retain();
+    if (parent) {
+       parent->retain();
+       _tag    = parent->getTag();
+    }
+    else {
+        _tag    = 0;
+    }
     _parent    = parent;
     _start     = offset;
     _length    = length;
     _flags     = direction;
+    _flags |= kIOMemoryThreadSafe;
+
 #ifndef __LP64__
     _direction  = (IODirection) (_flags & kIOMemoryDirectionMask);
 #endif /* !__LP64__ */
-    _tag       = parent->getTag();
 
     return( true );
 }
@@ -188,6 +191,25 @@ IOMemoryMap * IOSubMemoryDescriptor::makeMapping(
 uint64_t
 IOSubMemoryDescriptor::getPreparationID( void )
 {
-    return (_parent->getPreparationID());    
+    uint64_t pID;
+
+    if (!super::getKernelReserved())
+        return (kIOPreparationIDUnsupported);    
+
+    pID = _parent->getPreparationID();
+    if (reserved->kernReserved[0] != pID)
+    {
+        reserved->kernReserved[0] = pID;
+        reserved->preparationID   = kIOPreparationIDUnprepared;
+        super::setPreparationID();
+    }
+
+    return (super::getPreparationID());    
 }
 
+IOReturn
+IOSubMemoryDescriptor::getPageCounts(IOByteCount * residentPageCount,
+                                     IOByteCount * dirtyPageCount)
+{
+    return (_parent->getPageCounts(residentPageCount, dirtyPageCount));
+}