Port work-in-progress oprofile with Cortex-A9 support.

Change-Id: I26ecf3697c651dae31050081d6918ee5fc87915d
diff --git a/libop/op_xml_events.c b/libop/op_xml_events.c
index 5b9ac7d..67fc0a5 100644
--- a/libop/op_xml_events.c
+++ b/libop/op_xml_events.c
@@ -16,38 +16,38 @@
 #include "op_xml_out.h"
 
 static op_cpu cpu_type;
-#define MAX_BUFFER 4096
+#define MAX_BUFFER 16384
+static char buffer[MAX_BUFFER];
+
 void open_xml_events(char const * title, char const * doc, op_cpu the_cpu_type)
 {
 	char const * schema_version = "1.0";
-	char buffer[MAX_BUFFER];
 
 	buffer[0] = '\0';
 	cpu_type = the_cpu_type;
-	open_xml_element(HELP_EVENTS, 0, buffer);
-	open_xml_element(HELP_HEADER, 1, buffer);
-	init_xml_str_attr(HELP_TITLE, title, buffer);
-	init_xml_str_attr(SCHEMA_VERSION, schema_version, buffer);
-	init_xml_str_attr(HELP_DOC, doc, buffer);
-	close_xml_element(NONE, 0, buffer);
+	open_xml_element(HELP_EVENTS, 0, buffer, MAX_BUFFER);
+	open_xml_element(HELP_HEADER, 1, buffer, MAX_BUFFER);
+	init_xml_str_attr(HELP_TITLE, title, buffer, MAX_BUFFER);
+	init_xml_str_attr(SCHEMA_VERSION, schema_version, buffer, MAX_BUFFER);
+	init_xml_str_attr(HELP_DOC, doc, buffer, MAX_BUFFER);
+	close_xml_element(NONE, 0, buffer, MAX_BUFFER);
 	printf("%s", buffer);
 }
 
 void close_xml_events(void)
 {
-	char buffer[MAX_BUFFER];
-
 	buffer[0] = '\0';
-	close_xml_element(HELP_EVENTS, 0, buffer);
+	close_xml_element(HELP_EVENTS, 0, buffer, MAX_BUFFER);
 	printf("%s", buffer);
 }
 
-static void xml_do_arch_specific_event_help(struct op_event const * event,
-					    char * buffer)
+static void xml_do_arch_specific_event_help(struct op_event const *event,
+					    char *buffer, size_t size)
 {
 	switch (cpu_type) {
 	case CPU_PPC64_CELL:
-		init_xml_int_attr(HELP_EVENT_GROUP, event->val / 100, buffer);
+		init_xml_int_attr(HELP_EVENT_GROUP, event->val / 100, buffer,
+				  size);
 		break;
 	default:
 		break;
@@ -60,34 +60,41 @@
 	uint i;
 	int nr_counters;
 	int has_nested = strcmp(event->unit->name, "zero");
-	char buffer[MAX_BUFFER];
 
 	buffer[0] = '\0';
-	open_xml_element(HELP_EVENT, 1, buffer);
-	init_xml_str_attr(HELP_EVENT_NAME, event->name, buffer);
-	xml_do_arch_specific_event_help(event, buffer);
-	init_xml_str_attr(HELP_EVENT_DESC, event->desc, buffer);
+	open_xml_element(HELP_EVENT, 1, buffer, MAX_BUFFER);
+	init_xml_str_attr(HELP_EVENT_NAME, event->name, buffer, MAX_BUFFER);
+	xml_do_arch_specific_event_help(event, buffer, MAX_BUFFER);
+	init_xml_str_attr(HELP_EVENT_DESC, event->desc, buffer, MAX_BUFFER);
 
 	nr_counters = op_get_nr_counters(cpu_type);
-	init_xml_int_attr(HELP_COUNTER_MASK, event->counter_mask, buffer);
-	init_xml_int_attr(HELP_MIN_COUNT, event->min_count, buffer);
+	init_xml_int_attr(HELP_COUNTER_MASK, event->counter_mask, buffer,
+			  MAX_BUFFER);
+	if (event->ext)
+		init_xml_str_attr(HELP_EXT, event->ext, buffer, MAX_BUFFER);
+	init_xml_int_attr(HELP_MIN_COUNT, event->min_count,
+			  buffer, MAX_BUFFER);
 
 	if (has_nested) {
-		close_xml_element(NONE, 1, buffer);
-		open_xml_element(HELP_UNIT_MASKS, 1, buffer);
-		init_xml_int_attr(HELP_DEFAULT_MASK, event->unit->default_mask, buffer);
-		close_xml_element(NONE, 1, buffer);
+		close_xml_element(NONE, 1, buffer, MAX_BUFFER);
+		open_xml_element(HELP_UNIT_MASKS, 1, buffer, MAX_BUFFER);
+		init_xml_int_attr(HELP_DEFAULT_MASK, event->unit->default_mask,
+				  buffer, MAX_BUFFER);
+		close_xml_element(NONE, 1, buffer, MAX_BUFFER);
 		for (i = 0; i < event->unit->num; i++) {
-			open_xml_element(HELP_UNIT_MASK, 1, buffer);
+			open_xml_element(HELP_UNIT_MASK, 1, buffer, MAX_BUFFER);
 			init_xml_int_attr(HELP_UNIT_MASK_VALUE,
-					  event->unit->um[i].value, buffer);
+					  event->unit->um[i].value,
+					  buffer, MAX_BUFFER);
 			init_xml_str_attr(HELP_UNIT_MASK_DESC,
-					  event->unit->um[i].desc, buffer);
-			close_xml_element(NONE, 0, buffer);
+					  event->unit->um[i].desc,
+					  buffer, MAX_BUFFER);
+			close_xml_element(NONE, 0, buffer, MAX_BUFFER);
 		}
-		close_xml_element(HELP_UNIT_MASKS, 0, buffer);
+		close_xml_element(HELP_UNIT_MASKS, 0, buffer, MAX_BUFFER);
 	}
-	close_xml_element(has_nested ? HELP_EVENT : NONE, has_nested, buffer);
+	close_xml_element(has_nested ? HELP_EVENT : NONE, has_nested,
+			  buffer, MAX_BUFFER);
 	printf("%s", buffer);
 }