From: John L. <mov...@us...> - 2003-07-19 18:39:37
|
Update of /cvsroot/oprofile/oprofile/libop In directory sc8-pr-cvs1:/tmp/cvs-serv6294/libop Modified Files: Tag: BRANCH_CALLGRAPH op_events.c op_events.h Log Message: merge from trunk Index: op_events.c =================================================================== RCS file: /cvsroot/oprofile/oprofile/libop/op_events.c,v retrieving revision 1.38.2.1 retrieving revision 1.38.2.2 diff -u -p -d -r1.38.2.1 -r1.38.2.2 --- op_events.c 14 Jun 2003 01:07:27 -0000 1.38.2.1 +++ op_events.c 19 Jul 2003 18:39:33 -0000 1.38.2.2 @@ -15,6 +15,7 @@ #include "op_libiberty.h" #include "op_fileio.h" #include "op_string.h" +#include "op_cpufreq.h" #include <string.h> #include <stdlib.h> @@ -57,54 +58,6 @@ static int parse_hex(char const * str) } -static struct op_unit_mask * new_unit_mask(void) -{ - struct op_unit_mask * um = xmalloc(sizeof(struct op_unit_mask)); - memset(um, '\0', sizeof(struct op_unit_mask)); - list_add_tail(&um->um_next, &um_list); - - return um; -} - - -static void delete_unit_mask(struct op_unit_mask * unit) -{ - u32 cur; - for (cur = 0 ; cur < unit->num ; ++cur) { - if (unit->um[cur].desc) - free(unit->um[cur].desc); - } - - if (unit->name) - free(unit->name); - - list_del(&unit->um_next); - free(unit); -} - - -static struct op_event * new_event(void) -{ - struct op_event * event = xmalloc(sizeof(struct op_event)); - memset(event, '\0', sizeof(struct op_event)); - list_add_tail(&event->event_next, &events_list); - - return event; -} - - -static void delete_event(struct op_event * event) -{ - if (event->name) - free(event->name); - if (event->desc) - free(event->desc); - - list_del(&event->event_next); - free(event); -} - - /* name:MESI type:bitmask default:0x0f */ static void parse_um(struct op_unit_mask * um, char const * line) { @@ -172,6 +125,16 @@ static void parse_um_entry(struct op_des } +static struct op_unit_mask * new_unit_mask(void) +{ + struct op_unit_mask * um = xmalloc(sizeof(struct op_unit_mask)); + memset(um, '\0', sizeof(struct op_unit_mask)); + list_add_tail(&um->um_next, &um_list); + + return um; +} + + /* * name:zero type:mandatory default:0x0 * \t0x0 No unit mask @@ -303,6 +266,16 @@ static int next_token(char const ** cp, } +static struct op_event * new_event(void) +{ + struct op_event * event = xmalloc(sizeof(struct op_event)); + memset(event, '\0', sizeof(struct op_event)); + list_add_tail(&event->event_next, &events_list); + + return event; +} + + /* event:0x00 counters:0 um:zero minimum:4096 name:ISSUES : Total issues */ static void read_events(char const * file) { @@ -402,6 +375,34 @@ struct list_head * op_events(op_cpu cpu_ } +static void delete_unit_mask(struct op_unit_mask * unit) +{ + u32 cur; + for (cur = 0 ; cur < unit->num ; ++cur) { + if (unit->um[cur].desc) + free(unit->um[cur].desc); + } + + if (unit->name) + free(unit->name); + + list_del(&unit->um_next); + free(unit); +} + + +static void delete_event(struct op_event * event) +{ + if (event->name) + free(event->name); + if (event->desc) + free(event->desc); + + list_del(&event->event_next); + free(event); +} + + void op_free_events(void) { struct list_head * pos, * pos2; @@ -496,4 +497,53 @@ unsigned int op_min_count(u8 ctr_type, o event = find_event(ctr_type); return event ? event->min_count : 0; +} + + +void op_default_event(op_cpu cpu_type, struct op_default_event_descr * descr) +{ + descr->name = ""; + descr->um = 0x0; + /* around 2000 ints/sec on a 100% busy CPU */ + descr->count = (unsigned long)(op_cpu_frequency() * 500.0); + + switch (cpu_type) { + case CPU_PPRO: + case CPU_PII: + case CPU_PIII: + case CPU_ATHLON: + case CPU_HAMMER: + descr->name = "CPU_CLK_UNHALTED"; + break; + + case CPU_RTC: + descr->name = "RTC_INTERRUPTS"; + descr->count = 1024; + break; + + case CPU_P4: + case CPU_P4_HT2: + descr->name = "GLOBAL_POWER_EVENTS"; + descr->um = 0x1; + break; + + case CPU_IA64: + case CPU_IA64_1: + case CPU_IA64_2: + descr->name = "CPU_CYCLES"; + break; + + case CPU_AXP_EV4: + case CPU_AXP_EV5: + case CPU_AXP_PCA56: + case CPU_AXP_EV6: + case CPU_AXP_EV67: + descr->name = "CYCLES"; + break; + + case CPU_TIMER_INT: + case CPU_NO_GOOD: + case MAX_CPU_TYPE: + break; + } } Index: op_events.h =================================================================== RCS file: /cvsroot/oprofile/oprofile/libop/op_events.h,v retrieving revision 1.16 retrieving revision 1.16.4.1 diff -u -p -d -r1.16 -r1.16.4.1 --- op_events.h 5 Apr 2003 18:26:11 -0000 1.16 +++ op_events.h 19 Jul 2003 18:39:33 -0000 1.16.4.1 @@ -103,6 +103,20 @@ unsigned int op_min_count(u8 ctr_type, o */ void op_free_events(void); +struct op_default_event_descr { + char * name; + unsigned long count; + unsigned long um; +}; + +/** + * op_default_event - return the details of the default event + * @param cpu_type cpu type + * + * Fills in the event description if applicable + */ +void op_default_event(op_cpu cpu_type, struct op_default_event_descr * descr); + #ifdef __cplusplus } #endif |