perfsrv/memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanHeapDataBase.cpp
author hgs
Mon, 20 Sep 2010 12:20:18 +0300
changeset 52 c2f44e33b468
permissions -rw-r--r--
201037
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include "MemSpyDriverLogChanHeapDataUser.h"
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
// System includes
hgs
parents:
diff changeset
    21
#include <u32hal.h>
hgs
parents:
diff changeset
    22
#include <e32rom.h>
hgs
parents:
diff changeset
    23
#include <memspy/driver/memspydriverconstants.h>
hgs
parents:
diff changeset
    24
#include <memspy/driver/memspydriverobjectsshared.h>
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
// Shared includes
hgs
parents:
diff changeset
    27
#include "MemSpyDriverOpCodes.h"
hgs
parents:
diff changeset
    28
#include "MemSpyDriverObjectsInternal.h"
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
// User includes
hgs
parents:
diff changeset
    31
#include "MemSpyDriverLogChanHeapDataBase.h"
hgs
parents:
diff changeset
    32
#include "MemSpyDriverHeap.h"
hgs
parents:
diff changeset
    33
#include "MemSpyDriverUtils.h"
hgs
parents:
diff changeset
    34
#include "MemSpyDriverDevice.h"
hgs
parents:
diff changeset
    35
#include "MemSpyDriverOSAdaption.h"
hgs
parents:
diff changeset
    36
#include "MemSpyDriverHeapWalker.h"
hgs
parents:
diff changeset
    37
#include "MemSpyDriverUserEventMonitor.h"
hgs
parents:
diff changeset
    38
#include "MemSpyDriverSuspensionManager.h"
hgs
parents:
diff changeset
    39
hgs
parents:
diff changeset
    40
DMemSpyDriverLogChanHeapDataBase::DMemSpyDriverLogChanHeapDataBase( DMemSpyDriverDevice& aDevice, DThread& aThread )
hgs
parents:
diff changeset
    41
:	DMemSpyDriverLogChanHeapBase( aDevice, aThread )
hgs
parents:
diff changeset
    42
    {
hgs
parents:
diff changeset
    43
    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapDataBase::DMemSpyDriverLogChanHeapDataBase() - this: 0x%08x", this ));
hgs
parents:
diff changeset
    44
    }
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
DMemSpyDriverLogChanHeapDataBase::~DMemSpyDriverLogChanHeapDataBase()
hgs
parents:
diff changeset
    47
	{
hgs
parents:
diff changeset
    48
	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapDataBase::~DMemSpyDriverLogChanHeapDataBase() - START - this: 0x%08x", this ));
hgs
parents:
diff changeset
    49
	ReleaseCellList();
hgs
parents:
diff changeset
    50
	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapDataBase::~DMemSpyDriverLogChanHeapDataBase() - END - this: 0x%08x", this ));
hgs
parents:
diff changeset
    51
	}
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
TInt DMemSpyDriverLogChanHeapDataBase::PrepareCellListTransferBuffer()
hgs
parents:
diff changeset
    54
    {
hgs
parents:
diff changeset
    55
    // Transfer free cells immediately from xfer stream
hgs
parents:
diff changeset
    56
    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapDataBase::PrepareCellListTransferBuffer() - START - iHeapStream: 0x%08x", iHeapStream ));
hgs
parents:
diff changeset
    57
    __ASSERT_ALWAYS( !iHeapStream, MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapFreeCellStreamNotClosed ) );
hgs
parents:
diff changeset
    58
    //
hgs
parents:
diff changeset
    59
    TInt r = KErrNoMemory;
hgs
parents:
diff changeset
    60
    //
hgs
parents:
diff changeset
    61
    NKern::ThreadEnterCS();
hgs
parents:
diff changeset
    62
    //
hgs
parents:
diff changeset
    63
    iHeapStream = new RMemSpyMemStreamWriter();
hgs
parents:
diff changeset
    64
    if  ( iHeapStream )
