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