⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 op_model_p4.c

📁 这个linux源代码是很全面的~基本完整了~使用c编译的~由于时间问题我没有亲自测试~但就算用来做参考资料也是非常好的
💻 C
📖 第 1 页 / 共 2 页
字号:
/** * @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>#ifdef CONFIG_SMP#include <linux/smp.h>#include <linux/sched.h>#endif#include <asm/msr.h>#include <asm/ptrace.h>#include <asm/fixmap.h>#include <asm/apic.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_cccrs = NUM_CCCRS_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_cccrs = NUM_CCCRS_HT2;	}#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   libop/op_events.c. */#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 }};/* 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},		  {-1,-1} }	},	{ /* IOQ_ACTIVE_ENTRIES */		0x06, 0x1a, 		{ { CTR_BPU_2, MSR_P4_FSB_ESCR1},		  {-1,-1} }	},	{ /* 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},		  {-1,-1} }	},	{ /* BSQ_ACTIVE_ENTRIES */		0x07, 0x06,		{ { CTR_BPU_2, MSR_P4_BSU_ESCR1 /* guess */},  		  {-1,-1} }	},	{ /* 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 /* manual says 0x05 */, 		{ { 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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -