blob: 809b5507b812408c054061f9eed84b939e989f2d [file] [log] [blame]
/*
* @file libop/op_netburst.h
* Definitions of structures and methods for handling Intel Netburst events.
*
* @remark Copyright 2013 OProfile authors
* @remark Read the file COPYING
*
* Created on: May 14, 2013
* @author Maynard Johnson
* (C) Copyright IBM Corp. 2013
*
* NOTE: The code in this file was largely borrowed from a libpfm file,
* so we include below the Copyright and licensing information from that file.
*/
/*
* Copyright (c) 2006 IBM Corp.
* Contributed by Kevin Corry <kevcorry@us.ibm.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*
* pfmlib_netburst_priv.h
*
* Structures and definitions for use in the Pentium4/Xeon/EM64T libpfm code.
*/
#ifndef OP_NETBURST_H_
#define OP_NETBURST_H_
#ifdef __cplusplus
extern "C" {
#endif
/* ESCR: Event Selection Control Register
*
* These registers are used to select which event to count along with options
* for that event. There are (up to) 45 ESCRs, but each data counter is
* restricted to a specific set of ESCRs.
*/
/**
* netburst_escr_value_t
*
* Bit-wise breakdown of the ESCR registers.
*
* Bits Description
* ------- -----------
* 63 - 31 Reserved
* 30 - 25 Event Select
* 24 - 9 Event Mask
* 8 - 5 Tag Value
* 4 Tag Enable
* 3 T0 OS - Enable counting in kernel mode (thread 0)
* 2 T0 USR - Enable counting in user mode (thread 0)
* 1 T1 OS - Enable counting in kernel mode (thread 1)
* 0 T1 USR - Enable counting in user mode (thread 1)
**/
#define EVENT_MASK_BITS 16
#define EVENT_SELECT_BITS 6
typedef union {
unsigned long long val;
struct {
unsigned long t1_usr:1;
unsigned long t1_os:1;
unsigned long t0_usr:1;
unsigned long t0_os:1;
unsigned long tag_enable:1;
unsigned long tag_value:4;
unsigned long event_mask:EVENT_MASK_BITS;
unsigned long event_select:EVENT_SELECT_BITS;
unsigned long reserved:1;
} bits;
} netburst_escr_value_t;
/* CCCR: Counter Configuration Control Register
*
* These registers are used to configure the data counters. There are 18
* CCCRs, one for each data counter.
*/
/**
* netburst_cccr_value_t
*
* Bit-wise breakdown of the CCCR registers.
*
* Bits Description
* ------- -----------
* 63 - 32 Reserved
* 31 OVF - The data counter overflowed.
* 30 Cascade - Enable cascading of data counter when alternate
* counter overflows.
* 29 - 28 Reserved
* 27 OVF_PMI_T1 - Generate interrupt for LP1 on counter overflow
* 26 OVF_PMI_T0 - Generate interrupt for LP0 on counter overflow
* 25 FORCE_OVF - Force interrupt on every counter increment
* 24 Edge - Enable rising edge detection of the threshold comparison
* output for filtering event counts.
* 23 - 20 Threshold Value - Select the threshold value for comparing to
* incoming event counts.
* 19 Complement - Select how incoming event count is compared with
* the threshold value.
* 18 Compare - Enable filtering of event counts.
* 17 - 16 Active Thread - Only used with HT enabled.
* 00 - None: Count when neither LP is active.
* 01 - Single: Count when only one LP is active.
* 10 - Both: Count when both LPs are active.
* 11 - Any: Count when either LP is active.
* 15 - 13 ESCR Select - Select which ESCR to use for selecting the
* event to count.
* 12 Enable - Turns the data counter on or off.
* 11 - 0 Reserved
**/
typedef union {
unsigned long long val;
struct {
unsigned long reserved1:12;
unsigned long enable:1;
unsigned long escr_select:3;
unsigned long active_thread:2;
unsigned long compare:1;
unsigned long complement:1;
unsigned long threshold:4;
unsigned long edge:1;
unsigned long force_ovf:1;
unsigned long ovf_pmi_t0:1;
unsigned long ovf_pmi_t1:1;
unsigned long reserved2:2;
unsigned long cascade:1;
unsigned long overflow:1;
} bits;
} netburst_cccr_value_t;
/**
* netburst_event_mask_t
*
* Defines one bit of the event-mask for one Pentium4 event.
*
* @name: Event mask name
* @desc: Event mask description
* @bit: The bit position within the event_mask field.
**/
typedef struct {
char *name;
char *desc;
unsigned int bit;
unsigned int flags;
} netburst_event_mask_t;
/*
* netburst_event_mask_t->flags
*/
#define NETBURST_FL_DFL 0x1 /* event mask is default */
#define MAX_ESCRS_PER_EVENT 2
/*
* These are the unique event codes used by perf_events.
* They need to be encoded in the ESCR.event_select field when
* programming for perf_events.
* NOTE: Only 36 of the events specified below have counterparts
* in oprofile's p4 event list
*/
enum netburst_event_code {
P4_EVENT_TC_DELIVER_MODE,
P4_EVENT_BPU_FETCH_REQUEST,
P4_EVENT_ITLB_REFERENCE,
P4_EVENT_MEMORY_CANCEL,
P4_EVENT_MEMORY_COMPLETE,
P4_EVENT_LOAD_PORT_REPLAY,
P4_EVENT_STORE_PORT_REPLAY,
P4_EVENT_MOB_LOAD_REPLAY,
P4_EVENT_PAGE_WALK_TYPE,
P4_EVENT_BSQ_CACHE_REFERENCE,
P4_EVENT_IOQ_ALLOCATION,
P4_EVENT_IOQ_ACTIVE_ENTRIES,
P4_EVENT_FSB_DATA_ACTIVITY,
P4_EVENT_BSQ_ALLOCATION,
P4_EVENT_BSQ_ACTIVE_ENTRIES,
P4_EVENT_SSE_INPUT_ASSIST,
P4_EVENT_PACKED_SP_UOP,
P4_EVENT_PACKED_DP_UOP,
P4_EVENT_SCALAR_SP_UOP,
P4_EVENT_SCALAR_DP_UOP,
P4_EVENT_64BIT_MMX_UOP,
P4_EVENT_128BIT_MMX_UOP,
P4_EVENT_X87_FP_UOP,
P4_EVENT_TC_MISC,
P4_EVENT_GLOBAL_POWER_EVENTS,
P4_EVENT_TC_MS_XFER,
P4_EVENT_UOP_QUEUE_WRITES,
P4_EVENT_RETIRED_MISPRED_BRANCH_TYPE,
P4_EVENT_RETIRED_BRANCH_TYPE,
P4_EVENT_RESOURCE_STALL,
P4_EVENT_WC_BUFFER,
P4_EVENT_B2B_CYCLES,
P4_EVENT_BNR,
P4_EVENT_SNOOP,
P4_EVENT_RESPONSE,
P4_EVENT_FRONT_END_EVENT,
P4_EVENT_EXECUTION_EVENT,
P4_EVENT_REPLAY_EVENT,
P4_EVENT_INSTR_RETIRED,
P4_EVENT_UOPS_RETIRED,
P4_EVENT_UOP_TYPE,
P4_EVENT_BRANCH_RETIRED,
P4_EVENT_MISPRED_BRANCH_RETIRED,
P4_EVENT_X87_ASSIST,
P4_EVENT_MACHINE_CLEAR,
P4_EVENT_INSTR_COMPLETED,
};
typedef struct {
char *name;
char *desc;
unsigned int event_select;
unsigned int escr_select;
enum netburst_event_code perf_code; /* perf_event event code, enum P4_EVENTS */
int allowed_escrs[MAX_ESCRS_PER_EVENT];
netburst_event_mask_t event_masks[EVENT_MASK_BITS];
} netburst_entry_t;
#define NETBURST_ATTR_U 0
#define NETBURST_ATTR_K 1
#define NETBURST_ATTR_C 2
#define NETBURST_ATTR_E 3
#define NETBURST_ATTR_T 4
#define _NETBURST_ATTR_U (1 << NETBURST_ATTR_U)
#define _NETBURST_ATTR_K (1 << NETBURST_ATTR_K)
#define P4_REPLAY_REAL_MASK 0x00000003
int op_netburst_get_perf_encoding(const char * evt_name, unsigned long evt_um, int do_kernel,
int do_user, u64 * config);
#ifdef __cplusplus
}
#endif
#endif // OP_NETBURST_H_