#ifndef _IOKIT_IOKITDEBUG_H
#define _IOKIT_IOKITDEBUG_H
#include <IOKit/IOTypes.h>
#ifdef __cplusplus
#include <libkern/c++/OSObject.h>
#include <libkern/c++/OSDictionary.h>
#include <libkern/c++/OSSerialize.h>
class IOKitDiagnostics : public OSObject
{
OSDeclareDefaultStructors(IOKitDiagnostics)
public:
static OSObject * diagnostics( void );
virtual bool serialize(OSSerialize *s) const APPLE_KEXT_OVERRIDE;
private:
static void updateOffset( OSDictionary * dict,
UInt64 value, const char * name );
};
#endif
enum {
kIOLogAttach = 0x00000001ULL,
kIOLogProbe = 0x00000002ULL,
kIOLogStart = 0x00000004ULL,
kIOLogRegister = 0x00000008ULL,
kIOLogMatch = 0x00000010ULL,
kIOLogConfig = 0x00000020ULL,
kIOLogYield = 0x00000040ULL,
kIOLogPower = 0x00000080ULL,
kIOLogMapping = 0x00000100ULL,
kIOLogCatalogue = 0x00000200ULL,
kIOLogTracePower = 0x00000400ULL, kIOLogDebugPower = 0x00000800ULL,
kIOLogServiceTree = 0x00001000ULL,
kIOLogDTree = 0x00002000ULL,
kIOLogMemory = 0x00004000ULL,
kIOLogKextMemory = 0x00008000ULL,
kOSLogRegistryMods = 0x00010000ULL, kIOLogPMRootDomain = 0x00020000ULL,
kOSRegistryModsMode = 0x00040000ULL, kIOLogHibernate = 0x00100000ULL,
kIOStatistics = 0x04000000ULL,
kIOSleepWakeWdogOff = 0x40000000ULL,
kIOKextSpinDump = 0x80000000ULL,
kIONoFreeObjects = 0x00100000ULL,
kIOTracking = 0x00400000ULL,
kIOWaitQuietPanics = 0x00800000ULL,
kIOWaitQuietBeforeRoot = 0x01000000ULL,
kIOTrackingBoot = 0x02000000ULL,
_kIODebugTopFlag = 0x8000000000000000ULL };
enum {
kIOKitDebugUserOptions = 0
| kIOLogAttach
| kIOLogProbe
| kIOLogStart
| kIOLogRegister
| kIOLogMatch
| kIOLogConfig
| kIOLogYield
| kIOLogPower
| kIOLogMapping
| kIOLogCatalogue
| kIOLogTracePower
| kIOLogDebugPower
| kOSLogRegistryMods
| kIOLogPMRootDomain
| kOSRegistryModsMode
| kIOLogHibernate
| kIOSleepWakeWdogOff
| kIOKextSpinDump
| kIOWaitQuietPanics
};
enum {
kIOTraceInterrupts = 0x00000001ULL, kIOTraceWorkLoops = 0x00000002ULL, kIOTraceEventSources = 0x00000004ULL, kIOTraceIntEventSource = 0x00000008ULL, kIOTraceCommandGates = 0x00000010ULL, kIOTraceTimers = 0x00000020ULL,
kIOTracePowerMgmt = 0x00000400ULL,
kIOTraceIOService = 0x00080000ULL,
kIOTraceCompatBootArgs = kIOTraceIOService | kIOTracePowerMgmt
};
extern SInt64 gIOKitDebug;
extern SInt64 gIOKitTrace;
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
class IORegistryPlane;
#endif
extern void IOPrintPlane(
#ifdef __cplusplus
const IORegistryPlane * plane
#else
const struct IORegistryPlane * plane
#endif
);
#ifndef _OSCPPDEBUG_H
extern void OSPrintMemory( void );
#endif
#define IOPrintMemory OSPrintMemory
#define kIOKitDiagnosticsClientClassName "IOKitDiagnosticsClient"
enum
{
kIOKitDiagnosticsClientType = 0x99000002
};
struct IOKitDiagnosticsParameters
{
size_t size;
uint64_t value;
uint32_t options;
uint32_t tag;
uint32_t zsize;
uint32_t reserved[8];
};
typedef struct IOKitDiagnosticsParameters IOKitDiagnosticsParameters;
enum
{
kIOTrackingCallSiteBTs = 16,
};
struct IOTrackingCallSiteInfo
{
uint32_t count;
pid_t addressPID;
mach_vm_address_t address;
mach_vm_size_t size[2];
pid_t btPID;
mach_vm_address_t bt[2][kIOTrackingCallSiteBTs];
};
#define kIOMallocTrackingName "IOMalloc"
#define kIOWireTrackingName "IOWire"
#define kIOMapTrackingName "IOMap"
#if XNU_KERNEL_PRIVATE && IOTRACKING
struct IOTrackingQueue;
struct IOTrackingCallSite;
struct IOTracking
{
queue_chain_t link;
IOTrackingCallSite * site;
#if !defined(__LP64__)
uint32_t flags;
#endif
};
struct IOTrackingAddress
{
IOTracking tracking;
uintptr_t address;
size_t size;
#if defined(__LP64__)
uint32_t flags;
#endif
};
struct IOTrackingUser
{
queue_chain_t link;
pid_t btPID;
uint8_t user32;
uint8_t userCount;
uintptr_t bt[kIOTrackingCallSiteBTs];
uintptr_t btUser[kIOTrackingCallSiteBTs];
};
enum
{
kIOTrackingQueueTypeDefaultOn = 0x00000001,
kIOTrackingQueueTypeAlloc = 0x00000002,
kIOTrackingQueueTypeMap = 0x00000004,
kIOTrackingQueueTypeUser = 0x00000008,
};
void IOTrackingInit(void);
IOTrackingQueue * IOTrackingQueueAlloc(const char * name, uintptr_t btEntry,
size_t allocSize, size_t minCaptureSize,
uint32_t type, uint32_t numSiteQs);
void IOTrackingQueueFree(IOTrackingQueue * head);
void IOTrackingAdd(IOTrackingQueue * head, IOTracking * mem, size_t size, bool address, vm_tag_t tag);
void IOTrackingRemove(IOTrackingQueue * head, IOTracking * mem, size_t size);
void IOTrackingAddUser(IOTrackingQueue * queue, IOTrackingUser * mem, vm_size_t size);
void IOTrackingRemoveUser(IOTrackingQueue * head, IOTrackingUser * tracking);
void IOTrackingAlloc(IOTrackingQueue * head, uintptr_t address, size_t size);
void IOTrackingFree(IOTrackingQueue * head, uintptr_t address, size_t size);
void IOTrackingReset(IOTrackingQueue * head);
void IOTrackingAccumSize(IOTrackingQueue * head, IOTracking * mem, size_t size);
kern_return_t IOTrackingDebug(uint32_t selector, uint32_t options,
const char * names, size_t namesLen,
size_t size, OSObject ** result);
extern IOTrackingQueue * gIOMallocTracking;
extern IOTrackingQueue * gIOWireTracking;
extern IOTrackingQueue * gIOMapTracking;
#endif
enum
{
kIOTrackingExcludeNames = 0x00000001,
};
enum
{
kIOTrackingGetTracking = 0x00000001,
kIOTrackingGetMappings = 0x00000002,
kIOTrackingResetTracking = 0x00000003,
kIOTrackingStartCapture = 0x00000004,
kIOTrackingStopCapture = 0x00000005,
kIOTrackingSetMinCaptureSize = 0x00000006,
kIOTrackingLeaks = 0x00000007,
kIOTrackingInvalid = 0xFFFFFFFE,
};
#ifdef __cplusplus
}
#endif
#endif