Blame src/perfctr-2.7.x/etc/p4.c

Packit 577717
/* $Id: p4.c,v 1.7 2004/02/20 21:33:25 mikpe Exp $
Packit 577717
 *
Packit 577717
 * pipe stdout through 'sort -u' to see:
Packit 577717
 * - which ESCRs are usable, and the events they support
Packit 577717
 * - which COUNTERs/CCCRs are usable, and the usable ESCRs they support
Packit 577717
 */
Packit 577717
#include <stdio.h>
Packit 577717
#include <stdlib.h>
Packit 577717
#include <assert.h>
Packit 577717
Packit 577717
#define ARRAY_SIZE(A)	(sizeof(A)/sizeof((A)[0]))
Packit 577717
Packit 577717
/*
Packit 577717
 * The 18 40-bit counters.
Packit 577717
 */
Packit 577717
Packit 577717
struct counter {
Packit 577717
    const char name[16];
Packit 577717
};
Packit 577717
Packit 577717
static const struct counter counters[18] = {
Packit 577717
/*   nr    name			   available ESCRs */
Packit 577717
    [ 0] { "BPU_COUNTER0" },	/* {BPU,BSU,FSB,ITLB,MOB,PMH}_ESCR0 */
Packit 577717
    [ 1] { "BPU_COUNTER1" },	/* {BPU,BSU,FSB,ITLB,MOB,PMH}_ESCR0 */
Packit 577717
    [ 2] { "BPU_COUNTER2" },	/* {BPU,BSU,FSB,ITLB,MOB,PMH}_ESCR1 */
Packit 577717
    [ 3] { "BPU_COUNTER3" },	/* {BPU,BSU,FSB,ITLB,MOB,PMH}_ESCR1 */
Packit 577717
    [ 4] { "MS_COUNTER0" },	/* {MS,TBPU,TC}_ESCR0 */
Packit 577717
    [ 5] { "MS_COUNTER1" },	/* {MS,TBPU,TC}_ESCR0 */
Packit 577717
    [ 6] { "MS_COUNTER2" },	/* {MS,TBPU,TC}_ESCR1 */
Packit 577717
    [ 7] { "MS_COUNTER3" },	/* {MS,TBPU,TC}_ESCR1 */
Packit 577717
    [ 8] { "FLAME_COUNTER0" },	/* {DAC,FIRM,SAAT}_ESCR0 */
Packit 577717
    [ 9] { "FLAME_COUNTER1" },	/* {DAC,FIRM,SAAT}_ESCR0 */
Packit 577717
    [10] { "FLAME_COUNTER2" },	/* {DAC,FIRM,SAAT}_ESCR1 */
Packit 577717
    [11] { "FLAME_COUNTER3" },	/* {DAC,FIRM,SAAT}_ESCR1 */
Packit 577717
    [12] { "IQ_COUNTER0" },	/* ALF_ESCR0, CRU_ESCR0, CRU_ESCR2, RAT_ESCR0 */
Packit 577717
    [13] { "IQ_COUNTER1" },	/* ALF_ESCR0, CRU_ESCR0, CRU_ESCR2, RAT_ESCR0 */
Packit 577717
    [14] { "IQ_COUNTER2" },	/* ALF_ESCR1, CRU_ESCR1, CRU_ESCR3, RAT_ESCR1 */
Packit 577717
    [15] { "IQ_COUNTER3" },	/* ALF_ESCR1, CRU_ESCR1, CRU_ESCR3, RAT_ESCR1 */
Packit 577717
    [16] { "IQ_COUNTER4" },	/* ALF_ESCR0, CRU_ESCR0, CRU_ESCR2, RAT_ESCR0 */
Packit 577717
    [17] { "IQ_COUNTER5" },	/* ALF_ESCR0, CRU_ESCR1, CRU_ESCR3, RAT_ESCR1 */
Packit 577717
};
Packit 577717
Packit 577717
static unsigned int counter_msr(unsigned int counter_num)
Packit 577717
{
Packit 577717
    assert(counter_num < ARRAY_SIZE(counters));
Packit 577717
    return 0x300 + counter_num;
Packit 577717
}
Packit 577717
Packit 577717
static const char *counter_name(unsigned int counter_num)
Packit 577717
{
Packit 577717
    assert(counter_num < ARRAY_SIZE(counters));
Packit 577717
    return counters[counter_num].name;
Packit 577717
}
Packit 577717
Packit 577717
/*
Packit 577717
 * The 18 counter configuration control registers (CCCRs).
Packit 577717
 * They are in a one-to-one relation with the counters.
Packit 577717
 */
