📄 profiler.c
字号:
/* * NK Statistical Profiler API's * * Copyright (c) 1995-2000 Microsoft Corporation. All rights reserved. * * Module Name: * * profiler.c * * Abstract: * * This file implements the NK statistical profiler API's * * * Revision History: * */extern void * *Win32Methods;extern int bAllKMode;#define WIN32_CALL(type, api, args) (bAllKMode ? (*(type (*)args)(Win32Methods[W32_ ## api])) : (IMPLICIT_DECL(type, SH_WIN32, W32_ ## api, args)))#define KILLTHREADIFNEEDED() {if (bAllKMode) (*(void (*)(void))(Win32Methods[151]))();}#include <windows.h>#include <coredll.h>#define C_ONLY#include "kernel.h"#include "xtime.h"#include "profiler.h"// AMC CodeTEST code#ifdef WINCECODETEST// amc_ctrl_port and amc_data_port definitions#include "tagaddrs.h"// CodeTEST profiler base address/port address functions#define W32_GetProfileBaseAddress 154#define W32_SetProfilePortAddress 155#define GetProfileBaseAddress PRIV_WIN32_CALL(LPVOID, GetProfileBaseAddress, (void))#define SetProfilePortAddress PRIV_WIN32_CALL(void, SetProfilePortAddress, (LPVOID))// Page alignment macros#define PA(A) ((((DWORD)(A)) / PAGE_SIZE) * PAGE_SIZE)#define EX(A) (((DWORD)(A)) - PA(A))#endif // WINCECODETEST//---------------------------------------------------------------------------// ProfileInit - Perform initialization tasks for profiling////---------------------------------------------------------------------------DWORD ProfileInit(void){#ifdef WINCECODETEST amc_ctrl_port = (LPVOID)((DWORD)GetProfileBaseAddress( ) + EX(AMC_CTRL_PORT_ADDR)); amc_data_port = amc_ctrl_port - EX(AMC_CTRL_PORT_ADDR) + EX(AMC_DATA_PORT_ADDR); RETAILMSG(1, (TEXT("CodeTEST: ProfileInit: amc_ctrl_port = 0x%08X\n"), amc_ctrl_port));#endif return 0;}//---------------------------------------------------------------------------// ProfileStart - clear profile counters and enable profiler ISR//// INPUT: dwUSecInterval - non-zero = sample interval in uSec// zero= reset uSec counter// bPerProcess - TRUE - profile current process only// FALSE - profile all samples//---------------------------------------------------------------------------DWORD ProfileStart(DWORD dwUSecInterval, DWORD dwOptions){ DWORD dwProfileLen[4];#ifdef WINCECODETEST switch (dwOptions) { default:#endif // call ProfileSyscall with op= XTIME_PROFILE_DATA // and size=0 to clear counters and enable ISR dwProfileLen[0]=XTIME_PROFILE_DATA; dwProfileLen[1]=0; dwProfileLen[2]= dwUSecInterval; dwProfileLen[3]= dwOptions; ProfileSyscall(dwProfileLen); return 0;#ifdef WINCECODETEST case PROFILE_CODETEST: RETAILMSG(1, (TEXT("CodeTEST: ProfileStart\n"))); // Start profiling by redirecting tags to the instrumentation ports // (kernel). dwProfileLen[0] = XTIME_CODETEST; dwProfileLen[1] = 1; ProfileSyscall(dwProfileLen); // Start profiling by redirecting flags to the instrumentation ports // (coredll). Note: AMC_CTRL_PORT_ADDR must be on page boundary SetProfilePortAddress((LPVOID)(PA(AMC_CTRL_PORT_ADDR) / 256)); return 0; }#endif}//---------------------------------------------------------------------------// ProfileStop - Stop profile and display hit report//////---------------------------------------------------------------------------void ProfileStop(void){ DWORD dwProfileLen[4];#ifdef WINCECODETEST // Stop profiling by redirecting tags to unused memory (kernel) dwProfileLen[0] = XTIME_CODETEST; dwProfileLen[1] = 0; ProfileSyscall(dwProfileLen); // Stop profiling by redirecting tags to unused memory (coredll) SetProfilePortAddress(0); RETAILMSG(1, (TEXT("CodeTEST: ProfileStop\n")));#endif dwProfileLen[0]=XTIME_PROFILE_DATA; // call ProfileSyscall with op= XTIME_PROFILE_DATA dwProfileLen[1]=1; // and size=1 to disable ISR and return profile data size ProfileSyscall(dwProfileLen); return;}#ifdef CELOG//// This variable is only non-NULL if CELOGCORE is included into COREDLL//VOID (*pCeLogData)(BOOL fTimeStamp, WORD wID, PVOID pData, WORD wLen, DWORD dwZoneUser, DWORD dwZoneCE, WORD wFlag, BOOL bFlagged);VOID (*pCeLogSetZones)(DWORD dwZoneUser, DWORD dwZoneCE, DWORD dwZoneProcess);extern DWORD bProfilingKernel;//------------------------------------------------------------------------------//------------------------------------------------------------------------------VOID xxx_CeLogData( BOOL fTimeStamp, WORD wID, PVOID pData, WORD wLen, DWORD dwZoneUser, DWORD dwZoneCE, WORD wFlag, BOOL bFlagged){ if (pCeLogData) { // // Call the replacement function. // pCeLogData(fTimeStamp, wID, pData, wLen, dwZoneUser, dwZoneCE, wFlag, bFlagged); return; } if (bProfilingKernel) { CeLogData(fTimeStamp, wID, pData, wLen, dwZoneUser, dwZoneCE, wFlag, bFlagged); KILLTHREADIFNEEDED(); }}//------------------------------------------------------------------------------//------------------------------------------------------------------------------VOID xxx_CeLogSetZones( DWORD dwZoneUser, DWORD dwZoneCE, DWORD dwZoneProcess){ if (pCeLogSetZones) { // // Call the replacement function. // pCeLogSetZones(dwZoneUser, dwZoneCE, dwZoneProcess); return; } if (bProfilingKernel) { CeLogSetZones(dwZoneUser, dwZoneCE, dwZoneProcess); KILLTHREADIFNEEDED(); }}//------------------------------------------------------------------------------//------------------------------------------------------------------------------VOID xxx_CeLogReSync(){ if (bProfilingKernel) { CeLogReSync(); KILLTHREADIFNEEDED(); }}#else // CELOG// Stubs for non-profiling COREDLL, provided in case logging functions are // called externally.VOID xxx_CeLogData( BOOL fTimeStamp, WORD wID, PVOID pData, WORD wLen, DWORD dwZoneUser, DWORD dwZoneCE, WORD wFlag, BOOL bFlagged){}VOID xxx_CeLogSetZones( DWORD dwZoneUser, DWORD dwZoneCE, DWORD dwZoneProcess){}VOID xxx_CeLogReSync(){}#endif // CELOG
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -