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

185 lines
4.4 KiB
C

/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
xprofp.h
Abstract:
Kernel profiler functions
--*/
#ifndef _XPROFP_H
#define _XPROFP_H
#ifdef __cplusplus
extern "C" {
#endif
NTSTATUS
XProfpControl(
ULONG Action,
ULONG Param
);
#define XPROF_START 1
#define XPROF_STOP 2
#define XPROF_COMMENT 4
#define XPROF_THREAD_SWITCH 5
#define XPROF_DPC_BEGIN 6
#define XPROF_DPC_END 7
#define XPROF_DPC_ENABLED 0x80000000
/*
action: XPROF_START
param: size of profiling data buffer in MB, default = 32
action: XPROF_STOP
param: none
action: XPROF_COMMENT
param: user-defined parameter
*/
/*
!!! Profiling data record format:
timestamp: bits 63-32
timestamp: bits 31-0
type-specific data
Bits 63-61 of the timestamp are used as flags.
000 - fastcap start: just before calling a function
caller function: ULONG
callee function: ULONG
001 - fastcap end: just after calling a function
caller function: ULONG
010 - _penter:
caller function: ULONG
ESP: ULONG
011 - _pexit:
caller function: ULONG
ESP: ULONG
100 - callcap start:
caller function: ULONG
101 - callcap exit:
caller function: ULONG
110 - reserved
111 - control records:
record type: ULONG
param: ULONG
If type is XPROF_START or XPROF_STOP, param is the current thread ID
If type is XPROF_COMMENT, param is the user-defined parameter.
If type is XPROF_THREAD_SWITCH, param is the new thread ID.
If type is XPROF_DPC_START or XPROF_DPC_END, param is the DPC function address.
We don't need to record thread ID in each record because we can always derive
the current thread ID from the XPROF_START and XPROF_THREAD_SWITCH records.
*/
#define XPROFREC_TYPEMASK 0xE0000000
#define XPROFREC_FASTCAP_START 0x00000000
#define XPROFREC_FASTCAP_END 0x20000000
#define XPROFREC_PENTER 0x40000000
#define XPROFREC_PEXIT 0x60000000
#define XPROFREC_CALLCAP_START 0x80000000
#define XPROFREC_CALLCAP_END 0xA0000000
#define XPROFREC_CONTROL 0xE0000000
//
// Maximum size for all types of profile data records.
// Note that we're setting this to be a larger value than necessary
// in case we need to add new types of profiling data records
// in the future.
//
#define XPROFREC_MAXSIZE (32*sizeof(ULONG))
//
// Profile data file header
//
#define XPROF_FILE_VERSION 0x00000001
#define XPROF_FILE_HEADER_SIZE sizeof(XProfpFileHeader)
#define XPROF_MAX_MODULES 16
#define XPROF_MAX_MODULE_NAMELEN 48
typedef struct {
ULONG version; // 0x000 + 0x004
ULONG module_count; // 0x004 + 0x004
struct { // 0x008 + 0x010 * 0x040
ULONG loadaddr;
ULONG size;
ULONG reserved[2];
CHAR name[XPROF_MAX_MODULE_NAMELEN];
} modules[XPROF_MAX_MODULES];
UCHAR reserved[0x1000-0x408]; // ..... = 0x1000
} XProfpFileHeader;
//
// Global data structures maintained by the profiler
//
// NOTE: Do NOT change the first two fields of this structure,
// unless you also change the offsets in the assembly functions
// CAP_Start_Profiling and CAP_End_Profiling.
//
typedef struct {
ULONG* bufnext;
// Points to the next available space in the profiling data buffer
ULONG* bufend;
// End of profiling data buffer
ULONG* bufnext_stopped;
// Value of bufnext when the profiling session is stopped
// NULL if profiling session is active or hasn't been stopped
ULONG* bufstart;
// Start of profiling data buffer
// NULL if profiling session isn't active
ULONG start_type;
// Unused
ULONG start_param;
// Parameter that was passed to XPROF_START_x
LONG lock;
// Global access lock:
// 0 if the lock is free
// otherwise, the lock is busy
LONG reserved;
} XProfpGlobals;
//
// Retrieve kernel profiling global data structure
//
XProfpGlobals*
XProfpGetData();
//
// Runtime support function for sweeping BBT data into a file
//
NTSTATUS IrtSweep(HANDLE file);
#ifdef __cplusplus
}
#endif
#endif // !_XPROFP_H