Packit 577717
Packit 577717
struct cccr {
Packit 577717
    const char name[16];
Packit 577717
};
Packit 577717
Packit 577717
static const struct cccr cccrs[18] = {
Packit 577717
    [ 0] { "BPU_CCCR0" },
Packit 577717
    [ 1] { "BPU_CCCR1" },
Packit 577717
    [ 2] { "BPU_CCCR2" },
Packit 577717
    [ 3] { "BPU_CCCR3" },
Packit 577717
    [ 4] { "MS_CCCR0" },
Packit 577717
    [ 5] { "MS_CCCR1" },
Packit 577717
    [ 6] { "MS_CCCR2" },
Packit 577717
    [ 7] { "MS_CCCR3" },
Packit 577717
    [ 8] { "FLAME_CCCR0" },
Packit 577717
    [ 9] { "FLAME_CCCR1" },
Packit 577717
    [10] { "FLAME_CCCR2" },
Packit 577717
    [11] { "FLAME_CCCR3" },
Packit 577717
    [12] { "IQ_CCCR0" },
Packit 577717
    [13] { "IQ_CCCR1" },
Packit 577717
    [14] { "IQ_CCCR2" },
Packit 577717
    [15] { "IQ_CCCR3" },
Packit 577717
    [16] { "IQ_CCCR4" },
Packit 577717
    [17] { "IQ_CCCR5" },
Packit 577717
};
Packit 577717
Packit 577717
static unsigned int cccr_msr(unsigned int cccr_num)
Packit 577717
{
Packit 577717
    assert(cccr_num < ARRAY_SIZE(cccrs));
Packit 577717
    return 0x360 + cccr_num;
Packit 577717
}
Packit 577717
Packit 577717
static const char *cccr_name(unsigned int cccr_num)
Packit 577717
{
Packit 577717
    assert(cccr_num < ARRAY_SIZE(cccrs));
Packit 577717
    return cccrs[cccr_num].name;
Packit 577717
}
Packit 577717
Packit 577717
/*
Packit 577717
 * The 45 event selection control registers (ESCRs).
Packit 577717
 */
