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