diff -r 000000000000 -r a41df078684a kernel/eka/debug/utrace/src/e32utrace.cpp --- /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 +#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 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 aFmt,...) + { + if(WouldBeTracedNow(aContext)) + { + GET_PC(pc); + TBuf8 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 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 aFmt,...) + { + if(WouldBeTracedNow(aContext)) + { + GET_PC(pc); + TTruncateOverflow8 overflow; + VA_LIST list; + VA_START(list,aFmt); + TBuf8 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 aFmt,...) + { + if(WouldBeTracedNow(aContext)) + { + GET_PC(pc); + TTruncateOverflow16 overflow; + VA_LIST list; + VA_START(list,aFmt); + TBuf 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 ,...) { return EFalse; } +#ifndef __KERNEL_MODE__ +EXPORT_C TBool Printf(const TTraceContext&, TRefByValue,...) { 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 + +