Packit 577717
Packit 577717
enum escr_num {
Packit 577717
    BSU_ESCR0,	/* BSQ_allocation, BSQ_cache_reference */
Packit 577717
    BSU_ESCR1,	/* bsq_active_entries, BSQ_cache_reference */
Packit 577717
    FSB_ESCR0,	/* FSB_data_activity, IOQ_allocation, b2b_cycles, bnr, global_power_events, response, snoopt */
Packit 577717
    FSB_ESCR1,	/* FSB_data_activity, IOQ_active_entries, IOQ_allocation, b2b_cycles, bnr, global_power_events, response, snoop */
Packit 577717
    FIRM_ESCR0,	/* 128bit_MMX_uop, 64bit_MMX_uop, SSE_input_assist, packed_DP_uop, packed_SP_uop, scalar_DP_uop, scalar_SP_uop, x87_FP_uop, x86_SIMD_moves_uop */
Packit 577717
    FIRM_ESCR1,	/* 128bit_MMX_uop, 64bit_MMX_uop, SSE_input_assist, packed_DP_uop, packed_SP_uop, scalar_DP_uop, scalar_SP_uop, x87_FP_uop, x86_SIMD_moves_uop */
Packit 577717
    FLAME_ESCR0,/* UNUSED */
Packit 577717
    FLAME_ESCR1,/* UNUSED */
Packit 577717
    DAC_ESCR0,	/* WC_Buffer, memory_cancel */
Packit 577717
    DAC_ESCR1,	/* WC_Buffer, memory_cancel */
Packit 577717
    MOB_ESCR0,	/* MOB_load_replay */
Packit 577717
    MOB_ESCR1,	/* MOB_load_replay */
Packit 577717
    PMH_ESCR0,	/* page_walk_type */
Packit 577717
    PMH_ESCR1,	/* page_walk_type */
Packit 577717
    SAAT_ESCR0,	/* load_port_replay, memory_complete, store_port_replay */
Packit 577717
    SAAT_ESCR1,	/* load_port_replay, memory_complete, store_port_replay */
Packit 577717
    U2L_ESCR0,	/* UNUSED */
Packit 577717
    U2L_ESCR1,	/* UNUSED */
Packit 577717
    BPU_ESCR0,	/* BPU_fetch_request */
Packit 577717
    BPU_ESCR1,	/* BPU_fetch_request */
Packit 577717
    IS_ESCR0,	/* UNUSED */
Packit 577717
    IS_ESCR1,	/* UNUSED */
Packit 577717
    ITLB_ESCR0,	/* ITLB_reference */
Packit 577717
    ITLB_ESCR1,	/* ITLB_reference */
Packit 577717
    CRU_ESCR0,	/* instr_retired, mispred_branch_retired, uops_retired, instr_completed */
Packit 577717
    CRU_ESCR1,	/* instr_retired, mispred_branch_retired, uops_retired, instr_completed */
Packit 577717
    IQ_ESCR0,	/* UNUSED; available in family 0x0F models 1 and 2, removed from later models */
Packit 577717
    IQ_ESCR1,	/* UNUSED; available in family 0x0F models 1 and 2, removed from later models */
Packit 577717
    RAT_ESCR0,	/* uop_type */
Packit 577717
    RAT_ESCR1,	/* uop_type */
Packit 577717
    SSU_ESCR0,	/* UNUSED */
Packit 577717
    MS_ESCR0,	/* tc_ms_xfer, uop_queue_writes */
Packit 577717
    MS_ESCR1,	/* tc_ms_xfer, uop_queue_writes */
Packit 577717
    TBPU_ESCR0,	/* retired_branch_type, retired_mispred_branch_type */
Packit 577717
    TBPU_ESCR1,	/* retired_branch_type, retired_mispred_branch_type */
Packit 577717
    TC_ESCR0,	/* TC_deliver_mode, TC_misc */
Packit 577717
    TC_ESCR1,	/* TC_deliver_mode, TC_misc */
Packit 577717
    IX_ESCR0,	/* UNUSED */
Packit 577717
    IX_ESCR1,	/* UNUSED */
Packit 577717
    ALF_ESCR0,	/* resource_stall */
Packit 577717
    ALF_ESCR1,	/* resource_stall */
Packit 577717
    CRU_ESCR2,	/* branch_retired, execution_event, front_end_event, machine_clear, replay_event, x87_assist */
Packit 577717
    CRU_ESCR3,	/* branch_retired, execution_event, front_end_event, machine_clear, replay_event, x87_assist */
Packit 577717
    CRU_ESCR4,	/* UNUSED */
Packit 577717
    CRU_ESCR5,	/* UNUSED */
Packit 577717
};
Packit 577717
Packit 577717
struct escr {
Packit 577717
    const char name[16];
Packit 577717
};
Packit 577717
Packit 577717
static const struct escr escrs[45] = {
Packit 577717
    [BSU_ESCR0] { "BSU_ESCR0" },
Packit 577717
    [BSU_ESCR1] { "BSU_ESCR1" },
Packit 577717
    [FSB_ESCR0] { "FSB_ESCR0" },
Packit 577717
    [FSB_ESCR1] { "FSB_ESCR1" },
Packit 577717
    [FIRM_ESCR0] { "FIRM_ESCR0" },
Packit 577717
    [FIRM_ESCR1] { "FIRM_ESCR1" },
Packit 577717
    [FLAME_ESCR0] { "FLAME_ESCR0" },
Packit 577717
    [FLAME_ESCR1] { "FLAME_ESCR1" },
Packit 577717
    [DAC_ESCR0] { "DAC_ESCR0" },
Packit 577717
    [DAC_ESCR1] { "DAC_ESCR1" },
Packit 577717
    [MOB_ESCR0] { "MOB_ESCR0" },
Packit 577717
    [MOB_ESCR1] { "MOB_ESCR1" },
Packit 577717
    [PMH_ESCR0] { "PMH_ESCR0" },
Packit 577717
    [PMH_ESCR1] { "PMH_ESCR1" },
Packit 577717
    [SAAT_ESCR0] { "SAAT_ESCR0" },
Packit 577717
    [SAAT_ESCR1] { "SAAT_ESCR1" },
Packit 577717
    [U2L_ESCR0] { "U2L_ESCR0" },
Packit 577717
    [U2L_ESCR1] { "U2L_ESCR1" },
Packit 577717
    [BPU_ESCR0] { "BPU_ESCR0" },
Packit 577717
    [BPU_ESCR1] { "BPU_ESCR1" },
Packit 577717
    [IS_ESCR0] { "IS_ESCR0" },
Packit 577717
    [IS_ESCR1] { "IS_ESCR1" },
Packit 577717
    [ITLB_ESCR0] { "ITLB_ESCR0" },
Packit 577717
    [ITLB_ESCR1] { "ITLB_ESCR1" },
Packit 577717
    [CRU_ESCR0] { "CRU_ESCR0" },
Packit 577717
    [CRU_ESCR1] { "CRU_ESCR1" },
Packit 577717
    [IQ_ESCR0] { "IQ_ESCR0" },
Packit 577717
    [IQ_ESCR1] { "IQ_ESCR1" },
Packit 577717
    [RAT_ESCR0] { "RAT_ESCR0" },
Packit 577717
    [RAT_ESCR1] { "RAT_ESCR1" },
Packit 577717
    [SSU_ESCR0] { "SSU_ESCR0" },
Packit 577717
    [MS_ESCR0] { "MS_ESCR0" },
Packit 577717
    [MS_ESCR1] { "MS_ESCR1" },
Packit 577717
    [TBPU_ESCR0] { "TBPU_ESCR0" },
Packit 577717
    [TBPU_ESCR1] { "TBPU_ESCR1" },
Packit 577717
    [TC_ESCR0] { "TC_ESCR0" },
Packit 577717
    [TC_ESCR1] { "TC_ESCR1" },
Packit 577717
    [IX_ESCR0] { "IX_ESCR0" },
Packit 577717
    [IX_ESCR1] { "IX_ESCR1" },
Packit 577717
    [ALF_ESCR0] { "ALF_ESCR0" },
Packit 577717
    [ALF_ESCR1] { "ALF_ESCR1" },
Packit 577717
    [CRU_ESCR2] { "CRU_ESCR2" },
Packit 577717
    [CRU_ESCR3] { "CRU_ESCR3" },
Packit 577717
    [CRU_ESCR4] { "CRU_ESCR4" },
Packit 577717
    [CRU_ESCR5] { "CRU_ESCR5" },
Packit 577717
};
Packit 577717
Packit 577717
static unsigned int escr_msr(enum escr_num escr_num)
Packit 577717
{
Packit 577717
    assert(escr_num < ARRAY_SIZE(escrs));
Packit 577717
    if( escr_num >= CRU_ESCR4 )
Packit 577717
	return 0x3E0 + (escr_num - CRU_ESCR4);
Packit 577717
    if( escr_num >= IX_ESCR0 )
Packit 577717
	return 0x3C8 + (escr_num - IX_ESCR0);
Packit 577717
    if( escr_num >= MS_ESCR0 )
Packit 577717
	return 0x3C0 + (escr_num - MS_ESCR0);
Packit 577717
    return 0x3A0 + escr_num;
Packit 577717
}
Packit 577717
Packit 577717
static const char *escr_name(enum escr_num escr_num)
Packit 577717
{
Packit 577717
    assert(escr_num < ARRAY_SIZE(escrs));
Packit 577717
    return escrs[escr_num].name;
Packit 577717
}
Packit 577717
Packit 577717
/*
Packit 577717
 * The map from CCCR number and ESCR select value to ESCR MSR address.
Packit 577717
 * This is the manual's original uncompacted table.
Packit 577717
 */
