7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk/*
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * CDDL HEADER START
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk *
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * The contents of this file are subject to the terms of the
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * Common Development and Distribution License (the "License").
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * You may not use this file except in compliance with the License.
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk *
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * or http://www.opensolaris.org/os/licensing.
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * See the License for the specific language governing permissions
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * and limitations under the License.
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk *
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * When distributing Covered Code, include this CDDL HEADER in each
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * If applicable, add the following below this CDDL HEADER, with the
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * fields enclosed by brackets "[]" replaced with your own identifying
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * information: Portions Copyright [yyyy] [name of copyright owner]
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk *
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * CDDL HEADER END
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk/*
ac13ce240ba9273d4f6a0b39f769310a90ab85d3Adrian Frost * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla/*
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * This file contains preset event names from the Performance Application
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * Programming Interface v3.5 which included the following notice:
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla *
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * Copyright (c) 2005,6
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * Innovative Computing Labs
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * Computer Science Department,
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * University of Tennessee,
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * Knoxville, TN.
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * All Rights Reserved.
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla *
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla *
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * Redistribution and use in source and binary forms, with or without
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * modification, are permitted provided that the following conditions are met:
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla *
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * * Redistributions of source code must retain the above copyright notice,
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * this list of conditions and the following disclaimer.
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * * Redistributions in binary form must reproduce the above copyright
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * notice, this list of conditions and the following disclaimer in the
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * documentation and/or other materials provided with the distribution.
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * * Neither the name of the University of Tennessee nor the names of its
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * contributors may be used to endorse or promote products derived from
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * this software without specific prior written permission.
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla *
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * POSSIBILITY OF SUCH DAMAGE.
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla *
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla *
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * This open source software license conforms to the BSD License template.
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk/*
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvilla * Performance Counter Back-End for Intel processors supporting Architectural
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvilla * Performance Monitoring.
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#include <sys/cpuvar.h>
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#include <sys/param.h>
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#include <sys/cpc_impl.h>
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#include <sys/cpc_pcbe.h>
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#include <sys/modctl.h>
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#include <sys/inttypes.h>
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#include <sys/systm.h>
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#include <sys/cmn_err.h>
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#include <sys/x86_archext.h>
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#include <sys/sdt.h>
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#include <sys/archsystm.h>
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#include <sys/privregs.h>
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#include <sys/ddi.h>
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#include <sys/sunddi.h>
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#include <sys/cred.h>
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#include <sys/policy.h>
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic int core_pcbe_init(void);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic uint_t core_pcbe_ncounters(void);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic const char *core_pcbe_impl_name(void);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic const char *core_pcbe_cpuref(void);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic char *core_pcbe_list_events(uint_t picnum);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic char *core_pcbe_list_attrs(void);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic uint64_t core_pcbe_event_coverage(char *event);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic uint64_t core_pcbe_overflow_bitmap(void);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic int core_pcbe_configure(uint_t picnum, char *event, uint64_t preset,
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint32_t flags, uint_t nattrs, kcpc_attr_t *attrs, void **data,
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk void *token);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic void core_pcbe_program(void *token);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic void core_pcbe_allstop(void);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic void core_pcbe_sample(void *token);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic void core_pcbe_free(void *config);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define FALSE 0
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define TRUE 1
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk/* Counter Type */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define CORE_GPC 0 /* General-Purpose Counter (GPC) */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define CORE_FFC 1 /* Fixed-Function Counter (FFC) */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk/* MSR Addresses */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define GPC_BASE_PMC 0x00c1 /* First GPC */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define GPC_BASE_PES 0x0186 /* First GPC Event Select register */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define FFC_BASE_PMC 0x0309 /* First FFC */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define PERF_FIXED_CTR_CTRL 0x038d /* Used to enable/disable FFCs */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define PERF_GLOBAL_STATUS 0x038e /* Overflow status register */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define PERF_GLOBAL_CTRL 0x038f /* Used to enable/disable counting */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define PERF_GLOBAL_OVF_CTRL 0x0390 /* Used to clear overflow status */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk/*
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * Processor Event Select register fields
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define CORE_USR (1ULL << 16) /* Count while not in ring 0 */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define CORE_OS (1ULL << 17) /* Count while in ring 0 */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define CORE_EDGE (1ULL << 18) /* Enable edge detection */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define CORE_PC (1ULL << 19) /* Enable pin control */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define CORE_INT (1ULL << 20) /* Enable interrupt on overflow */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define CORE_EN (1ULL << 22) /* Enable counting */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define CORE_INV (1ULL << 23) /* Invert the CMASK */
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla#define CORE_ANYTHR (1ULL << 21) /* Count event for any thread on core */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define CORE_UMASK_SHIFT 8
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define CORE_UMASK_MASK 0xffu
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define CORE_CMASK_SHIFT 24
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define CORE_CMASK_MASK 0xffu
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk/*
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * Fixed-function counter attributes
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define CORE_FFC_OS_EN (1ULL << 0) /* Count while not in ring 0 */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define CORE_FFC_USR_EN (1ULL << 1) /* Count while in ring 1 */
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla#define CORE_FFC_ANYTHR (1ULL << 2) /* Count event for any thread on core */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define CORE_FFC_PMI (1ULL << 3) /* Enable interrupt on overflow */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk/*
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * Number of bits for specifying each FFC's attributes in the control register
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define CORE_FFC_ATTR_SIZE 4
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk/*
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * CondChgd and OvfBuffer fields of global status and overflow control registers
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define CONDCHGD (1ULL << 63)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define OVFBUFFER (1ULL << 62)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define MASK_CONDCHGD_OVFBUFFER (CONDCHGD | OVFBUFFER)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define ALL_STOPPED 0ULL
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define BITMASK_XBITS(x) ((1ull << (x)) - 1ull)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk/*
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * Only the lower 32-bits can be written to in the general-purpose
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * counters. The higher bits are extended from bit 31; all ones if
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * bit 31 is one and all zeros otherwise.
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk *
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * The fixed-function counters do not have this restriction.
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define BITS_EXTENDED_FROM_31 (BITMASK_XBITS(width_gpc) & ~BITMASK_XBITS(31))
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define WRMSR(msr, value) \
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk wrmsr((msr), (value)); \
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk DTRACE_PROBE2(wrmsr, uint64_t, (msr), uint64_t, (value));
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define RDMSR(msr, value) \
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk (value) = rdmsr((msr)); \
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk DTRACE_PROBE2(rdmsr, uint64_t, (msr), uint64_t, (value));
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kktypedef struct core_pcbe_config {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint64_t core_rawpic;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint64_t core_ctl; /* Event Select bits */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint64_t core_pmc; /* Counter register address */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint64_t core_pes; /* Event Select register address */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint_t core_picno;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint8_t core_pictype; /* CORE_GPC or CORE_FFC */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk} core_pcbe_config_t;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkpcbe_ops_t core_pcbe_ops = {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk PCBE_VER_1, /* pcbe_ver */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk CPC_CAP_OVERFLOW_INTERRUPT | CPC_CAP_OVERFLOW_PRECISE, /* pcbe_caps */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk core_pcbe_ncounters, /* pcbe_ncounters */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk core_pcbe_impl_name, /* pcbe_impl_name */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk core_pcbe_cpuref, /* pcbe_cpuref */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk core_pcbe_list_events, /* pcbe_list_events */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk core_pcbe_list_attrs, /* pcbe_list_attrs */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk core_pcbe_event_coverage, /* pcbe_event_coverage */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk core_pcbe_overflow_bitmap, /* pcbe_overflow_bitmap */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk core_pcbe_configure, /* pcbe_configure */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk core_pcbe_program, /* pcbe_program */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk core_pcbe_allstop, /* pcbe_allstop */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk core_pcbe_sample, /* pcbe_sample */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk core_pcbe_free /* pcbe_free */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk};
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvillastruct nametable_core_uarch {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk const char *name;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint64_t restricted_bits;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint8_t event_num;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk};
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define NT_END 0xFF
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk/*
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * Counting an event for all cores or all bus agents requires cpc_cpu privileges
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define ALL_CORES (1ULL << 15)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk#define ALL_AGENTS (1ULL << 13)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvillastruct generic_events {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla const char *name;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla uint8_t event_num;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla uint8_t umask;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla};
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvillastatic const struct generic_events cmn_generic_events[] = {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla { "PAPI_tot_cyc", 0x3c, 0x00 }, /* cpu_clk_unhalted.thread_p/core */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla { "PAPI_tot_ins", 0xc0, 0x00 }, /* inst_retired.any_p */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla { "PAPI_br_ins", 0xc4, 0x0c }, /* br_inst_retired.taken */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla { "PAPI_br_msp", 0xc5, 0x00 }, /* br_inst_retired.mispred */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla { "PAPI_br_ntk", 0xc4, 0x03 },
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla /* br_inst_retired.pred_not_taken|pred_taken */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla { "PAPI_br_prc", 0xc4, 0x05 },
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla /* br_inst_retired.pred_not_taken|pred_taken */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla { "PAPI_hw_int", 0xc8, 0x00 }, /* hw_int_rvc */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla { "PAPI_tot_iis", 0xaa, 0x01 }, /* macro_insts.decoded */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla { "PAPI_l1_dca", 0x43, 0x01 }, /* l1d_all_ref */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla { "PAPI_l1_icm", 0x81, 0x00 }, /* l1i_misses */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla { "PAPI_l1_icr", 0x80, 0x00 }, /* l1i_reads */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla { "PAPI_l1_tcw", 0x41, 0x0f }, /* l1d_cache_st.mesi */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla { "PAPI_l2_stm", 0x2a, 0x41 }, /* l2_st.self.i_state */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla { "PAPI_l2_tca", 0x2e, 0x4f }, /* l2_rqsts.self.demand.mesi */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla { "PAPI_l2_tch", 0x2e, 0x4e }, /* l2_rqsts.mes */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla { "PAPI_l2_tcm", 0x2e, 0x41 }, /* l2_rqsts.self.demand.i_state */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla { "PAPI_l2_tcw", 0x2a, 0x4f }, /* l2_st.self.mesi */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla { "PAPI_ld_ins", 0xc0, 0x01 }, /* inst_retired.loads */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla { "PAPI_lst_ins", 0xc0, 0x03 }, /* inst_retired.loads|stores */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla { "PAPI_sr_ins", 0xc0, 0x02 }, /* inst_retired.stores */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla { "PAPI_tlb_dm", 0x08, 0x01 }, /* dtlb_misses.any */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla { "PAPI_tlb_im", 0x82, 0x12 }, /* itlb.small_miss|large_miss */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla { "PAPI_tlb_tl", 0x0c, 0x03 }, /* page_walks */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla { "", NT_END, 0 }
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla};
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvillastatic const struct generic_events generic_events_pic0[] = {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla { "PAPI_l1_dcm", 0xcb, 0x01 }, /* mem_load_retired.l1d_miss */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla { "", NT_END, 0 }
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla};
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla/*
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla * The events listed in the following table can be counted on all
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvilla * general-purpose counters on processors that are of Penryn and Merom Family
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla */
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvillastatic const struct nametable_core_uarch cmn_gpc_events_core_uarch[] = {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk /* Alphabetical order of event name */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "baclears", 0x0, 0xe6 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "bogus_br", 0x0, 0xe4 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "br_bac_missp_exec", 0x0, 0x8a },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "br_call_exec", 0x0, 0x92 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "br_call_missp_exec", 0x0, 0x93 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "br_cnd_exec", 0x0, 0x8b },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "br_cnd_missp_exec", 0x0, 0x8c },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "br_ind_call_exec", 0x0, 0x94 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "br_ind_exec", 0x0, 0x8d },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "br_ind_missp_exec", 0x0, 0x8e },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "br_inst_decoded", 0x0, 0xe0 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "br_inst_exec", 0x0, 0x88 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "br_inst_retired", 0x0, 0xc4 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "br_inst_retired_mispred", 0x0, 0xc5 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "br_missp_exec", 0x0, 0x89 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "br_ret_bac_missp_exec", 0x0, 0x91 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "br_ret_exec", 0x0, 0x8f },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "br_ret_missp_exec", 0x0, 0x90 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "br_tkn_bubble_1", 0x0, 0x97 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "br_tkn_bubble_2", 0x0, 0x98 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "bus_bnr_drv", ALL_AGENTS, 0x61 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "bus_data_rcv", ALL_CORES, 0x64 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "bus_drdy_clocks", ALL_AGENTS, 0x62 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "bus_hit_drv", ALL_AGENTS, 0x7a },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "bus_hitm_drv", ALL_AGENTS, 0x7b },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "bus_io_wait", ALL_CORES, 0x7f },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "bus_lock_clocks", ALL_CORES | ALL_AGENTS, 0x63 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "bus_request_outstanding", ALL_CORES | ALL_AGENTS, 0x60 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "bus_trans_any", ALL_CORES | ALL_AGENTS, 0x70 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "bus_trans_brd", ALL_CORES | ALL_AGENTS, 0x65 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "bus_trans_burst", ALL_CORES | ALL_AGENTS, 0x6e },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "bus_trans_def", ALL_CORES | ALL_AGENTS, 0x6d },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "bus_trans_ifetch", ALL_CORES | ALL_AGENTS, 0x68 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "bus_trans_inval", ALL_CORES | ALL_AGENTS, 0x69 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "bus_trans_io", ALL_CORES | ALL_AGENTS, 0x6c },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "bus_trans_mem", ALL_CORES | ALL_AGENTS, 0x6f },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "bus_trans_p", ALL_CORES | ALL_AGENTS, 0x6b },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "bus_trans_pwr", ALL_CORES | ALL_AGENTS, 0x6a },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "bus_trans_rfo", ALL_CORES | ALL_AGENTS, 0x66 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "bus_trans_wb", ALL_CORES | ALL_AGENTS, 0x67 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "busq_empty", ALL_CORES, 0x7d },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "cmp_snoop", ALL_CORES, 0x78 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "cpu_clk_unhalted", 0x0, 0x3c },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "cycles_int", 0x0, 0xc6 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "cycles_l1i_mem_stalled", 0x0, 0x86 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "dtlb_misses", 0x0, 0x08 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "eist_trans", 0x0, 0x3a },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "esp", 0x0, 0xab },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "ext_snoop", ALL_AGENTS, 0x77 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "fp_mmx_trans", 0x0, 0xcc },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "hw_int_rcv", 0x0, 0xc8 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "ild_stall", 0x0, 0x87 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "inst_queue", 0x0, 0x83 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "inst_retired", 0x0, 0xc0 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "itlb", 0x0, 0x82 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "itlb_miss_retired", 0x0, 0xc9 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "l1d_all_ref", 0x0, 0x43 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "l1d_cache_ld", 0x0, 0x40 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "l1d_cache_lock", 0x0, 0x42 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "l1d_cache_st", 0x0, 0x41 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "l1d_m_evict", 0x0, 0x47 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "l1d_m_repl", 0x0, 0x46 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "l1d_pend_miss", 0x0, 0x48 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "l1d_prefetch", 0x0, 0x4e },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "l1d_repl", 0x0, 0x45 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "l1d_split", 0x0, 0x49 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "l1i_misses", 0x0, 0x81 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "l1i_reads", 0x0, 0x80 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "l2_ads", ALL_CORES, 0x21 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "l2_dbus_busy_rd", ALL_CORES, 0x23 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "l2_ifetch", ALL_CORES, 0x28 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "l2_ld", ALL_CORES, 0x29 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "l2_lines_in", ALL_CORES, 0x24 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "l2_lines_out", ALL_CORES, 0x26 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "l2_lock", ALL_CORES, 0x2b },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "l2_m_lines_in", ALL_CORES, 0x25 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "l2_m_lines_out", ALL_CORES, 0x27 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "l2_no_req", ALL_CORES, 0x32 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "l2_reject_busq", ALL_CORES, 0x30 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "l2_rqsts", ALL_CORES, 0x2e },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "l2_st", ALL_CORES, 0x2a },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "load_block", 0x0, 0x03 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "load_hit_pre", 0x0, 0x4c },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "machine_nukes", 0x0, 0xc3 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "macro_insts", 0x0, 0xaa },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "memory_disambiguation", 0x0, 0x09 },
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla { "misalign_mem_ref", 0x0, 0x05 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "page_walks", 0x0, 0x0c },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "pref_rqsts_dn", 0x0, 0xf8 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "pref_rqsts_up", 0x0, 0xf0 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "rat_stalls", 0x0, 0xd2 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "resource_stalls", 0x0, 0xdc },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "rs_uops_dispatched", 0x0, 0xa0 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "seg_reg_renames", 0x0, 0xd5 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "seg_rename_stalls", 0x0, 0xd4 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "segment_reg_loads", 0x0, 0x06 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "simd_assist", 0x0, 0xcd },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "simd_comp_inst_retired", 0x0, 0xca },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "simd_inst_retired", 0x0, 0xc7 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "simd_instr_retired", 0x0, 0xce },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "simd_sat_instr_retired", 0x0, 0xcf },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "simd_sat_uop_exec", 0x0, 0xb1 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "simd_uop_type_exec", 0x0, 0xb3 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "simd_uops_exec", 0x0, 0xb0 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "snoop_stall_drv", ALL_CORES | ALL_AGENTS, 0x7e },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "sse_pre_exec", 0x0, 0x07 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "sse_pre_miss", 0x0, 0x4b },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "store_block", 0x0, 0x04 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "thermal_trip", 0x0, 0x3b },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "uops_retired", 0x0, 0xc2 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "x87_ops_retired", 0x0, 0xc1 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "", 0x0, NT_END }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk};
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk/*
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * If any of the pic specific events require privileges, make sure to add a
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * check in configure_gpc() to find whether an event hard-coded as a number by
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * the user has any privilege requirements
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk */
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvillastatic const struct nametable_core_uarch pic0_events[] = {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk /* Alphabetical order of event name */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "cycles_div_busy", 0x0, 0x14 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "fp_comp_ops_exe", 0x0, 0x10 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "idle_during_div", 0x0, 0x18 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "mem_load_retired", 0x0, 0xcb },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "rs_uops_dispatched_port", 0x0, 0xa1 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "", 0x0, NT_END }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk};
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvillastatic const struct nametable_core_uarch pic1_events[] = {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk /* Alphabetical order of event name */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "delayed_bypass", 0x0, 0x19 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "div", 0x0, 0x13 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "fp_assist", 0x0, 0x11 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "mul", 0x0, 0x12 },
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk { "", 0x0, NT_END }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk};
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems/* FFC entries must be in order */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvillastatic char *ffc_names_non_htt[] = {
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems "instr_retired.any",
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems "cpu_clk_unhalted.core",
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems "cpu_clk_unhalted.ref",
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems NULL
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems};
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvillastatic char *ffc_names_htt[] = {
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems "instr_retired.any",
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla "cpu_clk_unhalted.thread",
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk "cpu_clk_unhalted.ref",
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk NULL
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk};
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvillastatic char *ffc_genericnames[] = {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla "PAPI_tot_ins",
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla "PAPI_tot_cyc",
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla "",
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla NULL
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla};
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvillastatic char **ffc_names = NULL;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvillastatic char **ffc_allnames = NULL;
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystemsstatic char **gpc_names = NULL;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvillastatic uint32_t versionid;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic uint64_t num_gpc;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic uint64_t width_gpc;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic uint64_t mask_gpc;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic uint64_t num_ffc;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic uint64_t width_ffc;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic uint64_t mask_ffc;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic uint_t total_pmc;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic uint64_t control_ffc;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic uint64_t control_gpc;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic uint64_t control_mask;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvillastatic uint32_t arch_events_vector;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla#define IMPL_NAME_LEN 100
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvillastatic char core_impl_name[IMPL_NAME_LEN];
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic const char *core_cpuref =
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk "See Appendix A of the \"Intel 64 and IA-32 Architectures Software" \
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk " Developer's Manual Volume 3B: System Programming Guide, Part 2\"" \
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk " Order Number: 253669-026US, Februrary 2008";
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvillastruct events_table_t {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla uint8_t eventselect;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla uint8_t unitmask;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla uint64_t supported_counters;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla const char *name;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla};
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla/* Used to describe which counters support an event */
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla#define C(x) (1 << (x))
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla#define C0 C(0)
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla#define C1 C(1)
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla#define C2 C(2)
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla#define C3 C(3)
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla#define C_ALL 0xFFFFFFFFFFFFFFFF
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems/* Architectural events */
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems#define ARCH_EVENTS_COMMON \
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems { 0xc0, 0x00, C_ALL, "inst_retired.any_p" }, \
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems { 0x3c, 0x01, C_ALL, "cpu_clk_unhalted.ref_p" }, \
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems { 0x2e, 0x4f, C_ALL, "longest_lat_cache.reference" }, \
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems { 0x2e, 0x41, C_ALL, "longest_lat_cache.miss" }, \
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems { 0xc4, 0x00, C_ALL, "br_inst_retired.all_branches" }, \
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems { 0xc5, 0x00, C_ALL, "br_misp_retired.all_branches" }
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvillastatic const struct events_table_t arch_events_table_non_htt[] = {
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems { 0x3c, 0x00, C_ALL, "cpu_clk_unhalted.core" },
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems ARCH_EVENTS_COMMON
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems};
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvillastatic const struct events_table_t arch_events_table_htt[] = {
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems { 0x3c, 0x00, C_ALL, "cpu_clk_unhalted.thread_p" },
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems ARCH_EVENTS_COMMON
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla};
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvillastatic char *arch_genevents_table[] = {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla "PAPI_tot_cyc", /* cpu_clk_unhalted.thread_p/core */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla "PAPI_tot_ins", /* inst_retired.any_p */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla "", /* cpu_clk_unhalted.ref_p */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla "", /* longest_lat_cache.reference */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla "", /* longest_lat_cache.miss */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla "", /* br_inst_retired.all_branches */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla "", /* br_misp_retired.all_branches */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla};
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvillastatic const struct events_table_t *arch_events_table = NULL;
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystemsstatic uint64_t known_arch_events;
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystemsstatic uint64_t known_ffc_num;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
03dbaac70615232c621989219a94543779d67ddfKuriakose Kuruvilla#define GENERICEVENTS_FAM6_NHM \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0xc4, 0x01, C0|C1|C2|C3, "PAPI_br_cn" }, /* br_inst_retired.conditional */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x1d, 0x01, C0|C1|C2|C3, "PAPI_hw_int" }, /* hw_int.rcx */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x17, 0x01, C0|C1|C2|C3, "PAPI_tot_iis" }, /* inst_queue_writes */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x43, 0x01, C0|C1, "PAPI_l1_dca" }, /* l1d_all_ref.any */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x24, 0x03, C0|C1|C2|C3, "PAPI_l1_dcm" }, /* l2_rqsts. loads and rfos */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x40, 0x0f, C0|C1|C2|C3, "PAPI_l1_dcr" }, /* l1d_cache_ld.mesi */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x41, 0x0f, C0|C1|C2|C3, "PAPI_l1_dcw" }, /* l1d_cache_st.mesi */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x80, 0x03, C0|C1|C2|C3, "PAPI_l1_ica" }, /* l1i.reads */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x80, 0x01, C0|C1|C2|C3, "PAPI_l1_ich" }, /* l1i.hits */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x80, 0x02, C0|C1|C2|C3, "PAPI_l1_icm" }, /* l1i.misses */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x80, 0x03, C0|C1|C2|C3, "PAPI_l1_icr" }, /* l1i.reads */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x24, 0x33, C0|C1|C2|C3, "PAPI_l1_ldm" }, /* l2_rqsts. loads and ifetches */\
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x24, 0xff, C0|C1|C2|C3, "PAPI_l1_tcm" }, /* l2_rqsts.references */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x24, 0x02, C0|C1|C2|C3, "PAPI_l2_ldm" }, /* l2_rqsts.ld_miss */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x24, 0x08, C0|C1|C2|C3, "PAPI_l2_stm" }, /* l2_rqsts.rfo_miss */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x24, 0x3f, C0|C1|C2|C3, "PAPI_l2_tca" }, \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla /* l2_rqsts. loads, rfos and ifetches */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x24, 0x15, C0|C1|C2|C3, "PAPI_l2_tch" }, \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla /* l2_rqsts. ld_hit, rfo_hit and ifetch_hit */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x24, 0x2a, C0|C1|C2|C3, "PAPI_l2_tcm" }, \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla /* l2_rqsts. ld_miss, rfo_miss and ifetch_miss */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x24, 0x33, C0|C1|C2|C3, "PAPI_l2_tcr" }, /* l2_rqsts. loads and ifetches */\
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x24, 0x0c, C0|C1|C2|C3, "PAPI_l2_tcw" }, /* l2_rqsts.rfos */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x2e, 0x4f, C0|C1|C2|C3, "PAPI_l3_tca" }, /* l3_lat_cache.reference */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x2e, 0x41, C0|C1|C2|C3, "PAPI_l3_tcm" }, /* l3_lat_cache.misses */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x0b, 0x01, C0|C1|C2|C3, "PAPI_ld_ins" }, /* mem_inst_retired.loads */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x0b, 0x03, C0|C1|C2|C3, "PAPI_lst_ins" }, \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla /* mem_inst_retired.loads and stores */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x26, 0xf0, C0|C1|C2|C3, "PAPI_prf_dm" }, /* l2_data_rqsts.prefetch.mesi */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x0b, 0x02, C0|C1|C2|C3, "PAPI_sr_ins" }, /* mem_inst_retired.stores */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x49, 0x01, C0|C1|C2|C3, "PAPI_tlb_dm" }, /* dtlb_misses.any */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x85, 0x01, C0|C1|C2|C3, "PAPI_tlb_im" } /* itlb_misses.any */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla
03dbaac70615232c621989219a94543779d67ddfKuriakose Kuruvilla#define EVENTS_FAM6_NHM \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x80, 0x04, C0|C1|C2|C3, "l1i.cycles_stalled" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x80, 0x01, C0|C1|C2|C3, "l1i.hits" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x80, 0x02, C0|C1|C2|C3, "l1i.misses" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x80, 0x03, C0|C1|C2|C3, "l1i.reads" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x82, 0x01, C0|C1|C2|C3, "large_itlb.hit" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x87, 0x0F, C0|C1|C2|C3, "ild_stall.any" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x87, 0x04, C0|C1|C2|C3, "ild_stall.iq_full" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x87, 0x01, C0|C1|C2|C3, "ild_stall.lcp" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x87, 0x02, C0|C1|C2|C3, "ild_stall.mru" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x87, 0x08, C0|C1|C2|C3, "ild_stall.regen" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xE6, 0x02, C0|C1|C2|C3, "baclear.bad_target" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xE6, 0x01, C0|C1|C2|C3, "baclear.clear" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xE8, 0x01, C0|C1|C2|C3, "bpu_clears.early" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xE8, 0x02, C0|C1|C2|C3, "bpu_clears.late" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xE5, 0x01, C0|C1|C2|C3, "bpu_missed_call_ret" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xE0, 0x01, C0|C1|C2|C3, "br_inst_decoded" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x88, 0x7F, C0|C1|C2|C3, "br_inst_exec.any" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x88, 0x01, C0|C1|C2|C3, "br_inst_exec.cond" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x88, 0x02, C0|C1|C2|C3, "br_inst_exec.direct" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x88, 0x10, C0|C1|C2|C3, "br_inst_exec.direct_near_call" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x88, 0x20, C0|C1|C2|C3, "br_inst_exec.indirect_near_call" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x88, 0x04, C0|C1|C2|C3, "br_inst_exec.indirect_non_call" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x88, 0x30, C0|C1|C2|C3, "br_inst_exec.near_calls" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x88, 0x07, C0|C1|C2|C3, "br_inst_exec.non_calls" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x88, 0x08, C0|C1|C2|C3, "br_inst_exec.return_near" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x88, 0x40, C0|C1|C2|C3, "br_inst_exec.taken" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x89, 0x7F, C0|C1|C2|C3, "br_misp_exec.any" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x89, 0x01, C0|C1|C2|C3, "br_misp_exec.cond" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x89, 0x02, C0|C1|C2|C3, "br_misp_exec.direct" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x89, 0x10, C0|C1|C2|C3, "br_misp_exec.direct_near_call" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x89, 0x20, C0|C1|C2|C3, "br_misp_exec.indirect_near_call" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x89, 0x04, C0|C1|C2|C3, "br_misp_exec.indirect_non_call" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x89, 0x30, C0|C1|C2|C3, "br_misp_exec.near_calls" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x89, 0x07, C0|C1|C2|C3, "br_misp_exec.non_calls" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x89, 0x08, C0|C1|C2|C3, "br_misp_exec.return_near" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x89, 0x40, C0|C1|C2|C3, "br_misp_exec.taken" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x17, 0x01, C0|C1|C2|C3, "inst_queue_writes" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x1E, 0x01, C0|C1|C2|C3, "inst_queue_write_cycles" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xA7, 0x01, C0|C1|C2|C3, "baclear_force_iq" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xD0, 0x01, C0|C1|C2|C3, "macro_insts.decoded" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xA6, 0x01, C0|C1|C2|C3, "macro_insts.fusions_decoded" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x19, 0x01, C0|C1|C2|C3, "two_uop_insts_decoded" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x18, 0x01, C0|C1|C2|C3, "inst_decoded.dec0" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xD1, 0x04, C0|C1|C2|C3, "uops_decoded.esp_folding" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xD1, 0x08, C0|C1|C2|C3, "uops_decoded.esp_sync" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xD1, 0x02, C0|C1|C2|C3, "uops_decoded.ms" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x20, 0x01, C0|C1|C2|C3, "lsd_overflow" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x0E, 0x01, C0|C1|C2|C3, "uops_issued.any" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x0E, 0x02, C0|C1|C2|C3, "uops_issued.fused" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xA2, 0x20, C0|C1|C2|C3, "resource_stalls.fpcw" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xA2, 0x02, C0|C1|C2|C3, "resource_stalls.load" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xA2, 0x40, C0|C1|C2|C3, "resource_stalls.mxcsr" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xA2, 0x04, C0|C1|C2|C3, "resource_stalls.rs_full" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xA2, 0x08, C0|C1|C2|C3, "resource_stalls.store" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xA2, 0x01, C0|C1|C2|C3, "resource_stalls.any" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xD2, 0x01, C0|C1|C2|C3, "rat_stalls.flags" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xD2, 0x02, C0|C1|C2|C3, "rat_stalls.registers" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xD2, 0x04, C0|C1|C2|C3, "rat_stalls.rob_read_port" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xD2, 0x08, C0|C1|C2|C3, "rat_stalls.scoreboard" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xD2, 0x0F, C0|C1|C2|C3, "rat_stalls.any" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xD4, 0x01, C0|C1|C2|C3, "seg_rename_stalls" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xD5, 0x01, C0|C1|C2|C3, "es_reg_renames" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x10, 0x02, C0|C1|C2|C3, "fp_comp_ops_exe.mmx" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x10, 0x80, C0|C1|C2|C3, "fp_comp_ops_exe.sse_double_precision" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x10, 0x04, C0|C1|C2|C3, "fp_comp_ops_exe.sse_fp" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x10, 0x10, C0|C1|C2|C3, "fp_comp_ops_exe.sse_fp_packed" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x10, 0x20, C0|C1|C2|C3, "fp_comp_ops_exe.sse_fp_scalar" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x10, 0x40, C0|C1|C2|C3, "fp_comp_ops_exe.sse_single_precision" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x10, 0x08, C0|C1|C2|C3, "fp_comp_ops_exe.sse2_integer" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x10, 0x01, C0|C1|C2|C3, "fp_comp_ops_exe.x87" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x14, 0x01, C0|C1|C2|C3, "arith.cycles_div_busy" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x14, 0x02, C0|C1|C2|C3, "arith.mul" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x12, 0x04, C0|C1|C2|C3, "simd_int_128.pack" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x12, 0x20, C0|C1|C2|C3, "simd_int_128.packed_arith" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x12, 0x10, C0|C1|C2|C3, "simd_int_128.packed_logical" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x12, 0x01, C0|C1|C2|C3, "simd_int_128.packed_mpy" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x12, 0x02, C0|C1|C2|C3, "simd_int_128.packed_shift" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x12, 0x40, C0|C1|C2|C3, "simd_int_128.shuffle_move" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x12, 0x08, C0|C1|C2|C3, "simd_int_128.unpack" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xFD, 0x04, C0|C1|C2|C3, "simd_int_64.pack" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xFD, 0x20, C0|C1|C2|C3, "simd_int_64.packed_arith" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xFD, 0x10, C0|C1|C2|C3, "simd_int_64.packed_logical" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xFD, 0x01, C0|C1|C2|C3, "simd_int_64.packed_mpy" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xFD, 0x02, C0|C1|C2|C3, "simd_int_64.packed_shift" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xFD, 0x40, C0|C1|C2|C3, "simd_int_64.shuffle_move" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xFD, 0x08, C0|C1|C2|C3, "simd_int_64.unpack" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xB1, 0x01, C0|C1|C2|C3, "uops_executed.port0" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xB1, 0x02, C0|C1|C2|C3, "uops_executed.port1" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x40, 0x04, C0|C1, "l1d_cache_ld.e_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x40, 0x01, C0|C1, "l1d_cache_ld.i_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x40, 0x08, C0|C1, "l1d_cache_ld.m_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x40, 0x0F, C0|C1, "l1d_cache_ld.mesi" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x40, 0x02, C0|C1, "l1d_cache_ld.s_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x41, 0x04, C0|C1, "l1d_cache_st.e_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x41, 0x08, C0|C1, "l1d_cache_st.m_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x41, 0x0F, C0|C1, "l1d_cache_st.mesi" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x41, 0x02, C0|C1, "l1d_cache_st.s_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x42, 0x04, C0|C1, "l1d_cache_lock.e_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x42, 0x01, C0|C1, "l1d_cache_lock.hit" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x42, 0x08, C0|C1, "l1d_cache_lock.m_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x42, 0x02, C0|C1, "l1d_cache_lock.s_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x43, 0x01, C0|C1, "l1d_all_ref.any" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x43, 0x02, C0|C1, "l1d_all_ref.cacheable" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x4B, 0x01, C0|C1, "mmx2_mem_exec.nta" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x4C, 0x01, C0|C1, "load_hit_pre" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x4E, 0x02, C0|C1, "l1d_prefetch.miss" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x4E, 0x01, C0|C1, "l1d_prefetch.requests" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x4E, 0x04, C0|C1, "l1d_prefetch.triggers" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x51, 0x04, C0|C1, "l1d.m_evict" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x51, 0x02, C0|C1, "l1d.m_repl" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x51, 0x08, C0|C1, "l1d.m_snoop_evict" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x51, 0x01, C0|C1, "l1d.repl" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x52, 0x01, C0|C1, "l1d_cache_prefetch_lock_fb_hit" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x53, 0x01, C0|C1, "l1d_cache_lock_fb_hit" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x63, 0x02, C0|C1, "cache_lock_cycles.l1d" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x63, 0x01, C0|C1, "cache_lock_cycles.l1d_l2" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x06, 0x04, C0|C1|C2|C3, "store_blocks.at_ret" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x06, 0x08, C0|C1|C2|C3, "store_blocks.l1d_block" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x06, 0x01, C0|C1|C2|C3, "store_blocks.not_sta" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x06, 0x02, C0|C1|C2|C3, "store_blocks.sta" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x13, 0x07, C0|C1|C2|C3, "load_dispatch.any" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x13, 0x04, C0|C1|C2|C3, "load_dispatch.mob" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x13, 0x01, C0|C1|C2|C3, "load_dispatch.rs" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x13, 0x02, C0|C1|C2|C3, "load_dispatch.rs_delayed" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x08, 0x01, C0|C1|C2|C3, "dtlb_load_misses.any" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x08, 0x20, C0|C1|C2|C3, "dtlb_load_misses.pde_miss" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x08, 0x02, C0|C1|C2|C3, "dtlb_load_misses.walk_completed" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x49, 0x01, C0|C1|C2|C3, "dtlb_misses.any" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x49, 0x10, C0|C1|C2|C3, "dtlb_misses.stlb_hit" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x49, 0x02, C0|C1|C2|C3, "dtlb_misses.walk_completed" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x4F, 0x02, C0|C1|C2|C3, "ept.epde_miss" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x4F, 0x08, C0|C1|C2|C3, "ept.epdpe_miss" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x85, 0x01, C0|C1|C2|C3, "itlb_misses.any" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x85, 0x02, C0|C1|C2|C3, "itlb_misses.walk_completed" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x24, 0xAA, C0|C1|C2|C3, "l2_rqsts.miss" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x24, 0xFF, C0|C1|C2|C3, "l2_rqsts.references" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x24, 0x10, C0|C1|C2|C3, "l2_rqsts.ifetch_hit" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x24, 0x20, C0|C1|C2|C3, "l2_rqsts.ifetch_miss" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x24, 0x30, C0|C1|C2|C3, "l2_rqsts.ifetches" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x24, 0x01, C0|C1|C2|C3, "l2_rqsts.ld_hit" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x24, 0x02, C0|C1|C2|C3, "l2_rqsts.ld_miss" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x24, 0x03, C0|C1|C2|C3, "l2_rqsts.loads" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x24, 0x40, C0|C1|C2|C3, "l2_rqsts.prefetch_hit" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x24, 0x80, C0|C1|C2|C3, "l2_rqsts.prefetch_miss" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x24, 0xC0, C0|C1|C2|C3, "l2_rqsts.prefetches" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x24, 0x04, C0|C1|C2|C3, "l2_rqsts.rfo_hit" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x24, 0x08, C0|C1|C2|C3, "l2_rqsts.rfo_miss" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x24, 0x0C, C0|C1|C2|C3, "l2_rqsts.rfos" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x26, 0xFF, C0|C1|C2|C3, "l2_data_rqsts.any" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x26, 0x04, C0|C1|C2|C3, "l2_data_rqsts.demand.e_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x26, 0x01, C0|C1|C2|C3, "l2_data_rqsts.demand.i_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x26, 0x08, C0|C1|C2|C3, "l2_data_rqsts.demand.m_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x26, 0x0F, C0|C1|C2|C3, "l2_data_rqsts.demand.mesi" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x26, 0x02, C0|C1|C2|C3, "l2_data_rqsts.demand.s_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x26, 0x40, C0|C1|C2|C3, "l2_data_rqsts.prefetch.e_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x26, 0x10, C0|C1|C2|C3, "l2_data_rqsts.prefetch.i_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x26, 0x80, C0|C1|C2|C3, "l2_data_rqsts.prefetch.m_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x26, 0xF0, C0|C1|C2|C3, "l2_data_rqsts.prefetch.mesi" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x26, 0x20, C0|C1|C2|C3, "l2_data_rqsts.prefetch.s_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x27, 0x40, C0|C1|C2|C3, "l2_write.lock.e_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x27, 0x10, C0|C1|C2|C3, "l2_write.lock.i_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x27, 0x20, C0|C1|C2|C3, "l2_write.lock.s_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x27, 0x0E, C0|C1|C2|C3, "l2_write.rfo.hit" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x27, 0x01, C0|C1|C2|C3, "l2_write.rfo.i_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x27, 0x08, C0|C1|C2|C3, "l2_write.rfo.m_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x27, 0x0F, C0|C1|C2|C3, "l2_write.rfo.mesi" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x27, 0x02, C0|C1|C2|C3, "l2_write.rfo.s_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x28, 0x04, C0|C1|C2|C3, "l1d_wb_l2.e_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x28, 0x01, C0|C1|C2|C3, "l1d_wb_l2.i_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x28, 0x08, C0|C1|C2|C3, "l1d_wb_l2.m_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xF0, 0x80, C0|C1|C2|C3, "l2_transactions.any" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xF0, 0x20, C0|C1|C2|C3, "l2_transactions.fill" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xF0, 0x04, C0|C1|C2|C3, "l2_transactions.ifetch" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xF0, 0x10, C0|C1|C2|C3, "l2_transactions.l1d_wb" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xF0, 0x01, C0|C1|C2|C3, "l2_transactions.load" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xF0, 0x08, C0|C1|C2|C3, "l2_transactions.prefetch" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xF0, 0x02, C0|C1|C2|C3, "l2_transactions.rfo" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xF0, 0x40, C0|C1|C2|C3, "l2_transactions.wb" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xF1, 0x07, C0|C1|C2|C3, "l2_lines_in.any" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xF1, 0x04, C0|C1|C2|C3, "l2_lines_in.e_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xF1, 0x02, C0|C1|C2|C3, "l2_lines_in.s_state" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xF2, 0x0F, C0|C1|C2|C3, "l2_lines_out.any" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xF2, 0x01, C0|C1|C2|C3, "l2_lines_out.demand_clean" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xF2, 0x02, C0|C1|C2|C3, "l2_lines_out.demand_dirty" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xF2, 0x04, C0|C1|C2|C3, "l2_lines_out.prefetch_clean" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x6C, 0x01, C0|C1|C2|C3, "io_transactions" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xB0, 0x80, C0|C1|C2|C3, "offcore_requests.any" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xB0, 0x10, C0|C1|C2|C3, "offcore_requests.any.rfo" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xB0, 0x40, C0|C1|C2|C3, "offcore_requests.l1d_writeback" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xB8, 0x01, C0|C1|C2|C3, "snoop_response.hit" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xB8, 0x02, C0|C1|C2|C3, "snoop_response.hite" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xB8, 0x04, C0|C1|C2|C3, "snoop_response.hitm" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xF4, 0x10, C0|C1|C2|C3, "sq_misc.split_lock" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x0B, 0x01, C0|C1|C2|C3, "mem_inst_retired.loads" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x0B, 0x02, C0|C1|C2|C3, "mem_inst_retired.stores" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xC0, 0x04, C0|C1|C2|C3, "inst_retired.mmx" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xC0, 0x02, C0|C1|C2|C3, "inst_retired.x87" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xC7, 0x04, C0|C1|C2|C3, "ssex_uops_retired.packed_double" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xC7, 0x01, C0|C1|C2|C3, "ssex_uops_retired.packed_single" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xC7, 0x08, C0|C1|C2|C3, "ssex_uops_retired.scalar_double" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xC7, 0x02, C0|C1|C2|C3, "ssex_uops_retired.scalar_single" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xC7, 0x10, C0|C1|C2|C3, "ssex_uops_retired.vector_integer" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xC2, 0x01, C0|C1|C2|C3, "uops_retired.any" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xC2, 0x04, C0|C1|C2|C3, "uops_retired.macro_fused" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xC8, 0x20, C0|C1|C2|C3, "itlb_miss_retired" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xCB, 0x80, C0|C1|C2|C3, "mem_load_retired.dtlb_miss" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xCB, 0x40, C0|C1|C2|C3, "mem_load_retired.hit_lfb" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xCB, 0x01, C0|C1|C2|C3, "mem_load_retired.l1d_hit" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xCB, 0x02, C0|C1|C2|C3, "mem_load_retired.l2_hit" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xCB, 0x10, C0|C1|C2|C3, "mem_load_retired.llc_miss" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xCB, 0x04, C0|C1|C2|C3, "mem_load_retired.llc_unshared_hit" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xCB, 0x08, C0|C1|C2|C3, "mem_load_retired.other_core_l2_hit_hitm" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x0F, 0x02, C0|C1|C2|C3, "mem_uncore_retired.other_core_l2_hitm" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x0F, 0x08, C0|C1|C2|C3, "mem_uncore_retired.remote_cache_local_home_hit" },\
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x0F, 0x10, C0|C1|C2|C3, "mem_uncore_retired.remote_dram" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x0F, 0x20, C0|C1|C2|C3, "mem_uncore_retired.local_dram" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0x0C, 0x01, C0|C1|C2|C3, "mem_store_retired.dtlb_miss" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xC4, 0x01, C0|C1|C2|C3, "br_inst_retired.conditional" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xC4, 0x02, C0|C1|C2|C3, "br_inst_retired.near_call" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xC5, 0x02, C0|C1|C2|C3, "br_misp_retired.near_call" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xDB, 0x01, C0|C1|C2|C3, "uop_unfusion" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xF7, 0x01, C0|C1|C2|C3, "fp_assist.all" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xF7, 0x04, C0|C1|C2|C3, "fp_assist.input" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xF7, 0x02, C0|C1|C2|C3, "fp_assist.output" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xCC, 0x03, C0|C1|C2|C3, "fp_mmx_trans.any" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xCC, 0x01, C0|C1|C2|C3, "fp_mmx_trans.to_fp" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xCC, 0x02, C0|C1|C2|C3, "fp_mmx_trans.to_mmx" }, \
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{ 0xC3, 0x04, C0|C1|C2|C3, "machine_clears.smc" }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla#define GENERICEVENTS_FAM6_MOD28 \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0xc4, 0x00, C0|C1, "PAPI_br_ins" }, /* br_inst_retired.any */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0xc5, 0x00, C0|C1, "PAPI_br_msp" }, /* br_inst_retired.mispred */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0xc4, 0x03, C0|C1, "PAPI_br_ntk" }, \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla /* br_inst_retired.pred_not_taken|mispred_not_taken */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0xc4, 0x05, C0|C1, "PAPI_br_prc" }, \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla /* br_inst_retired.pred_not_taken|pred_taken */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0xc8, 0x00, C0|C1, "PAPI_hw_int" }, /* hw_int_rcv */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0xaa, 0x03, C0|C1, "PAPI_tot_iis" }, /* macro_insts.all_decoded */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x40, 0x23, C0|C1, "PAPI_l1_dca" }, /* l1d_cache.l1|st */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x2a, 0x41, C0|C1, "PAPI_l2_stm" }, /* l2_st.self.i_state */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x2e, 0x4f, C0|C1, "PAPI_l2_tca" }, /* longest_lat_cache.reference */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x2e, 0x4e, C0|C1, "PAPI_l2_tch" }, /* l2_rqsts.mes */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x2e, 0x41, C0|C1, "PAPI_l2_tcm" }, /* longest_lat_cache.miss */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x2a, 0x4f, C0|C1, "PAPI_l2_tcw" }, /* l2_st.self.mesi */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x08, 0x07, C0|C1, "PAPI_tlb_dm" }, /* data_tlb_misses.dtlb.miss */ \
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{ 0x82, 0x02, C0|C1, "PAPI_tlb_im" } /* itlb.misses */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems#define EVENTS_FAM6_MOD28 \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x2, 0x81, C0|C1, "store_forwards.good" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x6, 0x0, C0|C1, "segment_reg_loads.any" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x7, 0x1, C0|C1, "prefetch.prefetcht0" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x7, 0x6, C0|C1, "prefetch.sw_l2" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x7, 0x8, C0|C1, "prefetch.prefetchnta" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x8, 0x7, C0|C1, "data_tlb_misses.dtlb_miss" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x8, 0x5, C0|C1, "data_tlb_misses.dtlb_miss_ld" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x8, 0x9, C0|C1, "data_tlb_misses.l0_dtlb_miss_ld" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x8, 0x6, C0|C1, "data_tlb_misses.dtlb_miss_st" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xC, 0x3, C0|C1, "page_walks.cycles" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x10, 0x1, C0|C1, "x87_comp_ops_exe.any.s" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x10, 0x81, C0|C1, "x87_comp_ops_exe.any.ar" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x11, 0x1, C0|C1, "fp_assist" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x11, 0x81, C0|C1, "fp_assist.ar" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x12, 0x1, C0|C1, "mul.s" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x12, 0x81, C0|C1, "mul.ar" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x13, 0x1, C0|C1, "div.s" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x13, 0x81, C0|C1, "div.ar" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x14, 0x1, C0|C1, "cycles_div_busy" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x21, 0x0, C0|C1, "l2_ads" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x22, 0x0, C0|C1, "l2_dbus_busy" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x24, 0x0, C0|C1, "l2_lines_in" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x25, 0x0, C0|C1, "l2_m_lines_in" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x26, 0x0, C0|C1, "l2_lines_out" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x27, 0x0, C0|C1, "l2_m_lines_out" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x28, 0x0, C0|C1, "l2_ifetch" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x29, 0x0, C0|C1, "l2_ld" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x2A, 0x0, C0|C1, "l2_st" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x2B, 0x0, C0|C1, "l2_lock" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x2E, 0x0, C0|C1, "l2_rqsts" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x2E, 0x41, C0|C1, "l2_rqsts.self.demand.i_state" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x2E, 0x4F, C0|C1, "l2_rqsts.self.demand.mesi" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x30, 0x0, C0|C1, "l2_reject_bus_q" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x32, 0x0, C0|C1, "l2_no_req" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x3A, 0x0, C0|C1, "eist_trans" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x3B, 0xC0, C0|C1, "thermal_trip" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x3C, 0x0, C0|C1, "cpu_clk_unhalted.core_p" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x3C, 0x1, C0|C1, "cpu_clk_unhalted.bus" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x3C, 0x2, C0|C1, "cpu_clk_unhalted.no_other" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x40, 0x21, C0|C1, "l1d_cache.ld" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x40, 0x22, C0|C1, "l1d_cache.st" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x60, 0x0, C0|C1, "bus_request_outstanding" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x61, 0x0, C0|C1, "bus_bnr_drv" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x62, 0x0, C0|C1, "bus_drdy_clocks" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x63, 0x0, C0|C1, "bus_lock_clocks" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x64, 0x0, C0|C1, "bus_data_rcv" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x65, 0x0, C0|C1, "bus_trans_brd" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x66, 0x0, C0|C1, "bus_trans_rfo" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x67, 0x0, C0|C1, "bus_trans_wb" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x68, 0x0, C0|C1, "bus_trans_ifetch" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x69, 0x0, C0|C1, "bus_trans_inval" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x6A, 0x0, C0|C1, "bus_trans_pwr" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x6B, 0x0, C0|C1, "bus_trans_p" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x6C, 0x0, C0|C1, "bus_trans_io" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x6D, 0x0, C0|C1, "bus_trans_def" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x6E, 0x0, C0|C1, "bus_trans_burst" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x6F, 0x0, C0|C1, "bus_trans_mem" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x70, 0x0, C0|C1, "bus_trans_any" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x77, 0x0, C0|C1, "ext_snoop" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x7A, 0x0, C0|C1, "bus_hit_drv" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x7B, 0x0, C0|C1, "bus_hitm_drv" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x7D, 0x0, C0|C1, "busq_empty" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x7E, 0x0, C0|C1, "snoop_stall_drv" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x7F, 0x0, C0|C1, "bus_io_wait" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x80, 0x3, C0|C1, "icache.accesses" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x80, 0x2, C0|C1, "icache.misses" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x82, 0x4, C0|C1, "itlb.flush" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0x82, 0x2, C0|C1, "itlb.misses" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xAA, 0x2, C0|C1, "macro_insts.cisc_decoded" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xAA, 0x3, C0|C1, "macro_insts.all_decoded" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xB0, 0x0, C0|C1, "simd_uops_exec.s" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xB0, 0x80, C0|C1, "simd_uops_exec.ar" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xB1, 0x0, C0|C1, "simd_sat_uop_exec.s" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xB1, 0x80, C0|C1, "simd_sat_uop_exec.ar" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xB3, 0x1, C0|C1, "simd_uop_type_exec.mul.s" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xB3, 0x81, C0|C1, "simd_uop_type_exec.mul.ar" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xB3, 0x02, C0|C1, "simd_uop_type_exec.shift.s" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xB3, 0x82, C0|C1, "simd_uop_type_exec.shift.ar" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xB3, 0x04, C0|C1, "simd_uop_type_exec.pack.s" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xB3, 0x84, C0|C1, "simd_uop_type_exec.pack.ar" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xB3, 0x08, C0|C1, "simd_uop_type_exec.unpack.s" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xB3, 0x88, C0|C1, "simd_uop_type_exec.unpack.ar" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xB3, 0x10, C0|C1, "simd_uop_type_exec.logical.s" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xB3, 0x90, C0|C1, "simd_uop_type_exec.logical.ar" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xB3, 0x20, C0|C1, "simd_uop_type_exec.arithmetic.s" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xB3, 0xA0, C0|C1, "simd_uop_type_exec.arithmetic.ar" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xC2, 0x10, C0|C1, "uops_retired.any" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xC3, 0x1, C0|C1, "machine_clears.smc" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xC4, 0x0, C0|C1, "br_inst_retired.any" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xC4, 0x1, C0|C1, "br_inst_retired.pred_not_taken" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xC4, 0x2, C0|C1, "br_inst_retired.mispred_not_taken" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xC4, 0x4, C0|C1, "br_inst_retired.pred_taken" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xC4, 0x8, C0|C1, "br_inst_retired.mispred_taken" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xC4, 0xA, C0|C1, "br_inst_retired.mispred" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xC4, 0xC, C0|C1, "br_inst_retired.taken" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xC4, 0xF, C0|C1, "br_inst_retired.any1" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xC6, 0x1, C0|C1, "cycles_int_masked.cycles_int_masked" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xC6, 0x2, C0|C1, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems "cycles_int_masked.cycles_int_pending_and_masked" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xC7, 0x1, C0|C1, "simd_inst_retired.packed_single" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xC7, 0x2, C0|C1, "simd_inst_retired.scalar_single" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xC7, 0x4, C0|C1, "simd_inst_retired.packed_double" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xC7, 0x8, C0|C1, "simd_inst_retired.scalar_double" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xC7, 0x10, C0|C1, "simd_inst_retired.vector" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xC7, 0x1F, C0|C1, "simd_inst_retired.any" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xC8, 0x00, C0|C1, "hw_int_rcv" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xCA, 0x1, C0|C1, "simd_comp_inst_retired.packed_single" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xCA, 0x2, C0|C1, "simd_comp_inst_retired.scalar_single" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xCA, 0x4, C0|C1, "simd_comp_inst_retired.packed_double" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xCA, 0x8, C0|C1, "simd_comp_inst_retired.scalar_double" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xCB, 0x1, C0|C1, "mem_load_retired.l2_hit" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xCB, 0x2, C0|C1, "mem_load_retired.l2_miss" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xCB, 0x4, C0|C1, "mem_load_retired.dtlb_miss" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xCD, 0x0, C0|C1, "simd_assist" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xCE, 0x0, C0|C1, "simd_instr_retired" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xCF, 0x0, C0|C1, "simd_sat_instr_retired" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xE0, 0x1, C0|C1, "br_inst_decoded" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xE4, 0x1, C0|C1, "bogus_br" }, \
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { 0xE6, 0x1, C0|C1, "baclears.any" }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvillastatic const struct events_table_t *events_table = NULL;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
03dbaac70615232c621989219a94543779d67ddfKuriakose Kuruvillaconst struct events_table_t events_fam6_nhm[] = {
03dbaac70615232c621989219a94543779d67ddfKuriakose Kuruvilla GENERICEVENTS_FAM6_NHM,
03dbaac70615232c621989219a94543779d67ddfKuriakose Kuruvilla EVENTS_FAM6_NHM,
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla { NT_END, 0, 0, "" }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla};
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystemsconst struct events_table_t events_fam6_mod28[] = {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla GENERICEVENTS_FAM6_MOD28,
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems EVENTS_FAM6_MOD28,
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems { NT_END, 0, 0, "" }
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems};
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla/*
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla * Initialize string containing list of supported general-purpose counter
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvilla * events for processors of Penryn and Merom Family
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla */
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvillastatic void
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvillapcbe_init_core_uarch()
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvilla const struct nametable_core_uarch *n;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla const struct generic_events *k;
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvilla const struct nametable_core_uarch *picspecific_events;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla const struct generic_events *picspecific_genericevents;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla size_t common_size;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla size_t size;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla uint64_t i;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla gpc_names = kmem_alloc(num_gpc * sizeof (char *), KM_SLEEP);
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla /* Calculate space needed to save all the common event names */
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla common_size = 0;
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvilla for (n = cmn_gpc_events_core_uarch; n->event_num != NT_END; n++) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla common_size += strlen(n->name) + 1;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla for (k = cmn_generic_events; k->event_num != NT_END; k++) {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla common_size += strlen(k->name) + 1;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla }
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla for (i = 0; i < num_gpc; i++) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla size = 0;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla picspecific_genericevents = NULL;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla switch (i) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla case 0:
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla picspecific_events = pic0_events;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla picspecific_genericevents = generic_events_pic0;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla break;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla case 1:
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla picspecific_events = pic1_events;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla break;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla default:
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla picspecific_events = NULL;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla break;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if (picspecific_events != NULL) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla for (n = picspecific_events;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla n->event_num != NT_END;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla n++) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla size += strlen(n->name) + 1;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla if (picspecific_genericevents != NULL) {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla for (k = picspecific_genericevents;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla k->event_num != NT_END; k++) {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla size += strlen(k->name) + 1;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla }
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla gpc_names[i] =
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla kmem_alloc(size + common_size + 1, KM_SLEEP);
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla gpc_names[i][0] = '\0';
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if (picspecific_events != NULL) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla for (n = picspecific_events;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla n->event_num != NT_END; n++) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla (void) strcat(gpc_names[i], n->name);
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla (void) strcat(gpc_names[i], ",");
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla if (picspecific_genericevents != NULL) {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla for (k = picspecific_genericevents;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla k->event_num != NT_END; k++) {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla (void) strcat(gpc_names[i], k->name);
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla (void) strcat(gpc_names[i], ",");
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla }
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla }
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvilla for (n = cmn_gpc_events_core_uarch; n->event_num != NT_END;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla n++) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla (void) strcat(gpc_names[i], n->name);
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla (void) strcat(gpc_names[i], ",");
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla for (k = cmn_generic_events; k->event_num != NT_END; k++) {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla (void) strcat(gpc_names[i], k->name);
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla (void) strcat(gpc_names[i], ",");
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla }
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla /*
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla * Remove trailing comma.
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla */
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla gpc_names[i][common_size + size - 1] = '\0';
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla}
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic int
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkcore_pcbe_init(void)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk{
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk struct cpuid_regs cp;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk size_t size;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint64_t i;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla uint64_t j;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla uint64_t arch_events_vector_length;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla size_t arch_events_string_length;
03dbaac70615232c621989219a94543779d67ddfKuriakose Kuruvilla uint_t model;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if (cpuid_getvendor(CPU) != X86_VENDOR_Intel)
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla return (-1);
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla /* Obtain Basic CPUID information */
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla cp.cp_eax = 0x0;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla (void) __cpuid_insn(&cp);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla /* No Architectural Performance Monitoring Leaf returned by CPUID */
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if (cp.cp_eax < 0xa) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (-1);
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk /* Obtain the Architectural Performance Monitoring Leaf */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk cp.cp_eax = 0xa;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk (void) __cpuid_insn(&cp);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk versionid = cp.cp_eax & 0xFF;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk /*
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems * Fixed-Function Counters (FFC)
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems *
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * All Family 6 Model 15 and Model 23 processors have fixed-function
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * counters. These counters were made Architectural with
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla * Family 6 Model 15 Stepping 9.
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk switch (versionid) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk case 0:
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (-1);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla case 2:
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk num_ffc = cp.cp_edx & 0x1F;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk width_ffc = (cp.cp_edx >> 5) & 0xFF;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk /*
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla * Some processors have an errata (AW34) where
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla * versionid is reported as 2 when actually 1.
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla * In this case, fixed-function counters are
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla * model-specific as in Version 1.
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk */
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if (num_ffc != 0) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla break;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla /* FALLTHROUGH */
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla case 1:
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk num_ffc = 3;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk width_ffc = 40;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla versionid = 1;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla break;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla default:
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla num_ffc = cp.cp_edx & 0x1F;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla width_ffc = (cp.cp_edx >> 5) & 0xFF;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk break;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (num_ffc >= 64)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (-1);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems /* Set HTT-specific names of architectural & FFC events */
7417cfdecea1902cef03c0d61a72df97d945925dKuriakose Kuruvilla if (is_x86_feature(x86_featureset, X86FSET_HTT)) {
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems ffc_names = ffc_names_htt;
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems arch_events_table = arch_events_table_htt;
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems known_arch_events =
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems sizeof (arch_events_table_htt) /
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems sizeof (struct events_table_t);
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems known_ffc_num =
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems sizeof (ffc_names_htt) / sizeof (char *);
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems } else {
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems ffc_names = ffc_names_non_htt;
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems arch_events_table = arch_events_table_non_htt;
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems known_arch_events =
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems sizeof (arch_events_table_non_htt) /
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems sizeof (struct events_table_t);
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems known_ffc_num =
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems sizeof (ffc_names_non_htt) / sizeof (char *);
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems }
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems if (num_ffc >= known_ffc_num) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk /*
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * The system seems to have more fixed-function counters than
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * what this PCBE is able to handle correctly. Default to the
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * maximum number of fixed-function counters that this driver
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * is aware of.
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk */
6323db193c07dc62901511cbb45eab912b17f4faKrishnendu Sadhukhan - Sun Microsystems num_ffc = known_ffc_num - 1;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk mask_ffc = BITMASK_XBITS(width_ffc);
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems control_ffc = BITMASK_XBITS(num_ffc);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems /*
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems * General Purpose Counters (GPC)
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk num_gpc = (cp.cp_eax >> 8) & 0xFF;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk width_gpc = (cp.cp_eax >> 16) & 0xFF;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (num_gpc >= 64)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (-1);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk mask_gpc = BITMASK_XBITS(width_gpc);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk control_gpc = BITMASK_XBITS(num_gpc);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk control_mask = (control_ffc << 32) | control_gpc;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems total_pmc = num_gpc + num_ffc;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (total_pmc > 64) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk /* Too wide for the overflow bitmap */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (-1);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla /* FFC names */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla ffc_allnames = kmem_alloc(num_ffc * sizeof (char *), KM_SLEEP);
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla for (i = 0; i < num_ffc; i++) {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla ffc_allnames[i] = kmem_alloc(
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla strlen(ffc_names[i]) + strlen(ffc_genericnames[i]) + 2,
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla KM_SLEEP);
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla ffc_allnames[i][0] = '\0';
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla (void) strcat(ffc_allnames[i], ffc_names[i]);
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla /* Check if this ffc has a generic name */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla if (strcmp(ffc_genericnames[i], "") != 0) {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla (void) strcat(ffc_allnames[i], ",");
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla (void) strcat(ffc_allnames[i], ffc_genericnames[i]);
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla }
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla }
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla /* GPC events for Family 6 Models 15, 23 and 29 only */
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if ((cpuid_getfamily(CPU) == 6) &&
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvilla ((cpuid_getmodel(CPU) == 15) || (cpuid_getmodel(CPU) == 23) ||
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvilla (cpuid_getmodel(CPU) == 29))) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla (void) snprintf(core_impl_name, IMPL_NAME_LEN,
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla "Core Microarchitecture");
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvilla pcbe_init_core_uarch();
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla return (0);
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla (void) snprintf(core_impl_name, IMPL_NAME_LEN,
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla "Intel Arch PerfMon v%d on Family %d Model %d",
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla versionid, cpuid_getfamily(CPU), cpuid_getmodel(CPU));
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems /*
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems * Architectural events
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems */
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla arch_events_vector_length = (cp.cp_eax >> 24) & 0xFF;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla ASSERT(known_arch_events == arch_events_vector_length);
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla /*
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla * To handle the case where a new performance monitoring setup is run
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla * on a non-debug kernel
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla */
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if (known_arch_events > arch_events_vector_length) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla known_arch_events = arch_events_vector_length;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla } else {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla arch_events_vector_length = known_arch_events;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla arch_events_vector = cp.cp_ebx &
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla BITMASK_XBITS(arch_events_vector_length);
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems /*
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems * Process architectural and non-architectural events using GPC
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (num_gpc > 0) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk gpc_names = kmem_alloc(num_gpc * sizeof (char *), KM_SLEEP);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla /* Calculate space required for the architectural gpc events */
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla arch_events_string_length = 0;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla for (i = 0; i < known_arch_events; i++) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if (((1U << i) & arch_events_vector) == 0) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla arch_events_string_length +=
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla strlen(arch_events_table[i].name) + 1;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla if (strcmp(arch_genevents_table[i], "") != 0) {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla arch_events_string_length +=
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla strlen(arch_genevents_table[i]) + 1;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems /* Non-architectural events list */
03dbaac70615232c621989219a94543779d67ddfKuriakose Kuruvilla model = cpuid_getmodel(CPU);
03dbaac70615232c621989219a94543779d67ddfKuriakose Kuruvilla switch (model) {
03dbaac70615232c621989219a94543779d67ddfKuriakose Kuruvilla /* Nehalem */
03dbaac70615232c621989219a94543779d67ddfKuriakose Kuruvilla case 26:
03dbaac70615232c621989219a94543779d67ddfKuriakose Kuruvilla case 30:
03dbaac70615232c621989219a94543779d67ddfKuriakose Kuruvilla case 31:
03dbaac70615232c621989219a94543779d67ddfKuriakose Kuruvilla /* Westmere */
03dbaac70615232c621989219a94543779d67ddfKuriakose Kuruvilla case 37:
03dbaac70615232c621989219a94543779d67ddfKuriakose Kuruvilla case 44:
03dbaac70615232c621989219a94543779d67ddfKuriakose Kuruvilla /* Nehalem-EX */
03dbaac70615232c621989219a94543779d67ddfKuriakose Kuruvilla case 46:
ac13ce240ba9273d4f6a0b39f769310a90ab85d3Adrian Frost case 47:
03dbaac70615232c621989219a94543779d67ddfKuriakose Kuruvilla events_table = events_fam6_nhm;
03dbaac70615232c621989219a94543779d67ddfKuriakose Kuruvilla break;
03dbaac70615232c621989219a94543779d67ddfKuriakose Kuruvilla case 28:
03dbaac70615232c621989219a94543779d67ddfKuriakose Kuruvilla events_table = events_fam6_mod28;
03dbaac70615232c621989219a94543779d67ddfKuriakose Kuruvilla break;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk for (i = 0; i < num_gpc; i++) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems /*
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems * Determine length of all supported event names
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems * (architectural + non-architectural)
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems */
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla size = arch_events_string_length;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla for (j = 0; events_table != NULL &&
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla events_table[j].eventselect != NT_END;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla j++) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if (C(i) & events_table[j].supported_counters) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla size += strlen(events_table[j].name) +
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla 1;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla /* Allocate memory for this pics list */
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla gpc_names[i] = kmem_alloc(size + 1, KM_SLEEP);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk gpc_names[i][0] = '\0';
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if (size == 0) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla continue;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems /*
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems * Create the list of all supported events
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems * (architectural + non-architectural)
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems */
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla for (j = 0; j < known_arch_events; j++) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if (((1U << j) & arch_events_vector) == 0) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla (void) strcat(gpc_names[i],
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla arch_events_table[j].name);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk (void) strcat(gpc_names[i], ",");
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla if (strcmp(
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla arch_genevents_table[j], "")
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla != 0) {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla (void) strcat(gpc_names[i],
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla arch_genevents_table[j]);
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla (void) strcat(gpc_names[i],
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla ",");
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla for (j = 0; events_table != NULL &&
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla events_table[j].eventselect != NT_END;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla j++) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if (C(i) & events_table[j].supported_counters) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla (void) strcat(gpc_names[i],
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla events_table[j].name);
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla (void) strcat(gpc_names[i], ",");
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems /* Remove trailing comma */
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla gpc_names[i][size - 1] = '\0';
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (0);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk}
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic uint_t core_pcbe_ncounters()
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk{
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (total_pmc);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk}
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic const char *core_pcbe_impl_name(void)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk{
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (core_impl_name);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk}
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic const char *core_pcbe_cpuref(void)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk{
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (core_cpuref);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk}
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic char *core_pcbe_list_events(uint_t picnum)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk{
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk ASSERT(picnum < cpc_ncounters);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (picnum < num_gpc) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (gpc_names[picnum]);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk } else {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla return (ffc_allnames[picnum - num_gpc]);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk}
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic char *core_pcbe_list_attrs(void)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk{
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if (versionid >= 3) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla return ("edge,inv,umask,cmask,anythr");
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla } else {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla return ("edge,pc,inv,umask,cmask");
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk}
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvillastatic const struct nametable_core_uarch *
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvillafind_gpcevent_core_uarch(char *name,
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvilla const struct nametable_core_uarch *nametable)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk{
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvilla const struct nametable_core_uarch *n;
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems int compare_result = -1;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk for (n = nametable; n->event_num != NT_END; n++) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk compare_result = strcmp(name, n->name);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (compare_result <= 0) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk break;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (compare_result == 0) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (n);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (NULL);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk}
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvillastatic const struct generic_events *
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvillafind_generic_events(char *name, const struct generic_events *table)
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla{
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla const struct generic_events *n;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla for (n = table; n->event_num != NT_END; n++) {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla if (strcmp(name, n->name) == 0) {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla return (n);
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla };
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla }
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla return (NULL);
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla}
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvillastatic const struct events_table_t *
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvillafind_gpcevent(char *name)
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla{
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla int i;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems /* Search architectural events */
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla for (i = 0; i < known_arch_events; i++) {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla if (strcmp(name, arch_events_table[i].name) == 0 ||
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla strcmp(name, arch_genevents_table[i]) == 0) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if (((1U << i) & arch_events_vector) == 0) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla return (&arch_events_table[i]);
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems /* Search non-architectural events */
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems if (events_table != NULL) {
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems for (i = 0; events_table[i].eventselect != NT_END; i++) {
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems if (strcmp(name, events_table[i].name) == 0) {
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems return (&events_table[i]);
e733453728bef62a6d9431aafae83669291d4c97Krishnendu Sadhukhan - Sun Microsystems }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla return (NULL);
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla}
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic uint64_t
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkcore_pcbe_event_coverage(char *event)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk{
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint64_t bitmap;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint64_t bitmask;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla const struct events_table_t *n;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk int i;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk bitmap = 0;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk /* Is it an event that a GPC can track? */
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if (versionid >= 3) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla n = find_gpcevent(event);
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if (n != NULL) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla bitmap |= (n->supported_counters &
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla BITMASK_XBITS(num_gpc));
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla } else {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla if (find_generic_events(event, cmn_generic_events) != NULL) {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla bitmap |= BITMASK_XBITS(num_gpc);
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla } if (find_generic_events(event, generic_events_pic0) != NULL) {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla bitmap |= 1ULL;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla } else if (find_gpcevent_core_uarch(event,
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla cmn_gpc_events_core_uarch) != NULL) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla bitmap |= BITMASK_XBITS(num_gpc);
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvilla } else if (find_gpcevent_core_uarch(event, pic0_events) !=
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvilla NULL) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla bitmap |= 1ULL;
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvilla } else if (find_gpcevent_core_uarch(event, pic1_events) !=
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvilla NULL) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla bitmap |= 1ULL << 1;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk /* Check if the event can be counted in the fixed-function counters */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (num_ffc > 0) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk bitmask = 1ULL << num_gpc;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk for (i = 0; i < num_ffc; i++) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (strcmp(event, ffc_names[i]) == 0) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk bitmap |= bitmask;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla } else if (strcmp(event, ffc_genericnames[i]) == 0) {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla bitmap |= bitmask;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk bitmask = bitmask << 1;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (bitmap);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk}
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic uint64_t
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkcore_pcbe_overflow_bitmap(void)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk{
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint64_t interrupt_status;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint64_t intrbits_ffc;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint64_t intrbits_gpc;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk extern int kcpc_hw_overflow_intr_installed;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint64_t overflow_bitmap;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk RDMSR(PERF_GLOBAL_STATUS, interrupt_status);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk WRMSR(PERF_GLOBAL_OVF_CTRL, interrupt_status);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk interrupt_status = interrupt_status & control_mask;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk intrbits_ffc = (interrupt_status >> 32) & control_ffc;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk intrbits_gpc = interrupt_status & control_gpc;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk overflow_bitmap = (intrbits_ffc << num_gpc) | intrbits_gpc;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk ASSERT(kcpc_hw_overflow_intr_installed);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk (*kcpc_hw_enable_cpc_intr)();
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (overflow_bitmap);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk}
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic int
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvillacheck_cpc_securitypolicy(core_pcbe_config_t *conf,
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvilla const struct nametable_core_uarch *n)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk{
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (conf->core_ctl & n->restricted_bits) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (secpolicy_cpc_cpu(crgetcred()) != 0) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (CPC_ATTR_REQUIRES_PRIVILEGE);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (0);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk}
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic int
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkconfigure_gpc(uint_t picnum, char *event, uint64_t preset, uint32_t flags,
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint_t nattrs, kcpc_attr_t *attrs, void **data)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk{
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk core_pcbe_config_t conf;
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvilla const struct nametable_core_uarch *n;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla const struct generic_events *k = NULL;
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvilla const struct nametable_core_uarch *m;
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvilla const struct nametable_core_uarch *picspecific_events;
afb806e6e80619e1656bd85fd44a7ab667ed0714Kuriakose Kuruvilla struct nametable_core_uarch nt_raw = { "", 0x0, 0x0 };
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint_t i;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk long event_num;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla const struct events_table_t *eventcode;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (((preset & BITS_EXTENDED_FROM_31) != 0) &&
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk ((preset & BITS_EXTENDED_FROM_31) !=
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk BITS_EXTENDED_FROM_31)) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk /*
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * Bits beyond bit-31 in the general-purpose counters can only
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * be written to by extension of bit 31. We cannot preset
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * these bits to any value other than all 1s or all 0s.
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (CPC_ATTRIBUTE_OUT_OF_RANGE);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if (versionid >= 3) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla eventcode = find_gpcevent(event);
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if (eventcode != NULL) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if ((C(picnum) & eventcode->supported_counters) == 0) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla return (CPC_PIC_NOT_CAPABLE);
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla if (nattrs > 0 &&
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla (strncmp("PAPI_", event, 5) == 0)) {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla return (CPC_ATTRIBUTE_OUT_OF_RANGE);
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla conf.core_ctl = eventcode->eventselect;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla conf.core_ctl |= eventcode->unitmask <<
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla CORE_UMASK_SHIFT;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla } else {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla /* Event specified as raw event code */
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if (ddi_strtol(event, NULL, 0, &event_num) != 0) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla return (CPC_INVALID_EVENT);
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla conf.core_ctl = event_num & 0xFF;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla } else {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla if ((k = find_generic_events(event, cmn_generic_events)) !=
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla NULL ||
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla (picnum == 0 &&
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla (k = find_generic_events(event, generic_events_pic0)) !=
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla NULL)) {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla if (nattrs > 0) {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla return (CPC_ATTRIBUTE_OUT_OF_RANGE);
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla conf.core_ctl = k->event_num;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla conf.core_ctl |= k->umask << CORE_UMASK_SHIFT;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla } else {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla /* Not a generic event */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla n = find_gpcevent_core_uarch(event,
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla cmn_gpc_events_core_uarch);
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla if (n == NULL) {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla switch (picnum) {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla case 0:
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla picspecific_events =
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla pic0_events;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla break;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla case 1:
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla picspecific_events =
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla pic1_events;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla break;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla default:
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla picspecific_events = NULL;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla break;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla }
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla if (picspecific_events != NULL) {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla n = find_gpcevent_core_uarch(event,
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla picspecific_events);
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla if (n == NULL) {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla /*
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * Check if this is a case where the event was
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * specified directly by its event number
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * instead of its name string.
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla if (ddi_strtol(event, NULL, 0, &event_num) !=
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla 0) {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla return (CPC_INVALID_EVENT);
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla event_num = event_num & 0xFF;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla /*
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * Search the event table to find out if the
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * event specified has an privilege
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * requirements. Currently none of the
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * pic-specific counters have any privilege
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * requirements. Hence only the table
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla * cmn_gpc_events_core_uarch is searched.
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla */
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla for (m = cmn_gpc_events_core_uarch;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla m->event_num != NT_END;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla m++) {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla if (event_num == m->event_num) {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla break;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla }
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla }
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla if (m->event_num == NT_END) {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla nt_raw.event_num = (uint8_t)event_num;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla n = &nt_raw;
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla } else {
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla n = m;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla conf.core_ctl = n->event_num; /* Event Select */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk conf.core_picno = picnum;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk conf.core_pictype = CORE_GPC;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk conf.core_rawpic = preset & mask_gpc;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk conf.core_pes = GPC_BASE_PES + picnum;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk conf.core_pmc = GPC_BASE_PMC + picnum;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk for (i = 0; i < nattrs; i++) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (strncmp(attrs[i].ka_name, "umask", 6) == 0) {
34fdb7002725c9fcfe5e88630bbcc9860ed8ae8fKuriakose Kuruvilla if ((attrs[i].ka_val | CORE_UMASK_MASK) !=
34fdb7002725c9fcfe5e88630bbcc9860ed8ae8fKuriakose Kuruvilla CORE_UMASK_MASK) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (CPC_ATTRIBUTE_OUT_OF_RANGE);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
34fdb7002725c9fcfe5e88630bbcc9860ed8ae8fKuriakose Kuruvilla /* Clear out the default umask */
34fdb7002725c9fcfe5e88630bbcc9860ed8ae8fKuriakose Kuruvilla conf.core_ctl &= ~ (CORE_UMASK_MASK <<
34fdb7002725c9fcfe5e88630bbcc9860ed8ae8fKuriakose Kuruvilla CORE_UMASK_SHIFT);
34fdb7002725c9fcfe5e88630bbcc9860ed8ae8fKuriakose Kuruvilla /* Use the user provided umask */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk conf.core_ctl |= attrs[i].ka_val <<
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk CORE_UMASK_SHIFT;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla } else if (strncmp(attrs[i].ka_name, "edge", 6) == 0) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (attrs[i].ka_val != 0)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk conf.core_ctl |= CORE_EDGE;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk } else if (strncmp(attrs[i].ka_name, "inv", 4) == 0) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (attrs[i].ka_val != 0)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk conf.core_ctl |= CORE_INV;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk } else if (strncmp(attrs[i].ka_name, "cmask", 6) == 0) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if ((attrs[i].ka_val | CORE_CMASK_MASK) !=
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk CORE_CMASK_MASK) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (CPC_ATTRIBUTE_OUT_OF_RANGE);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla conf.core_ctl |= attrs[i].ka_val <<
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla CORE_CMASK_SHIFT;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla } else if (strncmp(attrs[i].ka_name, "anythr", 7) ==
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla 0) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if (versionid < 3)
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla return (CPC_INVALID_ATTRIBUTE);
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if (secpolicy_cpc_cpu(crgetcred()) != 0) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla return (CPC_ATTR_REQUIRES_PRIVILEGE);
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if (attrs[i].ka_val != 0)
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla conf.core_ctl |= CORE_ANYTHR;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk } else {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (CPC_INVALID_ATTRIBUTE);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (flags & CPC_COUNT_USER)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk conf.core_ctl |= CORE_USR;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (flags & CPC_COUNT_SYSTEM)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk conf.core_ctl |= CORE_OS;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (flags & CPC_OVF_NOTIFY_EMT)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk conf.core_ctl |= CORE_INT;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk conf.core_ctl |= CORE_EN;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla if (versionid < 3 && k == NULL) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if (check_cpc_securitypolicy(&conf, n) != 0) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla return (CPC_ATTR_REQUIRES_PRIVILEGE);
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk *data = kmem_alloc(sizeof (core_pcbe_config_t), KM_SLEEP);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk *((core_pcbe_config_t *)*data) = conf;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (0);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk}
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic int
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkconfigure_ffc(uint_t picnum, char *event, uint64_t preset, uint32_t flags,
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla uint_t nattrs, kcpc_attr_t *attrs, void **data)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk{
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk core_pcbe_config_t *conf;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla uint_t i;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (picnum - num_gpc >= num_ffc) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (CPC_INVALID_PICNUM);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla if ((strcmp(ffc_names[picnum-num_gpc], event) != 0) &&
560e0ee2bb5791b5efe2cbdc74d0a76f06dbd84dKuriakose Kuruvilla (strcmp(ffc_genericnames[picnum-num_gpc], event) != 0)) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (CPC_INVALID_EVENT);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if ((versionid < 3) && (nattrs != 0)) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (CPC_INVALID_ATTRIBUTE);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk conf = kmem_alloc(sizeof (core_pcbe_config_t), KM_SLEEP);
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla conf->core_ctl = 0;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla for (i = 0; i < nattrs; i++) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if (strncmp(attrs[i].ka_name, "anythr", 7) == 0) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if (secpolicy_cpc_cpu(crgetcred()) != 0) {
96992ee7c93bf61dc0579501855b17b4d249f22dEthindra Ramamurthy kmem_free(conf, sizeof (core_pcbe_config_t));
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla return (CPC_ATTR_REQUIRES_PRIVILEGE);
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla if (attrs[i].ka_val != 0) {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla conf->core_ctl |= CORE_FFC_ANYTHR;
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla } else {
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla kmem_free(conf, sizeof (core_pcbe_config_t));
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla return (CPC_INVALID_ATTRIBUTE);
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk conf->core_picno = picnum;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk conf->core_pictype = CORE_FFC;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk conf->core_rawpic = preset & mask_ffc;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk conf->core_pmc = FFC_BASE_PMC + (picnum - num_gpc);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk /* All fixed-function counters have the same control register */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk conf->core_pes = PERF_FIXED_CTR_CTRL;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (flags & CPC_COUNT_USER)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk conf->core_ctl |= CORE_FFC_USR_EN;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (flags & CPC_COUNT_SYSTEM)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk conf->core_ctl |= CORE_FFC_OS_EN;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (flags & CPC_OVF_NOTIFY_EMT)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk conf->core_ctl |= CORE_FFC_PMI;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk *data = conf;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (0);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk}
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk/*ARGSUSED*/
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic int
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkcore_pcbe_configure(uint_t picnum, char *event, uint64_t preset,
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint32_t flags, uint_t nattrs, kcpc_attr_t *attrs, void **data,
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk void *token)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk{
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk int ret;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk core_pcbe_config_t *conf;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk /*
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * If we've been handed an existing configuration, we need only preset
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * the counter value.
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (*data != NULL) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk conf = *data;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk ASSERT(conf->core_pictype == CORE_GPC ||
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk conf->core_pictype == CORE_FFC);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (conf->core_pictype == CORE_GPC)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk conf->core_rawpic = preset & mask_gpc;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk else /* CORE_FFC */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk conf->core_rawpic = preset & mask_ffc;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (0);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (picnum >= total_pmc) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (CPC_INVALID_PICNUM);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (picnum < num_gpc) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk ret = configure_gpc(picnum, event, preset, flags,
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk nattrs, attrs, data);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk } else {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk ret = configure_ffc(picnum, event, preset, flags,
a18ddb3c6e38b3caec32c0c4fb5fef8f2f4c4c8fKuriakose Kuruvilla nattrs, attrs, data);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (ret);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk}
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic void
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkcore_pcbe_program(void *token)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk{
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk core_pcbe_config_t *cfg;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint64_t perf_global_ctrl;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint64_t perf_fixed_ctr_ctrl;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint64_t curcr4;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk core_pcbe_allstop();
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk curcr4 = getcr4();
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (kcpc_allow_nonpriv(token))
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk /* Allow RDPMC at any ring level */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk setcr4(curcr4 | CR4_PCE);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk else
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk /* Allow RDPMC only at ring 0 */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk setcr4(curcr4 & ~CR4_PCE);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk /* Clear any overflow indicators before programming the counters */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk WRMSR(PERF_GLOBAL_OVF_CTRL, MASK_CONDCHGD_OVFBUFFER | control_mask);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk cfg = NULL;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk perf_global_ctrl = 0;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk perf_fixed_ctr_ctrl = 0;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk cfg = (core_pcbe_config_t *)kcpc_next_config(token, cfg, NULL);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk while (cfg != NULL) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk ASSERT(cfg->core_pictype == CORE_GPC ||
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk cfg->core_pictype == CORE_FFC);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (cfg->core_pictype == CORE_GPC) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk /*
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * General-purpose counter registers have write
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * restrictions where only the lower 32-bits can be
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * written to. The rest of the relevant bits are
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * written to by extension from bit 31 (all ZEROS if
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * bit-31 is ZERO and all ONE if bit-31 is ONE). This
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * makes it possible to write to the counter register
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * only values that have all ONEs or all ZEROs in the
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * higher bits.
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (((cfg->core_rawpic & BITS_EXTENDED_FROM_31) == 0) ||
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk ((cfg->core_rawpic & BITS_EXTENDED_FROM_31) ==
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk BITS_EXTENDED_FROM_31)) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk /*
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * Straighforward case where the higher bits
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * are all ZEROs or all ONEs.
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk WRMSR(cfg->core_pmc,
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk (cfg->core_rawpic & mask_gpc));
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk } else {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk /*
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * The high order bits are not all the same.
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * We save what is currently in the registers
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * and do not write to it. When we want to do
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * a read from this register later (in
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * core_pcbe_sample()), we subtract the value
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * we save here to get the actual event count.
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk *
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * NOTE: As a result, we will not get overflow
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * interrupts as expected.
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk RDMSR(cfg->core_pmc, cfg->core_rawpic);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk cfg->core_rawpic = cfg->core_rawpic & mask_gpc;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk WRMSR(cfg->core_pes, cfg->core_ctl);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk perf_global_ctrl |= 1ull << cfg->core_picno;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk } else {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk /*
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * Unlike the general-purpose counters, all relevant
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * bits of fixed-function counters can be written to.
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk WRMSR(cfg->core_pmc, cfg->core_rawpic & mask_ffc);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk /*
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * Collect the control bits for all the
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * fixed-function counters and write it at one shot
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk * later in this function
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk perf_fixed_ctr_ctrl |= cfg->core_ctl <<
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk ((cfg->core_picno - num_gpc) * CORE_FFC_ATTR_SIZE);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk perf_global_ctrl |=
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk 1ull << (cfg->core_picno - num_gpc + 32);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk cfg = (core_pcbe_config_t *)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk kcpc_next_config(token, cfg, NULL);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk /* Enable all the counters */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk WRMSR(PERF_FIXED_CTR_CTRL, perf_fixed_ctr_ctrl);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk WRMSR(PERF_GLOBAL_CTRL, perf_global_ctrl);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk}
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic void
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkcore_pcbe_allstop(void)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk{
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk /* Disable all the counters together */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk WRMSR(PERF_GLOBAL_CTRL, ALL_STOPPED);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk setcr4(getcr4() & ~CR4_PCE);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk}
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic void
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkcore_pcbe_sample(void *token)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk{
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint64_t *daddr;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint64_t curpic;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk core_pcbe_config_t *cfg;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint64_t counter_mask;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk cfg = (core_pcbe_config_t *)kcpc_next_config(token, NULL, &daddr);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk while (cfg != NULL) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk ASSERT(cfg->core_pictype == CORE_GPC ||
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk cfg->core_pictype == CORE_FFC);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk curpic = rdmsr(cfg->core_pmc);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk DTRACE_PROBE4(core__pcbe__sample,
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint64_t, cfg->core_pmc,
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint64_t, curpic,
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint64_t, cfg->core_rawpic,
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk uint64_t, *daddr);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (cfg->core_pictype == CORE_GPC) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk counter_mask = mask_gpc;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk } else {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk counter_mask = mask_ffc;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk curpic = curpic & counter_mask;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (curpic >= cfg->core_rawpic) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk *daddr += curpic - cfg->core_rawpic;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk } else {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk /* Counter overflowed since our last sample */
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk *daddr += counter_mask - (cfg->core_rawpic - curpic) +
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk 1;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk cfg->core_rawpic = *daddr & counter_mask;
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk cfg =
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk (core_pcbe_config_t *)kcpc_next_config(token, cfg, &daddr);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk}
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic void
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkcore_pcbe_free(void *config)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk{
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk kmem_free(config, sizeof (core_pcbe_config_t));
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk}
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic struct modlpcbe core_modlpcbe = {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk &mod_pcbeops,
820c9f58018f61ff5e4d61e758c34cdc6d6aa3e4kk "Core Performance Counters",
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk &core_pcbe_ops
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk};
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkstatic struct modlinkage core_modl = {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk MODREV_1,
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk &core_modlpcbe,
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk};
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkint
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk_init(void)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk{
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk if (core_pcbe_init() != 0) {
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (ENOTSUP);
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk }
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (mod_install(&core_modl));
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk}
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkint
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk_fini(void)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk{
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (mod_remove(&core_modl));
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk}
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kkint
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk_info(struct modinfo *mi)
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk{
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk return (mod_info(&core_modl, mi));
7bd4a6f5db123a492fc94fc9130130320ba8a5f7kk}