usr/src/uts/intel/pcbe/opteron_pcbe.c
author kucharsk
Thu, 27 Oct 2005 14:59:45 -0700
changeset 770 0eda482eb80f
parent 0 68f95e015346
child 948 cd52fd15e97d
permissions -rw-r--r--
6311933 rdmsr/wrmsr do not need to set/pass values via memory pointers
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 * Common Development and Distribution License, Version 1.0 only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 * (the "License").  You may not use this file except in compliance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 * with the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
770
0eda482eb80f 6311933 rdmsr/wrmsr do not need to set/pass values via memory pointers
kucharsk
parents: 0
diff changeset
    23
 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
 * Performance Counter Back-End for AMD Opteron and AMD Athlon 64 processors.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <sys/cpuvar.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <sys/param.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <sys/systm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include <sys/cpc_pcbe.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <sys/kmem.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <sys/sdt.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <sys/modctl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <sys/errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <sys/debug.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include <sys/archsystm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include <sys/x86_archext.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#include <sys/privregs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
static int opt_pcbe_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
static uint_t opt_pcbe_ncounters(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
static const char *opt_pcbe_impl_name(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
static const char *opt_pcbe_cpuref(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
static char *opt_pcbe_list_events(uint_t picnum);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
static char *opt_pcbe_list_attrs(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
static uint64_t opt_pcbe_event_coverage(char *event);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
static uint64_t opt_pcbe_overflow_bitmap(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
static int opt_pcbe_configure(uint_t picnum, char *event, uint64_t preset,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
    uint32_t flags, uint_t nattrs, kcpc_attr_t *attrs, void **data,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
    void *token);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
static void opt_pcbe_program(void *token);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
static void opt_pcbe_allstop(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
static void opt_pcbe_sample(void *token);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
static void opt_pcbe_free(void *config);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
static pcbe_ops_t opt_pcbe_ops = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
	PCBE_VER_1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
	CPC_CAP_OVERFLOW_INTERRUPT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
	opt_pcbe_ncounters,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
	opt_pcbe_impl_name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
	opt_pcbe_cpuref,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
	opt_pcbe_list_events,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
	opt_pcbe_list_attrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
	opt_pcbe_event_coverage,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
	opt_pcbe_overflow_bitmap,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
	opt_pcbe_configure,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
	opt_pcbe_program,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
	opt_pcbe_allstop,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
	opt_pcbe_sample,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
	opt_pcbe_free
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
 * Define offsets and masks for the fields in the Performance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
 * Event-Select (PES) registers.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
#define	OPT_PES_CMASK_SHIFT	24
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
#define	OPT_PES_CMASK_MASK	0xFF
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
#define	OPT_PES_INV_SHIFT	23
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
#define	OPT_PES_ENABLE_SHIFT	22
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
#define	OPT_PES_INT_SHIFT	20
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
#define	OPT_PES_PC_SHIFT	19
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
#define	OPT_PES_EDGE_SHIFT	18
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
#define	OPT_PES_OS_SHIFT	17
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
#define	OPT_PES_USR_SHIFT	16
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
#define	OPT_PES_UMASK_SHIFT	8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
#define	OPT_PES_UMASK_MASK	0xFF
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
#define	OPT_PES_INV		(1 << OPT_PES_INV_SHIFT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
#define	OPT_PES_ENABLE		(1 << OPT_PES_ENABLE_SHIFT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
#define	OPT_PES_INT		(1 << OPT_PES_INT_SHIFT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
#define	OPT_PES_PC		(1 << OPT_PES_PC_SHIFT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
#define	OPT_PES_EDGE		(1 << OPT_PES_EDGE_SHIFT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
#define	OPT_PES_OS		(1 << OPT_PES_OS_SHIFT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
#define	OPT_PES_USR		(1 << OPT_PES_USR_SHIFT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
typedef struct _opt_pcbe_config {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
	uint8_t		opt_picno;	/* Counter number: 0, 1, 2, or 3 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	uint64_t	opt_evsel;	/* Event Selection register */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
	uint64_t	opt_rawpic;	/* Raw counter value */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
} opt_pcbe_config_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
opt_pcbe_config_t nullcfgs[4] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
	{ 0, 0, 0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
	{ 1, 0, 0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	{ 2, 0, 0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
	{ 3, 0, 0 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
typedef struct _opt_event {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
	char		*name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
	uint8_t		emask;		/* Event mask setting */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
	uint8_t		umask_valid;	/* Mask of unreserved UNIT_MASK bits */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
} opt_event_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
 * Base MSR addresses for the PerfEvtSel registers and the counters themselves.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
 * Add counter number to base address to get corresponding MSR address.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
#define	PES_BASE_ADDR	0xC0010000
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
#define	PIC_BASE_ADDR	0xC0010004
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
#define	MASK48		0xFFFFFFFFFFFF
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
#define	EV_END {NULL, 0, 0}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
static opt_event_t opt_events[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
	{ "FP_dispatched_fpu_ops",				0x0, 0x1F },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
	{ "FP_cycles_no_fpu_ops_retired",			0x1, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
	{ "FP_dispatched_fpu_ops_ff",				0x2, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
	{ "LS_seg_reg_load",					0x20, 0x7F },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
	{ "LS_uarch_resync_self_modify",			0x21, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
	{ "LS_uarch_resync_snoop",				0x22, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
	{ "LS_buffer_2_full",					0x23, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
	{ "LS_locked_operation",				0x24, 0x7 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
	{ "LS_uarch_late_cancel_op",				0x25, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
	{ "LS_retired_cflush",					0x26, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
	{ "LS_retired_cpuid",					0x27, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
	{ "DC_access",						0x40, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
	{ "DC_miss",						0x41, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
	{ "DC_refill_from_L2",					0x42, 0x1F },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
	{ "DC_refill_from_system",				0x43, 0x1F },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
	{ "DC_copyback",					0x44, 0x1F },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
	{ "DC_dtlb_L1_miss_L2_hit",				0x45, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
	{ "DC_dtlb_L1_miss_L2_miss",				0x46, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
	{ "DC_misaligned_data_ref",				0x47, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
	{ "DC_uarch_late_cancel_access",			0x48, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
	{ "DC_uarch_early_cancel_access",			0x49, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
	{ "DC_1bit_ecc_error_found",				0x4A, 0x3 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
	{ "DC_dispatched_prefetch_instr",			0x4B, 0x7 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
	{ "DC_dcache_accesses_by_locks",			0x4C, 0x3 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
	{ "BU_cpu_clk_unhalted",				0x76, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
	{ "BU_internal_L2_req",					0x7D, 0x1F },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
	{ "BU_fill_req_missed_L2",				0x7E, 0x7 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
	{ "BU_fill_into_L2",					0x7F, 0x3 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
	{ "IC_fetch",						0x80, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
	{ "IC_miss",						0x81, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
	{ "IC_refill_from_L2",					0x82, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	{ "IC_refill_from_system",				0x83, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
	{ "IC_itlb_L1_miss_L2_hit",				0x84, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	{ "IC_itlb_L1_miss_L2_miss",				0x85, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
	{ "IC_uarch_resync_snoop",				0x86, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
	{ "IC_instr_fetch_stall",				0x87, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
	{ "IC_return_stack_hit",				0x88, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
	{ "IC_return_stack_overflow",				0x89, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
	{ "FR_retired_x86_instr_w_excp_intr",			0xC0, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
	{ "FR_retired_uops",					0xC1, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
	{ "FR_retired_branches_w_excp_intr",			0xC2, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
	{ "FR_retired_branches_mispred",			0xC3, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
	{ "FR_retired_taken_branches",				0xC4, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
	{ "FR_retired_taken_branches_mispred",			0xC5, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
	{ "FR_retired_far_ctl_transfer",			0xC6, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	{ "FR_retired_resyncs",					0xC7, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	{ "FR_retired_near_rets",				0xC8, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	{ "FR_retired_near_rets_mispred",			0xC9, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
	{ "FR_retired_taken_branches_mispred_addr_miscomp",	0xCA, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	{ "FR_retired_fpu_instr",				0xCB, 0xF },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
	{ "FR_retired_fastpath_double_op_instr",		0xCC, 0x7 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
	{ "FR_intr_masked_cycles",				0xCD, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
	{ "FR_intr_masked_while_pending_cycles",		0xCE, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
	{ "FR_taken_hardware_intrs",				0xCF, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
	{ "FR_nothing_to_dispatch",				0xD0, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
	{ "FR_dispatch_stalls",					0xD1, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
	{ "FR_dispatch_stall_branch_abort_to_retire",		0xD2, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
	{ "FR_dispatch_stall_serialization",			0xD3, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
	{ "FR_dispatch_stall_segment_load",			0xD4, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
	{ "FR_dispatch_stall_reorder_buffer_full",		0xD5, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
	{ "FR_dispatch_stall_resv_stations_full",		0xD6, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
	{ "FR_dispatch_stall_fpu_full",				0xD7, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
	{ "FR_dispatch_stall_ls_full",				0xD8, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
	{ "FR_dispatch_stall_waiting_all_quiet",		0xD9, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	{ "FR_dispatch_stall_far_ctl_trsfr_resync_branch_pend",	0xDA, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
	{ "FR_fpu_exception",					0xDB, 0xF },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	{ "FR_num_brkpts_dr0",					0xDC, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	{ "FR_num_brkpts_dr1",					0xDD, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
	{ "FR_num_brkpts_dr2",					0xDE, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
	{ "FR_num_brkpts_dr3",					0xDF, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
	{ "NB_mem_ctrlr_page_access",				0xE0, 0x7 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
	{ "NB_mem_ctrlr_page_table_overflow",			0xE1, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
	{ "NB_mem_ctrlr_dram_cmd_slots_missed",			0xE2, 0x0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
	{ "NB_mem_ctrlr_turnaround",				0xE3, 0x7 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
	{ "NB_mem_ctrlr_bypass_counter_saturation",		0xE4, 0xF },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
	{ "NB_sized_commands",					0xEB, 0x7F },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
	{ "NB_probe_result",					0xEC, 0xF },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
	{ "NB_ht_bus0_bandwidth",				0xF6, 0xF },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
	{ "NB_ht_bus1_bandwidth",				0xF7, 0xF },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
	{ "NB_ht_bus2_bandwidth",				0xF8, 0xF },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	EV_END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
static char	*evlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
static size_t	evlist_sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
#define	BITS(v, u, l)   \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
	(((v) >> (l)) & ((1 << (1 + (u) - (l))) - 1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
#define	OPTERON_FAMILY	15
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
opt_pcbe_init(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
	opt_event_t		*evp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
	 * Make sure this really _is_ an Opteron or Athlon 64 system. The kernel
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
	 * loads this module based on its name in the module directory, but it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
	 * could have been renamed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
	if (cpuid_getvendor(CPU) != X86_VENDOR_AMD ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
	    cpuid_getfamily(CPU) != OPTERON_FAMILY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
	 * Construct event list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
	 * First pass:  Calculate size needed. We'll need an additional byte
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
	 *		for the NULL pointer during the last strcat.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
	 * Second pass: Copy strings.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
	for (evp = opt_events; evp->name != NULL; evp++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
		evlist_sz += strlen(evp->name) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
	evlist = kmem_alloc(evlist_sz + 1, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
	evlist[0] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
	for (evp = opt_events; evp->name != NULL; evp++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
		(void) strcat(evlist, evp->name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
		(void) strcat(evlist, ",");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
	 * Remove trailing comma.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
	evlist[evlist_sz - 1] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
static uint_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
opt_pcbe_ncounters(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
	return (4);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
static const char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
opt_pcbe_impl_name(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
	return ("AMD Opteron & Athlon64");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
static const char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
opt_pcbe_cpuref(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
	return ("See Chapter 10 of the \"BIOS and Kernel Developer's Guide "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
		"for the AMD Athlon 64 and AMD Opteron Processors,\" "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
		"AMD publication #26094");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
/*ARGSUSED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
opt_pcbe_list_events(uint_t picnum)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
	return (evlist);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
opt_pcbe_list_attrs(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
	return ("edge,pc,inv,cmask,umask");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
/*ARGSUSED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
static uint64_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
opt_pcbe_event_coverage(char *event)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
	 * Fortunately, all counters can count all events.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
	return (0xF);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
static uint64_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
opt_pcbe_overflow_bitmap(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
	 * Unfortunately, this chip cannot detect which counter overflowed, so
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
	 * we must act as if they all did.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
	return (0xF);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
static opt_event_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
find_event(char *name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
	opt_event_t	*evp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
	for (evp = opt_events; evp->name != NULL; evp++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
		if (strcmp(name, evp->name) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
			return (evp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
	return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
/*ARGSUSED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
opt_pcbe_configure(uint_t picnum, char *event, uint64_t preset, uint32_t flags,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
    uint_t nattrs, kcpc_attr_t *attrs, void **data, void *token)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
	opt_pcbe_config_t	*cfg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
	opt_event_t		*evp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
	int			i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
	uint32_t		evsel = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
	 * If we've been handed an existing configuration, we need only preset
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
	 * the counter value.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
	if (*data != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
		cfg = *data;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
		cfg->opt_rawpic = preset & MASK48;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
	if (picnum >= 4)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
		return (CPC_INVALID_PICNUM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
	if ((evp = find_event(event)) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
		return (CPC_INVALID_EVENT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
	evsel |= evp->emask;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
	if (flags & CPC_COUNT_USER)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
		evsel |= OPT_PES_USR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
	if (flags & CPC_COUNT_SYSTEM)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
		evsel |= OPT_PES_OS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
	if (flags & CPC_OVF_NOTIFY_EMT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
		evsel |= OPT_PES_INT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
	for (i = 0; i < nattrs; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
		if (strcmp(attrs[i].ka_name, "edge") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
			if (attrs[i].ka_val != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
				evsel |= OPT_PES_EDGE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
		} else if (strcmp(attrs[i].ka_name, "pc") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
			if (attrs[i].ka_val != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
				evsel |= OPT_PES_PC;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
		} else if (strcmp(attrs[i].ka_name, "inv") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
			if (attrs[i].ka_val != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
				evsel |= OPT_PES_INV;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
		} else if (strcmp(attrs[i].ka_name, "cmask") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
			if ((attrs[i].ka_val | OPT_PES_CMASK_MASK) !=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
			    OPT_PES_CMASK_MASK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
				return (CPC_ATTRIBUTE_OUT_OF_RANGE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
			evsel |= attrs[i].ka_val << OPT_PES_CMASK_SHIFT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
		} else if (strcmp(attrs[i].ka_name, "umask") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
			if ((attrs[i].ka_val | evp->umask_valid) !=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
			    evp->umask_valid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
				return (CPC_ATTRIBUTE_OUT_OF_RANGE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
			evsel |= attrs[i].ka_val << OPT_PES_UMASK_SHIFT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
		} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
			return (CPC_INVALID_ATTRIBUTE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
	cfg = kmem_alloc(sizeof (*cfg), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
	cfg->opt_picno = picnum;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
	cfg->opt_evsel = evsel;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
	cfg->opt_rawpic = preset & MASK48;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
	*data = cfg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
opt_pcbe_program(void *token)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
	opt_pcbe_config_t	*cfgs[4] = { &nullcfgs[0], &nullcfgs[1],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
						&nullcfgs[2], &nullcfgs[3] };
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
	opt_pcbe_config_t	*pcfg = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
	int			i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
	uint32_t		curcr4 = getcr4();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
	 * Allow nonprivileged code to read the performance counters if desired.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
	if (kcpc_allow_nonpriv(token))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
		setcr4(curcr4 | CR4_PCE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
		setcr4(curcr4 & ~CR4_PCE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
	 * Query kernel for all configs which will be co-programmed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
	do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
		pcfg = (opt_pcbe_config_t *)kcpc_next_config(token, pcfg, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
		if (pcfg != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
			ASSERT(pcfg->opt_picno < 4);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
			cfgs[pcfg->opt_picno] = pcfg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
	} while (pcfg != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
	 * Program in two loops. The first configures and presets the counter,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
	 * and the second loop enables the counters. This ensures that the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
	 * counters are all enabled as closely together in time as possible.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
	for (i = 0; i < 4; i++) {
770
0eda482eb80f 6311933 rdmsr/wrmsr do not need to set/pass values via memory pointers
kucharsk
parents: 0
diff changeset
   435
		wrmsr(PES_BASE_ADDR + i, cfgs[i]->opt_evsel);
0eda482eb80f 6311933 rdmsr/wrmsr do not need to set/pass values via memory pointers
kucharsk
parents: 0
diff changeset
   436
		wrmsr(PIC_BASE_ADDR + i, cfgs[i]->opt_rawpic);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
	for (i = 0; i < 4; i++) {
770
0eda482eb80f 6311933 rdmsr/wrmsr do not need to set/pass values via memory pointers
kucharsk
parents: 0
diff changeset
   440
		wrmsr(PES_BASE_ADDR + i, cfgs[i]->opt_evsel |
0eda482eb80f 6311933 rdmsr/wrmsr do not need to set/pass values via memory pointers
kucharsk
parents: 0
diff changeset
   441
		    (uint64_t)(uintptr_t)OPT_PES_ENABLE);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
opt_pcbe_allstop(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
	int		i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
	for (i = 0; i < 4; i++)
770
0eda482eb80f 6311933 rdmsr/wrmsr do not need to set/pass values via memory pointers
kucharsk
parents: 0
diff changeset
   451
		wrmsr(PES_BASE_ADDR + i, 0ULL);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
	 * Disable non-privileged access to the counter registers.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
	setcr4((uint32_t)getcr4() & ~CR4_PCE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
opt_pcbe_sample(void *token)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
	opt_pcbe_config_t	*cfgs[4] = { NULL, NULL, NULL, NULL };
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
	opt_pcbe_config_t	*pcfg = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
	int			i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
	uint64_t		curpic[4];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
	uint64_t		*addrs[4];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
	uint64_t		*tmp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
	int64_t			diff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
	for (i = 0; i < 4; i++)
770
0eda482eb80f 6311933 rdmsr/wrmsr do not need to set/pass values via memory pointers
kucharsk
parents: 0
diff changeset
   471
		curpic[i] = rdmsr(PIC_BASE_ADDR);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
	 * Query kernel for all configs which are co-programmed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
	do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
		pcfg = (opt_pcbe_config_t *)kcpc_next_config(token, pcfg, &tmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
		if (pcfg != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
			ASSERT(pcfg->opt_picno < 4);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
			cfgs[pcfg->opt_picno] = pcfg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
			addrs[pcfg->opt_picno] = tmp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
	} while (pcfg != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
	for (i = 0; i < 4; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
		if (cfgs[i] == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
		diff = (curpic[i] - cfgs[i]->opt_rawpic) & MASK48;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
		*addrs[i] += diff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
		DTRACE_PROBE4(opt__pcbe__sample, int, i, uint64_t, *addrs[i],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
		    uint64_t, curpic[i], uint64_t, cfgs[i]->opt_rawpic);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
		cfgs[i]->opt_rawpic = *addrs[i] & MASK48;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
opt_pcbe_free(void *config)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
	kmem_free(config, sizeof (opt_pcbe_config_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
static struct modlpcbe modlpcbe = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
	&mod_pcbeops,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
	"AMD Performance Counters v%I%",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
	&opt_pcbe_ops
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
static struct modlinkage modl = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
	MODREV_1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
	&modlpcbe,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
_init(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
	int ret;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
	if (opt_pcbe_init() != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
	if ((ret = mod_install(&modl)) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
		kmem_free(evlist, evlist_sz + 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
	return (ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
_fini(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
	int ret;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
	if ((ret = mod_remove(&modl)) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
		kmem_free(evlist, evlist_sz + 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
	return (ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
_info(struct modinfo *mi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
	return (mod_info(&modl, mi));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
}