Packit 577717
Packit 577717
static const unsigned short p4_cccr_escr_map_orig[18][8] = {
Packit 577717
     [0x00] {		[7] 0x3A0,
Packit 577717
			[6] 0x3A2,
Packit 577717
			[2] 0x3AA,
Packit 577717
			[4] 0x3AC,
Packit 577717
			[0] 0x3B2,
Packit 577717
			[1] 0x3B4,
Packit 577717
			[3] 0x3B6,
Packit 577717
			[5] 0x3C8, },
Packit 577717
     [0x01] {		[7] 0x3A0,
Packit 577717
			[6] 0x3A2,
Packit 577717
			[2] 0x3AA,
Packit 577717
			[4] 0x3AC,
Packit 577717
			[0] 0x3B2,
Packit 577717
			[1] 0x3B4,
Packit 577717
			[3] 0x3B6,
Packit 577717
			[5] 0x3C8, },
Packit 577717
     [0x02] {		[7] 0x3A1,
Packit 577717
			[6] 0x3A3,
Packit 577717
			[2] 0x3AB,
Packit 577717
			[4] 0x3AD,
Packit 577717
			[0] 0x3B3,
Packit 577717
			[1] 0x3B5,
Packit 577717
			[3] 0x3B7,
Packit 577717
			[5] 0x3C9, },
Packit 577717
     [0x03] {		[7] 0x3A1,
Packit 577717
			[6] 0x3A3,
Packit 577717
			[2] 0x3AB,
Packit 577717
			[4] 0x3AD,
Packit 577717
			[0] 0x3B3,
Packit 577717
			[1] 0x3B5,
Packit 577717
			[3] 0x3B7,
Packit 577717
			[5] 0x3C9, },
Packit 577717
     [0x04] {		[0] 0x3C0,
Packit 577717
			[2] 0x3C2,
Packit 577717
			[1] 0x3C4, },
Packit 577717
     [0x05] {		[0] 0x3C0,
Packit 577717
			[2] 0x3C2,
Packit 577717
			[1] 0x3C4, },
Packit 577717
     [0x06] {		[0] 0x3C1,
Packit 577717
			[2] 0x3C3,
Packit 577717
			[1] 0x3C5, },
Packit 577717
     [0x07] {		[0] 0x3C1,
Packit 577717
			[2] 0x3C3,
Packit 577717
			[1] 0x3C5, },
Packit 577717
     [0x08] {		[1] 0x3A4,
Packit 577717
			[0] 0x3A6,
Packit 577717
			[5] 0x3A8,
Packit 577717
			[2] 0x3AE,
Packit 577717
			[3] 0x3B0, },
Packit 577717
     [0x09] {		[1] 0x3A4,
Packit 577717
			[0] 0x3A6,
Packit 577717
			[5] 0x3A8,
Packit 577717
			[2] 0x3AE,
Packit 577717
			[3] 0x3B0, },
Packit 577717
     [0x0A] {		[1] 0x3A5,
Packit 577717
			[0] 0x3A7,
Packit 577717
			[5] 0x3A9,
Packit 577717
			[2] 0x3AF,
Packit 577717
			[3] 0x3B1, },
Packit 577717
     [0x0B] {		[1] 0x3A5,
Packit 577717
			[0] 0x3A7,
Packit 577717
			[5] 0x3A9,
Packit 577717
			[2] 0x3AF,
Packit 577717
			[3] 0x3B1, },
Packit 577717
     [0x0C] {		[4] 0x3B8,
Packit 577717
			[5] 0x3CC,
Packit 577717
			[6] 0x3E0,
Packit 577717
			[0] 0x3BA,
Packit 577717
			[2] 0x3BC,
Packit 577717
			[3] 0x3BE,
Packit 577717
			[1] 0x3CA, },
Packit 577717
     [0x0D] {		[4] 0x3B8,
Packit 577717
			[5] 0x3CC,
Packit 577717
			[6] 0x3E0,
Packit 577717
			[0] 0x3BA,
Packit 577717
			[2] 0x3BC,
Packit 577717
			[3] 0x3BE,
Packit 577717
			[1] 0x3CA, },
Packit 577717
     [0x0E] {		[4] 0x3B9,
Packit 577717
			[5] 0x3CD,
Packit 577717
			[6] 0x3E1,
Packit 577717
			[0] 0x3BB,
Packit 577717
			[2] 0x3BD,
Packit 577717
			[1] 0x3CB, },
Packit 577717
     [0x0F] {		[4] 0x3B9,
Packit 577717
			[5] 0x3CD,
Packit 577717
			[6] 0x3E1,
Packit 577717
			[0] 0x3BB,
Packit 577717
			[2] 0x3BD,
Packit 577717
			[1] 0x3CB, },
Packit 577717
     [0x10] {		[4] 0x3B8,
Packit 577717
			[5] 0x3CC,
Packit 577717
			[6] 0x3E0,
Packit 577717
			[0] 0x3BA,
Packit 577717
			[2] 0x3BC,
Packit 577717
			[3] 0x3BE,
Packit 577717
			[1] 0x3CA, },
Packit 577717
     [0x11] {		[4] 0x3B9,
Packit 577717
			[5] 0x3CD,
Packit 577717
			[6] 0x3E1,
Packit 577717
			[0] 0x3BB,
Packit 577717
			[2] 0x3BD,
Packit 577717
			[1] 0x3CB, },
Packit 577717
};
Packit 577717
Packit 577717
static unsigned int p4_escr_addr_orig(unsigned int pmc, unsigned int escr_select)
Packit 577717
{
Packit 577717
     if( pmc > 0x11 || escr_select > 7 )
Packit 577717
	  return 0;
Packit 577717
     return p4_cccr_escr_map_orig[pmc][escr_select];
Packit 577717
};
Packit 577717
Packit 577717
/*
Packit 577717
 * The map from CCCR number and ESCR select value to ESCR MSR address.
Packit 577717
 * This is the compacted map, derived from the manual's table.
Packit 577717
 */
