kernel/eka/debug/utrace/src/e32utrace.cpp
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kernel/eka/debug/utrace/src/e32utrace.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,535 @@
+// Copyright (c) 2007-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:
+// Trace API
+//
+
+#include <e32utf.h>
+#include "traceutils.h"
+
+
+//Add the Doxygen macro so that Doxygen doesn't need to know about the SYMBIAN_TRACE_EXECUTABLE_IS_INCLUDED define.
+//This allows doxygen to pick up the comments for the enabled implementation of the trace API.
+#ifdef __DOXYGEN__
+	#define SYMBIAN_TRACE_EXECUTABLE_IS_INCLUDED
+#endif //__DOXYGEN__
+
+
+namespace UTF
+{
+
+
+/**
+ * This method currently returns 0 until a fix is provided
+ * for:
+ * DPDEF110067	[Trace STP][ADP37] No Way for The Secondary Category to Be Set To Default
+ * DEF119891	[TraceSTP] 1.4.1 Default the ModuleUid
+ * This will in the future return the UID3 of the executable.
+ *
+ * @return Returns 0.
+ */
+EXPORT_C TModuleUid TTraceContext::DefaultModuleUid()
+	{
+	return 0;
+	}
+
+
+/**
+ * Check if thread identification will be added by default.
+ */
+EXPORT_C THasThreadIdentification TTraceContext::HasThreadIdentification()  const
+	{
+	return iHasThreadIdentification;
+	};
+
+/**
+ * Check if PC will be added by default.
+ */
+EXPORT_C THasProgramCounter TTraceContext::HasProgramCounter()  const
+	{
+	return iHasProgramCounter;
+	};
+
+
+/**
+ * Get the current classification
+ *
+ * @return The current classification of the trace point context.
+ */
+EXPORT_C TClassification TTraceContext::Classification() const
+	{
+	return iClassification;
+	};
+
+/**
+ * Get the current module Uid
+ *
+ * @return The currently set module Uid
+ */
+EXPORT_C TModuleUid TTraceContext::ModuleUid() const
+	{
+	return iModuleUid;
+	}
+
+
+//--------------------- UTrace compiled in ------------------------
+#ifdef SYMBIAN_TRACE_EXECUTABLE_IS_INCLUDED
+
+
+
+// --------- printf ------------
+
+/**
+Prints a string by outputting a trace packet with the format id KFormatPrintf.
+
+If the specified string is too long to fit into a single trace packet
+a multipart trace is generated.
+
+@param aContext 	The trace packet context. @see TTraceContext
+@param aDes			The string. This can be of variable length.
+
+@return 			The trace packet was/was not output.
+
+@See BTrace::TMultipart
+*/
+EXPORT_C TBool Print(const TTraceContext& aContext, const TDesC8& aDes)
+	{
+	if(WouldBeTracedNow(aContext))
+		{
+		GET_PC(pc);
+		return UTRACE_SECONDARY_ANY(aContext.Classification(), aContext.ModuleUid(), aContext.HasThreadIdentification(), aContext.HasProgramCounter(), pc, KFormatPrintf, aDes.Ptr(), aDes.Size());
+		}
+	return EFalse;
+	};
+
+
+#ifdef  __KERNEL_MODE__
+
+/**
+Prints a formatted string in kernel mode only by outputting a trace packet with the format id KFormatPrintf.
+
+The function uses Kern::AppendFormat() to do the formatting.
+
+Although it is safe to call this function from an ISR, it polls the output
+serial port and may take a long time to complete, invalidating any
+real-time guarantee.
+
+If called from an ISR, it is possible for output text to be intermingled
+with other output text if one set of output interrupts or preempts another.
+
+Some of the formatting options may not work inside an ISR.
+
+Be careful not to use a string that is too long to fit onto the stack.
+If the specified string is too long to fit into a single trace packet
+a multipart trace is generated.
+
+
+@param aContext 	The trace packet context. @see TTraceContext
+@param aFmt 		The format string. This must not be longer than 256 characters.
+@param ...			A variable number of arguments to be converted to text as dictated
+					by the format string.
+
+@return 			The trace packet was/was not output.
+
+@pre Calling thread can either be in a critical section or not.
+@pre Interrupts must be enabled.
+@pre Kernel must be unlocked
+@pre Call in any context.
+@pre Suitable for use in a device driver
+
+@see Kern::AppendFormat()
+@See BTrace::TMultipart
+
+Note: Until the Utrace packet format is changed this call will not add the
+FormatId to the trace packet for kernel side traces.
+*/
+EXPORT_C TBool Printf(const TTraceContext& aContext, const char* aFmt, ...)
+	{
+	if(WouldBeTracedNow(aContext))
+		{
+		GET_PC(pc);
+		TBuf8<KMaxPrintfSize> buf;
+		VA_LIST list;
+		VA_START(list,aFmt);
+		Kern::AppendFormat(buf,aFmt,list);
+		return UTRACE_SECONDARY_ANY(aContext.Classification(), aContext.ModuleUid(), aContext.HasThreadIdentification(), aContext.HasProgramCounter(), pc, KFormatPrintf, buf.Ptr(), buf.Size());
+		}
+	return EFalse;
+	}
+
+/**
+Prints a formatted string by outputting a trace packet with the format id KFormatPrintf.
+
+If the specified string is too long to fit into a single trace packet
+a multipart trace is generated.
+
+@param aContext 	The trace packet context. @see TTraceContext
+@param aFmt 		The format string. This must not be longer than 256 characters.
+@param ...			A variable number of arguments to be converted to text as dictated
+					by the format string.
+
+@return 			The trace packet was/was not output.
+
+@See BTrace::TMultipart
+*/
+EXPORT_C TBool Printf(const TTraceContext& aContext, TRefByValue<const TDesC8> aFmt,...)
+	{
+	if(WouldBeTracedNow(aContext))
+		{
+		GET_PC(pc);
+		TBuf8<KMaxPrintfSize> buf;
+		VA_LIST list;
+		VA_START(list,aFmt);
+		TDesC8 fmt = aFmt;
+		Kern::AppendFormat(buf,(char*)fmt.Ptr(),list);
+		return UTRACE_SECONDARY_ANY(aContext.Classification(), aContext.ModuleUid(), aContext.HasThreadIdentification(), aContext.HasProgramCounter(), pc, KFormatPrintf, buf.Ptr(), buf.Size());
+		}
+	return EFalse;
+	}
+
+#endif // __KERNEL_MODE__
+#ifndef __KERNEL_MODE__
+
+/**
+Prints a formatted string by outputting a trace packet with the format id KFormatPrintf.
+
+
+If the specified string is too long to fit into a single trace packet
+a multipart trace is generated.
+
+@param aContext 	The trace packet context. @see TTraceContext
+@param aFmt 		The format string. This must not be longer than 256 characters.
+@param ...			A variable number of arguments to be converted to text as dictated
+					by the format string.
+
+@return 			The trace packet was/was not output.
+
+@See BTrace::TMultipart
+*/
+EXPORT_C TBool Printf(const TTraceContext& aContext, const char* aFmt, ...)
+	{
+	if(WouldBeTracedNow(aContext))
+		{
+		GET_PC(pc);
+		TTruncateOverflow8 overflow;
+		VA_LIST list;
+		VA_START(list,aFmt);
+		TPtrC8 fmt((const TText8*)aFmt);
+		TBuf8<KMaxPrintfSize> buf;
+        // coverity[uninit_use_in_call]
+		buf.AppendFormatList(fmt,list,&overflow);
+		return UTRACE_SECONDARY_ANY(aContext.Classification(), aContext.ModuleUid(), aContext.HasThreadIdentification(), aContext.HasProgramCounter(), pc, KFormatPrintf, buf.Ptr(), buf.Size());
+		}
+	return EFalse;
+	};
+
+/**
+Prints a formatted string by outputting a trace packet with the format id KFormatPrintf.
+
+If the specified string is too long to fit into a single trace packet
+a multipart trace is generated.
+
+@param aContext 	The trace packet context. @see TTraceContext
+@param aFmt 		The format string. This must not be longer than 256 characters.
+@param ...			A variable number of arguments to be converted to text as dictated
+					by the format string.
+
+@return 			The trace packet was/was not output.
+
+@See BTrace::TMultipart
+*/
+EXPORT_C TBool Printf(const TTraceContext& aContext, TRefByValue<const TDesC8> aFmt,...)
+	{
+	if(WouldBeTracedNow(aContext))
+		{
+		GET_PC(pc);
+		TTruncateOverflow8 overflow;
+		VA_LIST list;
+		VA_START(list,aFmt);
+		TBuf8<KMaxPrintfSize> buf;
+        // coverity[uninit_use_in_call]
+		buf.AppendFormatList(aFmt,list,&overflow);
+		return UTRACE_SECONDARY_ANY(aContext.Classification(), aContext.ModuleUid(), aContext.HasThreadIdentification(), aContext.HasProgramCounter(), pc, KFormatPrintf, buf.Ptr(), buf.Size());
+		}
+	return EFalse;
+	}
+
+/**
+Prints a formatted string by outputting a trace packet with the format id
+KFormatPrintfUnicode for unicode strings and KFormatPrintf for other strings.
+
+If the specified string is too long to fit into a single trace packet
+a multipart trace is generated.
+
+@param aContext 	The trace packet context. @see TTraceContext
+@param aFmt 		The format string. This must not be longer than 256 characters.
+@param ...			A variable number of arguments to be converted to text as dictated
+					by the format string.
+
+@return 			The trace packet was/was not output.
+
+@See BTrace::TMultipart
+*/
+EXPORT_C TBool Printf(const TTraceContext& aContext, TRefByValue<const TDesC16> aFmt,...)
+	{
+	if(WouldBeTracedNow(aContext))
+		{
+		GET_PC(pc);
+		TTruncateOverflow16 overflow;
+		VA_LIST list;
+		VA_START(list,aFmt);
+		TBuf<KMaxPrintfSize> buf;
+	    // coverity[uninit_use_in_call]
+		buf.AppendFormatList(aFmt,list,&overflow);
+		#ifndef _UNICODE
+		TPtr8 p(buf.Collapse());
+		return UTRACE_SECONDARY_ANY(aContext.Classification(), aContext.ModuleUid(), aContext.HasThreadIdentification(), aContext.HasProgramCounter(), myPc, KFormatPrintf, buf.PtrZ(), p.Size());
+		#else //_UNICODE
+		return UTRACE_SECONDARY_ANY(aContext.Classification(), aContext.ModuleUid(), aContext.HasThreadIdentification(), aContext.HasProgramCounter(), pc, KFormatPrintfUnicode, buf.PtrZ(), buf.Size());
+		#endif //_UNICODE
+		}
+	return EFalse;
+	};
+
+
+/**
+Prints a string by outputting a trace packet with the format id KFormatPrintf
+
+If the specified string is too long to fit into a single trace packet
+a multipart trace is generated.
+
+@param aContext 	The trace packet context. @see TTraceContext
+@param aDes			The string. This must not be longer than 256 characters.
+
+@return 			The trace packet was/was not output.
+
+@See BTrace::TMultipart
+*/
+EXPORT_C TBool Print(const TTraceContext& aContext, const TDesC16& aDes)
+	{
+	if(WouldBeTracedNow(aContext))
+		{
+		GET_PC(pc);
+		return UTRACE_SECONDARY_ANY(aContext.Classification(), aContext.ModuleUid(), aContext.HasThreadIdentification(), aContext.HasProgramCounter(), pc, KFormatPrintfUnicode, aDes.Ptr(), aDes.Size());
+		}
+	return EFalse;
+	}
+#endif // __KERNEL_MODE__
+
+
+// --------- trace ------------
+
+/**
+Outputs a trace packet containing no payload data.
+
+@param aContext 	The trace packet context. @see TTraceContext
+@param aFormatId	A format identifier as specified by @see TFormatId
+
+@return		 		The trace packet was/was not output.
+*/
+EXPORT_C TBool Trace(const TTraceContext& aContext, TFormatId aFormatId)
+	{
+	GET_PC(pc);
+	return UTRACE_SECONDARY_0(aContext.Classification(),aContext.ModuleUid(),aContext.HasThreadIdentification(),aContext.HasProgramCounter(), pc, aFormatId);
+	}
+
+/**
+Outputs a trace packet containing 4 bytes of data.
+
+@param aContext 	The trace packet context. @see TTraceContext
+@param aFormatId	A format identifier as specified by @see TFormatId
+@param aData		4 bytes of data
+
+@return 		The trace packet was/was not output.
+*/
+EXPORT_C TBool Trace(const TTraceContext& aContext, TFormatId aFormatId, TUint32 aData)
+	{
+	GET_PC(pc);
+	return UTRACE_SECONDARY_1(aContext.Classification(),aContext.ModuleUid(),aContext.HasThreadIdentification(),aContext.HasProgramCounter(),pc,aFormatId,aData);
+	}
+
+/**
+Outputs a trace packet containing 8 bytes of data.
+
+@param aContext 	The trace packet context. @see TTraceContext
+@param aFormatId	A format identifier as specified by @see TFormatId
+@param aData1		4 bytes of data
+@param aData2		4 bytes of data
+
+@return 		The trace packet was/was not output.
+*/
+EXPORT_C TBool Trace(const TTraceContext& aContext, TFormatId aFormatId, TUint32 aData1, TUint32 aData2)
+	{
+	GET_PC(pc);
+	TUint32 packet[2];
+	packet[0] = aData1;
+	packet[1] = aData2;
+	return UTRACE_SECONDARY_ANY(aContext.Classification(), aContext.ModuleUid(), aContext.HasThreadIdentification(), aContext.HasProgramCounter(), pc, aFormatId, &packet, 8);
+	}
+
+/**
+Outputs a trace packet containing variable length data.
+
+If the specified data is too big to fit into a single
+trace packet a multipart trace is generated.
+
+
+@param aContext 	The trace packet context. @see TTraceContext
+@param aFormatId	A format identifier as specified by @see TFormatId
+@param aData		Address of additional data to add to trace packet.
+					Must be word aligned, i.e. a multiple of 4.
+@param aSize		Number of bytes of additional data.
+
+@return 			The trace packet was/was not output.
+
+@See BTrace::TMultipart
+*/
+EXPORT_C TBool Trace(const TTraceContext& aContext, TFormatId aFormatId, const TAny* aData, TInt aSize)
+	{
+	if(WouldBeTracedNow(aContext))
+		{
+		GET_PC(pc);
+		return UTRACE_SECONDARY_ANY(aContext.Classification(), aContext.ModuleUid(), aContext.HasThreadIdentification(), aContext.HasProgramCounter(), pc, aFormatId, aData, aSize);
+		}
+	return EFalse;
+	}
+
+/**
+Outputs a trace packet containing 4 bytes of data.
+
+@param aContext 	The trace packet context. @see TTraceContext
+@param aFormatId	A format identifier as specified by @see TFormatId
+@param aData		4 bytes of data
+
+@return 		The trace packet was/was not output.
+*/
+EXPORT_C TBool Trace(const TTraceContext& aContext, const TFormatId aFormatId, const TUint16 aData)
+	{
+	GET_PC(pc);
+	return UTRACE_SECONDARY_1(aContext.Classification(),aContext.ModuleUid(),aContext.HasThreadIdentification(),aContext.HasProgramCounter(),pc,aFormatId,aData);
+	}
+
+/**
+Outputs a trace packet containing 4 bytes of data.
+
+@param aContext 	The trace packet context. @see TTraceContext
+@param aFormatId	A format identifier as specified by @see TFormatId
+@param aData		4 bytes of data
+
+@return 		The trace packet was/was not output.
+*/
+EXPORT_C TBool Trace(const TTraceContext& aContext, const TFormatId aFormatId, const TUint8 aData)
+	{
+	GET_PC(pc);
+	return UTRACE_SECONDARY_1(aContext.Classification(),aContext.ModuleUid(),aContext.HasThreadIdentification(),aContext.HasProgramCounter(),pc,aFormatId,aData);
+	}
+
+#ifndef __KERNEL_MODE__
+/**
+Outputs a trace packet containing variable length data.
+
+If the specified data is too big to fit into a single
+trace record a multipart trace is generated.
+
+@param aContext 	Attributes of the trace point.
+@param aFormatId	A format identifier as specified by @see TFormatId
+@param aData		Additional data to add to trace packet.
+					Must be word aligned, i.e. a multiple of 4.
+
+@return 			The trace packet was/was not logged.
+
+@See BTrace::TMultipart
+*/
+EXPORT_C TBool Trace(const TTraceContext& aContext, const TFormatId aFormatId, const TDesC16& aData)
+	{
+	if(WouldBeTracedNow(aContext))
+		{
+		GET_PC(pc);
+		return UTRACE_SECONDARY_ANY(aContext.Classification(), aContext.ModuleUid(), aContext.HasThreadIdentification(), aContext.HasProgramCounter(), pc, aFormatId, aData.Ptr(), aData.Size());
+		}
+	return EFalse;
+	}
+#endif //__KERNEL_MODE__
+
+/**
+Outputs a trace packet containing variable length data.
+
+If the specified data is too big to fit into a single
+trace record a multipart trace is generated.
+
+@param aContext 	Attributes of the trace point.
+@param aFormatId	A format identifier as specified by @see TFormatId
+@param aData		Additional data to add to trace packet.
+					Must be word aligned, i.e. a multiple of 4.
+
+@return 			The trace packet was/was not logged.
+
+@See BTrace::TMultipart
+*/
+EXPORT_C TBool Trace(const TTraceContext& aContext, const TFormatId aFormatId, const TDesC8& aData)
+	{
+	if(WouldBeTracedNow(aContext))
+		{
+		GET_PC(pc);
+		return UTRACE_SECONDARY_ANY(aContext.Classification(), aContext.ModuleUid(), aContext.HasThreadIdentification(), aContext.HasProgramCounter(), pc, aFormatId, aData.Ptr(), aData.Size());
+		}
+	return EFalse;
+	}
+
+
+
+/**
+ * Check whether a trace packet would be traced or not.
+ *
+ * @param aContext The context of the trace packet(s) to be checked.
+ * @return Returns whether the trace packet would be traced or not.
+ * Note: The value should never be stored since the filters can be changed without warning.
+ */
+EXPORT_C TBool WouldBeTracedNow(const TTraceContext& aContext)
+	{
+	return BTrace::CheckFilter2(aContext.Classification(), aContext.ModuleUid());
+	};
+
+//--------------------- UTrace compiled out ------------------------
+
+#else //SYMBIAN_TRACE_EXECUTABLE_IS_INCLUDED
+
+//--------printf
+EXPORT_C TBool Printf(const TTraceContext&, const char*, ...) { return EFalse; }
+EXPORT_C TBool Print(const TTraceContext&, const TDesC8&) { return EFalse; }
+EXPORT_C TBool Printf(const TTraceContext&, TRefByValue<const TDesC8> ,...) { return EFalse; }
+#ifndef  __KERNEL_MODE__
+EXPORT_C TBool Printf(const TTraceContext&, TRefByValue<const TDesC16>,...) { return EFalse; }
+EXPORT_C TBool Print(const TTraceContext&, const TDesC16&) { return EFalse; }
+#endif //__KERNEL_MODE__
+
+//--------trace
+EXPORT_C TBool Trace(const TTraceContext&, TFormatId) { return EFalse; }
+EXPORT_C TBool Trace(const TTraceContext&, TFormatId, TUint32) { return EFalse; }
+EXPORT_C TBool Trace(const TTraceContext&, TFormatId, TUint32, TUint32) { return EFalse; }
+EXPORT_C TBool Trace(const TTraceContext&, TFormatId, const TAny*, TInt) { return EFalse; }
+
+EXPORT_C TBool Trace(const TTraceContext&, const TFormatId, const TUint8) { return EFalse; }
+EXPORT_C TBool Trace(const TTraceContext&, const TFormatId, const TUint16) { return EFalse; }
+EXPORT_C TBool Trace(const TTraceContext&, const TFormatId, const TDesC8&) { return EFalse; }
+#ifndef __KERNEL_MODE__
+EXPORT_C TBool Trace(const TTraceContext&, const TFormatId, const TDesC16&) { return EFalse; }
+#endif
+EXPORT_C TBool WouldBeTracedNow(const TTraceContext&) { return EFalse; }
+
+
+#endif //SYMBIAN_TRACE_EXECUTABLE_IS_INCLUDED
+
+}//namespace UTF
+
+