Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

410 lines
17 KiB

#ifndef IA64PROF_H_INCLUDED
#define IA64PROF_H_INCLUDED
/*++
Copyright (c) 1989-2000 Microsoft Corporation
Component Name:
IA64 Profiling
Module Name:
ia64prof.h
Abstract:
This header file presents the IA64 specific profiling definitions
Author:
David N. Cutler (davec) 5-Mar-1989
Environment:
ToBeSpecified
Revision History:
3/15/2000 Thierry Fevrier ([email protected]):
Initial version
--*/
//
// Warning: The definition of HALPROFILE_PCR should match the HalReserved[] type definition
// and the PROCESSOR_PROFILING_INDEX based indexes.
//
//
// IA64 Generic - Number of PMCs / PMDs pairs.
//
#define PROCESSOR_IA64_PERFCOUNTERS_PAIRS 4
typedef struct _HALPROFILE_PCR {
ULONGLONG ProfilingRunning;
ULONGLONG ProfilingInterruptHandler;
ULONGLONG ProfilingInterrupts; // XXTF - DEBUG
ULONGLONG ProfilingInterruptsWithoutProfiling; // XXTF - DEBUG
ULONGLONG ProfileSource [ PROCESSOR_IA64_PERFCOUNTERS_PAIRS ];
ULONGLONG PerfCnfg [ PROCESSOR_IA64_PERFCOUNTERS_PAIRS ];
ULONGLONG PerfData [ PROCESSOR_IA64_PERFCOUNTERS_PAIRS ];
ULONGLONG PerfCnfgReload[ PROCESSOR_IA64_PERFCOUNTERS_PAIRS ];
ULONGLONG PerfDataReload[ PROCESSOR_IA64_PERFCOUNTERS_PAIRS ];
} HALPROFILE_PCR, *PHALPROFILE_PCR;
#define HALPROFILE_PCR ( (PHALPROFILE_PCR)(&(PCR->HalReserved[PROCESSOR_PROFILING_INDEX])) )
//
// Define space in the HAL-reserved part of the PCR structure for each
// performance counter's interval count
//
// Note that i64prfs.s depends on these positions in the PCR.
//
//
// Per-Processor Profiling Status
//
#define HalpProfilingRunning HALPROFILE_PCR->ProfilingRunning
//
// Per-Processor registered Profiling Interrupt Handler
//
#define HalpProfilingInterruptHandler HALPROFILE_PCR->ProfilingInterruptHandler
//
// Per-Processor Profiling Interrupts Status
//
#define HalpProfilingInterrupts HALPROFILE_PCR->ProfilingInterrupts
#define HalpProfilingInterruptsWithoutProfiling HALPROFILE_PCR->ProfilingInterruptsWithoutProfiling
//
// Define the currently selected profile source for each counter
//
// FIXFIX - Merced Specific.
#define HalpProfileSource4 (KPROFILE_SOURCE)HALPROFILE_PCR->ProfileSource[0] // PMC4
#define HalpProfileSource5 (KPROFILE_SOURCE)HALPROFILE_PCR->ProfileSource[1] // PMC5
#define HalpProfileSource6 (KPROFILE_SOURCE)HALPROFILE_PCR->ProfileSource[2] // PMC6
#define HalpProfileSource7 (KPROFILE_SOURCE)HALPROFILE_PCR->ProfileSource[3] // PMC7
__inline
VOID
HalpSetProfileSource(
ULONG Pmcd,
KPROFILE_SOURCE ProfileSource,
ULONGLONG ProfileSourceConfig
)
{
ULONG pmcdIdx;
ASSERTMSG("HAL!HalpSetProfileSource: invalid Pmcd!\n", ((Pmcd >= 4) && ((Pmcd <= 7))));
pmcdIdx = Pmcd - PROCESSOR_IA64_PERFCOUNTERS_PAIRS;
(KPROFILE_SOURCE)HALPROFILE_PCR->ProfileSource[pmcdIdx] = ProfileSource;
(KPROFILE_SOURCE)HALPROFILE_PCR->PerfCnfg[pmcdIdx] = ProfileSourceConfig;
} // HalpSetProfileSource()
__inline
KPROFILE_SOURCE
HalpGetProfileSource(
ULONG Pmcd
)
{
ULONG pmcdIdx;
ASSERTMSG("HAL!HalpGetProfileSource: invalid Pmcd!\n", ((Pmcd >= 4) && ((Pmcd <= 7))));
pmcdIdx = Pmcd - PROCESSOR_IA64_PERFCOUNTERS_PAIRS;
return (KPROFILE_SOURCE)HALPROFILE_PCR->ProfileSource[pmcdIdx];
} // HalpGetProfileSource()
#define HalpProfileCnfg4 (ULONGLONG)HALPROFILE_PCR->PerfCnfg[0]
#define HalpProfileCnfg5 (ULONGLONG)HALPROFILE_PCR->PerfCnfg[1]
#define HalpProfileCnfg6 (ULONGLONG)HALPROFILE_PCR->PerfCnfg[2]
#define HalpProfileCnfg7 (ULONGLONG)HALPROFILE_PCR->PerfCnfg[3]
#define PCRProfileData4 ( (PULONGLONG) (&(HALPROFILE_PCR->PerfData[0])) )
#define PCRProfileData5 ( (PULONGLONG) (&(HALPROFILE_PCR->PerfData[1])) )
#define PCRProfileData6 ( (PULONGLONG) (&(HALPROFILE_PCR->PerfData[2])) )
#define PCRProfileData7 ( (PULONGLONG) (&(HALPROFILE_PCR->PerfData[3])) )
#define PCRProfileCnfg4Reload ( (PULONGLONG) (&(HALPROFILE_PCR->PerfCnfgReload[0])) )
#define PCRProfileCnfg5Reload ( (PULONGLONG) (&(HALPROFILE_PCR->PerfCnfgReload[1])) )
#define PCRProfileCnfg6Reload ( (PULONGLONG) (&(HALPROFILE_PCR->PerfCnfgReload[2])) )
#define PCRProfileCnfg7Reload ( (PULONGLONG) (&(HALPROFILE_PCR->PerfCnfgReload[3])) )
#define PCRProfileData4Reload ( (PULONGLONG) (&(HALPROFILE_PCR->PerfCnfgReload[0])) )
#define PCRProfileData5Reload ( (PULONGLONG) (&(HALPROFILE_PCR->PerfDataReload[1])) )
#define PCRProfileData6Reload ( (PULONGLONG) (&(HALPROFILE_PCR->PerfDataReload[2])) )
#define PCRProfileData7Reload ( (PULONGLONG) (&(HALPROFILE_PCR->PerfDataReload[3])) )
//
// IA64 Monitored Events have
//
typedef enum _PMCD_SOURCE_MASK {
// FIXFIX - 04/2002: First implementation uses defines.
// : We should use ULONG union and bit fields for next version.
PMCD_MASK_4 = 0x1,
PMCD_MASK_5 = 0x2,
PMCD_MASK_6 = 0x4,
PMCD_MASK_7 = 0x8,
PMCD_MASK_45 = (PMCD_MASK_4 | PMCD_MASK_5),
PMCD_MASK_67 = (PMCD_MASK_6 | PMCD_MASK_7),
PMCD_MASK_4567 = (PMCD_MASK_4 | PMCD_MASK_5 | PMCD_MASK_6 | PMCD_MASK_7),
//
// Source Sets definitions:
//
PMCD_MASK_SET = 0xffff0000,
PMCD_MASK_SET_SHIFT = 0x10,
PMCD_MASK_SET_PMCD = 0xff,
PMCD_MASK_SET_PMCD_SHIFT = 0x10,
PMCD_MASK_SET_PMCD_4 = (4 << PMCD_MASK_SET_PMCD_SHIFT),
PMCD_MASK_SET_PMCD_5 = (5 << PMCD_MASK_SET_PMCD_SHIFT),
PMCD_MASK_SET_PMCD_6 = (6 << PMCD_MASK_SET_PMCD_SHIFT),
PMCD_MASK_SET_PMCD_7 = (7 << PMCD_MASK_SET_PMCD_SHIFT),
PMCD_MASK_SET_DATA_SHIFT = 0x18,
PMCD_MASK_SET_L0D_CACHE_0 = ((1 << PMCD_MASK_SET_DATA_SHIFT) | PMCD_MASK_SET_PMCD_5),
PMCD_MASK_SET_L0D_CACHE_1 = ((2 << PMCD_MASK_SET_DATA_SHIFT) | PMCD_MASK_SET_PMCD_5),
PMCD_MASK_SET_L0D_CACHE_2 = ((3 << PMCD_MASK_SET_DATA_SHIFT) | PMCD_MASK_SET_PMCD_5),
PMCD_MASK_SET_L0D_CACHE_3 = ((4 << PMCD_MASK_SET_DATA_SHIFT) | PMCD_MASK_SET_PMCD_5),
PMCD_MASK_SET_L0D_CACHE_4 = ((5 << PMCD_MASK_SET_DATA_SHIFT) | PMCD_MASK_SET_PMCD_5),
PMCD_MASK_SET_L0D_CACHE_5 = ((6 << PMCD_MASK_SET_DATA_SHIFT) | PMCD_MASK_SET_PMCD_5),
PMCD_MASK_SET_L1_CACHE_0 = ((7 << PMCD_MASK_SET_DATA_SHIFT) | PMCD_MASK_SET_PMCD_4),
PMCD_MASK_SET_L1_CACHE_1 = ((8 << PMCD_MASK_SET_DATA_SHIFT) | PMCD_MASK_SET_PMCD_4),
PMCD_MASK_SET_L1_CACHE_2 = ((9 << PMCD_MASK_SET_DATA_SHIFT) | PMCD_MASK_SET_PMCD_4),
PMCD_MASK_SET_L1_CACHE_3 = ((10 << PMCD_MASK_SET_DATA_SHIFT) | PMCD_MASK_SET_PMCD_4),
PMCD_MASK_SET_L1_CACHE_4 = ((11 << PMCD_MASK_SET_DATA_SHIFT) | PMCD_MASK_SET_PMCD_4),
PMCD_MASK_SET_L1_CACHE_5 = ((12 << PMCD_MASK_SET_DATA_SHIFT) | PMCD_MASK_SET_PMCD_4),
} PMCD_SOURCE_MASK;
//
// Define the mapping between possible profile sources and the
// CPU-specific settings for the IA64 specific Event Counters.
//
typedef struct _HALP_PROFILE_MAPPING {
BOOLEAN Supported;
ULONG Event;
ULONG ProfileSource;
ULONG EventMask;
ULONGLONG Interval;
ULONGLONG IntervalDef; // Default or Desired Interval
ULONGLONG IntervalMax; // Maximum Interval
ULONGLONG IntervalMin; // Maximum Interval
UCHAR PrivilegeLevel; // Current Privilege Level
UCHAR PrivilegeLevelDef; // Default or Desired Privilege Level
UCHAR OverflowInterrupt; // Current Overflow Interrupt state
UCHAR OverflowInterruptDef; // Default or Desired Overflow Interrupt state
UCHAR PrivilegeEnable; // Current Privilege Enable state
UCHAR PrivilegeEnableDef; // Default or Desired Privilege Enable state
UCHAR UnitMask; // Current Event specific Unit Mask
UCHAR UnitMaskDef; // Default or Desired Event specific Unit Mask
UCHAR Threshold; // Current Threshold
UCHAR ThresholdDef; // Default or Desired Threshold for multi-occurence events.
UCHAR InstructionSetMask; // Current Instruction Set Mask
UCHAR InstructionSetMaskDef; // Default or Desired Instruction Set Mask
} HALP_PROFILE_MAPPING, *PHALP_PROFILE_MAPPING;
/////////////
//
// XXTF - ToBeDone - 02/08/2000.
// The following section should provide the IA64 PMC APIs.
// These should be considered as inline versions of the Halp*ProfileCounter*()
// functions. This will allow user application to use standardized APIs to
// program the performance monitor counters.
//
// HalpSetProfileCounterConfiguration()
// HalpSetProfileCounterPrivilegeLevelMask()
typedef enum _PMC_PLM_MASK {
PMC_PLM_NONE = 0x0,
PMC_PLM_0 = 0x1,
PMC_PLM_1 = 0x2,
PMC_PLM_2 = 0x4,
PMC_PLM_3 = 0x8,
PMC_PLM_ALL = (PMC_PLM_3|PMC_PLM_2|PMC_PLM_1|PMC_PLM_0)
} PMC_PLM_MASK;
// HalpSetProfileCounterConfiguration()
typedef enum _PMC_NAMESPACE {
PMC_DISABLE_OVERFLOW_INTERRUPT = 0x0,
PMC_ENABLE_OVERFLOW_INTERRUPT = 0x1,
PMC_DISABLE_PRIVILEGE_MONITOR = 0x0,
PMC_ENABLE_PRIVILEGE_MONITOR = 0x1,
PMC_UNIT_MASK_DEFAULT = 0x0,
PMC_UNIT_MASK_RSEFILLS = 0x1,
PMC_UNIT_MASK_INTANDFP_OPS = 0x3, // Ex: Specific umask for speculation events.
PMC_UNIT_MASK_ALLTLBMISSES = 0x3, // Ex: Specific umask for tlb events.
PMC_UNIT_MASK_L1TLBMISSES = 0x1, // Ex: Specific umask for tlb events.
PMC_UNIT_MASK_L2TLBMISSES = 0x2, // Ex: Specific umask for tlb events.
PMC_UNIT_MASK_IFETCH_BYPASS = 0x2, // Ex: Specific umask for inst. fetch cancels
PMC_UNIT_MASK_IFETCH_STFILLWB = 0x6, // Ex: Specific umask for inst. fetch cancels
PMC_UNIT_MASK_IFETCH_DATAREAD = 0x7, // Ex: Specific umask for inst. fetch cancels
PMC_UNIT_MASK_L3ACCESS_ANY = 0x9, // Ex: Specific umask for L3 accesses cancels
PMC_UNIT_MASK_L2_DATA_RDWR = 0x3, // Ex: Specific umask for L2 data references
PMC_UNIT_MASK_L2_DATA_READ = 0x1, // Ex: Specific umask for L2 data references
PMC_UNIT_MASK_L2_DATA_WRITE = 0x2, // Ex: Specific umask for L2 data references
PMC_UNIT_MASK_L2_DATA_BYPASS_L1DTOL2A = 0x0, // Ex: Specific umask for L2 bypasses
PMC_UNIT_MASK_L2_DATA_BYPASS_L1WTOL2I = 0x1, // Ex: Specific umask for L2 bypasses
PMC_UNIT_MASK_L3_DATA_BYPASS_L1DTOL2A = 0x2, // Ex: Specific umask for L2 bypasses
PMC_UNIT_MASK_L2_INST_BYPASS_L1DTOL2A = 0x4, // Ex: Specific umask for L2 bypasses
PMC_UNIT_MASK_L2_INST_BYPASS_L1WTOL2I = 0x5, // Ex: Specific umask for L2 bypasses
PMC_UNIT_MASK_L3_INST_BYPASS_L1DTOL2A = 0x6, // Ex: Specific umask for L2 bypasses
PMC_UNIT_MASK_EVENT_SELECTED_LOSET = 0x0,
PMC_UNIT_MASK_EVENT_SELECTED_HISET = 0x8,
PMC_UNIT_MASK_L2_INT_LOADS = 0x8, // Ex: Specific umask for L2 operation types
PMC_UNIT_MASK_L2_FP_LOADS = 0x9, // Ex: Specific umask for L2 operation types
PMC_UNIT_MASK_L2_RMW_STORES = 0xa, // Ex: Specific umask for L2 operation types
PMC_UNIT_MASK_L2_NON_RMW_STORES = 0xb, // Ex: Specific umask for L2 operation types
PMC_UNIT_MASK_L2_NONLOADS_NONSTORES = 0xc, // Ex: Specific umask for L2 operation types
PMC_UNIT_MASK_L3_READS_HITS = 0xd, // Ex: Specific umask for L3 reads
PMC_UNIT_MASK_L3_READS_MISSES = 0xe, // Ex: Specific umask for L3 reads
PMC_UNIT_MASK_L3_READS_IFETCH_REFERENCES = 0x7, // Ex: Specific umask for L3 reads
PMC_UNIT_MASK_L3_READS_IFETCH_HITS = 0x5, // Ex: Specific umask for L3 reads
PMC_UNIT_MASK_L3_READS_IFETCH_MISSES = 0x6, // Ex: Specific umask for L3 reads
PMC_UNIT_MASK_L3_READS_DATA_HITS = 0x9, // Ex: Specific umask for L3 reads
PMC_UNIT_MASK_L3_READS_DATA_MISSES = 0xa, // Ex: Specific umask for L3 reads
PMC_UNIT_MASK_L3_READS_DATA_REFERENCES = 0xb, // Ex: Specific umask for L3 reads
PMC_UNIT_MASK_L3_WRITES_HITS = 0xd, // Ex: Specific umask for L3 reads
PMC_UNIT_MASK_L3_WRITES_MISSES = 0xe, // Ex: Specific umask for L3 reads
PMC_UNIT_MASK_L3_WRITES_DATA_REFERENCES = 0x7, // Ex: Specific umask for L3 reads
PMC_UNIT_MASK_L3_WRITES_DATA_HITS = 0x5, // Ex: Specific umask for L3 reads
PMC_UNIT_MASK_L3_WRITES_DATA_MISSES = 0x6, // Ex: Specific umask for L3 reads
PMC_UNIT_MASK_L3_WRITEBACK_HITS = 0x9, // Ex: Specific umask for L3 reads
PMC_UNIT_MASK_L3_WRITEBACK_MISSES = 0xa, // Ex: Specific umask for L3 reads
PMC_UNIT_MASK_L3_WRITEBACK_REFERENCES = 0xb, // Ex: Specific umask for L3 reads
PMC_UNIT_MASK_BUS_ANY = 0x3, // Ex: Specific umask for BUS transactions
PMC_UNIT_MASK_BUS_BYSELF = 0x2, // Ex: Specific umask for BUS transactions
PMC_UNIT_MASK_BUS_NONPRI_AGENT = 0x1, // Ex: Specific umask for BUS transactions
PMC_UNIT_MASK_BUS_MEMORY_ALL = 0xc, // Ex: Specific umask for BUS transactions
PMC_UNIT_MASK_BUS_MEMORY_128BYTE = 0x4, // Ex: Specific umask for BUS transactions
PMC_UNIT_MASK_BUS_MEMORY_LTH_128BYTE = 0x8, // Ex: Specific umask for BUS transactions
PMC_UNIT_MASK_BUS_MEMORY_READS_ALL = 0xc, // Ex: Specific umask for BUS reads
PMC_UNIT_MASK_BUS_MEMORY_BIL = 0x0, // Ex: Specific umask for BUS reads
PMC_UNIT_MASK_BUS_MEMORY_BRL = 0x4, // Ex: Specific umask for BUS reads
PMC_UNIT_MASK_BUS_MEMORY_BRIL = 0x8, // Ex: Specific umask for BUS reads
PMC_UNIT_MASK_BUS_WB_ALL = 0xf, // Ex: Specific umask for BUS writebacks
PMC_UNIT_MASK_BUS_WB_BYSELF = 0xe, // Ex: Specific umask for BUS writebacks
PMC_UNIT_MASK_BUS_WB_NONPRI_AGENT = 0xd, // Ex: Specific umask for BUS writebacks
PMC_UNIT_MASK_BUS_WB_BURST_ALL = 0x7, // Ex: Specific umask for BUS writebacks
PMC_UNIT_MASK_BUS_WB_BURST_BYSELF = 0x6, // Ex: Specific umask for BUS writebacks
PMC_UNIT_MASK_BUS_WB_BURST_NONPRI_AGENT = 0x5, // Ex: Specific umask for BUS writebacks
PMC_UNIT_MASK_BUS_WB_ZEROBYTE_ALL = 0x7, // Ex: Specific umask for BUS writebacks
PMC_UNIT_MASK_BUS_WB_ZEROBYTE_BYSELF = 0x6, // Ex: Specific umask for BUS writebacks
PMC_UNIT_MASK_BUS_SNOOPS_ALL = 0xf, // Ex: Specific umask for BUS writebacks
PMC_UNIT_MASK_BUS_SNOOPS_BYSELF = 0xe, // Ex: Specific umask for BUS writebacks
PMC_UNIT_MASK_BUS_SNOOPS_NONPRI_AGENT = 0xd, // Ex: Specific umask for BUS writebacks
PMC_UNIT_MASK_RSE_LOADS = 0x1, // Ex: Specific umask for RSE accesses
PMC_UNIT_MASK_RSE_STORES = 0x2, // Ex: Specific umask for RSE accesses
PMC_UNIT_MASK_RSE_LOAD_UNDERFLOWS = 0x4, // Ex: Specific umask for RSE accesses
PMC_UNIT_MASK_ALL = 0xf,
PMC_THRESHOLD_DEFAULT = 0x0,
} PMC_NAMESPACE;
// HalpSetProfileCounterConfiguration()
// HalpSetProfileCounterInstructionSetMask()
typedef enum _PMC_INSTRUCTION_SET_MASK {
PMC_ISM_ALL = 0x0,
PMC_ISM_IA64 = 0x1,
PMC_ISM_IA32 = 0x2,
PMC_ISM_NONE = 0x3
} PMC_INSTRUCTION_SET_MASK;
//
////////////
/////////////
//
// The following section provides IA64 PMU Events Masks definitions.
// Microarchitectural definitions are defined in processor specific header file.
//
//
// BranchPathPrediction - Branch Path Mask
//
// not really a mask, more a specification value.
//
typedef enum _BRANCH_PATH_RESULT_MASK {
MISPRED_NT = 0x0,
MISPRED_TAKEN = 0x1,
OKPRED_NT = 0x2,
OKPRED_TAKEN = 0x3,
} BRANCH_PATH_RESULT_MASK;
//
// BranchTakenDetail - Slot Unit Mask.
//
typedef enum _BRANCH_TAKEN_DETAIL_SLOT_MASK {
INSTRUCTION_SLOT0 = 0x1,
INSTRUCTION_SLOT1 = 0x2,
INSTRUCTION_SLOT2 = 0x4,
NOT_TAKEN_BRANCH = 0x8
} BRANCH_TAKEN_DETAIL_SLOT_MASK;
//
// BranchMultiWayDetail - Prediction OutCome Mask
//
// not really a mask, more a specification value.
//
typedef enum _BRANCH_DETAIL_PREDICTION_OUTCOME_MASK {
ALL_PREDICTIONS = 0x0,
CORRECT_PREDICTION = 0x1,
WRONG_PATH = 0x2,
WRONG_TARGET = 0x3
} BRANCH_MWAY_DETAIL_PREDICTION_OUTCOME_MASK;
//
// BranchMultiWayDetail - Branch Path Mask
//
// not really a mask, more a specification value.
//
typedef enum _BRANCH_MWAY_DETAIL_BRANCH_PATH_MASK {
NOT_TAKEN = 0x0,
TAKEN = 0x1,
ALL_PATH = 0x2
} BRANCH_MWAY_DETAIL_BRANCH_PATH_MASK;
//
// INST_TYPE for:
//
// FailedSpeculativeCheckLoads
// AdvancedCheckLoads
// FailedAdvancedCheckLoads
// ALATOverflows
//
typedef enum _SPECULATION_EVENT_MASK {
NONE = 0x0,
INTEGER = 0x1,
FP = 0x2,
ALL = 0x3
} SPECULATION_EVENT_MASK;
//
// CpuCycles - Executing Instruction Set
//
typedef enum _CPU_CYCLES_MODE_MASK {
ALL_MODES = 0x0,
IA64_MODE = 0x1,
IA32_MODE = 0x2
} CPU_CYCLES_MODE_MASK;
//
////////////
#endif /* IA64PROF_H_INCLUDED */