#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
};
enum {
kIODKEnable = 0x00000001ULL,
kIODKLogSetup = 0x00000002ULL,
kIODKLogIPC = 0x00000004ULL,
kIODKLogPM = 0x00000008ULL,
kIODKLogMessages = 0x00000010ULL,
kIODKDisablePM = 0x000000100ULL,
kIODKDisableDextLaunch = 0x00001000ULL,
kIODKDisableDextTag = 0x00002000ULL,
kIODKDisableCDHashChecking = 0x00004000ULL,
kIODKDisableEntitlementChecking = 0x00008000ULL,
kIODKDisableCheckInTokenVerification = 0x00010000ULL,
};
#if XNU_KERNEL_PRIVATE
#define DKLOG(fmt, args...) { IOLog("DK: " fmt, ## args); }
#define DKS "%s-0x%qx"
#define DKN(s) s->getName(), s->getRegistryEntryID()
#endif
extern SInt64 gIOKitDebug;
extern SInt64 gIOKitTrace;
extern SInt64 gIODKDebug;
#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 IOTrackingQueueCollectUser(IOTrackingQueue * queue);
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