hgs
parents:
diff changeset
    65
        {
hgs
parents:
diff changeset
    66
        const TInt requiredMemory = CalculateCellListBufferSize();
hgs
parents:
diff changeset
    67
        r = OpenXferStream( *iHeapStream, requiredMemory );
hgs
parents:
diff changeset
    68
        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapDataBase::PrepareCellListTransferBuffer() - requested %d bytes for free cell list, r: %d", requiredMemory, r ));
hgs
parents:
diff changeset
    69
hgs
parents:
diff changeset
    70
        if  ( r == KErrNone )
hgs
parents:
diff changeset
    71
            {
hgs
parents:
diff changeset
    72
            const TInt count = iCellList.Count();
hgs
parents:
diff changeset
    73
            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapDataBase::PrepareCellListTransferBuffer() - cell count: %d", count ));
hgs
parents:
diff changeset
    74
            //
hgs
parents:
diff changeset
    75
            iHeapStream->WriteInt32( count );
hgs
parents:
diff changeset
    76
            for( TInt i=0; i<count; i++ )
hgs
parents:
diff changeset
    77
                {
hgs
parents:
diff changeset
    78
                const TMemSpyDriverCell& cell = iCellList[ i ];
hgs
parents:
diff changeset
    79
                TRACE( Kern::Printf("DMemSpyDriverLogChanHeapDataBase::PrepareCellListTransferBuffer() - storing entry: %d", i ));
hgs
parents:
diff changeset
    80
                //
hgs
parents:
diff changeset
    81
                iHeapStream->WriteInt32( cell.iType );
hgs
parents:
diff changeset
    82
                iHeapStream->WriteUint32( reinterpret_cast<TUint32>( cell.iAddress ) );
hgs
parents:
diff changeset
    83
                iHeapStream->WriteInt32( cell.iLength );
hgs
parents:
diff changeset
    84
                }
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
            // Finished with the array now
hgs
parents:
diff changeset
    87
            iCellList.Reset();
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
            // We return the amount of client-side memory that needs to be allocated to hold the buffer
hgs
parents:
diff changeset
    90
            r = requiredMemory;
hgs
parents:
diff changeset
    91
            }
hgs
parents:
diff changeset
    92
        }
hgs
parents:
diff changeset
    93
    //
hgs
parents:
diff changeset
    94
    NKern::ThreadLeaveCS();
hgs
parents:
diff changeset
    95
               
hgs
parents:
diff changeset
    96
    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapDataBase::PrepareCellListTransferBuffer() - END - r: %d", r));
hgs
parents:
diff changeset
    97
	return r;
hgs
parents:
diff changeset
    98
    }
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
TInt DMemSpyDriverLogChanHeapDataBase::FetchCellList( TDes8* aBufferSink )
hgs
parents:
diff changeset
   101
    {
hgs
parents:
diff changeset
   102
    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapDataBase::FetchCellList() - START - iHeapStream: 0x%08x", iHeapStream ));
hgs
parents:
diff changeset
   103
    __ASSERT_ALWAYS( iHeapStream, MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapFreeCellStreamNotOpen ) );
hgs
parents:
diff changeset
   104
hgs
parents:
diff changeset
   105
    TInt r = KErrNone;
hgs
parents:
diff changeset
   106
hgs
parents:
diff changeset
   107
    // Write buffer to client
hgs
parents:
diff changeset
   108
    NKern::ThreadEnterCS();
hgs
parents:
diff changeset
   109
    r = iHeapStream->WriteAndClose( aBufferSink );
hgs
parents:
diff changeset
   110
hgs
parents:
diff changeset
   111
    // Tidy up
hgs
parents:
diff changeset
   112
    ReleaseCellList();
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
    NKern::ThreadLeaveCS();
hgs
parents:
diff changeset
   115
    //
hgs
parents:
diff changeset
   116
    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapDataBase::FetchCellList() - END - r: %d", r));
hgs
parents:
diff changeset
   117
	return r;
hgs
parents:
diff changeset
   118
    }
