📄 op_model_p4.c
字号:
/** * @file op_model_p4.c * P4 model-specific MSR operations * * @remark Copyright 2002 OProfile authors * @remark Read the file COPYING * * @author Graydon Hoare */#include <linux/oprofile.h>#include <linux/smp.h>#include <asm/msr.h>#include <asm/ptrace.h>#include <asm/fixmap.h>#include <asm/apic.h>#include <asm/nmi.h>#include "op_x86_model.h"#include "op_counter.h"#define NUM_EVENTS 39#define NUM_COUNTERS_NON_HT 8#define NUM_ESCRS_NON_HT 45#define NUM_CCCRS_NON_HT 18#define NUM_CONTROLS_NON_HT (NUM_ESCRS_NON_HT + NUM_CCCRS_NON_HT)#define NUM_COUNTERS_HT2 4#define NUM_ESCRS_HT2 23#define NUM_CCCRS_HT2 9#define NUM_CONTROLS_HT2 (NUM_ESCRS_HT2 + NUM_CCCRS_HT2)static unsigned int num_counters = NUM_COUNTERS_NON_HT;static unsigned int num_controls = NUM_CONTROLS_NON_HT;/* this has to be checked dynamically since the hyper-threadedness of a chip is discovered at kernel boot-time. */static inline void setup_num_counters(void){#ifdef CONFIG_SMP if (smp_num_siblings == 2){ num_counters = NUM_COUNTERS_HT2; num_controls = NUM_CONTROLS_HT2; }#endif}static int inline addr_increment(void){#ifdef CONFIG_SMP return smp_num_siblings == 2 ? 2 : 1;#else return 1;#endif}/* tables to simulate simplified hardware view of p4 registers */struct p4_counter_binding { int virt_counter; int counter_address; int cccr_address;};struct p4_event_binding { int escr_select; /* value to put in CCCR */ int event_select; /* value to put in ESCR */ struct { int virt_counter; /* for this counter... */ int escr_address; /* use this ESCR */ } bindings[2];};/* nb: these CTR_* defines are a duplicate of defines in event/i386.p4*events. */#define CTR_BPU_0 (1 << 0)#define CTR_MS_0 (1 << 1)#define CTR_FLAME_0 (1 << 2)#define CTR_IQ_4 (1 << 3)#define CTR_BPU_2 (1 << 4)#define CTR_MS_2 (1 << 5)#define CTR_FLAME_2 (1 << 6)#define CTR_IQ_5 (1 << 7)static struct p4_counter_binding p4_counters [NUM_COUNTERS_NON_HT] = { { CTR_BPU_0, MSR_P4_BPU_PERFCTR0, MSR_P4_BPU_CCCR0 }, { CTR_MS_0, MSR_P4_MS_PERFCTR0, MSR_P4_MS_CCCR0 }, { CTR_FLAME_0, MSR_P4_FLAME_PERFCTR0, MSR_P4_FLAME_CCCR0 }, { CTR_IQ_4, MSR_P4_IQ_PERFCTR4, MSR_P4_IQ_CCCR4 }, { CTR_BPU_2, MSR_P4_BPU_PERFCTR2, MSR_P4_BPU_CCCR2 }, { CTR_MS_2, MSR_P4_MS_PERFCTR2, MSR_P4_MS_CCCR2 }, { CTR_FLAME_2, MSR_P4_FLAME_PERFCTR2, MSR_P4_FLAME_CCCR2 }, { CTR_IQ_5, MSR_P4_IQ_PERFCTR5, MSR_P4_IQ_CCCR5 }};#define NUM_UNUSED_CCCRS NUM_CCCRS_NON_HT - NUM_COUNTERS_NON_HT/* p4 event codes in libop/op_event.h are indices into this table. */static struct p4_event_binding p4_events[NUM_EVENTS] = { { /* BRANCH_RETIRED */ 0x05, 0x06, { {CTR_IQ_4, MSR_P4_CRU_ESCR2}, {CTR_IQ_5, MSR_P4_CRU_ESCR3} } }, { /* MISPRED_BRANCH_RETIRED */ 0x04, 0x03, { { CTR_IQ_4, MSR_P4_CRU_ESCR0}, { CTR_IQ_5, MSR_P4_CRU_ESCR1} } }, { /* TC_DELIVER_MODE */ 0x01, 0x01, { { CTR_MS_0, MSR_P4_TC_ESCR0}, { CTR_MS_2, MSR_P4_TC_ESCR1} } }, { /* BPU_FETCH_REQUEST */ 0x00, 0x03, { { CTR_BPU_0, MSR_P4_BPU_ESCR0}, { CTR_BPU_2, MSR_P4_BPU_ESCR1} } }, { /* ITLB_REFERENCE */ 0x03, 0x18, { { CTR_BPU_0, MSR_P4_ITLB_ESCR0}, { CTR_BPU_2, MSR_P4_ITLB_ESCR1} } }, { /* MEMORY_CANCEL */ 0x05, 0x02, { { CTR_FLAME_0, MSR_P4_DAC_ESCR0}, { CTR_FLAME_2, MSR_P4_DAC_ESCR1} } }, { /* MEMORY_COMPLETE */ 0x02, 0x08, { { CTR_FLAME_0, MSR_P4_SAAT_ESCR0}, { CTR_FLAME_2, MSR_P4_SAAT_ESCR1} } }, { /* LOAD_PORT_REPLAY */ 0x02, 0x04, { { CTR_FLAME_0, MSR_P4_SAAT_ESCR0}, { CTR_FLAME_2, MSR_P4_SAAT_ESCR1} } }, { /* STORE_PORT_REPLAY */ 0x02, 0x05, { { CTR_FLAME_0, MSR_P4_SAAT_ESCR0}, { CTR_FLAME_2, MSR_P4_SAAT_ESCR1} } }, { /* MOB_LOAD_REPLAY */ 0x02, 0x03, { { CTR_BPU_0, MSR_P4_MOB_ESCR0}, { CTR_BPU_2, MSR_P4_MOB_ESCR1} } }, { /* PAGE_WALK_TYPE */ 0x04, 0x01, { { CTR_BPU_0, MSR_P4_PMH_ESCR0}, { CTR_BPU_2, MSR_P4_PMH_ESCR1} } }, { /* BSQ_CACHE_REFERENCE */ 0x07, 0x0c, { { CTR_BPU_0, MSR_P4_BSU_ESCR0}, { CTR_BPU_2, MSR_P4_BSU_ESCR1} } }, { /* IOQ_ALLOCATION */ 0x06, 0x03, { { CTR_BPU_0, MSR_P4_FSB_ESCR0}, { 0, 0 } } }, { /* IOQ_ACTIVE_ENTRIES */ 0x06, 0x1a, { { CTR_BPU_2, MSR_P4_FSB_ESCR1}, { 0, 0 } } }, { /* FSB_DATA_ACTIVITY */ 0x06, 0x17, { { CTR_BPU_0, MSR_P4_FSB_ESCR0}, { CTR_BPU_2, MSR_P4_FSB_ESCR1} } }, { /* BSQ_ALLOCATION */ 0x07, 0x05, { { CTR_BPU_0, MSR_P4_BSU_ESCR0}, { 0, 0 } } }, { /* BSQ_ACTIVE_ENTRIES */ 0x07, 0x06, { { CTR_BPU_2, MSR_P4_BSU_ESCR1 /* guess */}, { 0, 0 } } }, { /* X87_ASSIST */ 0x05, 0x03, { { CTR_IQ_4, MSR_P4_CRU_ESCR2}, { CTR_IQ_5, MSR_P4_CRU_ESCR3} } }, { /* SSE_INPUT_ASSIST */ 0x01, 0x34, { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } }, { /* PACKED_SP_UOP */ 0x01, 0x08, { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } }, { /* PACKED_DP_UOP */ 0x01, 0x0c, { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } }, { /* SCALAR_SP_UOP */ 0x01, 0x0a, { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } }, { /* SCALAR_DP_UOP */ 0x01, 0x0e, { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } }, { /* 64BIT_MMX_UOP */ 0x01, 0x02, { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } }, { /* 128BIT_MMX_UOP */ 0x01, 0x1a, { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } }, { /* X87_FP_UOP */ 0x01, 0x04, { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } }, { /* X87_SIMD_MOVES_UOP */ 0x01, 0x2e, { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } }, { /* MACHINE_CLEAR */ 0x05, 0x02, { { CTR_IQ_4, MSR_P4_CRU_ESCR2}, { CTR_IQ_5, MSR_P4_CRU_ESCR3} } }, { /* GLOBAL_POWER_EVENTS */ 0x06, 0x13 /* older manual says 0x05, newer 0x13 */, { { CTR_BPU_0, MSR_P4_FSB_ESCR0}, { CTR_BPU_2, MSR_P4_FSB_ESCR1} } }, { /* TC_MS_XFER */ 0x00, 0x05, { { CTR_MS_0, MSR_P4_MS_ESCR0}, { CTR_MS_2, MSR_P4_MS_ESCR1} } }, { /* UOP_QUEUE_WRITES */ 0x00, 0x09, { { CTR_MS_0, MSR_P4_MS_ESCR0}, { CTR_MS_2, MSR_P4_MS_ESCR1} } }, { /* FRONT_END_EVENT */ 0x05, 0x08, { { CTR_IQ_4, MSR_P4_CRU_ESCR2}, { CTR_IQ_5, MSR_P4_CRU_ESCR3} } }, { /* EXECUTION_EVENT */ 0x05, 0x0c, { { CTR_IQ_4, MSR_P4_CRU_ESCR2}, { CTR_IQ_5, MSR_P4_CRU_ESCR3} } }, { /* REPLAY_EVENT */ 0x05, 0x09, { { CTR_IQ_4, MSR_P4_CRU_ESCR2}, { CTR_IQ_5, MSR_P4_CRU_ESCR3} } }, { /* INSTR_RETIRED */ 0x04, 0x02, { { CTR_IQ_4, MSR_P4_CRU_ESCR0}, { CTR_IQ_5, MSR_P4_CRU_ESCR1} } }, { /* UOPS_RETIRED */ 0x04, 0x01, { { CTR_IQ_4, MSR_P4_CRU_ESCR0}, { CTR_IQ_5, MSR_P4_CRU_ESCR1} } }, { /* UOP_TYPE */ 0x02, 0x02, { { CTR_IQ_4, MSR_P4_RAT_ESCR0}, { CTR_IQ_5, MSR_P4_RAT_ESCR1} } }, { /* RETIRED_MISPRED_BRANCH_TYPE */ 0x02, 0x05, { { CTR_MS_0, MSR_P4_TBPU_ESCR0}, { CTR_MS_2, MSR_P4_TBPU_ESCR1} } }, { /* RETIRED_BRANCH_TYPE */ 0x02, 0x04, { { CTR_MS_0, MSR_P4_TBPU_ESCR0}, { CTR_MS_2, MSR_P4_TBPU_ESCR1} } }};#define MISC_PMC_ENABLED_P(x) ((x) & 1 << 7)#define ESCR_RESERVED_BITS 0x80000003#define ESCR_CLEAR(escr) ((escr) &= ESCR_RESERVED_BITS)#define ESCR_SET_USR_0(escr, usr) ((escr) |= (((usr) & 1) << 2))#define ESCR_SET_OS_0(escr, os) ((escr) |= (((os) & 1) << 3))#define ESCR_SET_USR_1(escr, usr) ((escr) |= (((usr) & 1)))#define ESCR_SET_OS_1(escr, os) ((escr) |= (((os) & 1) << 1))#define ESCR_SET_EVENT_SELECT(escr, sel) ((escr) |= (((sel) & 0x3f) << 25))#define ESCR_SET_EVENT_MASK(escr, mask) ((escr) |= (((mask) & 0xffff) << 9))#define ESCR_READ(escr,high,ev,i) do {rdmsr(ev->bindings[(i)].escr_address, (escr), (high));} while (0)#define ESCR_WRITE(escr,high,ev,i) do {wrmsr(ev->bindings[(i)].escr_address, (escr), (high));} while (0)#define CCCR_RESERVED_BITS 0x38030FFF#define CCCR_CLEAR(cccr) ((cccr) &= CCCR_RESERVED_BITS)#define CCCR_SET_REQUIRED_BITS(cccr) ((cccr) |= 0x00030000)#define CCCR_SET_ESCR_SELECT(cccr, sel) ((cccr) |= (((sel) & 0x07) << 13))#define CCCR_SET_PMI_OVF_0(cccr) ((cccr) |= (1<<26))#define CCCR_SET_PMI_OVF_1(cccr) ((cccr) |= (1<<27))#define CCCR_SET_ENABLE(cccr) ((cccr) |= (1<<12))#define CCCR_SET_DISABLE(cccr) ((cccr) &= ~(1<<12))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -