Home | History | Annotate | Download | only in libop
      1 /**
      2  * @file op_xml_events.c
      3  * routines for generating event files in XML
      4  *
      5  * @remark Copyright 2008 OProfile authors
      6  * @remark Read the file COPYING
      7  *
      8  * @author Dave Nomura
      9  */
     10 
     11 #include <stdio.h>
     12 #include <string.h>
     13 #include "op_events.h"
     14 #include "op_list.h"
     15 #include "op_cpu_type.h"
     16 #include "op_xml_out.h"
     17 
     18 static op_cpu cpu_type;
     19 #define MAX_BUFFER 16384
     20 static char buffer[MAX_BUFFER];
     21 
     22 void open_xml_events(char const * title, char const * doc, op_cpu the_cpu_type)
     23 {
     24 	char const * schema_version = "1.1";
     25 
     26 	buffer[0] = '\0';
     27 	cpu_type = the_cpu_type;
     28 	open_xml_element(HELP_EVENTS, 1, buffer, MAX_BUFFER);
     29 	init_xml_str_attr(SCHEMA_VERSION, schema_version, buffer, MAX_BUFFER);
     30 	close_xml_element(NONE, 1, buffer, MAX_BUFFER);
     31 	open_xml_element(HELP_HEADER, 1, buffer, MAX_BUFFER);
     32 	init_xml_str_attr(HELP_TITLE, title, buffer, MAX_BUFFER);
     33 	init_xml_str_attr(HELP_DOC, doc, buffer, MAX_BUFFER);
     34 	close_xml_element(NONE, 0, buffer, MAX_BUFFER);
     35 	printf("%s", buffer);
     36 }
     37 
     38 void close_xml_events(void)
     39 {
     40 	buffer[0] = '\0';
     41 	close_xml_element(HELP_EVENTS, 0, buffer, MAX_BUFFER);
     42 	printf("%s", buffer);
     43 }
     44 
     45 static void xml_do_arch_specific_event_help(struct op_event const *event,
     46 					    char *buffer, size_t size)
     47 {
     48 	switch (cpu_type) {
     49 	case CPU_PPC64_CELL:
     50 		init_xml_int_attr(HELP_EVENT_GROUP, event->val / 100, buffer,
     51 				  size);
     52 		break;
     53 	default:
     54 		break;
     55 	}
     56 }
     57 
     58 
     59 void xml_help_for_event(struct op_event const * event)
     60 {
     61 	uint i;
     62 	int nr_counters;
     63 	int has_nested = strcmp(event->unit->name, "zero");
     64 
     65 	buffer[0] = '\0';
     66 	open_xml_element(HELP_EVENT, 1, buffer, MAX_BUFFER);
     67 	init_xml_str_attr(HELP_EVENT_NAME, event->name, buffer, MAX_BUFFER);
     68 	xml_do_arch_specific_event_help(event, buffer, MAX_BUFFER);
     69 	init_xml_str_attr(HELP_EVENT_DESC, event->desc, buffer, MAX_BUFFER);
     70 
     71 	nr_counters = op_get_nr_counters(cpu_type);
     72 	init_xml_int_attr(HELP_COUNTER_MASK, event->counter_mask, buffer,
     73 			  MAX_BUFFER);
     74 	if (event->ext)
     75 		init_xml_str_attr(HELP_EXT, event->ext, buffer, MAX_BUFFER);
     76 	init_xml_int_attr(HELP_MIN_COUNT, event->min_count,
     77 			  buffer, MAX_BUFFER);
     78 
     79 	if (has_nested) {
     80 		char um_type[10];
     81 		close_xml_element(NONE, 1, buffer, MAX_BUFFER);
     82 		open_xml_element(HELP_UNIT_MASKS, 1, buffer, MAX_BUFFER);
     83 		init_xml_int_attr(HELP_DEFAULT_MASK, event->unit->default_mask,
     84 				  buffer, MAX_BUFFER);
     85 		switch (event->unit->unit_type_mask){
     86 		case utm_bitmask:
     87 			strncpy(um_type, "bitmask", sizeof(um_type));
     88 			break;
     89 		case utm_exclusive:
     90 			strncpy(um_type, "exclusive", sizeof(um_type));
     91 			break;
     92 		case utm_mandatory:
     93 			strncpy(um_type, "mandatory", sizeof(um_type));
     94 			break;
     95 		}
     96 		init_xml_str_attr(HELP_UNIT_MASKS_CATEGORY, um_type, buffer, MAX_BUFFER);
     97 		close_xml_element(NONE, 1, buffer, MAX_BUFFER);
     98 		for (i = 0; i < event->unit->num; i++) {
     99 			open_xml_element(HELP_UNIT_MASK, 1, buffer, MAX_BUFFER);
    100 			init_xml_int_attr(HELP_UNIT_MASK_VALUE,
    101 					  event->unit->um[i].value,
    102 					  buffer, MAX_BUFFER);
    103 			init_xml_str_attr(HELP_UNIT_MASK_DESC,
    104 					  event->unit->um[i].desc,
    105 					  buffer, MAX_BUFFER);
    106 			close_xml_element(NONE, 0, buffer, MAX_BUFFER);
    107 		}
    108 		close_xml_element(HELP_UNIT_MASKS, 0, buffer, MAX_BUFFER);
    109 	}
    110 	close_xml_element(has_nested ? HELP_EVENT : NONE, has_nested,
    111 			  buffer, MAX_BUFFER);
    112 	printf("%s", buffer);
    113 }
    114 
    115