18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @file ophelp.c
38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Print out PMC event information
48cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
58cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Copyright 2002 OProfile authors
68cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Read the file COPYING
78cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
88cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author John Levon
98cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author Philippe Elie
108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define _GNU_SOURCE
138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <stdio.h>
148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <stdlib.h>
158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <string.h>
168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <limits.h>
178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_version.h"
198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_events.h"
208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_popt.h"
218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_cpufreq.h"
228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_hw_config.h"
238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_string.h"
248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_alloc_counter.h"
258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_parse_event.h"
268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_libiberty.h"
278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_xml_events.h"
288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic char const ** chosen_events;
308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic int num_chosen_events;
318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct parsed_event * parsed_events;
328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic op_cpu cpu_type = CPU_NO_GOOD;
338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic char * cpu_string;
348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic int callgraph_depth;
358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic int want_xml;
368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic poptContext optcon;
388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// return the Hamming weight (number of set bits)
418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic size_t hweight(size_t mask)
428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	size_t count = 0;
448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	while (mask) {
468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		mask &= mask - 1;
478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		count++;
488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return count;
518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic void do_arch_specific_event_help(struct op_event * event)
548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	switch (cpu_type) {
568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_PPC64_CELL:
578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		printf("Group %u :", event->val / 100);
588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	default:
608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define LINE_LEN 99
658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic void word_wrap(int indent, int *column, char *msg)
678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	while (*msg) {
698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		int wlen = strcspn(msg, " ");
708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (*column + wlen > LINE_LEN) {
718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			printf("\n%*s", indent, "");
728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			*column = indent;
738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		printf("%.*s ", wlen, msg);
758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		*column += wlen + 1;
768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		msg += wlen;
778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		msg += strspn(msg, " ");
788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * help_for_event - output event name and description
838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param i  event number
848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * output an help string for the event @i
868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic void help_for_event(struct op_event * event)
888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	int column;
908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	uint i, j;
918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	uint mask;
928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	size_t nr_counters;
938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	char buf[32];
948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	do_arch_specific_event_help(event);
968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	nr_counters = op_get_nr_counters(cpu_type);
978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/* Sanity check */
998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!event)
1008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return;
1018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	printf("%s", event->name);
1038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if(event->counter_mask != 0) {
1058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		printf(": (counter: ");
1068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		mask = event->counter_mask;
1088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (hweight(mask) == nr_counters) {
1098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			printf("all");
1108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		} else {
1118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			for (i = 0; i < CHAR_BIT * sizeof(event->counter_mask); ++i) {
1128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				if (mask & (1 << i)) {
1138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					printf("%d", i);
1148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					mask &= ~(1 << i);
1158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					if (mask)
1168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd						printf(", ");
1178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				}
1188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			}
1198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
1208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	} else	if (event->ext != NULL) {
1218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		/* Handling extended feature interface */
1228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		printf(": (ext: %s", event->ext);
1238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	} else {
1248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		/* Handling arch_perfmon case */
1258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		printf(": (counter: all");
1268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
1278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	printf(")\n\t");
1298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	column = 8;
1308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	word_wrap(8, &column, event->desc);
1318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	snprintf(buf, sizeof buf, "(min count: %d)", event->min_count);
1328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	word_wrap(8, &column, buf);
1338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	putchar('\n');
1348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (strcmp(event->unit->name, "zero")) {
1368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		printf("\tUnit masks (default 0x%x)\n",
1388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		       event->unit->default_mask);
1398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		printf("\t----------\n");
1408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		for (j = 0; j < event->unit->num; j++) {
1428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			printf("\t0x%.2x: ",
1438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			       event->unit->um[j].value);
1448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			column = 14;
1458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			word_wrap(14, &column, event->unit->um[j].desc);
1468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			putchar('\n');
1478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
1488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
1498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
1508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic void check_event(struct parsed_event * pev,
1538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			struct op_event const * event)
1548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
1558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	int ret;
1568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	int min_count;
1578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	int const callgraph_min_count_scale = 15;
1588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!event) {
1608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event = find_event_by_name(pev->name, 0, 0);
1618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (event)
1628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			fprintf(stderr, "Invalid unit mask %x for event %s\n",
1638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				pev->unit_mask, pev->name);
1648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		else
1658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			fprintf(stderr, "No event named %s is available.\n",
1668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				pev->name);
1678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit(EXIT_FAILURE);
1688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
1698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	ret = op_check_events(0, event->val, pev->unit_mask, cpu_type);
1718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (ret & OP_INVALID_UM) {
1738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fprintf(stderr, "Invalid unit mask 0x%x for event %s\n",
1748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		        pev->unit_mask, pev->name);
1758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit(EXIT_FAILURE);
1768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
1778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	min_count = event->min_count;
1798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (callgraph_depth)
1808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		min_count *= callgraph_min_count_scale;
1818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (pev->count < min_count) {
1828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fprintf(stderr, "Count %d for event %s is below the "
1838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		        "minimum %d\n", pev->count, pev->name, min_count);
1848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit(EXIT_FAILURE);
1858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
1868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
1878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic void resolve_events(void)
1908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
1918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	size_t count, count_events;
1928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	size_t i, j;
1938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	size_t * counter_map;
1948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	size_t nr_counters = op_get_nr_counters(cpu_type);
1958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	struct op_event const * selected_events[num_chosen_events];
1968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	count = parse_events(parsed_events, num_chosen_events, chosen_events);
1988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (i = 0; i < count; ++i) {
2008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		for (j = i + 1; j < count; ++j) {
2018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			struct parsed_event * pev1 = &parsed_events[i];
2028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			struct parsed_event * pev2 = &parsed_events[j];
2038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if (!strcmp(pev1->name, pev2->name) &&
2058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			    pev1->count == pev2->count &&
2068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			    pev1->unit_mask == pev2->unit_mask &&
2078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			    pev1->kernel == pev2->kernel &&
2088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			    pev1->user == pev2->user) {
2098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				fprintf(stderr, "All events must be distinct.\n");
2108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				exit(EXIT_FAILURE);
2118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			}
2128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
2138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
2148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (i = 0, count_events = 0; i < count; ++i) {
2168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		struct parsed_event * pev = &parsed_events[i];
2178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		/* For 0 unit mask always do wild card match */
2198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		selected_events[i] = find_event_by_name(pev->name, pev->unit_mask,
2208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					pev->unit_mask ? pev->unit_mask_valid : 0);
2218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		check_event(pev, selected_events[i]);
2228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (selected_events[i]->ext == NULL) {
2248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			count_events++;
2258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
2268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
2278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (count_events > nr_counters) {
2288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fprintf(stderr, "Not enough hardware counters. "
2298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				"Need %lu counters but only has %lu.\n",
2308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				(unsigned long) count_events,
2318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				(unsigned long) nr_counters);
2328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit(EXIT_FAILURE);
2338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
2348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	counter_map = map_event_to_counter(selected_events, count, cpu_type);
2368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!counter_map) {
2388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fprintf(stderr, "Couldn't allocate hardware counters for the selected events.\n");
2398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit(EXIT_FAILURE);
2408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
2418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (i = 0; i < count; ++i)
2438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if(counter_map[i] == (size_t)-1)
2448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if (selected_events[i]->ext != NULL)
2458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				printf("%s ", (char*) selected_events[i]->ext);
2468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			else
2478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				printf("N/A ");
2488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		else
2498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			printf("%d ", (unsigned int) counter_map[i]);
2508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	printf("\n");
2518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	free(counter_map);
2538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
2548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic void show_unit_mask(void)
2578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
2588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	struct op_event * event;
2598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	size_t count;
2608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	count = parse_events(parsed_events, num_chosen_events, chosen_events);
2628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (count > 1) {
2638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fprintf(stderr, "More than one event specified.\n");
2648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit(EXIT_FAILURE);
2658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
2668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	event = find_event_by_name(parsed_events[0].name, 0, 0);
2688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!event) {
2708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fprintf(stderr, "No such event found.\n");
2718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit(EXIT_FAILURE);
2728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
2738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	printf("%d\n", event->unit->default_mask);
2758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
2768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic void show_default_event(void)
2798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
2808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	struct op_default_event_descr descr;
2818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	op_default_event(cpu_type, &descr);
2838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (descr.name[0] == '\0')
2858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return;
2868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	printf("%s:%lu:%lu:1:1\n", descr.name, descr.count, descr.um);
2888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
2898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic int show_vers;
2928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic int get_cpu_type;
2938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic int check_events;
2948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic int unit_mask;
2958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic int get_default_event;
2968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic struct poptOption options[] = {
2988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	{ "cpu-type", 'c', POPT_ARG_STRING, &cpu_string, 0,
2998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  "use the given CPU type", "cpu type", },
3008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	{ "check-events", 'e', POPT_ARG_NONE, &check_events, 0,
3018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  "check the given event descriptions for validity", NULL, },
3028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	{ "unit-mask", 'u', POPT_ARG_NONE, &unit_mask, 0,
3038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  "default unit mask for the given event", NULL, },
3048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	{ "get-cpu-type", 'r', POPT_ARG_NONE, &get_cpu_type, 0,
3058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  "show the auto-detected CPU type", NULL, },
3068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	{ "get-default-event", 'd', POPT_ARG_NONE, &get_default_event, 0,
3078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  "get the default event", NULL, },
3088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	{ "callgraph", '\0', POPT_ARG_INT, &callgraph_depth, 0,
3098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	  "use this callgraph depth", "callgraph depth", },
3108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	{ "version", 'v', POPT_ARG_NONE, &show_vers, 0,
3118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	   "show version", NULL, },
3128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	{ "xml", 'X', POPT_ARG_NONE, &want_xml, 0,
3138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	   "list events as XML", NULL, },
3148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	POPT_AUTOHELP
3158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	{ NULL, 0, 0, NULL, 0, NULL, NULL, },
3168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd};
3178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
3198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * get_options - process command line
3208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param argc  program arg count
3218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param argv  program arg array
3228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
3238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Process the arguments, fatally complaining on error.
3248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
3258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic void get_options(int argc, char const * argv[])
3268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
3278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	optcon = op_poptGetContext(NULL, argc, argv, options, 0);
3288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (show_vers)
3308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		show_version(argv[0]);
3318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/* non-option, must be a valid event name or event specs */
3338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	chosen_events = poptGetArgs(optcon);
3348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if(chosen_events) {
3368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		num_chosen_events = 0;
3378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		while (chosen_events[num_chosen_events] != NULL)
3388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			num_chosen_events++;
3398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
3408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/* don't free the context now, we need chosen_events */
3428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
3438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/** make valgrind happy */
3468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic void cleanup(void)
3478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
3488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	int i;
3498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (parsed_events) {
3508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		for (i = 0; i < num_chosen_events; ++i) {
3518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if (parsed_events[i].name)
3528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				free(parsed_events[i].name);
3538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
3548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
3558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	op_free_events();
3568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (optcon)
3578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		poptFreeContext(optcon);
3588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (parsed_events)
3598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		free(parsed_events);
3608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
3618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define MAX_LINE 256
3648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddint main(int argc, char const * argv[])
3658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
3668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	struct list_head * events;
3678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	struct list_head * pos;
3688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	char const * pretty;
3698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	char title[10 * MAX_LINE];
3708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	char const * event_doc = "";
3718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	atexit(cleanup);
3738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	get_options(argc, argv);
3758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/* usefull for testing purpose to allow to force the cpu type
3778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * with --cpu-type */
3788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (cpu_string) {
3798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		cpu_type = op_get_cpu_number(cpu_string);
3808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	} else {
3818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		cpu_type = op_get_cpu_type();
3828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
3838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (cpu_type == CPU_NO_GOOD) {
3858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fprintf(stderr, "cpu_type '%s' is not valid\n",
3868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		        cpu_string ? cpu_string : "unset");
3878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fprintf(stderr, "you should upgrade oprofile or force the "
3888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"use of timer mode\n");
3898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit(EXIT_FAILURE);
3908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
3918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	parsed_events = (struct parsed_event *)xcalloc(num_chosen_events,
3938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		sizeof(struct parsed_event));
3948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	pretty = op_get_cpu_type_str(cpu_type);
3968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (get_cpu_type) {
3988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		printf("%s\n", pretty);
3998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit(EXIT_SUCCESS);
4008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
4018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (get_default_event) {
4038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		show_default_event();
4048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit(EXIT_SUCCESS);
4058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
4068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (cpu_type == CPU_TIMER_INT) {
4088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (!check_events)
4098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			printf("Using timer interrupt.\n");
4108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit(EXIT_SUCCESS);
4118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
4128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	events = op_events(cpu_type);
4148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!chosen_events && (unit_mask || check_events)) {
4168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fprintf(stderr, "No events given.\n");
4178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit(EXIT_FAILURE);
4188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
4198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (unit_mask) {
4218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		show_unit_mask();
4228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit(EXIT_SUCCESS);
4238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
4248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (check_events) {
4268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		resolve_events();
4278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit(EXIT_SUCCESS);
4288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
4298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/* without --check-events, the only argument must be an event name */
4318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (chosen_events && chosen_events[0]) {
4328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (chosen_events[1]) {
4338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			fprintf(stderr, "Too many arguments.\n");
4348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			exit(EXIT_FAILURE);
4358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
4368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		list_for_each(pos, events) {
4388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			struct op_event * event = list_entry(pos, struct op_event, event_next);
4398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if (strcmp(event->name, chosen_events[0]) == 0) {
4418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				char const * map = find_mapping_for_event(event->val, cpu_type);
4428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				if (map) {
4438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					printf("%d %s\n", event->val, map);
4448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				} else {
4458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					printf("%d\n", event->val);
4468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				}
4478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				exit(EXIT_SUCCESS);
4488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			}
4498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
4508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fprintf(stderr, "No such event \"%s\"\n", chosen_events[0]);
4518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit(EXIT_FAILURE);
4528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
4538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/* default: list all events */
4558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	switch (cpu_type) {
4578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_HAMMER:
4588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
4598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"See BIOS and Kernel Developer's Guide for AMD Athlon and AMD Opteron Processors\n"
4608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"(26094.pdf), Section 10.2\n\n";
4618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
4628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_FAMILY10:
4638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
4648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"See BIOS and Kernel Developer's Guide for AMD Family 10h Processors\n"
4658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"(31116.pdf), Section 3.14\n\n";
4668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
4678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_FAMILY11H:
4688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
4698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"See BIOS and Kernel Developer's Guide for AMD Family 11h Processors\n"
4708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"(41256.pdf), Section 3.14\n\n";
4718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
4727a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown	case CPU_FAMILY12H:
4737a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		event_doc =
4747a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			"See BIOS and Kernel Developer's Guide for AMD Family 12h Processors\n";
4757a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		break;
4767a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown	case CPU_FAMILY14H:
4777a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		event_doc =
4787a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			"See BIOS and Kernel Developer's Guide for AMD Family 14h Processors\n";
4797a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		break;
4807a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown	case CPU_FAMILY15H:
4817a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		event_doc =
4827a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			"See BIOS and Kernel Developer's Guide for AMD Family 15h Processors\n";
4837a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		break;
4848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_ATHLON:
4858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
4868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"See AMD Athlon Processor x86 Code Optimization Guide\n"
4878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"(22007.pdf), Appendix D\n\n";
4888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
4898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_PPRO:
4908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_PII:
4918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_PIII:
4928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_P6_MOBILE:
4938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_P4:
4948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_P4_HT2:
4958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_CORE:
4968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_CORE_2:
4978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_CORE_I7:
4987a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown	case CPU_NEHALEM:
4997a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown	case CPU_WESTMERE:
5008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_ATOM:
5018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
5028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"See Intel Architecture Developer's Manual Volume 3B, Appendix A and\n"
5038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"Intel Architecture Optimization Reference Manual (730795-001)\n\n";
5048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
5058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_ARCH_PERFMON:
5078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
5088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"See Intel 64 and IA-32 Architectures Software Developer's Manual\n"
5098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"Volume 3B (Document 253669) Chapter 18 for architectural perfmon events\n"
5108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"This is a limited set of fallback events because oprofile doesn't know your CPU\n";
5118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
5128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_IA64:
5148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_IA64_1:
5158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_IA64_2:
5168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
5178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"See Intel Itanium Processor Reference Manual\n"
5188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"for Software Development (Document 245320-003),\n"
5198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"Intel Itanium Processor Reference Manual\n"
5208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"for Software Optimization (Document 245473-003),\n"
5218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"Intel Itanium 2 Processor Reference Manual\n"
5228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"for Software Development and Optimization (Document 251110-001)\n\n";
5238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
5248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_AXP_EV4:
5258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_AXP_EV5:
5268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_AXP_PCA56:
5278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_AXP_EV6:
5288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_AXP_EV67:
5298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
5308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"See Alpha Architecture Reference Manual\n"
5318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"http://download.majix.org/dec/alpha_arch_ref.pdf\n";
5328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
5338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_ARM_XSCALE1:
5348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_ARM_XSCALE2:
5358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
5368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"See Intel XScale Core Developer's Manual\n"
5378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"Chapter 8 Performance Monitoring\n";
5388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
5398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_ARM_MPCORE:
5408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
5418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"See ARM11 MPCore Processor Technical Reference Manual r1p0\n"
5428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"Page 3-70, performance counters\n";
5438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
5448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_ARM_V6:
5468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc = "See ARM11 Technical Reference Manual\n";
5478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd  		break;
5488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_ARM_V7:
5508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
5517a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			"See Cortex-A8 Technical Reference Manual\n"
5528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"Cortex A8 DDI (ARM DDI 0344B, revision r1p1)\n";
5538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
5548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5557a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown	case CPU_ARM_V7_CA9:
5567a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		event_doc =
5577a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			"See Cortex-A9 Technical Reference Manual\n"
5587a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			"Cortex A9 DDI (ARM DDI 0388E, revision r2p0)\n";
5597a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		break;
5607a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown
5618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_PPC64_PA6T:
5628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
5638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"See PA6T Power Implementation Features Book IV\n"
5648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"Chapter 7 Performance Counters\n";
5658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
5668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_PPC64_POWER4:
5688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_PPC64_POWER5:
5698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_PPC64_POWER6:
5708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_PPC64_POWER5p:
5718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_PPC64_POWER5pp:
5728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_PPC64_970:
5738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_PPC64_970MP:
5748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_PPC64_POWER7:
5758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_PPC64_IBM_COMPAT_V1:
5768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
5778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"Obtain PowerPC64 processor documentation at:\n"
5788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"http://www-306.ibm.com/chips/techlib/techlib.nsf/productfamilies/PowerPC\n";
5798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
5808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_PPC64_CELL:
5828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
5838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"Obtain Cell Broadband Engine documentation at:\n"
5848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"http://www-306.ibm.com/chips/techlib/techlib.nsf/products/Cell_Broadband_Engine\n";
5858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
5868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_MIPS_20K:
5888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
5898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"See Programming the MIPS64 20Kc Processor Core User's "
5908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		"manual available from www.mips.com\n";
5918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
5928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_MIPS_24K:
5938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
5948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"See Programming the MIPS32 24K Core "
5958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"available from www.mips.com\n";
5968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
5978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_MIPS_25K:
5988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
5998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"See Programming the MIPS64 25Kf Processor Core User's "
6008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"manual available from www.mips.com\n";
6018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
6028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_MIPS_34K:
6038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
6048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"See Programming the MIPS32 34K Core Family "
6058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"available from www.mips.com\n";
6068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
6077a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown	case CPU_MIPS_74K:
6087a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		event_doc =
6097a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			"See Programming the MIPS32 74K Core Family "
6107a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			"available from www.mips.com\n";
6117a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		break;
6127a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown	case CPU_MIPS_1004K:
6137a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		event_doc =
6147a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			"See Programming the MIPS32 1004K Core Family "
6157a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			"available from www.mips.com\n";
6167a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		break;
6178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_MIPS_5K:
6188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
6198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"See Programming the MIPS64 5K Processor Core Family "
6208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"Software User's manual available from www.mips.com\n";
6218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
6228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_MIPS_R10000:
6238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_MIPS_R12000:
6248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
6258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"See NEC R10000 / R12000 User's Manual\n"
6268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"http://www.necelam.com/docs/files/U10278EJ3V0UM00.pdf\n";
6278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
6288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_MIPS_RM7000:
6298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
6308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"See RM7000 Family User Manual "
6318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"available from www.pmc-sierra.com\n";
6328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
6338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_MIPS_RM9000:
6348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
6358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"See RM9000x2 Family User Manual "
6368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"available from www.pmc-sierra.com\n";
6378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
6388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_MIPS_SB1:
6398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_MIPS_VR5432:
6408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
6418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"See NEC VR5443 User's Manual, Volume 1\n"
6428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"http://www.necelam.com/docs/files/1375_V1.pdf\n";
6438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
6448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_MIPS_VR5500:
6458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
6468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"See NEC R10000 / R12000 User's Manual\n"
6478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"http://www.necel.com/nesdis/image/U16677EJ3V0UM00.pdf\n";
6488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
6498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6507a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown	case CPU_MIPS_LOONGSON2:
6517a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		event_doc =
6527a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			"See loongson2 RISC Microprocessor Family Reference Manual\n";
6537a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		break;
6547a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown
6558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_PPC_E500:
6568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_PPC_E500_2:
6578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
6588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"See PowerPC e500 Core Complex Reference Manual\n"
6598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"Chapter 7: Performance Monitor\n"
6608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"Downloadable from http://www.freescale.com\n";
6618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
6628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_PPC_E300:
6648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
6658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"See PowerPC e300 Core Reference Manual\n"
6668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"Downloadable from http://www.freescale.com\n";
6678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
6688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_PPC_7450:
6708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
6718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"See MPC7450 RISC Microprocessor Family Reference "
6728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"Manual\n"
6738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"Chapter 11: Performance Monitor\n"
6748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"Downloadable from http://www.freescale.com\n";
6758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		break;
6768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case CPU_AVR32:
6788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_doc =
6798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"See AVR32 Architecture Manual\n"
6808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"Chapter 6: Performance Counters\n"
6818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			"http://www.atmel.com/dyn/resources/prod_documents/doc32000.pdf\n";
6828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		case CPU_RTC:
6848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			break;
6858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		// don't use default, if someone add a cpu he wants a compiler warning
6878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		// if he forgets to handle it here.
6888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		case CPU_TIMER_INT:
6898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		case CPU_NO_GOOD:
6908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		case MAX_CPU_TYPE:
6918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			printf("%d is not a valid processor type.\n", cpu_type);
6928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			exit(EXIT_FAILURE);
6938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
6948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	sprintf(title, "oprofile: available events for CPU type \"%s\"\n\n", pretty);
6968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (want_xml)
6978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		open_xml_events(title, event_doc, cpu_type);
6988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	else
6998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		printf("%s%s", title, event_doc);
7008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	list_for_each(pos, events) {
7028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		struct op_event * event = list_entry(pos, struct op_event, event_next);
7038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (want_xml)
7048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			xml_help_for_event(event);
7058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		else
7068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			help_for_event(event);
7078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
7088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (want_xml)
7108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		close_xml_events();
7118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return EXIT_SUCCESS;
7138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
714