110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/** 210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @file op_events.c 310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * Details of PMC profiling events 410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * 510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * You can have silliness here. 610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * 710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Copyright 2002 OProfile authors 810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Read the file COPYING 910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * 1010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @author John Levon 1110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @author Philippe Elie 1210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */ 1310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 1410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_events.h" 1510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_libiberty.h" 1610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_fileio.h" 1710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_string.h" 1810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_cpufreq.h" 195a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng#include "op_hw_specific.h" 2010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 2110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <string.h> 2210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <stdlib.h> 2310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <stdio.h> 2410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 2510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic LIST_HEAD(events_list); 2610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic LIST_HEAD(um_list); 2710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 2810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic char const * filename; 2910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic unsigned int line_nr; 3010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 315a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstatic void delete_event(struct op_event * event); 325a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstatic void read_events(char const * file); 335a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstatic void read_unit_masks(char const * file); 345a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstatic void free_unit_mask(struct op_unit_mask * um); 355a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng 365a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstatic char *build_fn(const char *cpu_name, const char *fn) 375a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng{ 385a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng char *s; 395a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng static const char *dir; 405a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (dir == NULL) 415a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng dir = getenv("OPROFILE_EVENTS_DIR"); 425a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (dir == NULL) 435a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng dir = OP_DATADIR; 445a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng s = xmalloc(strlen(dir) + strlen(cpu_name) + strlen(fn) + 5); 455a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng sprintf(s, "%s/%s/%s", dir, cpu_name, fn); 465a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng return s; 475a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng} 485a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng 4910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void parse_error(char const * context) 5010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 5110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fprintf(stderr, "oprofile: parse error in %s, line %u\n", 5210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project filename, line_nr); 5310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fprintf(stderr, "%s\n", context); 5410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 5510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 5610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 5710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 5810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic int parse_int(char const * str) 5910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 6010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project int value; 6110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (sscanf(str, "%d", &value) != 1) 6210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("expected decimal value"); 6310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 6410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return value; 6510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 6610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 6710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 6810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic int parse_hex(char const * str) 6910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 7010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project int value; 7110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* 0x/0X to force the use of hexa notation for field intended to 7210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project be in hexadecimal */ 7310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (sscanf(str, "0x%x", &value) != 1 && 7410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project sscanf(str, "0X%x", &value) != 1) 7510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("expected hexadecimal value"); 7610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 7710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return value; 7810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 7910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 8010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 8110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic u64 parse_long_hex(char const * str) 8210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 8310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project u64 value; 8410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (sscanf(str, "%Lx", &value) != 1) 8510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("expected long hexadecimal value"); 8610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 8710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fflush(stderr); 8810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return value; 8910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 9010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 915a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstatic void include_um(const char *start, const char *end) 925a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng{ 935a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng char *s; 945a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng char cpu[end - start + 1]; 955a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng int old_line_nr; 965a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng const char *old_filename; 975a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng 985a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng strncpy(cpu, start, end - start); 995a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng cpu[end - start] = 0; 1005a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng s = build_fn(cpu, "unit_masks"); 1015a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng old_line_nr = line_nr; 1025a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng old_filename = filename; 1035a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng read_unit_masks(s); 1045a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng line_nr = old_line_nr; 1055a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng filename = old_filename; 1065a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng free(s); 1075a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng} 10810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 10910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/* name:MESI type:bitmask default:0x0f */ 11010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void parse_um(struct op_unit_mask * um, char const * line) 11110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 11210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project int seen_name = 0; 11310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project int seen_type = 0; 11410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project int seen_default = 0; 11510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char const * valueend = line + 1; 11610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char const * tagend = line + 1; 11710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char const * start = line; 11810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 11910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project while (*valueend) { 12010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project valueend = skip_nonws(valueend); 12110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 12210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project while (*tagend != ':' && *tagend) 12310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project ++tagend; 12410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 12510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (valueend == tagend) 12610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project break; 12710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 12810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!*tagend) 12910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("parse_um() expected :value"); 13010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 13110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project ++tagend; 13210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 1335a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (strisprefix(start, "include")) { 1345a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (seen_name + seen_type + seen_default > 0) 1355a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng parse_error("include must be on its own"); 1365a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng free_unit_mask(um); 1375a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng include_um(tagend, valueend); 1385a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng return; 1395a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng } 1405a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng 14110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (strisprefix(start, "name")) { 14210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (seen_name) 14310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("duplicate name: tag"); 14410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project seen_name = 1; 14510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project um->name = op_xstrndup(tagend, valueend - tagend); 14610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else if (strisprefix(start, "type")) { 14710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (seen_type) 14810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("duplicate type: tag"); 14910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project seen_type = 1; 15010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (strisprefix(tagend, "mandatory")) { 15110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project um->unit_type_mask = utm_mandatory; 15210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else if (strisprefix(tagend, "bitmask")) { 15310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project um->unit_type_mask = utm_bitmask; 15410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else if (strisprefix(tagend, "exclusive")) { 15510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project um->unit_type_mask = utm_exclusive; 15610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else { 15710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("invalid unit mask type"); 15810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 15910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else if (strisprefix(start, "default")) { 16010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (seen_default) 16110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("duplicate default: tag"); 16210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project seen_default = 1; 16310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project um->default_mask = parse_hex(tagend); 16410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else { 16510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("invalid unit mask tag"); 16610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 16710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 16810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project valueend = skip_ws(valueend); 16910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project tagend = valueend; 17010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project start = valueend; 17110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 1725a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng 1735a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (!um->name) 1745a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng parse_error("Missing name for unit mask"); 1755a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (!seen_type) 1765a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng parse_error("Missing type for unit mask"); 17710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 17810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 17910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 18010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/* \t0x08 (M)odified cache state */ 18110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void parse_um_entry(struct op_described_um * entry, char const * line) 18210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 18310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char const * c = line; 18410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 18510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project c = skip_ws(c); 18610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project entry->value = parse_hex(c); 18710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project c = skip_nonws(c); 18810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 18910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!*c) 19010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("invalid unit mask entry"); 19110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 19210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project c = skip_ws(c); 19310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 19410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!*c) 19510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("invalid unit mask entry"); 19610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 19710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project entry->desc = xstrdup(c); 19810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 19910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 20010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 20110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic struct op_unit_mask * new_unit_mask(void) 20210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 20310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct op_unit_mask * um = xmalloc(sizeof(struct op_unit_mask)); 20410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project memset(um, '\0', sizeof(struct op_unit_mask)); 20510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project list_add_tail(&um->um_next, &um_list); 20610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 20710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return um; 20810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 20910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 2105a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstatic void free_unit_mask(struct op_unit_mask * um) 2115a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng{ 2125a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng list_del(&um->um_next); 2135a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng free(um); 2145a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng} 21510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 21610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/* 21710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * name:zero type:mandatory default:0x0 21810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * \t0x0 No unit mask 21910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */ 22010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void read_unit_masks(char const * file) 22110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 22210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct op_unit_mask * um = NULL; 22310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char * line; 22410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project FILE * fp = fopen(file, "r"); 22510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 22610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!fp) { 22710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fprintf(stderr, 22810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project "oprofile: could not open unit mask description file %s\n", file); 22910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 23010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 23110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 23210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project filename = file; 23310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project line_nr = 1; 23410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 23510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project line = op_get_line(fp); 23610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 23710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project while (line) { 23810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (empty_line(line) || comment_line(line)) 23910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project goto next; 24010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 24110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (line[0] != '\t') { 24210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project um = new_unit_mask(); 24310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_um(um, line); 24410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else { 24510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!um) 24610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("no unit mask name line"); 24710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (um->num >= MAX_UNIT_MASK) 24810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("oprofile: maximum unit mask entries exceeded"); 24910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 25010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_um_entry(&um->um[um->num], line); 25110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project ++(um->num); 25210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 25310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 25410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectnext: 25510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(line); 25610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project line = op_get_line(fp); 25710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project ++line_nr; 25810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 25910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 26010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fclose(fp); 26110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 26210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 26310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 26410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic u32 parse_counter_mask(char const * str) 26510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 26610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project u32 mask = 0; 26710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char const * numstart = str; 26810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 26910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project while (*numstart) { 27010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project mask |= 1 << parse_int(numstart); 27110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 27210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project while (*numstart && *numstart != ',') 27310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project ++numstart; 27410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* skip , unless we reach eos */ 27510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (*numstart) 27610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project ++numstart; 27710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 27810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project numstart = skip_ws(numstart); 27910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 28010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 28110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return mask; 28210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 28310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 2845a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstatic struct op_unit_mask * try_find_um(char const * value) 28510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 28610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct list_head * pos; 28710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 28810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project list_for_each(pos, &um_list) { 28910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct op_unit_mask * um = list_entry(pos, struct op_unit_mask, um_next); 2905a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (strcmp(value, um->name) == 0) { 2915a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng um->used = 1; 29210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return um; 2935a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng } 29410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 2955a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng return NULL; 2965a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng} 29710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 2985a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstatic struct op_unit_mask * find_um(char const * value) 2995a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng{ 3005a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng struct op_unit_mask * um = try_find_um(value); 3015a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (um) 3025a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng return um; 30310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fprintf(stderr, "oprofile: could not find unit mask %s\n", value); 30410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 30510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 30610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 3075a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng/* um:a,b,c,d merge multiple unit masks */ 3085a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstatic struct op_unit_mask * merge_um(char * value) 3095a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng{ 3105a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng int num; 3115a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng char *s; 3125a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng struct op_unit_mask *new, *um; 3135a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng enum unit_mask_type type = -1U; 3145a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng 3155a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng um = try_find_um(value); 3165a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (um) 3175a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng return um; 3185a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng 3195a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng new = new_unit_mask(); 3205a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng new->name = xstrdup(value); 3215a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng new->used = 1; 3225a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng num = 0; 3235a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng while ((s = strsep(&value, ",")) != NULL) { 3245a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng unsigned c; 3255a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng um = find_um(s); 3265a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (type == -1U) 3275a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng type = um->unit_type_mask; 3285a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (um->unit_type_mask != type) 3295a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng parse_error("combined unit mask must be all the same types"); 3305a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (type != utm_bitmask && type != utm_exclusive) 3315a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng parse_error("combined unit mask must be all bitmasks or exclusive"); 3325a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng new->default_mask |= um->default_mask; 3335a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng new->num += um->num; 3345a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (new->num > MAX_UNIT_MASK) 3355a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng parse_error("too many members in combined unit mask"); 3365a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng for (c = 0; c < um->num; c++, num++) { 3375a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng new->um[num] = um->um[c]; 3385a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng new->um[num].desc = xstrdup(new->um[num].desc); 3395a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng } 3405a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng } 3415a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (type == -1U) 3425a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng parse_error("Empty unit mask"); 3435a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng new->unit_type_mask = type; 3445a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng return new; 3455a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng} 34610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 34710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/* parse either a "tag:value" or a ": trailing description string" */ 34810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic int next_token(char const ** cp, char ** name, char ** value) 34910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 35010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project size_t tag_len; 35110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project size_t val_len; 35210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char const * c = *cp; 35310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char const * end; 35410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char const * colon; 35510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 35610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project c = skip_ws(c); 35710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project end = colon = c; 35810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project end = skip_nonws(end); 35910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 36010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project colon = strchr(colon, ':'); 36110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 36210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!colon) { 36310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (*c) 36410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("next_token(): garbage at end of line"); 36510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return 0; 36610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 36710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 36810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (colon >= end) 36910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("next_token() expected ':'"); 37010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 37110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project tag_len = colon - c; 37210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project val_len = end - (colon + 1); 37310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 37410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!tag_len) { 37510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* : trailing description */ 37610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project end = skip_ws(end); 37710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *name = xstrdup("desc"); 37810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *value = xstrdup(end); 37910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project end += strlen(end); 38010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else { 38110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* tag:value */ 38210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *name = op_xstrndup(c, tag_len); 38310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *value = op_xstrndup(colon + 1, val_len); 38410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project end = skip_ws(end); 38510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 38610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 38710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *cp = end; 38810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return 1; 38910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 39010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 3915a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstatic void include_events (char *value) 3925a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng{ 3935a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng char * event_file; 3945a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng const char *old_filename; 3955a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng int old_line_nr; 3965a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng 3975a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng event_file = build_fn(value, "events"); 3985a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng old_line_nr = line_nr; 3995a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng old_filename = filename; 4005a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng read_events(event_file); 4015a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng line_nr = old_line_nr; 4025a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng filename = old_filename; 4035a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng free(event_file); 4045a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng} 40510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 40610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic struct op_event * new_event(void) 40710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 40810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct op_event * event = xmalloc(sizeof(struct op_event)); 40910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project memset(event, '\0', sizeof(struct op_event)); 41010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project list_add_tail(&event->event_next, &events_list); 41110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 41210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return event; 41310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 41410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 4155a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstatic void free_event(struct op_event * event) 4165a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng{ 4175a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng list_del(&event->event_next); 4185a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng free(event); 4195a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng} 42010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 42110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/* event:0x00 counters:0 um:zero minimum:4096 name:ISSUES : Total issues */ 4225a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng/* event:0x00 ext:xxxxxx um:zero minimum:4096 name:ISSUES : Total issues */ 42310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void read_events(char const * file) 42410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 42510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct op_event * event = NULL; 42610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char * line; 42710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char * name; 42810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char * value; 42910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char const * c; 4305a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng int seen_event, seen_counters, seen_um, seen_minimum, seen_name, seen_ext; 43110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project FILE * fp = fopen(file, "r"); 4325a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng int tags; 43310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 43410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!fp) { 43510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fprintf(stderr, "oprofile: could not open event description file %s\n", file); 43610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 43710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 43810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 43910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project filename = file; 44010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project line_nr = 1; 44110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 44210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project line = op_get_line(fp); 44310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 44410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project while (line) { 44510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (empty_line(line) || comment_line(line)) 44610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project goto next; 44710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 4485a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng tags = 0; 44910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project seen_name = 0; 45010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project seen_event = 0; 45110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project seen_counters = 0; 4525a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng seen_ext = 0; 45310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project seen_um = 0; 45410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project seen_minimum = 0; 45510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project event = new_event(); 4565a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng event->filter = -1; 4575a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng event->ext = NULL; 4585a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng 45910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project c = line; 46010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project while (next_token(&c, &name, &value)) { 46110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (strcmp(name, "name") == 0) { 46210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (seen_name) 46310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("duplicate name: tag"); 46410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project seen_name = 1; 46510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (strchr(value, '/') != NULL) 46610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("invalid event name"); 46710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (strchr(value, '.') != NULL) 46810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("invalid event name"); 46910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project event->name = value; 47010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else if (strcmp(name, "event") == 0) { 47110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (seen_event) 47210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("duplicate event: tag"); 47310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project seen_event = 1; 47410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project event->val = parse_hex(value); 47510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(value); 47610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else if (strcmp(name, "counters") == 0) { 47710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (seen_counters) 47810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("duplicate counters: tag"); 47910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project seen_counters = 1; 4805a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (!strcmp(value, "cpuid")) 4815a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng event->counter_mask = arch_get_counter_mask(); 4825a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng else 4835a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng event->counter_mask = parse_counter_mask(value); 48410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(value); 4855a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng } else if (strcmp(name, "ext") == 0) { 4865a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (seen_ext) 4875a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng parse_error("duplicate ext: tag"); 4885a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng seen_ext = 1; 4895a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng event->ext = value; 49010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else if (strcmp(name, "um") == 0) { 49110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (seen_um) 49210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("duplicate um: tag"); 49310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project seen_um = 1; 4945a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (strchr(value, ',')) 4955a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng event->unit = merge_um(value); 4965a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng else 4975a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng event->unit = find_um(value); 49810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(value); 49910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else if (strcmp(name, "minimum") == 0) { 50010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (seen_minimum) 50110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("duplicate minimum: tag"); 50210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project seen_minimum = 1; 50310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project event->min_count = parse_int(value); 50410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(value); 50510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else if (strcmp(name, "desc") == 0) { 50610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project event->desc = value; 5075a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng } else if (strcmp(name, "filter") == 0) { 5085a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng event->filter = parse_int(value); 5095a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng free(value); 5105a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng } else if (strcmp(name, "include") == 0) { 5115a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (tags > 0) 5125a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng parse_error("tags before include:"); 5135a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng free_event(event); 5145a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng include_events(value); 5155a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng free(value); 5165a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng c = skip_ws(c); 5175a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (*c != '\0' && *c != '#') 5185a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng parse_error("non whitespace after include:"); 51910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else { 52010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("unknown tag"); 52110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 5225a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng tags++; 52310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 52410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(name); 52510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 52610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectnext: 52710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(line); 52810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project line = op_get_line(fp); 52910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project ++line_nr; 53010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 53110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 53210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fclose(fp); 53310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 53410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 53510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 53610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/* usefull for make check */ 5375a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstatic int check_unit_mask(struct op_unit_mask const * um, 53810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char const * cpu_name) 53910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 54010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project u32 i; 5415a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng int err = 0; 54210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 54310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!um->used) { 54410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fprintf(stderr, "um %s is not used\n", um->name); 5455a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng err = EXIT_FAILURE; 54610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 54710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 54810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (um->unit_type_mask == utm_mandatory && um->num != 1) { 54910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fprintf(stderr, "mandatory um %s doesn't contain exactly one " 55010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project "entry (%s)\n", um->name, cpu_name); 5515a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng err = EXIT_FAILURE; 55210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else if (um->unit_type_mask == utm_bitmask) { 55310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project u32 default_mask = um->default_mask; 55410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project for (i = 0; i < um->num; ++i) 55510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project default_mask &= ~um->um[i].value; 55610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 55710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (default_mask) { 55810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fprintf(stderr, "um %s default mask is not valid " 55910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project "(%s)\n", um->name, cpu_name); 5605a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng err = EXIT_FAILURE; 56110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 56210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else { 56310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project for (i = 0; i < um->num; ++i) { 56410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (um->default_mask == um->um[i].value) 56510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project break; 56610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 56710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 56810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (i == um->num) { 56910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fprintf(stderr, "exclusive um %s default value is not " 57010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project "valid (%s)\n", um->name, cpu_name); 5715a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng err = EXIT_FAILURE; 57210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 57310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 5745a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng return err; 57510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 57610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 5775a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstatic void arch_filter_events(op_cpu cpu_type) 5785a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng{ 5795a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng struct list_head * pos, * pos2; 5805a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng unsigned filter = arch_get_filter(cpu_type); 5815a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (!filter) 5825a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng return; 5835a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng list_for_each_safe (pos, pos2, &events_list) { 5845a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng struct op_event * event = list_entry(pos, struct op_event, event_next); 5855a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (event->filter >= 0 && ((1U << event->filter) & filter)) 5865a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng delete_event(event); 5875a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng } 5885a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng} 58910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 5905a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstatic void load_events_name(const char *cpu_name) 59110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 59210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char * event_file; 59310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char * um_file; 59410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 5955a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng event_file = build_fn(cpu_name, "events"); 5965a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng um_file = build_fn(cpu_name, "unit_masks"); 59710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 5985a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng read_unit_masks(um_file); 5995a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng read_events(event_file); 6005a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng 6015a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng free(um_file); 6025a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng free(event_file); 6035a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng} 60410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 6055a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstatic void load_events(op_cpu cpu_type) 6065a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng{ 6075a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng const char * cpu_name = op_get_cpu_name(cpu_type); 6085a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng struct list_head * pos; 6095a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng int err = 0; 61010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 6115a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (!list_empty(&events_list)) 6125a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng return; 61310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 6145a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng load_events_name(cpu_name); 61510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 6165a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng arch_filter_events(cpu_type); 61710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 61810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* sanity check: all unit mask must be used */ 61910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project list_for_each(pos, &um_list) { 62010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct op_unit_mask * um = list_entry(pos, struct op_unit_mask, um_next); 6215a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng err |= check_unit_mask(um, cpu_name); 62210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 6235a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (err) 6245a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng exit(err); 62510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 62610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 62710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstruct list_head * op_events(op_cpu cpu_type) 62810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 62910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project load_events(cpu_type); 6305a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng arch_filter_events(cpu_type); 63110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return &events_list; 63210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 63310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 63410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 63510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void delete_unit_mask(struct op_unit_mask * unit) 63610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 63710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project u32 cur; 63810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project for (cur = 0 ; cur < unit->num ; ++cur) { 63910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (unit->um[cur].desc) 64010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(unit->um[cur].desc); 64110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 64210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 64310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (unit->name) 64410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(unit->name); 64510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 64610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project list_del(&unit->um_next); 64710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(unit); 64810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 64910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 65010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 65110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void delete_event(struct op_event * event) 65210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 65310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (event->name) 65410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(event->name); 65510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (event->desc) 65610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(event->desc); 65710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 65810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project list_del(&event->event_next); 65910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(event); 66010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 66110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 66210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 66310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectvoid op_free_events(void) 66410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 66510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct list_head * pos, * pos2; 66610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project list_for_each_safe(pos, pos2, &events_list) { 66710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct op_event * event = list_entry(pos, struct op_event, event_next); 66810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project delete_event(event); 66910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 67010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 67110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project list_for_each_safe(pos, pos2, &um_list) { 67210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct op_unit_mask * unit = list_entry(pos, struct op_unit_mask, um_next); 67310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project delete_unit_mask(unit); 67410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 67510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 67610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 6775a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng/* There can be actually multiple events here, so this is not quite correct */ 6785a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstatic struct op_event * find_event_any(u32 nr) 67910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 68010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct list_head * pos; 68110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 68210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project list_for_each(pos, &events_list) { 68310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct op_event * event = list_entry(pos, struct op_event, event_next); 68410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (event->val == nr) 68510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return event; 68610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 68710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 68810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return NULL; 68910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 69010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 6915a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstatic struct op_event * find_event_um(u32 nr, u32 um) 6925a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng{ 6935a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng struct list_head * pos; 6945a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng unsigned int i; 69510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 6965a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng list_for_each(pos, &events_list) { 6975a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng struct op_event * event = list_entry(pos, struct op_event, event_next); 6985a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (event->val == nr) { 6995a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng for (i = 0; i < event->unit->num; i++) { 7005a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (event->unit->um[i].value == um) 7015a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng return event; 7025a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng } 7035a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng } 7045a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng } 7055a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng 7065a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng return NULL; 7075a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng} 7085a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng 7095a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstatic FILE * open_event_mapping_file(char const * cpu_name) 71010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 71110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char * ev_map_file; 71210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char * dir; 71310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project dir = getenv("OPROFILE_EVENTS_DIR"); 71410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (dir == NULL) 71510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project dir = OP_DATADIR; 71610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 71710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project ev_map_file = xmalloc(strlen(dir) + strlen("/") + strlen(cpu_name) + 71810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project strlen("/") + + strlen("event_mappings") + 1); 71910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project strcpy(ev_map_file, dir); 72010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project strcat(ev_map_file, "/"); 72110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 72210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project strcat(ev_map_file, cpu_name); 72310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project strcat(ev_map_file, "/"); 72410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project strcat(ev_map_file, "event_mappings"); 72510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project filename = ev_map_file; 72610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return (fopen(ev_map_file, "r")); 72710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 72810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 72910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 73010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/** 73110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * This function is PPC64-specific. 73210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */ 7335a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstatic char const * get_mapping(u32 nr, FILE * fp) 73410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 73510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char * line; 73610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char * name; 73710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char * value; 73810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char const * c; 73910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char * map = NULL; 74010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project int seen_event = 0, seen_mmcr0 = 0, seen_mmcr1 = 0, seen_mmcra = 0; 74110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project u32 mmcr0 = 0; 74210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project u64 mmcr1 = 0; 74310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project u32 mmcra = 0; 74410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project int event_found = 0; 74510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 74610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project line_nr = 1; 74710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project line = op_get_line(fp); 74810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project while (line && !event_found) { 74910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (empty_line(line) || comment_line(line)) 75010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project goto next; 75110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 75210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project seen_event = 0; 75310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project seen_mmcr0 = 0; 75410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project seen_mmcr1 = 0; 75510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project seen_mmcra = 0; 75610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project mmcr0 = 0; 75710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project mmcr1 = 0; 75810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project mmcra = 0; 75910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 76010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project c = line; 76110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project while (next_token(&c, &name, &value)) { 76210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (strcmp(name, "event") == 0) { 76310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project u32 evt; 76410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (seen_event) 76510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("duplicate event tag"); 76610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project seen_event = 1; 76710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project evt = parse_hex(value); 76810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (evt == nr) 76910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project event_found = 1; 77010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(value); 77110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else if (strcmp(name, "mmcr0") == 0) { 77210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (seen_mmcr0) 77310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("duplicate mmcr0 tag"); 77410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project seen_mmcr0 = 1; 77510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project mmcr0 = parse_hex(value); 77610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(value); 77710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else if (strcmp(name, "mmcr1") == 0) { 77810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (seen_mmcr1) 77910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("duplicate mmcr1: tag"); 78010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project seen_mmcr1 = 1; 78110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project mmcr1 = parse_long_hex(value); 78210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(value); 78310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else if (strcmp(name, "mmcra") == 0) { 78410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (seen_mmcra) 78510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("duplicate mmcra: tag"); 78610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project seen_mmcra = 1; 78710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project mmcra = parse_hex(value); 78810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(value); 78910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else { 79010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project parse_error("unknown tag"); 79110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 79210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 79310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(name); 79410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 79510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectnext: 79610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(line); 79710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project line = op_get_line(fp); 79810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project ++line_nr; 79910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 80010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (event_found) { 80110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!seen_mmcr0 || !seen_mmcr1 || !seen_mmcra) { 80210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fprintf(stderr, "Error: Missing information in line %d of event mapping file %s\n", line_nr, filename); 80310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 80410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 80510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project map = xmalloc(70); 80610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project snprintf(map, 70, "mmcr0:%u mmcr1:%Lu mmcra:%u", 80710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project mmcr0, mmcr1, mmcra); 80810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 80910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 81010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return map; 81110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 81210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 81310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 81410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectchar const * find_mapping_for_event(u32 nr, op_cpu cpu_type) 81510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 81610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char const * cpu_name = op_get_cpu_name(cpu_type); 81710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project FILE * fp = open_event_mapping_file(cpu_name); 81810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char const * map = NULL; 81910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project switch (cpu_type) { 82010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_PPC64_PA6T: 82110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_PPC64_970: 82210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_PPC64_970MP: 82310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_PPC64_POWER4: 82410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_PPC64_POWER5: 82510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_PPC64_POWER5p: 82610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_PPC64_POWER5pp: 82710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_PPC64_POWER6: 8285a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng case CPU_PPC64_POWER7: 8295a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng case CPU_PPC64_IBM_COMPAT_V1: 83010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!fp) { 83110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fprintf(stderr, "oprofile: could not open event mapping file %s\n", filename); 83210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 83310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else { 83410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project map = get_mapping(nr, fp); 83510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 83610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project break; 83710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project default: 83810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project break; 83910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 84010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 84110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (fp) 84210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fclose(fp); 84310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 84410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return map; 84510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 84610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 8475a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstatic int match_event(int i, struct op_event *event, unsigned um) 8485a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng{ 8495a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng unsigned v = event->unit->um[i].value; 8505a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng 8515a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng switch (event->unit->unit_type_mask) { 8525a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng case utm_exclusive: 8535a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng case utm_mandatory: 8545a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng return v == um; 85510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 8565a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng case utm_bitmask: 8575a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng return (v & um) || (!v && v == 0); 8585a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng } 8595a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng 8605a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng abort(); 8615a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng} 8625a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng 8635a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstruct op_event * find_event_by_name(char const * name, unsigned um, int um_valid) 86410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 86510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct list_head * pos; 86610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 86710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project list_for_each(pos, &events_list) { 86810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct op_event * event = list_entry(pos, struct op_event, event_next); 8695a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (strcmp(event->name, name) == 0) { 8705a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (um_valid) { 8715a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng unsigned i; 8725a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng 8735a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng for (i = 0; i < event->unit->num; i++) 8745a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (match_event(i, event, um)) 8755a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng return event; 8765a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng continue; 8775a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng } 87810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return event; 8795a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng } 88010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 88110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 88210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return NULL; 88310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 88410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 88510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 8865a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstruct op_event * op_find_event(op_cpu cpu_type, u32 nr, u32 um) 88710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 88810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct op_event * event; 88910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 89010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project load_events(cpu_type); 89110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 8925a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng event = find_event_um(nr, um); 89310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 89410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return event; 89510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 89610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 8975a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstruct op_event * op_find_event_any(op_cpu cpu_type, u32 nr) 8985a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng{ 8995a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng load_events(cpu_type); 9005a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng 9015a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng return find_event_any(nr); 9025a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng} 90310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 90410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectint op_check_events(int ctr, u32 nr, u32 um, op_cpu cpu_type) 90510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 9065a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng int ret = OP_INVALID_EVENT; 90710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project size_t i; 90810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project u32 ctr_mask = 1 << ctr; 9095a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng struct list_head * pos; 91010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 91110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project load_events(cpu_type); 91210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 9135a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng list_for_each(pos, &events_list) { 9145a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng struct op_event * event = list_entry(pos, struct op_event, event_next); 9155a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (event->val != nr) 9165a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng continue; 91710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 9185a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng ret = OP_OK_EVENT; 91910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 9205a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if ((event->counter_mask & ctr_mask) == 0) 9215a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng ret |= OP_INVALID_COUNTER; 92210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 9235a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (event->unit->unit_type_mask == utm_bitmask) { 9245a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng for (i = 0; i < event->unit->num; ++i) 9255a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng um &= ~(event->unit->um[i].value); 9265a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng 9275a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (um) 9285a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng ret |= OP_INVALID_UM; 9295a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng 9305a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng } else { 9315a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng for (i = 0; i < event->unit->num; ++i) { 9325a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (event->unit->um[i].value == um) 9335a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng break; 9345a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng } 9355a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng 9365a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (i == event->unit->num) 9375a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng ret |= OP_INVALID_UM; 93810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 93910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 94010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 9415a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (ret == OP_OK_EVENT) 9425a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng return ret; 94310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 94410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 94510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return ret; 94610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 94710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 94810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 94910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectvoid op_default_event(op_cpu cpu_type, struct op_default_event_descr * descr) 95010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 95110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project descr->name = ""; 95210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project descr->um = 0x0; 95310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* A fixed value of CPU cycles; this should ensure good 95410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * granulity even on faster CPUs, though it will generate more 95510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * interrupts. 95610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */ 95710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project descr->count = 100000; 95810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 95910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project switch (cpu_type) { 96010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_PPRO: 96110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_PII: 96210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_PIII: 96310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_P6_MOBILE: 96410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_CORE: 96510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_CORE_2: 96610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_ATHLON: 96710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_HAMMER: 96810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_FAMILY10: 9695a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng case CPU_ARCH_PERFMON: 9705a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng case CPU_FAMILY11H: 9715a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng case CPU_ATOM: 9725a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng case CPU_CORE_I7: 9735bbbe460405564a1aed8a67a13c43e9356ffc656Ben Cheng case CPU_NEHALEM: 9747a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown case CPU_WESTMERE: 9755bbbe460405564a1aed8a67a13c43e9356ffc656Ben Cheng case CPU_MIPS_LOONGSON2: 9767a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown case CPU_FAMILY12H: 9777a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown case CPU_FAMILY14H: 9787a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown case CPU_FAMILY15H: 97910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project descr->name = "CPU_CLK_UNHALTED"; 98010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project break; 98110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 98210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_RTC: 98310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project descr->name = "RTC_INTERRUPTS"; 98410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project descr->count = 1024; 98510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project break; 98610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 98710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_P4: 98810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_P4_HT2: 98910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project descr->name = "GLOBAL_POWER_EVENTS"; 99010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project descr->um = 0x1; 99110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project break; 99210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 99310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_IA64: 99410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_IA64_1: 99510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_IA64_2: 99610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project descr->count = 1000000; 99710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project descr->name = "CPU_CYCLES"; 99810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project break; 99910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 100010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_AXP_EV4: 100110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_AXP_EV5: 100210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_AXP_PCA56: 100310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_AXP_EV6: 100410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_AXP_EV67: 100510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project descr->name = "CYCLES"; 100610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project break; 100710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 100810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project // we could possibly use the CCNT 100910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_ARM_XSCALE1: 101010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_ARM_XSCALE2: 101110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_ARM_MPCORE: 101210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_ARM_V6: 10135a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng case CPU_ARM_V7: 10145bbbe460405564a1aed8a67a13c43e9356ffc656Ben Cheng case CPU_ARM_V7_CA9: 101510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_AVR32: 101610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project descr->name = "CPU_CYCLES"; 101710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project break; 101810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 101910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_PPC64_PA6T: 102010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_PPC64_970: 102110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_PPC64_970MP: 102210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_PPC_7450: 102310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_PPC64_POWER4: 102410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_PPC64_POWER5: 102510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_PPC64_POWER6: 102610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_PPC64_POWER5p: 102710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_PPC64_POWER5pp: 102810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_PPC64_CELL: 10295a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng case CPU_PPC64_POWER7: 10305a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng case CPU_PPC64_IBM_COMPAT_V1: 103110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project descr->name = "CYCLES"; 103210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project break; 103310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 103410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_MIPS_20K: 103510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project descr->name = "CYCLES"; 103610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project break; 103710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 103810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_MIPS_24K: 103910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_MIPS_34K: 10405bbbe460405564a1aed8a67a13c43e9356ffc656Ben Cheng case CPU_MIPS_74K: 10415bbbe460405564a1aed8a67a13c43e9356ffc656Ben Cheng case CPU_MIPS_1004K: 104210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project descr->name = "INSTRUCTIONS"; 104310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project break; 104410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 104510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_MIPS_5K: 104610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_MIPS_25K: 104710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project descr->name = "CYCLES"; 104810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project break; 104910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 105010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_MIPS_R10000: 105110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_MIPS_R12000: 105210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project descr->name = "INSTRUCTIONS_GRADUATED"; 105310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project break; 105410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 105510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_MIPS_RM7000: 105610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_MIPS_RM9000: 105710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project descr->name = "INSTRUCTIONS_ISSUED"; 105810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project break; 105910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 106010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_MIPS_SB1: 106110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project descr->name = "INSN_SURVIVED_STAGE7"; 106210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project break; 106310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 106410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_MIPS_VR5432: 106510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_MIPS_VR5500: 106610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project descr->name = "INSTRUCTIONS_EXECUTED"; 106710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project break; 106810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 106910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_PPC_E500: 107010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_PPC_E500_2: 107110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_PPC_E300: 107210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project descr->name = "CPU_CLK"; 107310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project break; 107410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 107510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project // don't use default, if someone add a cpu he wants a compiler 107610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project // warning if he forgets to handle it here. 107710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_TIMER_INT: 107810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case CPU_NO_GOOD: 107910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case MAX_CPU_TYPE: 108010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project break; 108110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 108210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 1083