kernel/eka/debug/crashMonitor/inc/scmdatasave.h
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 30 8aab599e3476
parent 0 a41df078684a
child 23 1df514389a47
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of the License "Eclipse Public License v1.0"
// which accompanies this distribution, and is available
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
// e32\include\kernel\scmdatasave.h
// Kernel System crash data save header file
// 
// WARNING: This file contains some APIs which are internal and are subject
//          to change without notice. Such APIs should therefore not be used
//          outside the Kernel and Hardware Services package.
//

#ifndef SCMDATASAVE_H
#define SCMDATASAVE_H

/**
 @file
 @internalComponent
 */

#include <plat_priv.h>
#include <kernel/monitor.h>
#include <e32des8.h>	
#include <arm.h>
#include <crashflash.h>

#include <scmdatatypes.h>
#include <scmbytestreamutil.h>
#include <scmconfig.h>

using namespace Debug;

IMPORT_C TInt64 CrashTime();


_LIT8(KKernelHeapChunkName, "ekern.exe::SvHeap");


/**
 * This class handles gathering of the kernel data and writing it to flash
 * 
 */
class SCMDataSave : MPhysicalWriterImpl
	{	
	public:	
	    enum TRegisterSetType
	        {
	        EUserRegisters = 0,
	        ESupervisorRegisters = 1,
	        EFullCPURegisters = 2,
	        ERegSetNone = 3,
	        ERegLast
	        }; 
	    
	    enum TStackType
	    	{
	    	EUsrStack = 0,
	    	ESvrStack = 1,
	    	EStackTypeNone = 2,
	    	EStackLast
	    	};
	    
	    enum TDumpScope
	    	{
	    	EThreadSpecific = 0,
	    	EProcessSpecific = 1,
	    	ESystemWide = 2,
	    	EDumpLast
	    	};
	    
	    /**
	     * This structure defines the type of data we wish to dump for a given kernel object
	     */
	    struct TDataToDump
	    	{
	    	TBool iMetaData;   		/**< Dump meta data about object */
	    	TBool iCodeSegs;   		/**< Dump DProcess code segs (ignored for other objects) */
	    	TStackType iStk;   		/**< Dump this stack type */
	    	TRegisterSetType iReg;  /**< Dump this register set */
	    		    	
	    	TDataToDump()
	    		{
	    		//upon construction, nothing is set to be dumped
	    		iMetaData = EFalse;
	    		iCodeSegs = EFalse;
	    		iStk = EStackTypeNone;
	    		iReg = ERegSetNone;
	    		}
	    	
	    	};
	    
		enum TWriteSelect
			{ 
			EWriteFlash = 0, /**< write data to flash */
			EWriteComm =1,   /**< write data to comm port */
			ELast
			};
    
	public:
		
		IMPORT_C SCMDataSave(Monitor* aMonitor, CrashFlash* aFlash);
		virtual ~SCMDataSave();

		
		TInt LogCrashHeader(const TDesC8& aCategory, TInt aReason, TInt aCrashId, TUint& aSizeDumped);
		TInt LogThreadData(DThread* aThread, TUint& aSizeDumped);
		TInt LogProcessData(DProcess* aProcess, TUint& aSizeDumped);
		TInt LogCodeSegments(DProcess* aProcess, TUint& aSizeDumped);
				
		TInt LogThreadUserStack(DThread* aThread, TBool aFullStack, TUint& aSizeDumped);
		TInt LogThreadSupervisorStack(DThread* aThread, TBool aFullStack, TUint& aSizeDumped);		
						
		TInt LogRegisters(DThread* aThread, const TRegisterSetType& aRegType, TUint& aSizeDumped);	
		TInt LogCPURegisters(TUint& aSizeDumped);
		TInt ReadUserRegisters(DThread* aThread, TArmRegSet& aRegs, TUint32& aAvailableRegs);
		TInt ReadSystemRegisters(DThread* aThread, TArmRegSet& aRegs, TUint32& aAvailableRegs);
		void ReadCPURegisters(SFullArmRegSet& aRegs);
		
		TInt LogMemory(const TUint8* aStartAddress, TInt aLength, const DThread* aThread, TUint& aSizeDumped);	
		TInt LogExceptionStacks(TUint& aSizeDumped);	
		TInt LogTraceBuffer(TInt aSizeToDump, TUint& aSizeDumped);
		TInt LogLocks(TUint& aSizeDumped);		
		TInt LogRawData(const TDesC8& aData, TUint& aSizeDumped);
		TInt LogVariantSpecificData(TUint& aSizeDumped);
		TInt LogRomInfo(TUint& aSizeDumped);
		
		TInt LogKernelHeap(TUint& aSizeDumped);		
		TInt FindKernelHeap(TInt32& aHeapLocation, TInt32& aHeapSize);
		
		TInt LogConfig(SCMConfiguration& aConfig);
		TInt ReadConfig(SCMConfiguration& aScmConfig);
		
		
		void Write(const TAny* aSomething, TInt aSize);
		static void WriteUart(const TUint8* aData, TInt aSize);			
		static void WriteUart(const TDesC8& aDes);
		virtual void DoPhysicalWrite(TAny* aData, TInt aPos, TInt aLen);
				
		void WriteCrashFlash(TInt aPos, TInt& aSize, const TDesC8& aBuffer);
				
		TInt GetRegisterType(const TRegisterSetType& aSetType, TInt32& aRegNumber, TUint32& aRegisterType);
		TInt GetByteCount();
		void SetByteCount(TInt aByte);
		
		
		TWriteSelect GetWriteSelect();
		void SetWriteSelect(TWriteSelect aWriteSelect);
	
		TUint SpaceRemaining();
		TUint MaxLogSize();
		
		void SetCrashStartingPoint(TUint32 aStart);
		TUint32 GetCrashStartingPoint() {return iStartingPointForCrash;}
		
	public:
		
		/** Offsets header to assist parsing */		
		TCrashOffsetsHeader 	iHdr;		  	
		
		/** Basic crash info */
		TCrashInfoHeader		iCrashInf;   	
		
		/** Writer for physical writing */
		TCachedByteStreamWriter* iWriter;		
		
	private:				
		Monitor* iMonitor; //need to use this to map memory and things like that
		CrashFlash* iFlash;
		TTraceDump iTrace;
		
		TInt iByteCount;
		
		//This is a pointer to memory on the heap we can use that is the same size as iFlash.GetFlashBlockSize()
		HBuf8* iFlashCache;
				
		TWriteSelect iWriteSelect;
		TBool iPerformChecksum;
		TScmChecksum iChecksum;	

		TUint32 iStartingPointForCrash;	
	};

#endif /*SCMDATASAVE_H*/