hgs
parents:
diff changeset
   119
hgs
parents:
diff changeset
   120
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
TInt DMemSpyDriverLogChanHeapDataBase::CalculateCellListBufferSize() const
hgs
parents:
diff changeset
   123
    {
hgs
parents:
diff changeset
   124
    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapDataBase::CalculateCellListBufferSize() - START" ));
hgs
parents:
diff changeset
   125
hgs
parents:
diff changeset
   126
    const TInt count = iCellList.Count();
hgs
parents:
diff changeset
   127
    const TInt entrySize = sizeof( TInt32 ) + sizeof( TInt32 ) + sizeof( TUint32 );
hgs
parents:
diff changeset
   128
    const TInt r = ( count * entrySize ) + sizeof( TInt ); // Extra TInt to hold count
hgs
parents:
diff changeset
   129
                
hgs
parents:
diff changeset
   130
    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapDataBase::CalculateCellListBufferSize() - END - r: %d, count: %d, entrySize: %d", r, count, entrySize ));
hgs
parents:
diff changeset
   131
	return r;
hgs
parents:
diff changeset
   132
    }
hgs
parents:
diff changeset
   133
hgs
parents:
diff changeset
   134
hgs
parents:
diff changeset
   135
hgs
parents:
diff changeset
   136
void DMemSpyDriverLogChanHeapDataBase::ReleaseCellList()
hgs
parents:
diff changeset
   137
    {
hgs
parents:
diff changeset
   138
	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapDataBase::ReleaseCellList() - START - this: 0x%08x", this ));
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
    NKern::ThreadEnterCS();
hgs
parents:
diff changeset
   141
    iCellList.Reset();
hgs
parents:
diff changeset
   142
    delete iHeapStream;
hgs
parents:
diff changeset
   143
    iHeapStream = NULL;
hgs
parents:
diff changeset
   144
    NKern::ThreadLeaveCS();
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapDataBase::ReleaseCellList() - END - this: 0x%08x", this ));
hgs
parents:
diff changeset
   147
    }
hgs
parents:
diff changeset
   148
hgs
parents:
diff changeset
   149
TBool DMemSpyDriverLogChanHeapDataBase::HandleHeapCell(TMemSpyDriverCellType aCellType, TAny* aCellAddress, TInt aLength, TInt /*aNestingLevel*/, TInt /*aAllocNumber*/)
hgs
parents:
diff changeset
   150
    {
hgs
parents:
diff changeset
   151
	TInt err = KErrNone;
hgs
parents:
diff changeset
   152
    if (((aCellType & EMemSpyDriverFreeCellMask) && iHeapInfoParams.iBuildFreeCellList) || 
hgs
parents:
diff changeset
   153
        ((aCellType & EMemSpyDriverAllocatedCellMask) && iHeapInfoParams.iBuildAllocCellList))
hgs
parents:
diff changeset
   154
		{
hgs
parents:
diff changeset
   155
		TMemSpyDriverCell cell;
hgs
parents:
diff changeset
   156
		cell.iType = aCellType;
hgs
parents:
diff changeset
   157
		cell.iAddress = aCellAddress;
hgs
parents:
diff changeset
   158
		cell.iLength = aLength;
hgs
parents:
diff changeset
   159
hgs
parents:
diff changeset
   160
		NKern::ThreadEnterCS();
hgs
parents:
diff changeset
   161
		err = iCellList.Append(cell);
hgs
parents:
diff changeset
   162
		NKern::ThreadLeaveCS();
hgs
parents:
diff changeset
   163
		}
hgs
parents:
diff changeset
   164
	return err == KErrNone;
hgs
parents:
diff changeset
   165
	}
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
void DMemSpyDriverLogChanHeapDataBase::HandleHeapWalkInit()
hgs
parents:
diff changeset
   168
	{
hgs
parents:
diff changeset
   169
	}
hgs
parents:
diff changeset
   170
hgs
parents:
diff changeset
   171
