xbox-kernel/private/ntos/xprof/idf.h
2020-09-30 17:17:25 +02:00

203 lines
7.5 KiB
C

/***********************************************************************
* Microsoft BBT
*
* Microsoft Confidential. Copyright (c) Microsoft Corporation. All rights reserved.
*
* File Comments:
*
*
***********************************************************************/
#pragma once
#pragma pack(push, 4)
struct IDFHDR // Instrumentation Data File Header
{
DWORD dwSignature; // ( 0) File signature
DWORD dwVersion; // ( 4)
DWORD dwId; // ( 8) Id of original image (.exe, .dll, .sys, ...)
DWORD ibszIdfKeyPath; // ( C) Name of .IDFKEY file
DWORD dwGeneration; // (10) Database generation
DWORDLONG qwStartTime; // (14) Creation time of this data
DWORD tov; // (1C) Variety of time order instrumentation
DWORD cb; // (20) Size of valid data
DWORD cqwCount; // (24) Count of static edge counts
DWORD ibrgqwCount; // (28) Offset to array of static edge count
DWORD ciblh; // (2C) Count of IBLHs
DWORD ibrgiblh; // (30) Offset to array of IBLHs
DWORD cible; // (34) Number of IBLE structs allocated
DWORD ctlhCode; // (38) Count of TLHs for code
DWORD ibrgtlhCode; // (3C) Offset to array of TLHs for code
DWORD ctlhResource; // (40) Count of TLHs for resources
DWORD ibrgtlhResource; // (44) Offset to array of TLHs for resources
DWORD cthd; // (48) Count of THDs
DWORD ibthdHead; // (4C) Offset to first THD
DWORD cmsStartTime; // (50) Tick count at initialization
DWORD ifunEndBoot; // (54) Index of EndBoot function (from IRTP)
DWORD iSequenceEndBoot; // (58) Seq number of the last boot time code or resource
DWORD iIntervalEndBoot; // (5C) Last internal of boot sequence
// The following data is used at runtime and appears here
// so that it can be shared among multiple processes.
DWORD dwLock; // (60) Used to lock shared structures
DWORD cbAllocated; // (64) Size of allocated (committed) memory
DWORD cbMax; // (68) Maximum size of memory region
DWORD cpsActive; // (6C) Count of processes using this data
DWORD fSweepPending; // (70)
DWORD cthdActive; // (74) Number of threads within runtime
DWORD cmsTimer; // (78) Timer interval in milliseconds
DWORD pidTimer; // (7C) Process ID of timer process or 0?
DWORD iIntervalCur; // (80) Current time interval
DWORD cmsNextAttempt; // (84)
DWORD iSequence; // (88) Sequence number of initial references
DWORD iIntervalStart; // (8C) First valid time interval
DWORD iSequenceStart; // (90) First valid sequence number
// Runtime-only state for storage allocators
DWORD cbPermanentFree; // (94) Base of permanent free page
DWORD cbPermanentLimit; // (98) End of permanent free page
DWORD cbReclaimableFree; // (9C) Base of reclaimable free page
DWORD cbReclaimableLimit; // (A0) End of reclaimable free page
DWORD cbReclaimablePageHead; // (A4) Head of linked list of reclaimable pages
DWORD cbReclaimablePageTail; // (A8) Tail of linked list of reclaimable pages
// Bitfields are implemented from LSB to MSB.
// Since the position of LSB is different for little endian
// and big endian processors, bit fields cannot be used for
// IDF purposes. Instead, a series of chars are used instead.
char fBigEndian; // (AC) Non-zero if collected data is big-endian
char fSweepable; // Non-zero if IDF is sweepable.
char fWinNTPerf;
char fFastRT; // Are we using the faster runtime?
DWORDLONG hIdfFile; // (B0) HANDLE of open .IDF file
DWORD dwDynProbeCount; // (B8) Number of TOB Probes to execute to increment time.
DWORDLONG pWinNTBufInterval; // (BC) pinter to NT buffer timer interval.
DWORD ibineHead;
};
#pragma pack(pop)
#define szIrtMutexPrefix "BBT30.Mtx."
#define szIrtFMutexPrefix "BBT30.Ftx."
#define szIrtMemoryPrefix "BBT30.Mem."
#define szIrtTimerApp "bbtimr30"
#define wszIrtMutexPrefix L"BBT30.Mtx."
#define wszIrtMemoryPrefix L"BBT30.Mem."
#define wszIrtTimerApp L"bbtimr30"
#define szIdfIdTemplate "%BBT_Idf_Id%"
#define szIdfKeyIdTemplate "%BBT_Key_Id%"
#define szIdfSuffix ".idf"
#define szIdfKeySuffix ".key"
#define dwIdfKeySignature 0xa97df1eb
#define dwIdfSignature 0x09040600
#define dwDIdfSignature 0x09040601
#define dwIdfVerCurrent 0x00001010 // This also much be changed in bbtirt.h
// Flag to indicate IDF originated with pogo runtime
#define dwIdfVerPogo 0x90000000
struct IBLH // Indirect Branch List Header
{
DWORD ibibleFirst; // Offset to first IBLE
};
struct IBLE // Indirect Branch List Element
{
DWORD ibibleNext; // Offset to next IBLE or 0
DWORD blkidSrc;
DWORDLONG qwCount;
};
#define cdwTob 4 // Keep 4 DWORDs for each TOB
#define cbitDw 32 // There are 32 bits in a DWORD
struct TOB // Time Order Bits
{
DWORD iInterval; // Time interval represented
DWORD rgdwBit[cdwTob]; // One bit for each time interval
};
struct TLH // Time List Header
{
DWORD ibtleFirst; // Offset to first TLE
DWORD iSequenceInit; // Initial sequence number
DWORDLONG qwTOBFanin; // Directly measured fanin for this block
};
struct TLE // Time List Element
{
DWORD ibtleNext; // Offset to next TLE or 0
TOB tob;
};
struct THD
{
DWORD iBrc; // Last recorded branch
DWORD blkidSrc; // Last recorded indirect branch source
DWORD iDst; // Last recorded indirect branch target
DWORD ibthdNext; // Offset of next THD or 0
};
struct RPH
{
DWORD cbNext;
};
#ifndef TOV_DEFINED
#define TOV_DEFINED
enum TOV // Time Order Variety
{
tovNone,
tovFunction,
tovBlock,
tovEveryBlock,
tov4Mask,
tov4Fun,
tov4Block,
tov4EveryBlock,
tovFunctionAndPostCall,
tovThreadEveryBlock,
tovCTO, // IRT to sweep counts for tobs
};
struct INE // Interval name entry
{
DWORD ibineNext;
DWORD iInterval;
char szName[16];
};
#endif