Packit 577717
Packit 577717
static const unsigned char p4_cccr_escr_map[4][8] = {
Packit 577717
	/* 0x00 and 0x01 as is, 0x02 and 0x03 are +1 */
Packit 577717
	[0x00/4] {	[7] 0xA0,
Packit 577717
			[6] 0xA2,
Packit 577717
			[2] 0xAA,
Packit 577717
			[4] 0xAC,
Packit 577717
			[0] 0xB2,
Packit 577717
			[1] 0xB4,
Packit 577717
			[3] 0xB6,
Packit 577717
			[5] 0xC8, },
Packit 577717
	/* 0x04 and 0x05 as is, 0x06 and 0x07 are +1 */
Packit 577717
	[0x04/4] {	[0] 0xC0,
Packit 577717
			[2] 0xC2,
Packit 577717
			[1] 0xC4, },
Packit 577717
	/* 0x08 and 0x09 as is, 0x0A and 0x0B are +1 */
Packit 577717
	[0x08/4] {	[1] 0xA4,
Packit 577717
			[0] 0xA6,
Packit 577717
			[5] 0xA8,
Packit 577717
			[2] 0xAE,
Packit 577717
			[3] 0xB0, },
Packit 577717
	/* 0x0C, 0x0D, and 0x10 as is,
Packit 577717
	   0x0E, 0x0F, and 0x11 are +1 except [3] is not in the domain */
Packit 577717
	[0x0C/4] {	[4] 0xB8,
Packit 577717
			[5] 0xCC,
Packit 577717
			[6] 0xE0,
Packit 577717
			[0] 0xBA,
Packit 577717
			[2] 0xBC,
Packit 577717
			[3] 0xBE,
Packit 577717
			[1] 0xCA, },
Packit 577717
};
Packit 577717
Packit 577717
static unsigned int p4_escr_addr(unsigned int pmc, unsigned int escr_select)
Packit 577717
{
Packit 577717
	unsigned int pair, escr_offset;
Packit 577717
Packit 577717
	if( pmc > 0x11 )
Packit 577717
		return 0;	/* pmc range error */
Packit 577717
	if( pmc > 0x0F )
Packit 577717
		pmc -= 3;	/* 0 <= pmc <= 0x0F */
Packit 577717
	pair = pmc / 2;		/* 0 <= pair <= 7 */
Packit 577717
	escr_offset = p4_cccr_escr_map[pair / 2][escr_select];
Packit 577717
	if( !escr_offset || (pair == 7 && escr_select == 3) )
Packit 577717
		return 0;	/* ESCR SELECT range error */
Packit 577717
	return escr_offset + (pair & 1) + 0x300;
Packit 577717
};
Packit 577717
Packit 577717
static void check_p4_escr_addr(void)
Packit 577717
{
Packit 577717
     unsigned int pmc, escr_select, escr_addr_orig, escr_addr;
Packit 577717
Packit 577717
     for(pmc = 0; pmc < 0x12; ++pmc) {
Packit 577717
	  for(escr_select = 0; escr_select < 8; ++escr_select) {
Packit 577717
	       escr_addr_orig = p4_escr_addr_orig(pmc, escr_select);
Packit 577717
	       escr_addr = p4_escr_addr(pmc, escr_select);
Packit 577717
	       if( escr_addr_orig != escr_addr )
Packit 577717
		    printf("p4_escr_addr(%u, %u) is 0x%03x, should be 0x%03x\n",
Packit 577717
			   pmc, escr_select, escr_addr, escr_addr_orig);
Packit 577717
	  }
Packit 577717
     }
Packit 577717
}
Packit 577717
Packit 577717
/*
Packit 577717
 * The events.
Packit 577717
 */