TInt DMemSpyDriverLogChanHeapDataBase::GetFullData( TMemSpyDriverInternalHeapDataParams* aParams )
hgs
parents:
diff changeset
   172
    {
hgs
parents:
diff changeset
   173
    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapDataBase::GetFullData() - START"));
hgs
parents:
diff changeset
   174
hgs
parents:
diff changeset
   175
    TMemSpyDriverInternalHeapDataParams params;
hgs
parents:
diff changeset
   176
    TInt r = Kern::ThreadRawRead( &ClientThread(), aParams, &params, sizeof(TMemSpyDriverInternalHeapDataParams) );
hgs
parents:
diff changeset
   177
    //
hgs
parents:
diff changeset
   178
    if  ( r == KErrNone )
hgs
parents:
diff changeset
   179
        {
hgs
parents:
diff changeset
   180
        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapDataBase::GetFullData - thread id: %d, remaining: %8d, vtable: 0x%08x", params.iTid, params.iRemaining, params.iRHeapVTable));
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
        // NB: The two 'get heap data' functions return either an error ( < KErrNone ) or then
hgs
parents:
diff changeset
   183
        // return the length of the descriptor data that was written to the client's address
hgs
parents:
diff changeset
   184
        // space.
hgs
parents:
diff changeset
   185
        //
hgs
parents:
diff changeset
   186
        r = GetFullData( params );
hgs
parents:
diff changeset
   187
hgs
parents:
diff changeset
   188
        // Write back to user space if everything went okay. Remember that the 
hgs
parents:
diff changeset
   189
        // return value above will be the length of data that was written to the
hgs
parents:
diff changeset
   190
        // client if there was no error.
hgs
parents:
diff changeset
   191
        if  ( r >= KErrNone )
hgs
parents:
diff changeset
   192
            {
hgs
parents:
diff changeset
   193
            const TInt clientDescriptorLength = r;
hgs
parents:
diff changeset
   194
hgs
parents:
diff changeset
   195
            // Make sure we update client's remaining data
hgs
parents:
diff changeset
   196
            r = Kern::ThreadRawWrite( &ClientThread(), aParams, &params, sizeof(TMemSpyDriverInternalHeapDataParams) );
hgs
parents:
diff changeset
   197
            
hgs
parents:
diff changeset
   198
            // ... and if that went okay, then we return the length of the descriptor data
hgs
parents:
diff changeset
   199
            // back to the client.
hgs
parents:
diff changeset
   200
            if  ( r == KErrNone )
hgs
parents:
diff changeset
   201
                {
hgs
parents:
diff changeset
   202
                r = clientDescriptorLength;
hgs
parents:
diff changeset
   203
                }
hgs
parents:
diff changeset
   204
            }
hgs
parents:
diff changeset
   205
        }
hgs
parents:
diff changeset
   206
    else
hgs
parents:
diff changeset
   207
        {
hgs
parents:
diff changeset
   208
        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapDataBase::GetFullData - params read error: %d", r));
hgs
parents:
diff changeset
   209
        }
hgs
parents:
diff changeset
   210
hgs
parents:
diff changeset
   211
    // Done
hgs
parents:
diff changeset
   212
    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapDataBase::GetFullData() - END - ret: %d", r));
hgs
parents:
diff changeset
   213
    return r;
hgs
parents:
diff changeset
   214
    }
hgs
parents:
diff changeset
   215
hgs
parents:
diff changeset
   216
TInt DMemSpyDriverLogChanHeapDataBase::DoGetFullData(TMemSpyDriverInternalHeapDataParams& aParams, 
hgs
parents:
diff changeset
   217
                                                     DThread* aThread, 
hgs
parents:
diff changeset
   218
                                                     RMemSpyDriverRHeapBase& aHeap)
