#ifndef _IOKIT_IOUSBLOG_H
#define _IOKIT_IOUSBLOG_H
#include <IOKit/IOService.h>
#include <IOKit/IOLib.h>
#ifdef __cplusplus
extern "C" {
#endif
#define USBLog( LEVEL, ARGS...) KernelDebugLogTag( LEVEL, 'USBF', ## ARGS )
#define USBError( LEVEL, ARGS...) KernelDebugLogInternal( ( LEVEL ), 'USBF', ## ARGS )
#define DEBUG_LEVEL_PRODUCTION 0
#define DEBUG_LEVEL_DEVELOPMENT 1
#define DEBUG_LEVEL_ALPHA 2
#define DEBUG_LEVEL_BETA 3
#define DEBUG_LEVEL_FINAL DEBUG_LEVEL_PRODUCTION
#if( !defined( DEBUG_LEVEL ) )
#define DEBUG_LEVEL DEBUG_LEVEL_FINAL
#endif
enum
{
kUSBControllerUserClientOpen = 0,
kUSBControllerUserClientClose,
kUSBControllerUserClientEnableLogger,
kUSBControllerUserClientSetDebuggingLevel,
kUSBControllerUserClientSetDebuggingType,
kUSBControllerUserClientGetDebuggingLevel,
kUSBControllerUserClientGetDebuggingType,
kUSBControllerUserClientSetTestMode,
kUSBControllerUserClientReadRegister,
kUSBControllerUserClientWriteRegister,
kNumUSBControllerMethods
};
typedef UInt32 KernelDebuggingOutputType;
enum
{
kKernelDebugOutputIOLogType = 0x00000001,
kKernelDebugOutputKextLoggerType = 0x00000002
};
typedef UInt32 KernelDebugLevel;
enum
{
kKernelDebugInfoLevel = 1000,
kKernelDebugRareInfoLevel = 2000,
kKernelDebugAllowedErrorLevel = 3000,
kKernelDebugAssertLevel = 4000,
kKernelDebugRequireLevel = 5000,
kKernelDebugErrorLevel = 6000,
kKernelDebugCriticalErrorLevel = 7000,
kKernelDebugTragicErrorLevel = 8000,
kKernelDebugAnyLevel = 0
};
void KernelDebugSetLevel( KernelDebugLevel inLevel );
KernelDebugLevel KernelDebugGetLevel();
void KernelDebugSetOutputType( KernelDebuggingOutputType inType );
KernelDebuggingOutputType KernelDebugGetOutputType();
IOReturn KernelDebugFindKernelLogger();
void KernelDebugEnable( bool enable );
void KernelDebugLogInternal( KernelDebugLevel inLevel, UInt32 inTag, char const *inFormatString, ... ) __attribute__ ((format(printf,3,4)));;
void KernelDebugLogDataInternal( UInt32 inLevel, UInt32 inTag, void *buffer, UInt32 byteCount, bool preBuffer);
#define REQUIRE_NO_ERR_PRINTF( VALUE, LABEL, ARGS... ) \
if( VALUE != kIOReturnSuccess ) \
{ \
KernelDebugLogInternal( kDebugInfoLevel, 'BluD', ## ARGS ); \
goto LABEL; \
}
#define REQUIRE_PRINTF( TEST, LABEL, ARGS... ) \
do \
{ \
if( !( TEST ) ) \
{ \
KernelDebugLogInternal( kDebugInfoLevel, 'BluD', ## ARGS ); \
goto LABEL; \
} \
} while( false )
#if DEBUG_LEVEL != DEBUG_LEVEL_PRODUCTION
#define KernelDebugLog( LEVEL, ARGS... ) KernelDebugLogInternal( ( LEVEL ), 'KDbg', ## ARGS ) __attribute__ ((format(printf,1,2)));
#define KernelDebugLogTag( LEVEL, TAG, ARGS... ) KernelDebugLogInternal( ( LEVEL ), ( TAG ), ## ARGS )
#define KernelDebugLogData( LEVEL, TAG, BUFFER, SIZE, HOLD) KernelDebugLogDataInternal( ( LEVEL ), ( TAG ), ( BUFFER ), ( SIZE ), ( HOLD ))
#else
#define KernelDebugLog( LEVEL, ARGS... )
#define KernelDebugLogTag( LEVEL, TAG, ARGS... )
#define KernelDebugLogData( LEVEL, TAG, BUFFER, SIZE, HOLD)
#endif
#ifdef __cplusplus
}
class com_apple_iokit_KLogClient;
#define kLogKextName "com_apple_iokit_KLog"
#define MAXUSERS 5
typedef UInt32 KLogLevel;
typedef UInt32 KLogTag;
class com_apple_iokit_KLog : public IOService
{
OSDeclareDefaultStructors(com_apple_iokit_KLog)
com_apple_iokit_KLogClient * mClientPtr[MAXUSERS+1];
unsigned char * mMsgBuffer;
UInt8 mClientCount;
UInt8 mMsgSize;
bool mErrFlag;
struct timeval * mTimeVal;
IOLock * mLogLock;
public:
static com_apple_iokit_KLog * logger;
virtual bool init(OSDictionary *dictionary = 0);
virtual void free(void);
virtual IOService * probe(IOService *provider, SInt32 *score);
virtual bool start(IOService *provider);
virtual void stop(IOService *provider);
virtual IOReturn newUserClient( task_t owningTask, void * securityID,
UInt32 type, IOUserClient ** handler );
virtual SInt8 Log( KLogLevel level, KLogTag tag, const char *format, ... );
virtual SInt8 vLog( KLogLevel level, KLogTag tag, const char *format, va_list in_va_list );
void closeChild(com_apple_iokit_KLogClient *ptr);
void setErr(bool set);
};
#define kMaxStatusBufSize (8*1024)
class IOUSBLog : public IOService
{
OSDeclareAbstractStructors(IOUSBLog)
private:
public:
virtual bool init( OSDictionary * dictionary = 0 );
static IOUSBLog *usblog();
virtual void AddStatusLevel (UInt32 level, UInt32 ref, char *status, UInt32 value);
virtual void AddStatus(char *message);
virtual void AddStatus(UInt32 level, char *message);
virtual void USBLogPrintf(UInt32 level, char *format,...);
};
#endif
#endif