Packit 577717
Packit 577717
struct event {
Packit 577717
    const char name[32];
Packit 577717
    unsigned int select;	/* ESCR[31:25] */
Packit 577717
    enum escr_num escr0;
Packit 577717
    unsigned int escr1;		/* escr_num or -1 */
Packit 577717
};
Packit 577717
Packit 577717
static const struct event events[] = {
Packit 577717
    /* Non-Retirement Events: */
Packit 577717
    { "TC_deliver_mode", 0x01, TC_ESCR0, TC_ESCR1 },
Packit 577717
    { "BPU_fetch_request", 0x03, BPU_ESCR0, BPU_ESCR1 },
Packit 577717
    { "ITLB_reference", 0x18, ITLB_ESCR0, ITLB_ESCR1 },
Packit 577717
    { "memory_cancel", 0x02, DAC_ESCR0, DAC_ESCR1 },
Packit 577717
    { "memory_complete", 0x08, SAAT_ESCR0, SAAT_ESCR1 },
Packit 577717
    { "load_port_replay", 0x04, SAAT_ESCR0, SAAT_ESCR1 },
Packit 577717
    { "store_port_replay", 0x05, SAAT_ESCR0, SAAT_ESCR1 },
Packit 577717
    { "MOB_load_replay", 0x03, MOB_ESCR0, MOB_ESCR1 },
Packit 577717
    { "page_walk_type", 0x01, PMH_ESCR0, PMH_ESCR1 },
Packit 577717
    { "BSQ_cache_reference", 0x0C, BSU_ESCR0, BSU_ESCR1 },
Packit 577717
    { "IOQ_allocation", 0x03, FSB_ESCR0, FSB_ESCR1 }, /* ESCR1 unavailable if CPUID < 0xF27 */
Packit 577717
    { "IOQ_active_entries", 0x1A, FSB_ESCR1, -1 },
Packit 577717
    { "FSB_data_activity", 0x17, FSB_ESCR0, FSB_ESCR1 },
Packit 577717
    { "BSQ_allocation", 0x05, BSU_ESCR0, -1 },
Packit 577717
    { "bsq_active_entries", 0x06, BSU_ESCR1, -1 },
Packit 577717
    { "SSE_input_assist", 0x34, FIRM_ESCR0, FIRM_ESCR1 },
Packit 577717
    { "packed_SP_uop", 0x08, FIRM_ESCR0, FIRM_ESCR1 },
Packit 577717
    { "packed_DP_uop", 0x0C, FIRM_ESCR0, FIRM_ESCR1 },
Packit 577717
    { "scalar_SP_uop", 0x0A, FIRM_ESCR0, FIRM_ESCR1 },
Packit 577717
    { "scalar_DP_uop", 0x0E, FIRM_ESCR0, FIRM_ESCR1 },
Packit 577717
    { "64bit_MMX_uop", 0x02, FIRM_ESCR0, FIRM_ESCR1 },
Packit 577717
    { "128bit_MMX_uop", 0x1A, FIRM_ESCR0, FIRM_ESCR1 },
Packit 577717
    { "x87_FP_uop", 0x04, FIRM_ESCR0, FIRM_ESCR1 },
Packit 577717
    { "x87_SIMD_moves_uop", 0x2E, FIRM_ESCR0, FIRM_ESCR1 },
Packit 577717
    { "TC_misc", 0x06, TC_ESCR0, TC_ESCR1 },
Packit 577717
    { "global_power_events", 0x13, FSB_ESCR0, FSB_ESCR1 },
Packit 577717
    { "tc_ms_xfer", 0x05, MS_ESCR0, MS_ESCR1 },
Packit 577717
    { "uop_queue_writes", 0x09, MS_ESCR0, MS_ESCR1 },
Packit 577717
    { "retired_mispred_branch_type", 0x05, TBPU_ESCR0, TBPU_ESCR1 },
Packit 577717
    { "retired_branch_type", 0x04, TBPU_ESCR0, TBPU_ESCR1 },
Packit 577717
    { "resource_stall", 0x01, ALF_ESCR0, ALF_ESCR1 },
Packit 577717
    { "WC_Buffer", 0x05, DAC_ESCR0, DAC_ESCR1 },
Packit 577717
    { "b2b_cycles", 0x16, FSB_ESCR0, FSB_ESCR1 },
Packit 577717
    { "bnr", 0x08, FSB_ESCR0, FSB_ESCR1 },
Packit 577717
    { "snoop", 0x06, FSB_ESCR0, FSB_ESCR1 },
Packit 577717
    { "response", 0x04, FSB_ESCR0, FSB_ESCR1 },
Packit 577717
    /* At-Retirement Events: */
Packit 577717
    { "front_end_event", 0x08, CRU_ESCR2, CRU_ESCR3 }, /* filters uop_type */
Packit 577717
    { "execution_event", 0x0C, CRU_ESCR2, CRU_ESCR3 }, /* filters packed_SP_uop, packed_DP_uop, scalar_SP_uop, scalar_DP_uop, 128bit_MMX_uop, 64bit_MMX_uop, x87_FP_uop, x86_SIMD_moves_uop */
Packit 577717
    { "replay_event", 0x09, CRU_ESCR2, CRU_ESCR3 }, /* filters MOB_load_replay, load_port_replay(SAAT_ESCR1), store_port_replay(SAAT_ESCR0), MSR_IA32_PEBS_ENABLE, MSR_PEBS_MATRIX_VERT */
Packit 577717
    { "instr_retired", 0x02, CRU_ESCR0, CRU_ESCR1 }, /* seems to be sensitive to tagged uops */
Packit 577717
    { "uops_retired", 0x01, CRU_ESCR0, CRU_ESCR1 },
Packit 577717
    { "uop_type", 0x02, RAT_ESCR0, RAT_ESCR1 }, /* can tag uops for front_end_event */
Packit 577717
    { "branch_retired", 0x06, CRU_ESCR2, CRU_ESCR3 },
Packit 577717
    { "mispred_branch_retired", 0x03, CRU_ESCR0, CRU_ESCR1 },
Packit 577717
    { "x87_assist", 0x03, CRU_ESCR2, CRU_ESCR3 },
Packit 577717
    { "machine_clear", 0x02, CRU_ESCR2, CRU_ESCR3 },
Packit 577717
    /* Model 3 only */
Packit 577717
    { "instr_completed", 0x07, CRU_ESCR0, CRU_ESCR1 },
Packit 577717
};
Packit 577717
Packit 577717
static void do_escr(unsigned int escr_num)
Packit 577717
{
Packit 577717
     unsigned int pmc;
Packit 577717
     unsigned int escr_select;
Packit 577717
     unsigned int msr;
Packit 577717
     const char *name;
Packit 577717
Packit 577717
     msr = escr_msr(escr_num);
Packit 577717
     name = escr_name(escr_num);
Packit 577717
Packit 577717
     for(pmc = 0; pmc < ARRAY_SIZE(counters); ++pmc) {
Packit 577717
	  for(escr_select = 0; escr_select < 8; ++escr_select) {
Packit 577717
	       if( p4_escr_addr(pmc, escr_select) == msr )
Packit 577717
		    printf("counter %s escr %s\n", counter_name(pmc), name);
Packit 577717
	  }
Packit 577717
     }
Packit 577717
}
Packit 577717
Packit 577717
static void do_events(void)
Packit 577717
{
Packit 577717
    unsigned int i;
Packit 577717
Packit 577717
    for(i = 0; i < ARRAY_SIZE(events); ++i) {
Packit 577717
	const struct event *event = &events[i];
Packit 577717
	printf("escr %s event %s\n",
Packit 577717
	       escr_name(event->escr0),
Packit 577717
	       event->name);
Packit 577717
	do_escr(event->escr0);
Packit 577717
	if( event->escr1 != -1 ) {
Packit 577717
	    printf("escr %s event %s\n",
Packit 577717
		   escr_name(event->escr1),
Packit 577717
		   event->name);
Packit 577717
	    do_escr(event->escr1);
Packit 577717
	}
Packit 577717
    }
Packit 577717
}
Packit 577717
Packit 577717
int main(void)
Packit 577717
{
Packit 577717
    check_p4_escr_addr();
Packit 577717
    do_events();
Packit 577717
    return 0;
Packit 577717
}