hgs
parents:
diff changeset
   219
    {
hgs
parents:
diff changeset
   220
    TInt r = KErrNone;
hgs
parents:
diff changeset
   221
    if  ( aParams.iChecksum != 0 )
hgs
parents:
diff changeset
   222
        {
hgs
parents:
diff changeset
   223
        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapDataBase::DoGetFullData - checksum validation requested - expecting: 0x%08x", aParams.iChecksum ) );
hgs
parents:
diff changeset
   224
        
hgs
parents:
diff changeset
   225
        RMemSpyDriverHeapWalker heapWalker(aHeap);
hgs
parents:
diff changeset
   226
        
hgs
parents:
diff changeset
   227
        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapDataBase::DoGetFullData - starting traversal..." ));
hgs
parents:
diff changeset
   228
#if ( defined( TRACE_TYPE_USERHEAP ) && defined( TRACE_TYPE_HEAPWALK ) )
hgs
parents:
diff changeset
   229
        heapWalker.SetPrintDebug();
hgs
parents:
diff changeset
   230
#endif
hgs
parents:
diff changeset
   231
        r = heapWalker.Traverse();
hgs
parents:
diff changeset
   232
        const TUint32 calculatedChecksum = heapWalker.Stats().iFreeCellCRC;
hgs
parents:
diff changeset
   233
        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapDataBase::DoGetFullData - finished traversal - err: %d, checksum: 0x%08x", r, calculatedChecksum ));
hgs
parents:
diff changeset
   234
hgs
parents:
diff changeset
   235
        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapDataBase::DoGetFullData - comparing CALCULATED: 0x%08x vs EXPECTED: 0x%08x", calculatedChecksum, aParams.iChecksum ));
hgs
parents:
diff changeset
   236
        if  ( calculatedChecksum != aParams.iChecksum )
hgs
parents:
diff changeset
   237
            {
hgs
parents:
diff changeset
   238
            Kern::Printf("DMemSpyDriverLogChanHeapDataBase::DoGetFullData - comparing CALCULATED: 0x%08x vs EXPECTED: 0x%08x for thread %O", calculatedChecksum, aParams.iChecksum, aThread );
hgs
parents:
diff changeset
   239
            r = KErrCorrupt;
hgs
parents:
diff changeset
   240
            }
hgs
parents:
diff changeset
   241
        }
hgs
parents:
diff changeset
   242
hgs
parents:
diff changeset
   243
    // Get user side (MemSpyApp) descriptor length info
hgs
parents:
diff changeset
   244
    if  ( r == KErrNone )
hgs
parents:
diff changeset
   245
        {
hgs
parents:
diff changeset
   246
        TInt destLen = 0;
hgs
parents:
diff changeset
   247
        TInt destMax = 0;
hgs
parents:
diff changeset
   248
        TUint8* destPtr = NULL;
hgs
parents:
diff changeset
   249
        r = Kern::ThreadGetDesInfo( &ClientThread(), aParams.iDes, destLen, destMax, destPtr, ETrue );
hgs
parents:
diff changeset
   250
        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapDataBase::DoGetFullData - user side descriptor: 0x%08x (0x%08x), len: %8d, maxLen: %8d, r: %d", aParams.iDes, destPtr, destLen, destMax, r ));
hgs
parents:
diff changeset
   251
        destMax = destMax & ~(KPageSize-1); // Round down dest max to page size
hgs
parents:
diff changeset
   252
        if (destMax <= 0 || (aParams.iReadAddress & (KPageSize-1)))
hgs
parents:
diff changeset
   253
            {
hgs
parents:
diff changeset
   254
            // If destMax is less than a page or the read address isn't a multiple of page size then we don't want to know
hgs
parents:
diff changeset
   255
            r = KErrArgument;
hgs
parents:
diff changeset
   256
            }
hgs
parents:
diff changeset
   257
hgs
parents:
diff changeset
   258
        if  ( r == KErrNone )
hgs
parents:
diff changeset
   259
            {
hgs
parents:
diff changeset
   260
            const TLinAddr chunkBase = aHeap.ChunkBase(); 
hgs
parents:
diff changeset
   261
            const TLinAddr chunkMaxAddr = chunkBase + OSAdaption().DChunk().GetMaxSize(aHeap.Chunk());
hgs
parents:
diff changeset
   262
            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapDataBase::DoGetFullData - chunkBase:    0x%08x", chunkBase) );
hgs
parents:
diff changeset
   263
hgs
parents:
diff changeset
   264
            TLinAddr readAddress = aParams.iReadAddress;
hgs
parents:
diff changeset
   265
            if (aParams.iRemaining < 0 )
hgs
parents:
diff changeset
   266
                {
hgs
parents:
diff changeset
   267
                // Initial case, start from the bottom
hgs
parents:
diff changeset
   268
                readAddress = chunkBase;
hgs
parents:
diff changeset
   269
                aParams.iRemaining = aHeap.Helper()->CommittedSize();
hgs
parents:
diff changeset
   270
                }
hgs
parents:
diff changeset
   271
hgs
parents:
diff changeset
   272
            // The remaining number of bytes should allow us to calculate the position
hgs
parents:
diff changeset
   273
            // to read from.
hgs
parents:
diff changeset
   274
            TInt amountToRead = Min( aParams.iRemaining, destMax );
hgs
parents:
diff changeset
   275
            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapDataBase::DoGetFullData - amountToRead:           %8d", amountToRead) );
hgs
parents:
diff changeset
   276
hgs
parents:
diff changeset
   277
            // Do the read from the heap we are spying on into MemSpy's address space
hgs
parents:
diff changeset
   278
            do
hgs
parents:
diff changeset
   279
                {
hgs
parents:
diff changeset
   280
                r = Kern::ThreadRawRead( aThread, (const void*)readAddress, destPtr, amountToRead );
hgs
parents:
diff changeset
   281
                TRACE( Kern::Printf("DMemSpyDriverLogChanHeapDataBase::DoGetFullData - reading %d bytes starting at 0x%08x result: %d", 
hgs
parents:
diff changeset
   282
                                     amountToRead, readAddress, r) );
hgs
parents:
diff changeset
   283
hgs
parents:
diff changeset
   284
                if (r == KErrBadDescriptor)
hgs
parents:
diff changeset
   285
                    {
hgs
parents:
diff changeset
   286
                    // This is not necessarily an error - it could be we've hit an unmapped page
hgs
parents:
diff changeset
   287
                    if (amountToRead > KPageSize)
hgs
parents:
diff changeset
   288
                        {
hgs
parents:
diff changeset
   289
                        // retry reading a single page instead
hgs
parents:
diff changeset
   290
                        amountToRead = KPageSize;
hgs
parents:
diff changeset
   291
                        }
hgs
parents:
diff changeset
   292
                    else
hgs
parents:
diff changeset
   293
                        {
hgs
parents:
diff changeset
   294
                        // Try the next page
hgs
parents:
diff changeset
   295
                        readAddress += KPageSize;
hgs
parents:
diff changeset
   296
                        }
hgs
parents:
diff changeset
   297
                    }
hgs
parents:
diff changeset
   298
                } while (r == KErrBadDescriptor && readAddress < chunkMaxAddr);
hgs
parents:
diff changeset
   299
            //
hgs
parents:
diff changeset
   300
            if  (r == KErrNone)
hgs
parents:
diff changeset
   301
                {
hgs
parents:
diff changeset
   302
                // Client takes care of updating descriptor length.
hgs
parents:
diff changeset
   303
                r = amountToRead;
hgs
parents:
diff changeset
   304
                }
hgs
parents:
diff changeset
   305
hgs
parents:
diff changeset
   306
            // Update remaining bytes
hgs
parents:
diff changeset
   307
            aParams.iRemaining -= amountToRead;
hgs
parents:
diff changeset
   308
            aParams.iReadAddress = readAddress;
hgs
parents:
diff changeset
   309
            }
hgs
parents:
diff changeset
   310
        }
hgs
parents:
diff changeset
   311
    return r;
hgs
parents:
diff changeset
   312
    }