gator: Version 5.10
authorJon Medhurst <tixy@linaro.org>
Thu, 10 May 2012 13:15:56 +0000 (14:15 +0100)
committerJon Medhurst <tixy@linaro.org>
Wed, 16 May 2012 13:22:59 +0000 (14:22 +0100)
New gator release (build 1385) for ARM DS-5 v5.10

Signed-off-by: Jon Medhurst <tixy@linaro.org>
86 files changed:
daemon/Android.mk [changed mode: 0644->0755]
daemon/CapturedXML.cpp
daemon/CapturedXML.h
daemon/Child.cpp
daemon/Child.h
daemon/Collector.cpp
daemon/Collector.h
daemon/ConfigurationXML.cpp
daemon/ConfigurationXML.h
daemon/Fifo.cpp
daemon/Fifo.h
daemon/LocalCapture.cpp
daemon/LocalCapture.h
daemon/Makefile
daemon/OlySocket.cpp [changed mode: 0644->0755]
daemon/OlySocket.h [changed mode: 0644->0755]
daemon/OlyUtility.cpp [changed mode: 0644->0755]
daemon/OlyUtility.h [changed mode: 0644->0755]
daemon/RequestXML.cpp [deleted file]
daemon/RequestXML.h [deleted file]
daemon/Sender.cpp
daemon/Sender.h
daemon/SessionData.cpp
daemon/SessionData.h
daemon/SessionXML.cpp
daemon/SessionXML.h
daemon/StreamlineSetup.cpp
daemon/StreamlineSetup.h
daemon/XMLOut.cpp [deleted file]
daemon/XMLOut.h [deleted file]
daemon/XMLReader.cpp [deleted file]
daemon/XMLReader.h [deleted file]
daemon/configuration.xml
daemon/events-ARM11.xml
daemon/events-ARM11MPCore.xml
daemon/events-Cortex-A15.xml
daemon/events-Cortex-A5.xml
daemon/events-Cortex-A7.xml [changed mode: 0644->0755]
daemon/events-Cortex-A8.xml
daemon/events-Cortex-A9.xml
daemon/events-Krait-architected.xml [changed mode: 0644->0755]
daemon/events-L2C-310.xml
daemon/events-Linux.xml
daemon/events-Mali-400.xml
daemon/events-Scorpion.xml
daemon/events-ScorpionMP.xml
daemon/main.cpp
daemon/mxml/COPYING [new file with mode: 0644]
daemon/mxml/config.h [new file with mode: 0644]
daemon/mxml/mxml-attr.c [new file with mode: 0644]
daemon/mxml/mxml-entity.c [new file with mode: 0644]
daemon/mxml/mxml-file.c [new file with mode: 0644]
daemon/mxml/mxml-get.c [new file with mode: 0644]
daemon/mxml/mxml-index.c [new file with mode: 0644]
daemon/mxml/mxml-node.c [new file with mode: 0644]
daemon/mxml/mxml-private.c [new file with mode: 0644]
daemon/mxml/mxml-private.h [new file with mode: 0644]
daemon/mxml/mxml-search.c [new file with mode: 0644]
daemon/mxml/mxml-set.c [new file with mode: 0644]
daemon/mxml/mxml-string.c [new file with mode: 0644]
daemon/mxml/mxml.h [new file with mode: 0644]
driver/Makefile
driver/gator.h
driver/gator_annotate.c
driver/gator_backtrace.c
driver/gator_cookies.c
driver/gator_ebs.c
driver/gator_events_armv6.c
driver/gator_events_armv7.c
driver/gator_events_block.c
driver/gator_events_irq.c
driver/gator_events_mali.c [changed mode: 0644->0755]
driver/gator_events_meminfo.c
driver/gator_events_mmaped.c
driver/gator_events_net.c
driver/gator_events_perf_pmu.c [changed mode: 0644->0755]
driver/gator_events_power.c [deleted file]
driver/gator_events_scorpion.c
driver/gator_fs.c
driver/gator_hrtimer_gator.c [changed mode: 0644->0755]
driver/gator_main.c
driver/gator_marshaling.c [new file with mode: 0755]
driver/gator_pack.c
driver/gator_trace_gpu.c
driver/gator_trace_power.c [new file with mode: 0755]
driver/gator_trace_sched.c

old mode 100644 (file)
new mode 100755 (executable)
index 14aeda2..3ab55b9
@@ -16,13 +16,20 @@ LOCAL_SRC_FILES:= \
        main.cpp \\r
        OlySocket.cpp \\r
        OlyUtility.cpp \\r
-       RequestXML.cpp \\r
        Sender.cpp \\r
        SessionData.cpp \\r
        SessionXML.cpp \\r
        StreamlineSetup.cpp \\r
-       XMLOut.cpp \\r
-       XMLReader.cpp \r
+       mxml/mxml-attr.c \\r
+       mxml/mxml-entity.c \\r
+       mxml/mxml-file.c \\r
+       mxml/mxml-get.c \\r
+       mxml/mxml-index.c \\r
+       mxml/mxml-node.c \\r
+       mxml/mxml-private.c \\r
+       mxml/mxml-search.c \\r
+       mxml/mxml-set.c \\r
+       mxml/mxml-string.c\r
 \r
 LOCAL_C_INCLUDES := $(LOCAL_PATH) \r
 \r
index 51076dd48717b3f0677a494ed1de73080985ff10..f02ed2a0155192bfb5d36a1608e38eb499967238 100644 (file)
@@ -22,13 +22,15 @@ CapturedXML::CapturedXML() {
 CapturedXML::~CapturedXML() {
 }
 
-const char* CapturedXML::getXML() {
+mxml_node_t* CapturedXML::getTree() {
        bool perfCounters = false;
+       mxml_node_t *xml;
+    mxml_node_t *captured;
+    mxml_node_t *target;
+    mxml_node_t *counters;
+       mxml_node_t *counter;
        int x;
 
-       clearXmlString();
-       xmlHeader();
-
        for (x=0; x<MAX_PERFORMANCE_COUNTERS; x++) {
                if (gSessionData->mPerfCounterEnabled[x]) {
                        perfCounters = true;
@@ -36,62 +38,86 @@ const char* CapturedXML::getXML() {
                }
        }
 
-       startElement("captured");
-       attributeInt("version", 1);
-       attributeInt("protocol", PROTOCOL_VERSION);
+       xml = mxmlNewXML("1.0");
+
+       captured = mxmlNewElement(xml, "captured");
+       mxmlElementSetAttr(captured, "version", "1");
+       mxmlElementSetAttrf(captured, "protocol", "%d", PROTOCOL_VERSION);
        if (gSessionData->mBytes > 0) { // Send the following only after the capture is complete
                if (time(NULL) > 1267000000) { // If the time is reasonable (after Feb 23, 2010)
-                       attributeUInt("created", time(NULL)); // Valid until the year 2038
+                       mxmlElementSetAttrf(captured, "created", "%lu", time(NULL)); // Valid until the year 2038
                }
-               attributeUInt("bytes", gSessionData->mBytes);
+               mxmlElementSetAttrf(captured, "bytes", "%d", gSessionData->mBytes);
        }
-       startElement("target");
-       attributeString("name", gSessionData->mCoreName);
-       attributeInt("sample_rate", gSessionData->mSampleRate);
-       attributeInt("cores", gSessionData->mCores);
-       endElement("target");
+
+       target = mxmlNewElement(captured, "target");
+       mxmlElementSetAttr(target, "name", gSessionData->mCoreName);
+       mxmlElementSetAttrf(target, "sample_rate", "%d", gSessionData->mSampleRate);
+       mxmlElementSetAttrf(target, "cores", "%d", gSessionData->mCores);
+
        if (perfCounters) {
-               startElement("counters");
+               counters = mxmlNewElement(captured, "counters");
                for (x = 0; x < MAX_PERFORMANCE_COUNTERS; x++) {
                        if (gSessionData->mPerfCounterEnabled[x]) {
-                               startElement("counter");
-                               attributeString("title", gSessionData->mPerfCounterTitle[x]);
-                               attributeString("name", gSessionData->mPerfCounterName[x]);
-                               attributeHex8("color", gSessionData->mPerfCounterColor[x]);
-                               attributeHex8("key", gSessionData->mPerfCounterKey[x]);
-                               attributeString("type", gSessionData->mPerfCounterType[x]);
-                               attributeHex8("event", gSessionData->mPerfCounterEvent[x]);
+                               counter = mxmlNewElement(counters, "counter");
+                               mxmlElementSetAttr(counter, "title", gSessionData->mPerfCounterTitle[x]);
+                               mxmlElementSetAttr(counter, "name", gSessionData->mPerfCounterName[x]);
+                               mxmlElementSetAttrf(counter, "color", "0x%08x", gSessionData->mPerfCounterColor[x]);
+                               mxmlElementSetAttrf(counter, "key", "0x%08x", gSessionData->mPerfCounterKey[x]);
+                               mxmlElementSetAttr(counter, "type", gSessionData->mPerfCounterType[x]);
+                               mxmlElementSetAttrf(counter, "event", "0x%08x", gSessionData->mPerfCounterEvent[x]);
                                if (gSessionData->mPerfCounterPerCPU[x]) {
-                                       attributeBool("per_cpu", true);
+                                       mxmlElementSetAttr(counter, "per_cpu", "yes");
                                }
                                if (strlen(gSessionData->mPerfCounterOperation[x]) > 0) {
-                                       attributeString("operation", gSessionData->mPerfCounterOperation[x]);
+                                       mxmlElementSetAttr(counter, "operation", gSessionData->mPerfCounterOperation[x]);
                                }
                                if (gSessionData->mPerfCounterCount[x] > 0) {
-                                       attributeInt("count", gSessionData->mPerfCounterCount[x]);
+                                       mxmlElementSetAttrf(counter, "count", "%d", gSessionData->mPerfCounterCount[x]);
+                               }
+                               if (gSessionData->mPerfCounterLevel[x]) {
+                                       mxmlElementSetAttr(counter, "level", "yes");
+                               }
+                               if (strlen(gSessionData->mPerfCounterAlias[x]) > 0) {
+                                       mxmlElementSetAttr(counter, "alias", gSessionData->mPerfCounterAlias[x]);
                                }
-                               attributeString("description", gSessionData->mPerfCounterDescription[x]);
-                               endElement("counter");
+                               if (strlen(gSessionData->mPerfCounterDisplay[x]) > 0) {
+                                       mxmlElementSetAttr(counter, "display", gSessionData->mPerfCounterDisplay[x]);
+                               }
+                               if (strlen(gSessionData->mPerfCounterUnits[x]) > 0) {
+                                       mxmlElementSetAttr(counter, "units", gSessionData->mPerfCounterUnits[x]);
+                               }
+                               if (gSessionData->mPerfCounterAverageSelection[x]) {
+                                       mxmlElementSetAttr(counter, "average_selection", "yes");
+                               }
+                               mxmlElementSetAttr(counter, "description", gSessionData->mPerfCounterDescription[x]);
                        }
                }
-               endElement("counters");
        }
-       endElement("captured");
-       return getXmlString();
+
+       return xml;
+}
+
+char* CapturedXML::getXML() {
+       char* xml_string;
+       mxml_node_t *xml = getTree();
+       xml_string = mxmlSaveAllocString(xml, mxmlWhitespaceCB);
+       mxmlDelete(xml);
+       return xml_string;
 }
 
 void CapturedXML::write(char* path) {
-       charfile = (char*)malloc(PATH_MAX);
+       char *file = (char*)malloc(PATH_MAX);
 
        // Set full path
        snprintf(file, PATH_MAX, "%s/captured.xml", path);
        
-       // Write the file
-       const char* xml = getXML();
+       char* xml = getXML();
        if (util->writeToDisk(file, xml) < 0) {
                logg->logError(__FILE__, __LINE__, "Error writing %s\nPlease verify the path.", file);
                handleException();
        }
 
+       free(xml);
        free(file);
 }
index d37c59e37ac0257b2ddc2a7a5e841071e27c174e..984d1f2d13e83231596b2b2b3e01fd7dd46f4e7d 100644 (file)
 #ifndef        __CAPTURED_XML_H__
 #define        __CAPTURED_XML_H__
 
-#include "XMLOut.h"
+#include "mxml/mxml.h"
 
-class CapturedXML : XMLOut {
+class CapturedXML {
 public:
        CapturedXML();
        ~CapturedXML();
-       const char* getXML();
+       char* getXML(); // the string should be freed by the caller
        void write(char* path);
+private:
+       mxml_node_t* getTree();
 };
 
 #endif         //__CAPTURED_XML_H__
index ddf105b8d315d4b475f2106308218836bf268898..bcc868a553c612defc2980058f77130d73f8678d 100644 (file)
@@ -134,6 +134,7 @@ void* stopThread(void* pVoid) {
 void* senderThread(void* pVoid) {
        int length;
        char* data;
+       char end_sequence[] = {RESPONSE_APC_DATA, 0, 0, 0, 0};
 
        sem_post(&senderThreadStarted);
        prctl(PR_SET_NAME, (unsigned int)&"gatord-sender", 0, 0, 0);
@@ -143,20 +144,25 @@ void* senderThread(void* pVoid) {
                data = collectorFifo->read(&length);
                sender->writeData(data, length, RESPONSE_APC_DATA);
        } while (length > 0);
+
+       // write end-of-capture sequence
+       if (!gSessionData->mLocalCapture) {
+               sender->writeData(end_sequence, sizeof(end_sequence), RESPONSE_APC_DATA);
+       }
+
        logg->logMessage("Exit sender thread");
        return 0;
 }
 
-Child::Child(char* path) {
+Child::Child() {
        initialization();
-       sessionXMLPath = path;
        gSessionData->mLocalCapture = true;
 }
 
 Child::Child(OlySocket* sock, int conn) {
        initialization();
        socket = sock;
-       numConnections = conn;
+       mNumConnections = conn;
 }
 
 Child::~Child() {
@@ -171,8 +177,7 @@ void Child::initialization() {
        signal(SIGALRM, child_handler);
        socket = NULL;
        numExceptions = 0;
-       numConnections = 0;
-       sessionXMLPath = 0;
+       mNumConnections = 0;
 
        // Initialize semaphores
        sem_init(&senderThreadStarted, 0, 0);
@@ -189,13 +194,17 @@ void Child::run() {
        char* collectBuffer;
        int bytesCollected = 0;
        LocalCapture* localCapture = NULL;
+       pthread_t durationThreadID, stopThreadID, senderThreadID;
 
        prctl(PR_SET_NAME, (unsigned int)&"gatord-child", 0, 0, 0);
 
+       // Disable line wrapping when generating xml files; carriage returns and indentation to be added manually
+       mxmlSetWrapMargin(0);
+
        // Instantiate the Sender - must be done first, after which error messages can be sent
        sender = new Sender(socket);
 
-       if (numConnections > 1) {
+       if (mNumConnections > 1) {
                logg->logError(__FILE__, __LINE__, "Session already in progress");
                handleException();
        }
@@ -211,29 +220,27 @@ void Child::run() {
                // Respond to Streamline requests
                StreamlineSetup ss(socket);
        } else {
-               xmlString = util->readFromDisk(sessionXMLPath);
+               char* xmlString;
+               xmlString = util->readFromDisk(gSessionData->mSessionXMLPath);
                if (xmlString == 0) {
-                       logg->logError(__FILE__, __LINE__, "Unable to read session xml file: %s", sessionXMLPath);
+                       logg->logError(__FILE__, __LINE__, "Unable to read session xml file: %s", gSessionData->mSessionXMLPath);
                        handleException();
                }
                gSessionData->parseSessionXML(xmlString);
                localCapture = new LocalCapture();
-               localCapture->createAPCDirectory(gSessionData->target_path, gSessionData->title);
-               localCapture->copyImages(gSessionData->images);
+               localCapture->createAPCDirectory(gSessionData->mTargetPath, gSessionData->mTitle);
+               localCapture->copyImages(gSessionData->mImages);
                localCapture->write(xmlString);
-               sender->createDataFile(gSessionData->apcDir);
-               delete xmlString;
+               sender->createDataFile(gSessionData->mAPCDir);
+               free(xmlString);
        }
 
        // Write configuration into the driver
        collector->setupPerfCounters();
 
-       // Create user-space buffers
-       int fifoBufferSize = collector->getBufferSize();
-       int numCollectorBuffers = (gSessionData->mTotalBufferSize * 1024 * 1024 + fifoBufferSize - 1) / fifoBufferSize;
-       numCollectorBuffers = (numCollectorBuffers < 4) ? 4 : numCollectorBuffers;
-       logg->logMessage("Created %d %d-byte collector buffers", numCollectorBuffers, fifoBufferSize);
-       collectorFifo = new Fifo(numCollectorBuffers, fifoBufferSize);
+       // Create user-space buffers, add 5 to the size to account for the 1-byte type and 4-byte length
+       logg->logMessage("Created %d MB collector buffer with a %d-byte ragged end", gSessionData->mTotalBufferSize, collector->getBufferSize());
+       collectorFifo = new Fifo(collector->getBufferSize() + 5, gSessionData->mTotalBufferSize* 1024 * 1024);
 
        // Get the initial pointer to the collect buffer
        collectBuffer = collectorFifo->start();
@@ -243,12 +250,14 @@ void Child::run() {
 
        // Create the duration, stop, and sender threads
        bool thread_creation_success = true;
-       if (gSessionData->mDuration > 0 && pthread_create(&durationThreadID, NULL, durationThread, NULL))
+       if (gSessionData->mDuration > 0 && pthread_create(&durationThreadID, NULL, durationThread, NULL)) {
                thread_creation_success = false;
-       else if (socket && pthread_create(&stopThreadID, NULL, stopThread, NULL))
+       } else if (socket && pthread_create(&stopThreadID, NULL, stopThread, NULL)) {
                thread_creation_success = false;
-       else if (pthread_create(&senderThreadID, NULL, senderThread, NULL))
+       } else if (pthread_create(&senderThreadID, NULL, senderThread, NULL)){
                thread_creation_success = false;
+       }
+
        if (!thread_creation_success) {
                logg->logError(__FILE__, __LINE__, "Failed to create gator threads");
                handleException();
@@ -269,8 +278,7 @@ void Child::run() {
 
                // In one shot mode, stop collection once all the buffers are filled
                if (gSessionData->mOneShot && gSessionData->mSessionIsActive) {
-                       // Depth minus 1 because write() has not yet been called
-                       if ((bytesCollected == -1) || (collectorFifo->numWriteToReadBuffersFilled() == collectorFifo->depth() - 1)) {
+                       if (bytesCollected == -1 || collectorFifo->willFill(bytesCollected)) {
                                logg->logMessage("One shot");
                                endSession();
                        }
@@ -292,7 +300,7 @@ void Child::run() {
        // Write the captured xml file
        if (gSessionData->mLocalCapture) {
                CapturedXML capturedXML;
-               capturedXML.write(gSessionData->apcDir);
+               capturedXML.write(gSessionData->mAPCDir);
        }
 
        logg->logMessage("Profiling ended.");
index eee5ac70f9e06f688e77178b6f05eb17dfd7af45..612ca7cf3e2cfb563b40794396d3c2d892b34be6 100644 (file)
@@ -15,7 +15,7 @@
 
 class Child {
 public:
-       Child(char* sessionXMLPath);
+       Child();
        Child(OlySocket* sock, int numConnections);
        ~Child();
        void run();
@@ -23,11 +23,7 @@ public:
        void endSession();
        int numExceptions;
 private:
-       char* xmlString;
-       char* sessionXMLPath;
-       int numConnections;
-       time_t timeStart;
-       pthread_t durationThreadID, stopThreadID, senderThreadID;
+       int mNumConnections;
 
        void initialization();
 };
index 7a41198e5cb4e1a7d0a96ea198d076e6ed384698..db7b9c08e7735f05967e7fde4079d5f0dc13f5bf 100644 (file)
 #include "Collector.h"
 #include "SessionData.h"
 #include "Logging.h"
+#include "Sender.h"
 
 extern void handleException();
 
 // Driver initialization independent of session settings
 Collector::Collector() {
-       char text[sizeof(gSessionData->mPerfCounterType[0]) + 20]; // sufficiently large to hold all events/<types>/<file>
+       char text[sizeof(gSessionData->mPerfCounterType[0]) + 30]; // sufficiently large to hold all /dev/gator/events/<types>/<file>
 
-       bufferFD = 0;
+       mBufferFD = 0;
 
        checkVersion();
 
        int enable = -1;
-       if (readIntDriver("enable", &enable) != 0 || enable != 0) {
+       if (readIntDriver("/dev/gator/enable", &enable) != 0 || enable != 0) {
                logg->logError(__FILE__, __LINE__, "Driver already enabled, possibly a session is already in progress.");
                handleException();
        }
 
-       readIntDriver("cpu_cores", &gSessionData->mCores);
+       readIntDriver("/dev/gator/cpu_cores", &gSessionData->mCores);
        if (gSessionData->mCores == 0) {
                gSessionData->mCores = 1;
        }
 
-       bufferSize = 512 * 1024;
-       if (writeReadDriver("buffer_size", &bufferSize) || bufferSize <= 0) {
-               logg->logError(__FILE__, __LINE__, "Unable to set the driver buffer size");
+       mBufferSize = 0;
+       if (readIntDriver("/dev/gator/buffer_size", &mBufferSize) || mBufferSize <= 0) {
+               logg->logError(__FILE__, __LINE__, "Unable to read the driver buffer size");
                handleException();
        }
 
@@ -51,7 +52,7 @@ Collector::Collector() {
        // Read unchanging keys from driver which are created at insmod'ing of gator.ko
        for (int i = 0; i < MAX_PERFORMANCE_COUNTERS; i++) {
                if (gSessionData->mPerfCounterEnabled[i]) {
-                       snprintf(text, sizeof(text), "events/%s/key", gSessionData->mPerfCounterType[i]);
+                       snprintf(text, sizeof(text), "/dev/gator/events/%s/key", gSessionData->mPerfCounterType[i]);
                        readIntDriver(text, &gSessionData->mPerfCounterKey[i]);
                }
        }
@@ -59,21 +60,37 @@ Collector::Collector() {
 
 Collector::~Collector() {
        // Write zero for safety, as a zero should have already been written
-       writeDriver("enable", "0");
+       writeDriver("/dev/gator/enable", "0");
 
        // Calls event_buffer_release in the driver
-       if (bufferFD) {
-               close(bufferFD);
+       if (mBufferFD) {
+               close(mBufferFD);
        }
 }
 
+#include <dirent.h>
 void Collector::enablePerfCounters() {
        char text[sizeof(gSessionData->mPerfCounterType[0]) + 30]; // sufficiently large to hold all /dev/gator/events/<types>/enabled
+
+       // Initialize all perf counters in the driver, i.e. set enabled to zero
+       struct dirent *ent;
+       DIR* dir = opendir("/dev/gator/events");
+       if (dir) {
+               while ((ent = readdir(dir)) != NULL) {
+                       // skip hidden files, current dir, and parent dir
+                       if (ent->d_name[0] == '.')
+                               continue;
+                       snprintf(text, sizeof(text), "/dev/gator/events/%s/enabled", ent->d_name);
+                       writeDriver(text, 0);
+               }
+               closedir (dir);
+       }
+
        for (int i=0; i<MAX_PERFORMANCE_COUNTERS; i++) {
                if (!gSessionData->mPerfCounterEnabled[i]) {
                        continue;
                }
-               snprintf(text, sizeof(text), "events/%s/enabled", gSessionData->mPerfCounterType[i]);
+               snprintf(text, sizeof(text), "/dev/gator/events/%s/enabled", gSessionData->mPerfCounterType[i]);
                if (writeReadDriver(text, &gSessionData->mPerfCounterEnabled[i])) {
                        // Disable those events that don't exist on this hardware platform even though they exist in configuration.xml
                        gSessionData->mPerfCounterEnabled[i] = 0;
@@ -83,21 +100,21 @@ void Collector::enablePerfCounters() {
 }
 
 void Collector::setupPerfCounters() {
-       char base[sizeof(gSessionData->mPerfCounterType[0]) + 10]; // sufficiently large to hold all events/<types>
-       char text[sizeof(gSessionData->mPerfCounterType[0]) + 20]; // sufficiently large to hold all events/<types>/<file>
+       char base[sizeof(gSessionData->mPerfCounterType[0]) + 20]; // sufficiently large to hold all /dev/gator/events/<types>
+       char text[sizeof(gSessionData->mPerfCounterType[0]) + 30]; // sufficiently large to hold all /dev/gator/events/<types>/<file>
 
        for (int i=0; i<MAX_PERFORMANCE_COUNTERS; i++) {
                if (!gSessionData->mPerfCounterEnabled[i]) {
                        continue;
                }
-               snprintf(base, sizeof(base), "events/%s", gSessionData->mPerfCounterType[i]);
+               snprintf(base, sizeof(base), "/dev/gator/events/%s", gSessionData->mPerfCounterType[i]);
                snprintf(text, sizeof(text), "%s/event", base);
                writeDriver(text, gSessionData->mPerfCounterEvent[i]);
                if (gSessionData->mPerfCounterEBSCapable[i]) {
                        snprintf(text, sizeof(text), "%s/count", base);
-                       if (access(resolvePath(text), F_OK) == 0) {
+                       if (access(text, F_OK) == 0) {
                                if (writeReadDriver(text, &gSessionData->mPerfCounterCount[i]) && gSessionData->mPerfCounterCount[i] > 0) {
-                                       logg->logError(__FILE__, __LINE__, "Cannot enable EBS for %s with a count of %d\n", gSessionData->mPerfCounterName[i], gSessionData->mPerfCounterCount[i]);
+                                       logg->logError(__FILE__, __LINE__, "Cannot enable EBS for %s:%s with a count of %d\n", gSessionData->mPerfCounterTitle[i], gSessionData->mPerfCounterName[i], gSessionData->mPerfCounterCount[i]);
                                        handleException();
                                }
                        } else if (gSessionData->mPerfCounterCount[i] > 0) {
@@ -111,7 +128,7 @@ void Collector::setupPerfCounters() {
 void Collector::checkVersion() {
        int driver_version = 0;
 
-       if (readIntDriver("version", &driver_version) == -1) {
+       if (readIntDriver("/dev/gator/version", &driver_version) == -1) {
                logg->logError(__FILE__, __LINE__, "Error reading gator driver version");
                handleException();
        }
@@ -139,61 +156,61 @@ void Collector::checkVersion() {
 
 void Collector::start() {
        // Set the maximum backtrace depth
-       if (writeReadDriver("backtrace_depth", &gSessionData->mBacktraceDepth)) {
+       if (writeReadDriver("/dev/gator/backtrace_depth", &gSessionData->mBacktraceDepth)) {
                logg->logError(__FILE__, __LINE__, "Unable to set the driver backtrace depth");
                handleException();
        }
 
        // open the buffer which calls userspace_buffer_open() in the driver
-       bufferFD = open(resolvePath("buffer"), O_RDONLY);
-       if (bufferFD < 0) {
+       mBufferFD = open("/dev/gator/buffer", O_RDONLY);
+       if (mBufferFD < 0) {
                logg->logError(__FILE__, __LINE__, "The gator driver did not set up properly. Please view the linux console or dmesg log for more information on the failure.");
                handleException();
        }
 
        // set the tick rate of the profiling timer
-       if (writeReadDriver("tick", &gSessionData->mSampleRate) != 0) {
+       if (writeReadDriver("/dev/gator/tick", &gSessionData->mSampleRate) != 0) {
                logg->logError(__FILE__, __LINE__, "Unable to set the driver tick");
                handleException();
        }
 
-       // notify the kernel of the streaming mode, currently used for network stats
-       int streaming = (int)!gSessionData->mOneShot;
-       if (writeReadDriver("streaming", &streaming) != 0) {
-               logg->logError(__FILE__, __LINE__, "Unable to set streaming");
+       // notify the kernel of the response type
+       int response_type = gSessionData->mLocalCapture ? 0 : RESPONSE_APC_DATA;
+       if (writeDriver("/dev/gator/response_type", response_type)) {
+               logg->logError(__FILE__, __LINE__, "Unable to write the response type");
                handleException();
        }
 
        logg->logMessage("Start the driver");
 
        // This command makes the driver start profiling by calling gator_op_start() in the driver
-       if (writeDriver("enable", "1") != 0) {
+       if (writeDriver("/dev/gator/enable", "1") != 0) {
                logg->logError(__FILE__, __LINE__, "The gator driver did not start properly. Please view the linux console or dmesg log for more information on the failure.");
                handleException();
        }
 
-       lseek(bufferFD, 0, SEEK_SET);
+       lseek(mBufferFD, 0, SEEK_SET);
 }
 
 // These commands should cause the read() function in collect() to return
 void Collector::stop() {
        // This will stop the driver from profiling
-       if (writeDriver("enable", "0") != 0) {
+       if (writeDriver("/dev/gator/enable", "0") != 0) {
                logg->logMessage("Stopping kernel failed");
        }
 }
 
 int Collector::collect(char* buffer) {
        // Calls event_buffer_read in the driver
-       int bytesRead = read(bufferFD, buffer, bufferSize);
+       int bytesRead = read(mBufferFD, buffer, mBufferSize);
 
        // If read() returned due to an interrupt signal, re-read to obtain the last bit of collected data
        if (bytesRead == -1 && errno == EINTR) {
-               bytesRead = read(bufferFD, buffer, bufferSize);
+               bytesRead = read(mBufferFD, buffer, mBufferSize);
        }
 
+       // return the total bytes written
        logg->logMessage("Driver read of %d bytes", bytesRead);
-
        return bytesRead;
 }
 
@@ -209,8 +226,9 @@ void Collector::getCoreName() {
        }
 
        while (fgets(temp, sizeof(temp), f)) {
-               if (strlen(temp) > 0)
+               if (strlen(temp) > 0) {
                        temp[strlen(temp) - 1] = 0;     // Replace the line feed with a null
+               }
 
                if (strstr(temp, "Hardware") != 0) {
                        char* position = strchr(temp, ':');
@@ -219,7 +237,7 @@ void Collector::getCoreName() {
                                        "The core name in the captured xml file will be 'unknown'.");
                                return;
                        }
-                       strncpy(gSessionData->mCoreName, (char *)((int)position + 2), sizeof(gSessionData->mCoreName));
+                       strncpy(gSessionData->mCoreName, (char*)((int)position + 2), sizeof(gSessionData->mCoreName));
                        gSessionData->mCoreName[sizeof(gSessionData->mCoreName) - 1] = 0; // strncpy does not guarantee a null-terminated string
                        fclose(f);
                        return;
@@ -231,14 +249,7 @@ void Collector::getCoreName() {
        fclose(f);
 }
 
-char* Collector::resolvePath(const char* file) {
-       static char fullpath[100]; // Sufficiently large to hold any path within /dev/gator
-       snprintf(fullpath, sizeof(fullpath), "/dev/gator/%s", file);
-       return fullpath;
-}
-
-int Collector::readIntDriver(const char* path, int* value) {
-       char* fullpath = resolvePath(path);
+int Collector::readIntDriver(const char* fullpath, int* value) {
        FILE* file = fopen(fullpath, "r");
        if (file == NULL) {
                return -1;
@@ -258,8 +269,7 @@ int Collector::writeDriver(const char* path, int value) {
        return writeDriver(path, data);
 }
 
-int Collector::writeDriver(const char* path, const char* data) {
-       char* fullpath = resolvePath(path);
+int Collector::writeDriver(const char* fullpath, const char* data) {
        int fd = open(fullpath, O_WRONLY);
        if (fd < 0) {
                return -1;
index 6c80725ad94bdfb1af0652fc60565132a0e992e1..5977a725ecc358355a752db5913ae963813e2c43 100644 (file)
@@ -20,16 +20,14 @@ public:
        int collect(char* buffer);
        void enablePerfCounters();
        void setupPerfCounters();
-       int getBufferSize() {return bufferSize;}
+       int getBufferSize() {return mBufferSize;}
 private:
-       int bufferSize;
-       int bufferFD;
-       char * buffer;
+       int mBufferSize;
+       int mBufferFD;
 
        void checkVersion();
        void getCoreName();
 
-       char* resolvePath(const char* file);
        int readIntDriver(const char* path, int* value);
        int writeDriver(const char* path, int value);
        int writeDriver(const char* path, const char* data);
index e1bec0fd4fa89ddb9118355827a3f575f8cfd26a..145ddbdd73633544c223365f3b6acf413e84f34d 100644 (file)
@@ -17,7 +17,7 @@
 extern void handleException();
 
 static const char*     ATTR_COUNTER     = "counter";
-static const char*  ATTR_VERSION     = "version";
+static const char*  ATTR_REVISION    = "revision";
 static const char*     ATTR_TITLE       = "title";
 static const char*     ATTR_NAME        = "name";
 static const char*     ATTR_EVENT       = "event";
@@ -27,14 +27,19 @@ static const char*  ATTR_OPERATION   = "operation";
 static const char*     ATTR_PER_CPU     = "per_cpu";
 static const char*  ATTR_DESCRIPTION = "description";
 static const char*     ATTR_EBS         = "event_based_sampling";
+static const char*  ATTR_LEVEL       = "level";
+static const char*  ATTR_ALIAS       = "alias";
+static const char*  ATTR_DISPLAY     = "display";
+static const char*  ATTR_UNITS       = "units";
+static const char*  ATTR_AVERAGE_SELECTION = "average_selection";
 
 ConfigurationXML::ConfigurationXML() {
 #include "configuration_xml.h" // defines and initializes char configuration_xml[] and int configuration_xml_len
-       index = 0;
-       char* path = (char *)malloc(PATH_MAX);
+       mIndex = 0;
+       char* path = (char*)malloc(PATH_MAX);
 
-       if (gSessionData->configurationXMLPath) {
-               strncpy(path, gSessionData->configurationXMLPath, PATH_MAX);
+       if (gSessionData->mConfigurationXMLPath) {
+               strncpy(path, gSessionData->mConfigurationXMLPath, PATH_MAX);
        } else {
                if (util->getApplicationFullPath(path, PATH_MAX) != 0) {
                        logg->logMessage("Unable to determine the full path of gatord, the cwd will be used");
@@ -63,10 +68,10 @@ ConfigurationXML::ConfigurationXML() {
                        logg->logError(__FILE__, __LINE__, "Invalid configuration.xml file detected and unable to delete it. To resolve, delete configuration.xml on disk");
                        handleException();
                }
-       } else if (ret < 0 || isValid() == false) {
-               logg->logError(__FILE__, __LINE__, "Parsing of the configuration.xml file failed. Please verify configuration.xml on the target filesystem is valid or delete it to use the default.");
-               handleException();
+               logg->logMessage("Invalid configuration.xml file detected and removed");
        }
+       
+       validate();
 
        free(path);
 }
@@ -78,79 +83,106 @@ ConfigurationXML::~ConfigurationXML() {
 }
 
 int ConfigurationXML::parse(const char* configurationXML) {
-       int ret = 0;
-       XMLReader reader(configurationXML);
-       char * tag = reader.nextTag();
-       while(tag != 0 && ret == 0) {
-               if (strcmp(tag, "configurations") == 0) {
-                       ret = configurationsTag(&reader);
-               } else if (strcmp(tag, "configuration") == 0) {
-                       ret = configurationTag(&reader);
+       mxml_node_t *tree, *node;
+       int ret;
+
+       tree = mxmlLoadString(NULL, configurationXML, MXML_NO_CALLBACK);
+
+       node = mxmlGetFirstChild(tree);
+       while (node && mxmlGetType(node) != MXML_ELEMENT)
+               node = mxmlWalkNext(node, tree, MXML_NO_DESCEND);
+       
+       ret = configurationsTag(node);
+
+       node = mxmlGetFirstChild(node);
+       while (node) {
+               if (mxmlGetType(node) != MXML_ELEMENT) {
+                       node = mxmlWalkNext(node, tree, MXML_NO_DESCEND);
+                       continue;
                }
-               tag = reader.nextTag();
+               configurationTag(node);
+               node = mxmlWalkNext(node, tree, MXML_NO_DESCEND);
        }
 
+       mxmlDelete(tree);
+
        return ret;
 }
 
-bool ConfigurationXML::isValid(void) {
+void ConfigurationXML::validate(void) {
        for (int i = 0; i < MAX_PERFORMANCE_COUNTERS; i++) {
                if (gSessionData->mPerfCounterEnabled[i]) {
-                       if (strcmp(gSessionData->mPerfCounterType[i], "") == 0 ||
-                                       strcmp(gSessionData->mPerfCounterTitle[i], "") == 0 ||
-                                       strcmp(gSessionData->mPerfCounterName[i], "") == 0) {
-                               logg->logMessage("Invalid required attribute\n  counter=\"%s\"\n  title=\"%s\"\n  name=\"%s\"\n  event=%d\n", gSessionData->mPerfCounterType[i], gSessionData->mPerfCounterTitle[i], gSessionData->mPerfCounterName[i], gSessionData->mPerfCounterEvent[i]);
-                               return false; // failure
+                       if (strcmp(gSessionData->mPerfCounterType[i], "") == 0) {
+                               logg->logError(__FILE__, __LINE__, "Invalid required attribute in configuration.xml:\n  counter=\"%s\"\n  title=\"%s\"\n  name=\"%s\"\n  event=%d\n", gSessionData->mPerfCounterType[i], gSessionData->mPerfCounterTitle[i], gSessionData->mPerfCounterName[i], gSessionData->mPerfCounterEvent[i]);
+                               handleException();
                        }
 
                        // iterate through the remaining enabled performance counters
                        for (int j = i + 1; j < MAX_PERFORMANCE_COUNTERS; j++) {
                                if (gSessionData->mPerfCounterEnabled[j]) {
-                                       // check if the type or device are the same
+                                       // check if the types are the same
                                        if (strcmp(gSessionData->mPerfCounterType[i], gSessionData->mPerfCounterType[j]) == 0) {
-                                               logg->logMessage("Duplicate performance counter type: %s", gSessionData->mPerfCounterType[i]);
-                                               return false; // failure
+                                               logg->logError(__FILE__, __LINE__, "Duplicate performance counter type in configuration.xml: %s", gSessionData->mPerfCounterType[i]);
+                                               handleException();
                                        }
                                }
                        }
                }
        }
-
-       return true; // success
 }
 
-#define CONFIGURATION_VERSION 1
-int ConfigurationXML::configurationsTag(XMLReader *in) {
-       int version = in->getAttributeAsInteger(ATTR_VERSION, 0);
-       if (version != CONFIGURATION_VERSION) {
-               logg->logMessage("Incompatible configuration.xml version (%d) detected. The version needs to be %d.", version, CONFIGURATION_VERSION);
-               return 1; // version issue
+#define CONFIGURATION_REVISION 1
+int ConfigurationXML::configurationsTag(mxml_node_t *node) {
+       const char* revision_string;
+       
+       revision_string = mxmlElementGetAttr(node, ATTR_REVISION);
+       if (!revision_string) {
+               return 1; //revision issue;
+       }
+
+       int revision = strtol(revision_string, NULL, 10);
+       if (revision < CONFIGURATION_REVISION) {
+               return 1; // revision issue
        }
+
        return 0;
 }
 
-int ConfigurationXML::configurationTag(XMLReader* in) {
+void ConfigurationXML::configurationTag(mxml_node_t *node) {
        // handle all other performance counters
-       if (index >= MAX_PERFORMANCE_COUNTERS) {
-               logg->logMessage("Invalid performance counter index: %d", index);
-               return -1; // failure
+       if (mIndex >= MAX_PERFORMANCE_COUNTERS) {
+               logg->logError(__FILE__, __LINE__, "Exceeded maximum number of %d performance counters", MAX_PERFORMANCE_COUNTERS);
+               handleException();
        }
 
        // read attributes
-       in->getAttribute(ATTR_COUNTER, gSessionData->mPerfCounterType[index], sizeof(gSessionData->mPerfCounterType[index]), "");
-       in->getAttribute(ATTR_TITLE, gSessionData->mPerfCounterTitle[index], sizeof(gSessionData->mPerfCounterTitle[index]), "");
-       in->getAttribute(ATTR_NAME, gSessionData->mPerfCounterName[index], sizeof(gSessionData->mPerfCounterName[index]), "");
-       in->getAttribute(ATTR_DESCRIPTION, gSessionData->mPerfCounterDescription[index], sizeof(gSessionData->mPerfCounterDescription[index]), "");
-       gSessionData->mPerfCounterEvent[index] = in->getAttributeAsInteger(ATTR_EVENT, 0);
-       gSessionData->mPerfCounterCount[index] = in->getAttributeAsInteger(ATTR_COUNT, 0);
-       gSessionData->mPerfCounterColor[index] = in->getAttributeAsInteger(ATTR_COLOR, 0);
-       gSessionData->mPerfCounterPerCPU[index] = in->getAttributeAsBoolean(ATTR_PER_CPU, false);
-       gSessionData->mPerfCounterEBSCapable[index] = in->getAttributeAsBoolean(ATTR_EBS, false);
-       in->getAttribute(ATTR_OPERATION, gSessionData->mPerfCounterOperation[index], sizeof(gSessionData->mPerfCounterOperation[index]), "");
-       gSessionData->mPerfCounterEnabled[index] = true;
+       if (mxmlElementGetAttr(node, ATTR_COUNTER)) strncpy(gSessionData->mPerfCounterType[mIndex], mxmlElementGetAttr(node, ATTR_COUNTER), sizeof(gSessionData->mPerfCounterType[mIndex]));
+       if (mxmlElementGetAttr(node, ATTR_TITLE)) strncpy(gSessionData->mPerfCounterTitle[mIndex], mxmlElementGetAttr(node, ATTR_TITLE), sizeof(gSessionData->mPerfCounterTitle[mIndex]));
+       if (mxmlElementGetAttr(node, ATTR_NAME)) strncpy(gSessionData->mPerfCounterName[mIndex], mxmlElementGetAttr(node, ATTR_NAME), sizeof(gSessionData->mPerfCounterName[mIndex]));
+       if (mxmlElementGetAttr(node, ATTR_DESCRIPTION)) strncpy(gSessionData->mPerfCounterDescription[mIndex], mxmlElementGetAttr(node, ATTR_DESCRIPTION), sizeof(gSessionData->mPerfCounterDescription[mIndex]));
+       if (mxmlElementGetAttr(node, ATTR_EVENT)) gSessionData->mPerfCounterEvent[mIndex] = strtol(mxmlElementGetAttr(node, ATTR_EVENT), NULL, 16);
+       if (mxmlElementGetAttr(node, ATTR_COUNT)) gSessionData->mPerfCounterCount[mIndex] = strtol(mxmlElementGetAttr(node, ATTR_COUNT), NULL, 10);
+       if (mxmlElementGetAttr(node, ATTR_COLOR)) gSessionData->mPerfCounterColor[mIndex] = strtol(mxmlElementGetAttr(node, ATTR_COLOR), NULL, 16);
+       if (mxmlElementGetAttr(node, ATTR_PER_CPU)) gSessionData->mPerfCounterPerCPU[mIndex] = util->stringToBool(mxmlElementGetAttr(node, ATTR_PER_CPU), false);
+       if (mxmlElementGetAttr(node, ATTR_EBS)) gSessionData->mPerfCounterEBSCapable[mIndex] = util->stringToBool(mxmlElementGetAttr(node, ATTR_EBS), false);
+       if (mxmlElementGetAttr(node, ATTR_OPERATION)) strncpy(gSessionData->mPerfCounterOperation[mIndex], mxmlElementGetAttr(node, ATTR_OPERATION), sizeof(gSessionData->mPerfCounterOperation[mIndex]));
+       if (mxmlElementGetAttr(node, ATTR_LEVEL)) gSessionData->mPerfCounterLevel[mIndex] = util->stringToBool(mxmlElementGetAttr(node, ATTR_LEVEL), false);
+       if (mxmlElementGetAttr(node, ATTR_ALIAS)) strncpy(gSessionData->mPerfCounterAlias[mIndex], mxmlElementGetAttr(node, ATTR_ALIAS), sizeof(gSessionData->mPerfCounterAlias[mIndex]));
+       if (mxmlElementGetAttr(node, ATTR_DISPLAY)) strncpy(gSessionData->mPerfCounterDisplay[mIndex], mxmlElementGetAttr(node, ATTR_DISPLAY), sizeof(gSessionData->mPerfCounterDisplay[mIndex]));
+       if (mxmlElementGetAttr(node, ATTR_UNITS)) strncpy(gSessionData->mPerfCounterUnits[mIndex], mxmlElementGetAttr(node, ATTR_UNITS), sizeof(gSessionData->mPerfCounterUnits[mIndex]));
+       if (mxmlElementGetAttr(node, ATTR_AVERAGE_SELECTION)) gSessionData->mPerfCounterAverageSelection[mIndex] = util->stringToBool(mxmlElementGetAttr(node, ATTR_AVERAGE_SELECTION), false);
+       gSessionData->mPerfCounterEnabled[mIndex] = true;
+
+       // strncpy does not guarantee a null-termianted string
+       gSessionData->mPerfCounterType[mIndex][sizeof(gSessionData->mPerfCounterType[mIndex]) - 1] = 0;
+       gSessionData->mPerfCounterTitle[mIndex][sizeof(gSessionData->mPerfCounterTitle[mIndex]) - 1] = 0;
+       gSessionData->mPerfCounterName[mIndex][sizeof(gSessionData->mPerfCounterName[mIndex]) - 1] = 0;
+       gSessionData->mPerfCounterDescription[mIndex][sizeof(gSessionData->mPerfCounterDescription[mIndex]) - 1] = 0;
+       gSessionData->mPerfCounterOperation[mIndex][sizeof(gSessionData->mPerfCounterOperation[mIndex]) - 1] = 0;
+       gSessionData->mPerfCounterAlias[mIndex][sizeof(gSessionData->mPerfCounterAlias[mIndex]) - 1] = 0;
+       gSessionData->mPerfCounterDisplay[mIndex][sizeof(gSessionData->mPerfCounterDisplay[mIndex]) - 1] = 0;
+       gSessionData->mPerfCounterUnits[mIndex][sizeof(gSessionData->mPerfCounterUnits[mIndex]) - 1] = 0;
 
        // update counter index
-       index++;
-
-       return 0; // success
+       mIndex++;
 }
index 047c4b077056e11fc2a730614d3b43d6f230a88f..b48d32f978dc64d6e06c083ef2cfa58ee19215dd 100644 (file)
@@ -9,21 +9,21 @@
 #ifndef COUNTERS_H
 #define COUNTERS_H
 
-#include "XMLReader.h"
+#include "mxml/mxml.h"
 
 class ConfigurationXML {
 public:
        ConfigurationXML();
        ~ConfigurationXML();
        const char* getConfigurationXML() {return mConfigurationXML;}
+       void validate(void);
 private:
        char* mConfigurationXML;
+       int mIndex;
 
        int parse(const char* xmlFile);
-       bool isValid(void);
-       int configurationsTag(XMLReader *in);
-       int configurationTag(XMLReader* in);
-       int index;
+       int configurationsTag(mxml_node_t *node);
+       void configurationTag(mxml_node_t *node);
 };
 
 #endif // COUNTERS_H
index 1456183b0f0df8d4688f3d577e71e7525445196f..bbfc9198b307a4f6b8e9a152568b0c481f15221e 100644 (file)
-/**
- * Copyright (C) ARM Limited 2010-2012. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include "Fifo.h"
-#include "Logging.h"
-
-extern void handleException();
-
-Fifo::Fifo(int numBuffers, int bufferSize) {
-       int     which;
-
-       if (numBuffers > FIFO_BUFFER_LIMIT) {
-               logg->logError(__FILE__, __LINE__, "Number of fifo buffers exceeds maximum");
-               handleException();
-       }
-       mNumBuffers = numBuffers;
-       mBufferSize = bufferSize;
-       mWriteCurrent = 0;
-       mReadCurrent = mNumBuffers - 1; // (n-1) pipelined
-
-       for (which=0; which<mNumBuffers; which++) {
-               // initialized read-to-write sem to 1, so that first wait goes through; write-to-read init'd to 0
-               if (sem_init(&mReadToWriteSem[which], 0, 1) ||
-                       sem_init(&mWriteToReadSem[which], 0, 0)) {
-                       logg->logError(__FILE__, __LINE__, "sem_init(%d) failed", which);
-                       handleException();
-               }
-               // page-align allocate buffers
-               mBuffer[which] = (char*)valloc(bufferSize);
-               if (mBuffer[which] == NULL) {
-                       logg->logError(__FILE__, __LINE__, "failed to allocate %d bytes", bufferSize);
-                       handleException();
-               }
-               // touch each page to fault it in
-               for (int i=0; i<bufferSize; i+= getpagesize()) {
-                       *mBuffer[which] = 0;
-               }
-       }
-}
-
-Fifo::~Fifo() {
-       for (int which=0; which<mNumBuffers; which++) {
-               if (mBuffer[which] != NULL) {
-                       free(mBuffer[which]);
-                       mBuffer[which] = NULL;
-               }
-       }
-}
-
-int Fifo::depth(void) {
-       return mNumBuffers;
-}
-
-int Fifo::numReadToWriteBuffersFilled() {
-       int value;
-       int numFilled = 0;
-       for (int which=0; which<mNumBuffers; which++) {
-               if (sem_getvalue(&mReadToWriteSem[which], &value) == 0) numFilled += value;
-       }
-       return numFilled;
-}
-
-int Fifo::numWriteToReadBuffersFilled() {
-       int value;
-       int numFilled = 0;
-       for (int which=0; which<mNumBuffers; which++) {
-               if (sem_getvalue(&mWriteToReadSem[which], &value) == 0) numFilled += value;
-       }
-       return numFilled;
-}
-
-char* Fifo::start() {
-       sem_wait(&mReadToWriteSem[mWriteCurrent]);
-       return mBuffer[mWriteCurrent];
-}
-
-char* Fifo::write(int length) {
-       mLength[mWriteCurrent] = length;
-       sem_post(&mWriteToReadSem[mWriteCurrent]);
-       mWriteCurrent = (mWriteCurrent + 1) % mNumBuffers;
-       sem_wait(&mReadToWriteSem[mWriteCurrent]);
-       return mBuffer[mWriteCurrent];
-}
-
-char* Fifo::read(int* length) {
-       static bool firstTime = true;
-       if (!firstTime) {
-               sem_post(&mReadToWriteSem[mReadCurrent]);
-       }
-       firstTime = false;
-       mReadCurrent = (mReadCurrent + 1) % mNumBuffers;
-       sem_wait(&mWriteToReadSem[mReadCurrent]);
-       *length = mLength[mReadCurrent];
-       return mBuffer[mReadCurrent];
-}
+/**\r
+ * Copyright (C) ARM Limited 2010-2012. All rights reserved.\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License version 2 as\r
+ * published by the Free Software Foundation.\r
+ */\r
+\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <unistd.h>\r
+#include "Fifo.h"\r
+#include "Logging.h"\r
+\r
+extern void handleException();\r
+\r
+// bufferSize is the amount of data to be filled\r
+// singleBufferSize is the maximum size that may be filled during a single write\r
+// (bufferSize + singleBufferSize) will be allocated\r
+Fifo::Fifo(int singleBufferSize, int bufferSize) {\r
+       mWrite = mRead = mReadCommit = mRaggedEnd = 0;\r
+       mWrapThreshold = bufferSize;\r
+       mSingleBufferSize = singleBufferSize;\r
+       mBuffer = (char*)valloc(bufferSize + singleBufferSize);\r
+       mEnd = false;\r
+\r
+       if (mBuffer == NULL) {\r
+               logg->logError(__FILE__, __LINE__, "failed to allocate %d bytes", bufferSize + singleBufferSize);\r
+               handleException();\r
+       }\r
+\r
+       if (sem_init(&mWaitForSpaceSem, 0, 0) || sem_init(&mWaitForDataSem, 0, 0)) {\r
+               logg->logError(__FILE__, __LINE__, "sem_init() failed");\r
+               handleException();\r
+       }\r
+}\r
+\r
+Fifo::~Fifo() {\r
+       free(mBuffer);\r
+}\r
+\r
+int Fifo::numBytesFilled() {\r
+       return mWrite - mRead + mRaggedEnd;\r
+}\r
+\r
+char* Fifo::start() {\r
+       return mBuffer;\r
+}\r
+\r
+bool Fifo::isEmpty() {\r
+       return mRead == mWrite;\r
+}\r
+\r
+bool Fifo::isFull() {\r
+       return willFill(0);\r
+}\r
+\r
+// Determines if the buffer will fill assuming 'additional' bytes will be added to the buffer\r
+// comparisons use '<', read and write pointers must never equal when not empty\r
+// 'full' means there is less than singleBufferSize bytes available; it does not mean there are zero bytes available\r
+bool Fifo::willFill(int additional) {\r
+       if (mWrite > mRead) {\r
+               if (numBytesFilled() + additional < mWrapThreshold) {\r
+                       return false;\r
+               }\r
+       } else {\r
+               if (numBytesFilled() + additional < mWrapThreshold - mSingleBufferSize) {\r
+                       return false;\r
+               }\r
+       }\r
+       return true;\r
+}\r
+\r
+// This function will stall until contiguous singleBufferSize bytes are available\r
+char* Fifo::write(int length) {\r
+       if (length <= 0) {\r
+               length = 0;\r
+               mEnd = true;\r
+       }\r
+\r
+       // update the write pointer\r
+       mWrite += length;\r
+\r
+       // handle the wrap-around\r
+       if (mWrite >= mWrapThreshold) {\r
+               mRaggedEnd = mWrite;\r
+               mWrite = 0;\r
+       }\r
+\r
+       // send a notification that data is ready\r
+       sem_post(&mWaitForDataSem);\r
+\r
+       // wait for space\r
+       while (isFull()) {\r
+               sem_wait(&mWaitForSpaceSem);\r
+       }\r
+\r
+       return &mBuffer[mWrite];\r
+}\r
+\r
+// This function will stall until data is available\r
+char* Fifo::read(int* length) {\r
+       // update the read pointer now that the data has been handled\r
+       mRead = mReadCommit;\r
+\r
+       // handle the wrap-around\r
+       if (mRead >= mWrapThreshold) {\r
+               mRaggedEnd = mRead = mReadCommit = 0;\r
+       }\r
+\r
+       // send a notification that data is free (space is available)\r
+       sem_post(&mWaitForSpaceSem);\r
+\r
+       // wait for data\r
+       while (isEmpty() && !mEnd) {\r
+               sem_wait(&mWaitForDataSem);\r
+       }\r
+\r
+       // obtain the length\r
+       do {\r
+               mReadCommit = mRaggedEnd ? mRaggedEnd : mWrite;\r
+               *length = mReadCommit - mRead;\r
+       } while (*length < 0); // plugs race condition without using semaphores\r
+\r
+       return &mBuffer[mRead];\r
+}\r
index 51e2bcd6a7f888662b9ba664abc7349ca8c483e9..548ba2788064c3a892baa649d5c683a539d61a39 100644 (file)
@@ -1,41 +1,33 @@
-/**
- * Copyright (C) ARM Limited 2010-2012. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifndef        __FIFO_H__
-#define        __FIFO_H__
-
-#include <semaphore.h>
-
-// Number of buffers allowed with large buffer mode
-#define FIFO_BUFFER_LIMIT      64
-
-class Fifo {
-public:
-       Fifo(int numBuffers, int bufferSize);
-       ~Fifo();
-       int depth(void);
-       int numReadToWriteBuffersFilled();
-       int numWriteToReadBuffersFilled();
-       int numReadToWriteBuffersEmpty() {return depth() - numReadToWriteBuffersFilled();}
-       int numWriteToReadBuffersEmpty() {return depth() - numWriteToReadBuffersFilled();}
-       char* start();
-       char* write(int length);
-       char* read(int* length);
-
-private:
-       int             mNumBuffers;
-       int             mBufferSize;
-       int             mWriteCurrent;
-       int             mReadCurrent;
-       sem_t   mReadToWriteSem[FIFO_BUFFER_LIMIT];
-       sem_t   mWriteToReadSem[FIFO_BUFFER_LIMIT];
-       char*   mBuffer[FIFO_BUFFER_LIMIT];
-       int             mLength[FIFO_BUFFER_LIMIT];
-};
-
-#endif         //__FIFO_H__
+/**\r
+ * Copyright (C) ARM Limited 2010-2012. All rights reserved.\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License version 2 as\r
+ * published by the Free Software Foundation.\r
+ */\r
+\r
+#ifndef        __FIFO_H__\r
+#define        __FIFO_H__\r
+\r
+#include <semaphore.h>\r
+\r
+class Fifo {\r
+public:\r
+       Fifo(int singleBufferSize, int totalBufferSize);\r
+       ~Fifo();\r
+       int numBytesFilled();\r
+       bool isEmpty();\r
+       bool isFull();\r
+       bool willFill(int additional);\r
+       char* start();\r
+       char* write(int length);\r
+       char* read(int* length);\r
+\r
+private:\r
+       int             mSingleBufferSize, mWrite, mRead, mReadCommit, mRaggedEnd, mWrapThreshold;\r
+       sem_t   mWaitForSpaceSem, mWaitForDataSem;\r
+       char*   mBuffer;\r
+       bool    mEnd;\r
+};\r
+\r
+#endif         //__FIFO_H__\r
index 4a2d6d755e6b3c2f57fa74f0bf96fe93f7c0cc7b..6449d0352142ae1b69e7699ef2b226c219353bda 100644 (file)
@@ -24,9 +24,9 @@ LocalCapture::LocalCapture() {}
 LocalCapture::~LocalCapture() {}
 
 void LocalCapture::createAPCDirectory(char* target_path, char* name) {
-       gSessionData->apcDir = createUniqueDirectory(target_path, ".apc", name);
-       if ((removeDirAndAllContents(gSessionData->apcDir) != 0 || mkdir(gSessionData->apcDir, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0)) {
-               logg->logError(__FILE__, __LINE__, "Unable to create directory %s", gSessionData->apcDir);
+       gSessionData->mAPCDir = createUniqueDirectory(target_path, ".apc", name);
+       if ((removeDirAndAllContents(gSessionData->mAPCDir) != 0 || mkdir(gSessionData->mAPCDir, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0)) {
+               logg->logError(__FILE__, __LINE__, "Unable to create directory %s", gSessionData->mAPCDir);
                handleException();
        }
 }
@@ -35,7 +35,7 @@ void LocalCapture::write(char* string) {
        char* file = (char*)malloc(PATH_MAX);
 
        // Set full path
-       snprintf(file, PATH_MAX, "%s/session.xml", gSessionData->apcDir);
+       snprintf(file, PATH_MAX, "%s/session.xml", gSessionData->mAPCDir);
 
        // Write the file
        if (util->writeToDisk(file, string) < 0) {
@@ -53,12 +53,14 @@ char* LocalCapture::createUniqueDirectory(const char* initialPath, const char* e
 
        // Ensure the path is an absolute path, i.e. starts with a slash
        if (initialPath == 0 || strlen(initialPath) == 0) {
-               if (getcwd(path, PATH_MAX) == 0)
+               if (getcwd(path, PATH_MAX) == 0) {
                        logg->logMessage("Unable to retrive the current working directory");
+               }
                strncat(path, "/@F_@N", PATH_MAX - strlen(path) - 1);
        } else if (initialPath[0] != '/') {
-               if (getcwd(path, PATH_MAX) == 0)
+               if (getcwd(path, PATH_MAX) == 0) {
                        logg->logMessage("Unable to retrive the current working directory");
+               }
                strncat(path, "/", PATH_MAX - strlen(path) - 1);
                strncat(path, initialPath, PATH_MAX - strlen(path) - 1);
        } else {
@@ -158,7 +160,7 @@ void LocalCapture::replaceAll(char* target, const char* find, const char* replac
        free(original);
 }
 
-int LocalCapture::removeDirAndAllContents(char *path) {
+int LocalCapture::removeDirAndAllContents(charpath) {
        int error = 0;
        struct stat mFileInfo;
        // Does the path exist?
@@ -173,7 +175,9 @@ int LocalCapture::removeDirAndAllContents(char *path) {
                                        sprintf(newpath, "%s/%s", path, entry->d_name);
                                        error = removeDirAndAllContents(newpath);
                                        free(newpath);
-                                       if (error) break;
+                                       if (error) {
+                                               break;
+                                       }
                                }
                                entry = readdir(dir);
                        }
@@ -192,15 +196,17 @@ void LocalCapture::copyImages(ImageLinkList* ptr) {
        char* dstfilename = (char*)malloc(PATH_MAX);
 
        while (ptr) {
-               strncpy(dstfilename, gSessionData->apcDir, PATH_MAX);
+               strncpy(dstfilename, gSessionData->mAPCDir, PATH_MAX);
                dstfilename[PATH_MAX - 1] = 0; // strncpy does not guarantee a null-terminated string
-               if (gSessionData->apcDir[strlen(gSessionData->apcDir) - 1] != '/')
+               if (gSessionData->mAPCDir[strlen(gSessionData->mAPCDir) - 1] != '/') {
                        strncat(dstfilename, "/", PATH_MAX - strlen(dstfilename) - 1);
+               }
                strncat(dstfilename, util->getFilePart(ptr->path), PATH_MAX - strlen(dstfilename) - 1);
-               if (util->copyFile(ptr->path, dstfilename))
+               if (util->copyFile(ptr->path, dstfilename)) {
                        logg->logMessage("copied file %s to %s", ptr->path, dstfilename);
-               else
+               } else {
                        logg->logMessage("copy of file %s to %s failed", ptr->path, dstfilename);
+               }
 
                ptr = ptr->next;
        }
index 4f5f8186e09f75b3d29e39a70cc7cbb900a1d620..ca37f6e7b5152daf4b5e0ff294f56e4cbc6e4be1 100644 (file)
@@ -15,13 +15,13 @@ class LocalCapture {
 public:
        LocalCapture();
        ~LocalCapture();
-       void write(char *string);
+       void write(charstring);
        void copyImages(ImageLinkList* ptr);
        void createAPCDirectory(char* target_path, char* name);
 private:
        char* createUniqueDirectory(const char* path, const char* ending, char* title);
        void replaceAll(char* target, const char* find, const char* replace, unsigned int size);
-       int removeDirAndAllContents(char *path);
+       int removeDirAndAllContents(charpath);
 };
 
 #endif         //__LOCAL_CAPTURE_H__
index d73d95bb96d79d5bf8888ed61ac4ef709eb4a842..aa1c0056a8a5a03e4ab74bab363770434c540673 100644 (file)
@@ -7,6 +7,7 @@
 ARCH=arm
 
 CPP=$(CROSS_COMPILE)g++
+GCC=$(CROSS_COMPILE)gcc
 
 # -g produces debugging information
 # -O3 maximum optimization
@@ -17,13 +18,18 @@ CPP=$(CROSS_COMPILE)g++
 # -std=c++98 is the 1998 c++ standard
 # -march=armv5t is required to set the minimum architecture
 # -mthumb-interwork is required for interworking to ARM or Thumb stdlibc
-CFLAGS=-O3 -Wall -Werror
+CFLAGS=-O3 -Wall -Werror -march=armv5t -mthumb-interwork
 TARGET=gatord
-CPP_SRC = $(wildcard *.cpp)
-TGT_OBJS = $(CPP_SRC:%.cpp=%.o)
+C_SRC = $(wildcard mxml/*.c)
+CPP_SRC  = $(wildcard *.cpp)
+TGT_OBJS = $(CPP_SRC:%.cpp=%.o) \
+           $(C_SRC:%.c=%.o)
 
 all: $(TARGET)
 
+%.o: %.c *.h
+       $(GCC) -c $(CFLAGS) -o $@ $<
+
 %.o: %.cpp *.h
        $(CPP) -c $(CFLAGS) -o $@ $<
 
@@ -37,4 +43,4 @@ convert:
        xxd -i configuration.xml > configuration_xml.h
 
 clean:
-       rm -f *.o $(TARGET) events.xml events_xml.h configuration_xml.h
+       rm -f *.o mxml/*.o $(TARGET) events.xml events_xml.h configuration_xml.h
old mode 100644 (file)
new mode 100755 (executable)
index 8a9ca97..a3bf746
@@ -46,7 +46,7 @@ OlySocket::OlySocket(int port, bool multiple) {
 }
 
 OlySocket::OlySocket(int port, char* host) {
-       fdServer = 0;
+       mFDServer = 0;
        createClientSocket(host, port);
 }
 
@@ -70,11 +70,11 @@ void OlySocket::closeSocket() {
 }
 
 void OlySocket::closeServerSocket() {
-       if (CLOSE_SOCKET(fdServer) != 0) {
+       if (CLOSE_SOCKET(mFDServer) != 0) {
                logg->logError(__FILE__, __LINE__, "Failed to close server socket.");
                handleException();
        }
-       fdServer = 0;
+       mFDServer = 0;
 }
 
 void OlySocket::createClientSocket(char* hostname, int portno) {
@@ -95,8 +95,9 @@ void OlySocket::createClientSocket(char* hostname, int portno) {
                handleException();
        }
        for (res=res0; res!=NULL; res = res->ai_next) {
-               if ( res->ai_family != PF_INET || res->ai_socktype != SOCK_STREAM )
+               if ( res->ai_family != PF_INET || res->ai_socktype != SOCK_STREAM ) {
                        continue;
+               }
                mSocketID = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
                if (mSocketID < 0) {
                        continue;
@@ -105,7 +106,9 @@ void OlySocket::createClientSocket(char* hostname, int portno) {
                        close(mSocketID);
                        mSocketID = -1;
                }
-               if (mSocketID > 0) break;
+               if (mSocketID > 0) {
+                       break;
+               }
        }
        freeaddrinfo(res0);
        if (mSocketID <= 0) {
@@ -124,15 +127,15 @@ void OlySocket::createSingleServerConnection(int port) {
 
 void OlySocket::createServerSocket(int port) {
        // Create socket
-       fdServer = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
-       if (fdServer < 0) {
+       mFDServer = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
+       if (mFDServer < 0) {
                logg->logError(__FILE__, __LINE__, "Error creating server socket");
                handleException();
        }
 
        // Enable address reuse, another solution would be to create the server socket once and only close it when the object exits
        int on = 1;
-       if (setsockopt(fdServer, SOL_SOCKET, SO_REUSEADDR, (const char *)&on, sizeof(on)) != 0) {
+       if (setsockopt(mFDServer, SOL_SOCKET, SO_REUSEADDR, (const char*)&on, sizeof(on)) != 0) {
                logg->logError(__FILE__, __LINE__, "Setting server socket options failed");
                handleException();
        }
@@ -145,13 +148,13 @@ void OlySocket::createServerSocket(int port) {
        sockaddr.sin_addr.s_addr = INADDR_ANY;
        
        // Bind the socket to an address
-       if (bind(fdServer, (const struct sockaddr*)&sockaddr, sizeof(sockaddr)) < 0) {
+       if (bind(mFDServer, (const struct sockaddr*)&sockaddr, sizeof(sockaddr)) < 0) {
                logg->logError(__FILE__, __LINE__, "Binding of server socket failed.\nIs an instance already running?");
                handleException();
        }
 
        // Listen for connections on this socket
-       if (listen(fdServer, 1) < 0) {
+       if (listen(mFDServer, 1) < 0) {
                logg->logError(__FILE__, __LINE__, "Listening of server socket failed");
                handleException();
        }
@@ -160,13 +163,13 @@ void OlySocket::createServerSocket(int port) {
 // mSocketID is always set to the most recently accepted connection
 // The user of this class should maintain the different socket connections, e.g. by forking the process
 int OlySocket::acceptConnection() {
-       if (fdServer <= 0) {
+       if (mFDServer <= 0) {
                logg->logError(__FILE__, __LINE__, "Attempting multiple connections on a single connection server socket or attempting to accept on a client socket");
                handleException();
        }
 
        // Accept a connection, note that this call blocks until a client connects
-       mSocketID = accept(fdServer, NULL, NULL);
+       mSocketID = accept(mFDServer, NULL, NULL);
        if (mSocketID < 0) {
                logg->logError(__FILE__, __LINE__, "Socket acceptance failed");
                handleException();
@@ -230,8 +233,9 @@ int OlySocket::receiveString(char* buffer, int size) {
        int bytes_received = 0;
        bool found = false;
 
-       if (buffer == 0)
+       if (buffer == 0) {
                return 0;
+       }
 
        while (!found && bytes_received < size) {
                // Receive a single character
old mode 100644 (file)
new mode 100755 (executable)
index 2fe6e59..266a831
@@ -25,11 +25,9 @@ public:
        int receive(char* buffer, int size);
        int receiveNBytes(char* buffer, int size);
        int receiveString(char* buffer, int size);
-       char* getLastError() {return strError;}
        int getSocketID() {return mSocketID;}
 private:
-       char* strError;
-       int mSocketID, fdServer;
+       int mSocketID, mFDServer;
        void createClientSocket(char* hostname, int port);
        void createSingleServerConnection(int port);
        void createServerSocket(int port);
old mode 100644 (file)
new mode 100755 (executable)
index 1b15d33..ec852df
 
 OlyUtility* util = NULL;
 
+bool OlyUtility::stringToBool(const char* string, bool defValue) {
+       char value[32];
+
+       strncpy(value, string, sizeof(value));
+       if (value[0] == 0) {
+               return defValue;
+       }
+       value[sizeof(value) - 1] = 0; // strncpy does not guarantee a null-terminated string
+
+       // Convert to lowercase
+       int i = 0;
+       while (value[i]) {
+               value[i] = tolower(value[i]);
+               i++;
+       }
+
+       if (strcmp(value, "true") == 0 || strcmp(value, "yes") == 0 || strcmp(value, "1") == 0 || strcmp(value, "on") == 0) {
+               return true;
+       } else if (strcmp(value, "false") == 0 || strcmp(value, "no") == 0 || strcmp(value, "0") == 0 || strcmp(value, "off") == 0) {
+               return false;
+       } else {
+               return defValue;
+       }
+}
+
 void OlyUtility::stringToLower(char* string) {
-       if (string == NULL)
+       if (string == NULL) {
                return;
+       }
 
        while (*string) {
                *string = tolower(*string);
@@ -40,8 +66,9 @@ int OlyUtility::getApplicationFullPath(char* fullpath, int sizeOfPath) {
        int length = readlink("/proc/self/exe", fullpath, sizeOfPath);
 #endif
 
-       if (length == sizeOfPath)
+       if (length == sizeOfPath) {
                return -1;
+       }
 
        fullpath[length] = 0;
        fullpath = getPathPart(fullpath);
@@ -52,7 +79,9 @@ int OlyUtility::getApplicationFullPath(char* fullpath, int sizeOfPath) {
 char* OlyUtility::readFromDisk(const char* file, unsigned int *size, bool appendNull) {
        // Open the file
        FILE* pFile = fopen(file, "rb");
-       if (pFile==NULL) return NULL;
+       if (pFile==NULL) {
+               return NULL;
+       }
 
        // Obtain file size
        fseek(pFile , 0 , SEEK_END);
@@ -61,19 +90,28 @@ char* OlyUtility::readFromDisk(const char* file, unsigned int *size, bool append
 
        // Allocate memory to contain the whole file
        char* buffer = (char*)malloc(lSize + (int)appendNull);
-       if (buffer == NULL) return NULL;
+       if (buffer == NULL) {
+               fclose(pFile);
+               return NULL;
+       }
 
        // Copy the file into the buffer
-       if (fread(buffer, 1, lSize, pFile) != lSize) return NULL;
+       if (fread(buffer, 1, lSize, pFile) != lSize) {
+               free(buffer);
+               fclose(pFile);
+               return NULL;
+       }
 
        // Terminate
        fclose(pFile);
 
-       if (appendNull)
+       if (appendNull) {
                buffer[lSize] = 0;
+       }
 
-       if (size)
+       if (size) {
                *size = lSize;
+       }
 
        return buffer;
 }
@@ -81,10 +119,15 @@ char* OlyUtility::readFromDisk(const char* file, unsigned int *size, bool append
 int OlyUtility::writeToDisk(const char* path, const char* data) {
        // Open the file
        FILE* pFile = fopen(path, "wb");
-       if (pFile == NULL) return -1;
+       if (pFile == NULL) {
+               return -1;
+       }
 
        // Write the data to disk
-       if (fwrite(data, 1, strlen(data), pFile) != strlen(data)) return -1;
+       if (fwrite(data, 1, strlen(data), pFile) != strlen(data)) {
+               fclose(pFile);
+               return -1;
+       }
 
        // Terminate
        fclose(pFile);
@@ -94,10 +137,15 @@ int OlyUtility::writeToDisk(const char* path, const char* data) {
 int OlyUtility::appendToDisk(const char* path, const char* data) {
        // Open the file
        FILE* pFile = fopen(path, "a");
-       if (pFile == NULL) return -1;
+       if (pFile == NULL) {
+               return -1;
+       }
 
        // Write the data to disk
-       if (fwrite(data, 1, strlen(data), pFile) != strlen(data)) return -1;
+       if (fwrite(data, 1, strlen(data), pFile) != strlen(data)) {
+               fclose(pFile);
+               return -1;
+       }
 
        // Terminate
        fclose(pFile);
@@ -110,7 +158,7 @@ int OlyUtility::appendToDisk(const char* path, const char* data) {
  * 0 is returned on an error; otherwise 1.
  */
 #define TRANSFER_SIZE 1024
-int OlyUtility::copyFile(const char * srcFile, const char * dstFile) {
+int OlyUtility::copyFile(const char* srcFile, const char* dstFile) {
        char* buffer = (char*)malloc(TRANSFER_SIZE);
        FILE * f_src = fopen(srcFile,"rb");
        if (!f_src) {
@@ -165,3 +213,42 @@ char* OlyUtility::getPathPart(char* path) {
 
        return (path);
 }
+
+// whitespace callback utility function used with mini-xml
+const char * mxmlWhitespaceCB(mxml_node_t *node, int loc) {
+       const char *name;
+
+       name = mxmlGetElement(node);
+
+       if (loc == MXML_WS_BEFORE_OPEN) {
+               // Single indentation
+               if (!strcmp(name, "target") || !strcmp(name, "counters"))
+                       return("\n  ");
+
+               // Double indentation
+               if (!strcmp(name, "counter"))
+                       return("\n    ");
+
+               // Avoid a carriage return on the first line of the xml file
+               if (!strncmp(name, "?xml", 4))
+                       return(NULL);
+
+               // Default - no indentation
+               return("\n");
+       }
+
+       if (loc == MXML_WS_BEFORE_CLOSE) {
+               // No indentation
+               if (!strcmp(name, "captured"))
+                       return("\n");
+
+               // Single indentation
+               if (!strcmp(name, "counters"))
+                       return("\n  ");
+
+               // Default - no carriage return
+               return(NULL);
+       }
+
+       return(NULL);
+}
old mode 100644 (file)
new mode 100755 (executable)
index 0fa021d..793a733
@@ -19,17 +19,20 @@ class OlyUtility {
 public:
        OlyUtility() {};
        ~OlyUtility() {};
+       bool stringToBool(const char* string, bool defValue);
        void stringToLower(char* string);
        int getApplicationFullPath(char* path, int sizeOfPath);
        char* readFromDisk(const char* file, unsigned int *size = NULL, bool appendNull = true);
        int writeToDisk(const char* path, const char* file);
        int appendToDisk(const char* path, const char* file);
-       int copyFile(const char * srcFile, const char * dstFile);
+       int copyFile(const char* srcFile, const char* dstFile);
        const char* getFilePart(const char* path);
        char* getPathPart(char* path);
 private:
 };
 
+#include "mxml/mxml.h"
+const char * mxmlWhitespaceCB(mxml_node_t *node, int where);
 extern OlyUtility* util;
 
 #endif // OLY_UTILITY_H
diff --git a/daemon/RequestXML.cpp b/daemon/RequestXML.cpp
deleted file mode 100644 (file)
index e8f24d2..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * Copyright (C) ARM Limited 2011-2012. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <string.h>
-#include <stdlib.h>
-#include <limits.h>
-#include "RequestXML.h"
-#include "Logging.h"
-
-extern void handleException();
-
-static const char*     TAG_REQUEST = "request";
-
-static const char*     ATTR_PROTOCOL           = "protocol";           
-static const char*     ATTR_EVENTS                     = "events";
-static const char*     ATTR_CONFIGURATION      = "configuration";
-static const char*     ATTR_COUNTERS           = "counters";
-static const char*     ATTR_SESSION            = "session";
-static const char*     ATTR_CAPTURED           = "captured";
-static const char*     ATTR_DEFAULTS           = "defaults";
-
-RequestXML::RequestXML(const char * str) {
-       parameters.protocol = false;
-       parameters.events = false;
-       parameters.configuration = false;
-       parameters.counters = false;
-       parameters.session = false;
-       parameters.captured = false;
-       parameters.defaults = false;
-
-       XMLReader reader(str);
-       char * tag = reader.nextTag();
-       while(tag != 0) {
-               if (strcmp(tag, TAG_REQUEST) == 0) {
-                       requestTag(&reader);
-                       return;
-               }
-               tag = reader.nextTag();
-       }
-
-       logg->logError(__FILE__, __LINE__, "No request tag found in the request.xml file");
-       handleException();
-}
-
-RequestXML::~RequestXML() {
-}
-
-void RequestXML::requestTag(XMLReader* in) {
-       parameters.protocol = in->getAttributeAsBoolean(ATTR_PROTOCOL, false);
-       parameters.events = in->getAttributeAsBoolean(ATTR_EVENTS, false);
-       parameters.configuration = in->getAttributeAsBoolean(ATTR_CONFIGURATION, false);
-       parameters.counters = in->getAttributeAsBoolean(ATTR_COUNTERS, false);
-       parameters.session = in->getAttributeAsBoolean(ATTR_SESSION, false);
-       parameters.captured = in->getAttributeAsBoolean(ATTR_CAPTURED, false);
-       parameters.defaults = in->getAttributeAsBoolean(ATTR_DEFAULTS, false);
-}
diff --git a/daemon/RequestXML.h b/daemon/RequestXML.h
deleted file mode 100644 (file)
index bebd048..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * Copyright (C) ARM Limited 2010-2012. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifndef REQUEST_XML_H
-#define REQUEST_XML_H
-
-#include "XMLReader.h"
-
-struct ConfigParameters {
-       bool protocol;
-       bool events;
-       bool configuration;
-       bool counters;
-       bool session;
-       bool captured;
-       bool defaults;
-};
-
-class RequestXML {
-public:
-       RequestXML(const char * str);
-       ~RequestXML();
-       ConfigParameters parameters;
-private:
-       void requestTag(XMLReader* in);
-};
-
-#endif // REQUEST_XML_H
index 9792c3677a36e4d731ab7af5f2b0e107f6ec9b58..efff7532a0dc4fc0be8a73c790ab8ef4d5e712d0 100644 (file)
 extern void handleException();
 
 Sender::Sender(OlySocket* socket) {
-       dataFile = NULL;
-       dataSocket = NULL;
+       mDataFile = NULL;
+       mDataSocket = NULL;
 
        // Set up the socket connection
        if (socket) {
                char streamline[64] = {0};
-               dataSocket = socket;
+               mDataSocket = socket;
 
                // Receive magic sequence - can wait forever
                // Streamline will send data prior to the magic sequence for legacy support, which should be ignored for v4+
                while (strcmp("STREAMLINE", streamline) != 0) {
-                       if (dataSocket->receiveString(streamline, sizeof(streamline)) == -1) {
+                       if (mDataSocket->receiveString(streamline, sizeof(streamline)) == -1) {
                                logg->logError(__FILE__, __LINE__, "Socket disconnected");
                                handleException();
                        }
@@ -39,32 +39,33 @@ Sender::Sender(OlySocket* socket) {
 
                // Send magic sequence - must be done first, afterwhich error messages can be sent
                char magic[] = {'G', 'A', 'T', 'O', 'R', '\n'};
-               dataSocket->send(magic, sizeof(magic));
+               mDataSocket->send(magic, sizeof(magic));
 
                gSessionData->mWaitingOnCommand = true;
                logg->logMessage("Completed magic sequence");
        }
 
-       pthread_mutex_init(&sendMutex, NULL);
+       pthread_mutex_init(&mSendMutex, NULL);
 }
 
 Sender::~Sender() {
-       delete dataSocket;
-       dataSocket = NULL;
-       if (dataFile) {
-               fclose(dataFile);
+       delete mDataSocket;
+       mDataSocket = NULL;
+       if (mDataFile) {
+               fclose(mDataFile);
        }
 }
 
 void Sender::createDataFile(char* apcDir) {
-       if (apcDir == NULL)
+       if (apcDir == NULL) {
                return;
+       }
 
-       dataFileName = (char*)malloc(strlen(apcDir) + 12);
-       sprintf(dataFileName, "%s/0000000000", apcDir);
-       dataFile = fopen(dataFileName, "wb");
-       if (!dataFile) {
-               logg->logError(__FILE__, __LINE__, "Failed to open binary file: %s", dataFileName);
+       mDataFileName = (char*)malloc(strlen(apcDir) + 12);
+       sprintf(mDataFileName, "%s/0000000000", apcDir);
+       mDataFile = fopen(mDataFileName, "wb");
+       if (!mDataFile) {
+               logg->logError(__FILE__, __LINE__, "Failed to open binary file: %s", mDataFileName);
                handleException();
        }
 }
@@ -75,32 +76,35 @@ void Sender::writeData(const char* data, int length, int type) {
        }
 
        // Multiple threads call writeData()
-       pthread_mutex_lock(&sendMutex);
+       pthread_mutex_lock(&mSendMutex);
 
        // Send data over the socket connection
-       if (dataSocket) {
+       if (mDataSocket) {
                // Start alarm
                alarm(8);
 
                // Send data over the socket, sending the type and size first
                logg->logMessage("Sending data with length %d", length);
-               dataSocket->send((char*)&type, 1);
-               dataSocket->send((char*)&length, sizeof(length));
-               dataSocket->send((char*)data, length);
+               if (type != RESPONSE_APC_DATA) {
+                       // type and length already added by the Collector for apc data
+                       mDataSocket->send((char*)&type, 1);
+                       mDataSocket->send((char*)&length, sizeof(length));
+               }
+               mDataSocket->send((char*)data, length);
 
                // Stop alarm
                alarm(0);
        }
 
        // Write data to disk as long as it is not meta data
-       if (dataFile && type == RESPONSE_APC_DATA) {
+       if (mDataFile && type == RESPONSE_APC_DATA) {
                logg->logMessage("Writing data with length %d", length);
-               // Send data to the data file, storing the size first
-               if ((fwrite((char*)&length, 1, sizeof(length), dataFile) != sizeof(length)) || (fwrite(data, 1, length, dataFile) != (unsigned int)length)) {
-                       logg->logError(__FILE__, __LINE__, "Failed writing binary file %s", dataFileName);
+               // Send data to the data file
+               if (fwrite(data, 1, length, mDataFile) != (unsigned int)length) {
+                       logg->logError(__FILE__, __LINE__, "Failed writing binary file %s", mDataFileName);
                        handleException();
                }
        }
 
-       pthread_mutex_unlock(&sendMutex);
+       pthread_mutex_unlock(&mSendMutex);
 }
index 3444b852b01ee8855d3f7ac5e070243d6a22d3fc..98467e025c12332b1c8b9fbba8df26f101c46101 100644 (file)
@@ -29,10 +29,10 @@ public:
        void writeData(const char* data, int length, int type);
        void createDataFile(char* apcDir);
 private:
-       OlySocket* dataSocket;
-       FILE* dataFile;
-       char* dataFileName;
-       pthread_mutex_t sendMutex;
+       OlySocket* mDataSocket;
+       FILE* mDataFile;
+       char* mDataFileName;
+       pthread_mutex_t mSendMutex;
 };
 
 #endif         //__SENDER_H__
index 4adcfcd6c20b77d4e7cda134343cf412b57b8cf7..a245369a37a35d37a4bc94c3e490f2865287b346 100644 (file)
@@ -27,8 +27,10 @@ void SessionData::initialize() {
        mLocalCapture = false;
        mOneShot = false;
        strcpy(mCoreName, "unknown");
-       configurationXMLPath = NULL;
-       apcDir = NULL;
+       mConfigurationXMLPath = NULL;
+       mSessionXMLPath = NULL;
+       mEventsXMLPath = NULL;
+       mAPCDir = NULL;
        mSampleRate = 0;
        mDuration = 0;
        mBytes = 0;
@@ -46,14 +48,19 @@ void SessionData::initializeCounters() {
                mPerfCounterTitle[i][0] = 0;
                mPerfCounterName[i][0] = 0;
                mPerfCounterDescription[i][0] = 0;
+               mPerfCounterOperation[i][0] = 0;
+               mPerfCounterAlias[i][0] = 0;
+               mPerfCounterDisplay[i][0] = 0;
+               mPerfCounterUnits[i][0] = 0;
                mPerfCounterEnabled[i] = 0;
                mPerfCounterEvent[i] = 0;
                mPerfCounterColor[i] = 0;
                mPerfCounterKey[i] = 0;
                mPerfCounterCount[i] = 0;
-               mPerfCounterOperation[i][0] = 0;
                mPerfCounterPerCPU[i] = false;
                mPerfCounterEBSCapable[i] = false;
+               mPerfCounterLevel[i] = false;
+               mPerfCounterAverageSelection[i] = false;
        }
 }
 
@@ -75,8 +82,10 @@ void SessionData::parseSessionXML(char* xmlString) {
                gSessionData->mSampleRate = 10000;
        } else if (strcmp(session.parameters.sample_rate, "normal") == 0) {
                gSessionData->mSampleRate = 1000;
-       } else { // "low"
+       } else if (strcmp(session.parameters.sample_rate, "low") == 0) {
                gSessionData->mSampleRate = 100;
+       } else {
+               gSessionData->mSampleRate = 0;
        }
        gSessionData->mBacktraceDepth = session.parameters.call_stack_unwinding == true ? 128 : 0;
        gSessionData->mDuration = session.parameters.duration;
@@ -97,7 +106,7 @@ void SessionData::parseSessionXML(char* xmlString) {
                handleException();
        }
 
-       gSessionData->images = session.parameters.images;
-       gSessionData->target_path = session.parameters.target_path;
-       gSessionData->title = session.parameters.title;
+       gSessionData->mImages = session.parameters.images;
+       gSessionData->mTargetPath = session.parameters.target_path;
+       gSessionData->mTitle = session.parameters.title;
 }
index cc188f8e694ac6ba1fdd05b7e6408b508083c862..7daee72a664375dd2c1335057659376c5c811945 100644 (file)
 #define MAX_STRING_LEN                         80
 #define MAX_DESCRIPTION_LEN                    400
 
-#define PROTOCOL_VERSION       8
+#define PROTOCOL_VERSION       9
 #define PROTOCOL_DEV           1000    // Differentiates development versions (timestamp) from release versions
 
 struct ImageLinkList {
-       char *path;
+       charpath;
        struct ImageLinkList *next;
 };
 
@@ -30,11 +30,13 @@ public:
        void parseSessionXML(char* xmlString);
 
        char mCoreName[MAX_STRING_LEN];
-       struct ImageLinkList *images;
-       char* configurationXMLPath;
-       char* target_path;
-       char* apcDir;
-       char* title;
+       struct ImageLinkList *mImages;
+       char* mConfigurationXMLPath;
+       char* mSessionXMLPath;
+       char* mEventsXMLPath;
+       char* mTargetPath;
+       char* mAPCDir;
+       char* mTitle;
 
        bool mWaitingOnCommand;
        bool mSessionIsActive;
@@ -42,7 +44,7 @@ public:
        bool mOneShot;          // halt processing of the driver data until profiling is complete or the buffer is filled
        
        int mBacktraceDepth;
-       int mTotalBufferSize;   // approximate number of MB to use for the entire collection buffer, the actual amount is a multiple based on a buffer size retrieved from the driver
+       int mTotalBufferSize;   // number of MB to use for the entire collection buffer
        int mSampleRate;
        int mDuration;
        int mCores;
@@ -53,6 +55,10 @@ public:
        char mPerfCounterTitle[MAX_PERFORMANCE_COUNTERS][MAX_STRING_LEN];
        char mPerfCounterName[MAX_PERFORMANCE_COUNTERS][MAX_STRING_LEN];
        char mPerfCounterDescription[MAX_PERFORMANCE_COUNTERS][MAX_DESCRIPTION_LEN];
+       char mPerfCounterOperation[MAX_PERFORMANCE_COUNTERS][MAX_STRING_LEN];
+       char mPerfCounterAlias[MAX_PERFORMANCE_COUNTERS][MAX_STRING_LEN];
+       char mPerfCounterDisplay[MAX_PERFORMANCE_COUNTERS][MAX_STRING_LEN];
+       char mPerfCounterUnits[MAX_PERFORMANCE_COUNTERS][MAX_STRING_LEN];
        int mPerfCounterEnabled[MAX_PERFORMANCE_COUNTERS];
        int mPerfCounterEvent[MAX_PERFORMANCE_COUNTERS];
        int mPerfCounterColor[MAX_PERFORMANCE_COUNTERS];
@@ -60,7 +66,8 @@ public:
        int mPerfCounterKey[MAX_PERFORMANCE_COUNTERS];
        bool mPerfCounterPerCPU[MAX_PERFORMANCE_COUNTERS];
        bool mPerfCounterEBSCapable[MAX_PERFORMANCE_COUNTERS];
-       char mPerfCounterOperation[MAX_PERFORMANCE_COUNTERS][MAX_STRING_LEN];
+       bool mPerfCounterLevel[MAX_PERFORMANCE_COUNTERS];
+       bool mPerfCounterAverageSelection[MAX_PERFORMANCE_COUNTERS];
 };
 
 extern SessionData* gSessionData;
index 4604d7cf1937a036c3a2e4f39d4a31849cb256d3..f1a8258b525e0b5716341c2cadb9c5859ef065a6 100644 (file)
@@ -11,6 +11,7 @@
 #include <limits.h>
 #include "SessionXML.h"
 #include "Logging.h"
+#include "OlyUtility.h"
 
 extern void handleException();
 
@@ -28,7 +29,7 @@ static const char*    ATTR_OUTPUT_PATH        = "output_path";
 static const char*     ATTR_DURATION           = "duration";
 static const char*     ATTR_PATH               = "path";
 
-SessionXML::SessionXML(const char * str) {
+SessionXML::SessionXML(const char* str) {
        parameters.title = 0;
        parameters.uuid[0] = 0;
        parameters.target_path = 0;
@@ -50,70 +51,92 @@ SessionXML::~SessionXML() {
 }
 
 void SessionXML::parse() {
-       XMLReader reader(mSessionXML);
-       char * tag = reader.nextTag();
-       while(tag != 0) {
-               if (strcmp(tag, TAG_SESSION) == 0) {
-                       sessionTag(&reader);
-                       return;
-               }
-               tag = reader.nextTag();
+       mxml_node_t *tree;
+       mxml_node_t *node;
+
+       tree = mxmlLoadString(NULL, mSessionXML, MXML_NO_CALLBACK);
+       node = mxmlFindElement(tree, tree, TAG_SESSION, NULL, NULL, MXML_DESCEND);
+
+       if (node) {
+               sessionTag(tree, node);
+               mxmlDelete(tree);
+               return;
        }
 
        logg->logError(__FILE__, __LINE__, "No session tag found in the session.xml file");
        handleException();
 }
 
-void SessionXML::sessionTag(XMLReader* in) {
-       char* tempBuffer = (char*)malloc(PATH_MAX);
-       int version = in->getAttributeAsInteger(ATTR_VERSION, 0);
+void SessionXML::sessionTag(mxml_node_t *tree, mxml_node_t *node) {
+       int version = 0;
+       if (mxmlElementGetAttr(node, ATTR_VERSION)) version = strtol(mxmlElementGetAttr(node, ATTR_VERSION), NULL, 10);
        if (version != 1) {
                logg->logError(__FILE__, __LINE__, "Invalid session.xml version: %d", version);
                handleException();
        }
 
-       in->getAttribute(ATTR_TITLE, tempBuffer, PATH_MAX, "unnamed");
-       parameters.title = strdup(tempBuffer); // freed when the child process exits
-       if (parameters.title == NULL) {
-               logg->logError(__FILE__, __LINE__, "failed to allocate parameters.title (%d bytes)", strlen(tempBuffer));
-               handleException();
+       // allocate strings
+       if (mxmlElementGetAttr(node, ATTR_TITLE)) {
+               parameters.title = strdup(mxmlElementGetAttr(node, ATTR_TITLE)); // freed when the child process exits
+               if (parameters.title == NULL) {
+                       logg->logError(__FILE__, __LINE__, "failed to allocate parameters.title");
+                       handleException();
+               }
        }
-       in->getAttribute(ATTR_UUID, parameters.uuid, sizeof(parameters.uuid), "");
-       parameters.duration = in->getAttributeAsInteger(ATTR_DURATION, 0);
-       parameters.call_stack_unwinding = in->getAttributeAsBoolean(ATTR_CALL_STACK_UNWINDING, true);
-       in->getAttribute(ATTR_BUFFER_MODE, parameters.buffer_mode, sizeof(parameters.buffer_mode), "normal");
-       in->getAttribute(ATTR_SAMPLE_RATE, parameters.sample_rate, sizeof(parameters.sample_rate), "");
-       in->getAttribute(ATTR_TARGET_PATH, tempBuffer, PATH_MAX, "");
-       parameters.target_path = strdup(tempBuffer); // freed when the child process exits
-       if (parameters.target_path == NULL) {
-               logg->logError(__FILE__, __LINE__, "failed to allocate parameters.target_path (%d bytes)", strlen(tempBuffer));
-               handleException();
+       if (mxmlElementGetAttr(node, ATTR_TARGET_PATH)) {
+               parameters.target_path = strdup(mxmlElementGetAttr(node, ATTR_TARGET_PATH)); // freed when the child process exits
+               if (parameters.target_path == NULL) {
+                       logg->logError(__FILE__, __LINE__, "failed to allocate parameters.target_path");
+                       handleException();
+               }
        }
-       in->getAttribute(ATTR_OUTPUT_PATH, tempBuffer, PATH_MAX, "");
-       parameters.output_path = strdup(tempBuffer); // freed when the child process exits
-       if (parameters.output_path == NULL) {
-               logg->logError(__FILE__, __LINE__, "failed to allocate parameters.output_path (%d bytes)", strlen(tempBuffer));
-               handleException();
+       if (mxmlElementGetAttr(node, ATTR_OUTPUT_PATH)) {
+               parameters.output_path = strdup(mxmlElementGetAttr(node, ATTR_OUTPUT_PATH)); // freed when the child process exits
+               if (parameters.output_path == NULL) {
+                       logg->logError(__FILE__, __LINE__, "failed to allocate parameters.output_path");
+                       handleException();
+               }
        }
 
-       free(tempBuffer);
+       // copy to pre-allocated strings
+       if (mxmlElementGetAttr(node, ATTR_UUID)) {
+               strncpy(parameters.uuid, mxmlElementGetAttr(node, ATTR_UUID), sizeof(parameters.uuid));
+               parameters.uuid[sizeof(parameters.uuid) - 1] = 0; // strncpy does not guarantee a null-terminated string
+       }
+       if (mxmlElementGetAttr(node, ATTR_BUFFER_MODE)) {
+               strncpy(parameters.buffer_mode, mxmlElementGetAttr(node, ATTR_BUFFER_MODE), sizeof(parameters.buffer_mode));
+               parameters.buffer_mode[sizeof(parameters.buffer_mode) - 1] = 0; // strncpy does not guarantee a null-terminated string
+       }
+       if (mxmlElementGetAttr(node, ATTR_SAMPLE_RATE)) {
+               strncpy(parameters.sample_rate, mxmlElementGetAttr(node, ATTR_SAMPLE_RATE), sizeof(parameters.sample_rate));
+               parameters.sample_rate[sizeof(parameters.sample_rate) - 1] = 0; // strncpy does not guarantee a null-terminated string
+       }
+
+       // integers/bools
+       parameters.call_stack_unwinding = util->stringToBool(mxmlElementGetAttr(node, ATTR_CALL_STACK_UNWINDING), false);
+       if (mxmlElementGetAttr(node, ATTR_DURATION)) parameters.duration = strtol(mxmlElementGetAttr(node, ATTR_DURATION), NULL, 10);
 
-       char * tag = in->nextTag();
-       while(tag != 0) {
-               if (strcmp(tag, TAG_IMAGE) == 0) {
-                       sessionImage(in);
+       // parse subtags
+       node = mxmlGetFirstChild(node);
+       while (node) {
+               if (mxmlGetType(node) != MXML_ELEMENT) {
+                       node = mxmlWalkNext(node, tree, MXML_NO_DESCEND);
+                       continue;
+               }
+               if (strcmp(TAG_IMAGE, mxmlGetElement(node)) == 0) {
+                       sessionImage(node);
                }
-               tag = in->nextTag();
+               node = mxmlWalkNext(node, tree, MXML_NO_DESCEND);
        }
 }
 
-void SessionXML::sessionImage(XMLReader* in) {
-       int length = in->getAttributeLength(ATTR_PATH);
+void SessionXML::sessionImage(mxml_node_t *node) {
+       int length = strlen(mxmlElementGetAttr(node, ATTR_PATH));
        struct ImageLinkList *image;
 
        image = (struct ImageLinkList *)malloc(sizeof(struct ImageLinkList));
-       image->path = (char *)malloc(length + 1);
-       in->getAttribute(ATTR_PATH, image->path, length + 1, "");
+       image->path = (char*)malloc(length + 1);
+       image->path = strdup(mxmlElementGetAttr(node, ATTR_PATH));
        image->next = parameters.images;
        parameters.images = image;
 }
index 4649685bc9e197224932f2335dbbbf590725b284..c2b54894441342db5d05cda6d1a6df953d5d604a 100644 (file)
@@ -9,7 +9,7 @@
 #ifndef SESSION_XML_H
 #define SESSION_XML_H
 
-#include "XMLReader.h"
+#include "mxml/mxml.h"
 #include "SessionData.h"
 
 struct ConfigParameters {
@@ -26,15 +26,15 @@ struct ConfigParameters {
 
 class SessionXML {
 public:
-       SessionXML(const char * str);
+       SessionXML(const char* str);
        ~SessionXML();
        void parse();
        ConfigParameters parameters;
 private:
        char*  mSessionXML;
        char*  mPath;
-       void sessionTag(XMLReader* in);
-       void sessionImage(XMLReader* in);
+       void sessionTag(mxml_node_t *tree, mxml_node_t *node);
+       void sessionImage(mxml_node_t *node);
 };
 
 #endif // SESSION_XML_H
index 5662ee8c76ff8f092bc7a0925cbc8b9d4f78bc09..53729ab0f6e6992541a92e778a6e5a5812a75240 100644 (file)
 #include <arpa/inet.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
-#include "XMLOut.h"
 #include "Sender.h"
 #include "Logging.h"
-#include "XMLReader.h"
-#include "RequestXML.h"
 #include "OlyUtility.h"
 #include "SessionData.h"
 #include "CapturedXML.h"
 
 extern void handleException();
 
-static const char*     TAG_SESSION = "session";
-static const char*     TAG_CONFIGURATIONS = "configurations";
+static const char* TAG_SESSION = "session";
+static const char* TAG_REQUEST = "request";
+static const char* TAG_CONFIGURATIONS = "configurations";
+
+static const char*     ATTR_PROTOCOL           = "protocol";           
+static const char*     ATTR_EVENTS                     = "events";
+static const char*     ATTR_CONFIGURATION      = "configuration";
+static const char*     ATTR_COUNTERS           = "counters";
+static const char*     ATTR_SESSION            = "session";
+static const char*     ATTR_CAPTURED           = "captured";
+static const char*     ATTR_DEFAULTS           = "defaults";
 
 StreamlineSetup::StreamlineSetup(OlySocket* s) {
        bool ready = false;
-       char *data = NULL;
+       chardata = NULL;
        int type;
 
-       socket = s;
+       mSocket = s;
        mSessionXML = NULL;
 
        // Receive commands from Streamline (master)
@@ -73,13 +79,14 @@ StreamlineSetup::StreamlineSetup(OlySocket* s) {
                                handleException();
                }
 
-               delete(data);
+               free(data);
        }
 }
 
 StreamlineSetup::~StreamlineSetup() {
-       if (mSessionXML)
+       if (mSessionXML) {
                free(mSessionXML);
+       }
 }
 
 char* StreamlineSetup::readCommand(int* command) {
@@ -88,7 +95,7 @@ char* StreamlineSetup::readCommand(int* command) {
        int response, length;
 
        // receive type
-       response = socket->receiveNBytes(&type, sizeof(type));
+       response = mSocket->receiveNBytes(&type, sizeof(type));
 
        // After receiving a single byte, we are no longer waiting on a command
        gSessionData->mWaitingOnCommand = false;
@@ -99,7 +106,7 @@ char* StreamlineSetup::readCommand(int* command) {
        }
 
        // receive length
-       response = socket->receiveNBytes((char*)&length, sizeof(length));
+       response = mSocket->receiveNBytes((char*)&length, sizeof(length));
        if (response < 0) {
                logg->logError(__FILE__, __LINE__, "Target error: Unexpected socket disconnect");
                handleException();
@@ -119,7 +126,7 @@ char* StreamlineSetup::readCommand(int* command) {
        }
 
        // receive data
-       response = socket->receiveNBytes(data, length);
+       response = mSocket->receiveNBytes(data, length);
        if (response < 0) {
                logg->logError(__FILE__, __LINE__, "Target error: Unexpected socket disconnect");
                handleException();
@@ -135,29 +142,31 @@ char* StreamlineSetup::readCommand(int* command) {
 }
 
 void StreamlineSetup::handleRequest(char* xml) {
-       RequestXML request(xml);
+       mxml_node_t *tree, *node;
 
-       if (request.parameters.protocol) {
+       tree = mxmlLoadString(NULL, xml, MXML_NO_CALLBACK);
+       if ((node = mxmlFindElement(tree, tree, TAG_REQUEST, ATTR_PROTOCOL, NULL, MXML_DESCEND_FIRST)) && util->stringToBool(mxmlElementGetAttr(node, ATTR_PROTOCOL), false)) {
                sendProtocol();
                logg->logMessage("Sent protocol xml response");
-       } else if (request.parameters.events) {
+       } else if ((node = mxmlFindElement(tree, tree, TAG_REQUEST, ATTR_EVENTS, NULL, MXML_DESCEND_FIRST)) && util->stringToBool(mxmlElementGetAttr(node, ATTR_EVENTS), false)) {
                sendEvents();
                logg->logMessage("Sent events xml response");
-       } else if (request.parameters.configuration) {
+       } else if ((node = mxmlFindElement(tree, tree, TAG_REQUEST, ATTR_CONFIGURATION, NULL, MXML_DESCEND_FIRST)) && util->stringToBool(mxmlElementGetAttr(node, ATTR_CONFIGURATION), false)) {
                sendConfiguration();
                logg->logMessage("Sent configuration xml response");
-       } else if (request.parameters.counters) {
+       } else if ((node = mxmlFindElement(tree, tree, TAG_REQUEST, ATTR_COUNTERS, NULL, MXML_DESCEND_FIRST)) && util->stringToBool(mxmlElementGetAttr(node, ATTR_COUNTERS), false)) {
                sendCounters();
                logg->logMessage("Sent counters xml response");
-       } else if (request.parameters.session) {
+       } else if ((node = mxmlFindElement(tree, tree, TAG_REQUEST, ATTR_SESSION, NULL, MXML_DESCEND_FIRST)) && util->stringToBool(mxmlElementGetAttr(node, ATTR_SESSION), false)) {
                sendData(mSessionXML, strlen(mSessionXML), RESPONSE_XML);
                logg->logMessage("Sent session xml response");
-       } else if (request.parameters.captured) {
+       } else if ((node = mxmlFindElement(tree, tree, TAG_REQUEST, ATTR_CAPTURED, NULL, MXML_DESCEND_FIRST)) && util->stringToBool(mxmlElementGetAttr(node, ATTR_CAPTURED), false)) {
                CapturedXML capturedXML;
-               const char* capturedText = capturedXML.getXML();
+               char* capturedText = capturedXML.getXML();
                sendData(capturedText, strlen(capturedText), RESPONSE_XML);
+               free(capturedText);
                logg->logMessage("Sent captured xml response");
-       } else if (request.parameters.defaults) {
+       } else if ((node = mxmlFindElement(tree, tree, TAG_REQUEST, ATTR_DEFAULTS, NULL, MXML_DESCEND_FIRST)) && util->stringToBool(mxmlElementGetAttr(node, ATTR_DEFAULTS), false)) {
                sendDefaults();
                logg->logMessage("Sent default configuration xml response");
        } else {
@@ -165,67 +174,60 @@ void StreamlineSetup::handleRequest(char* xml) {
                sendData(error, strlen(error), RESPONSE_NAK);
                logg->logMessage("Received unknown request:\n%s", xml);
        }
+
+       mxmlDelete(tree);
 }
 
-typedef enum {UNKNOWN, SESSION_XML, CONFIGURATION_XML} delivery_type_t;
 void StreamlineSetup::handleDeliver(char* xml) {
-       delivery_type_t type = UNKNOWN; 
+       mxml_node_t *tree;
 
        // Determine xml type
-       XMLReader reader(xml);
-       char * tag = reader.nextTag();
-       while(tag != 0) {
-               if (strcmp(tag, TAG_SESSION) == 0) {
-                       type = SESSION_XML;
-                       break;
-               } else if (strcmp(tag, TAG_CONFIGURATIONS) == 0) {
-                       type = CONFIGURATION_XML;
-                       break;
+       tree = mxmlLoadString(NULL, xml, MXML_NO_CALLBACK);
+       if (mxmlFindElement(tree, tree, TAG_SESSION, NULL, NULL, MXML_DESCEND_FIRST)) {
+               // Session XML
+               gSessionData->parseSessionXML(xml);
+
+               // Save xml
+               mSessionXML = strdup(xml);
+               if (mSessionXML == NULL) {
+                       logg->logError(__FILE__, __LINE__, "malloc failed for size %d", strlen(xml) + 1);
+                       handleException();
                }
-               tag = reader.nextTag();
+               sendData(NULL, 0, RESPONSE_ACK);
+               logg->logMessage("Received session xml");
+       } else if (mxmlFindElement(tree, tree, TAG_CONFIGURATIONS, NULL, NULL, MXML_DESCEND_FIRST)) {
+               // Configuration XML
+               writeConfiguration(xml);
+               sendData(NULL, 0, RESPONSE_ACK);
+               logg->logMessage("Received configuration xml");
+       } else {
+               // Unknown XML
+               logg->logMessage("Received unknown XML delivery type");
+               sendData(NULL, 0, RESPONSE_NAK);
        }
 
-       switch (type) {
-               case UNKNOWN:
-                       logg->logMessage("Received unknown delivery type: %d", type);
-                       sendData(NULL, 0, RESPONSE_NAK);
-                       break;
-               case SESSION_XML:
-                       // Parse the session xml
-                       gSessionData->parseSessionXML(xml);
-
-                       // Save xml
-                       mSessionXML = strdup(xml);
-                       if (mSessionXML == NULL) {
-                               logg->logError(__FILE__, __LINE__, "malloc failed for size %d", strlen(xml) + 1);
-                               handleException();
-                       }
-                       sendData(NULL, 0, RESPONSE_ACK);
-                       logg->logMessage("Received session xml");
-                       break;
-               case CONFIGURATION_XML:
-                       writeConfiguration(xml);
-                       sendData(NULL, 0, RESPONSE_ACK);
-                       logg->logMessage("Received configuration xml");
-                       break;
-       }
+       mxmlDelete(tree);
 }
 
 void StreamlineSetup::sendData(const char* data, int length, int type) {
-       socket->send((char*)&type, 1);
-       socket->send((char*)&length, sizeof(length));
-       socket->send((char*)data, length);
+       mSocket->send((char*)&type, 1);
+       mSocket->send((char*)&length, sizeof(length));
+       mSocket->send((char*)data, length);
 }
 
 void StreamlineSetup::sendProtocol() {
-       XMLOut out;
-       out.xmlHeader();
+       mxml_node_t *xml;
+    mxml_node_t *protocol;
 
-       out.startElement("protocol");
-       out.attributeInt("version", PROTOCOL_VERSION);
-       out.endElement("protocol");
+       xml = mxmlNewXML("1.0");
+       protocol = mxmlNewElement(xml, "protocol");
+       mxmlElementSetAttrf(protocol, "version", "%d", PROTOCOL_VERSION);
 
-       sendString(out.getXmlString(), RESPONSE_XML);
+       char* string = mxmlSaveAllocString(xml, mxmlWhitespaceCB);
+       sendString(string, RESPONSE_XML);
+
+       free(string);
+       mxmlDelete(xml);
 }
 
 void StreamlineSetup::sendEvents() {
@@ -234,8 +236,12 @@ void StreamlineSetup::sendEvents() {
        char* buffer;
        unsigned int size = 0;
 
-       util->getApplicationFullPath(path, PATH_MAX);
-       strncat(path, "events.xml", PATH_MAX - strlen(path) - 1);
+       if (gSessionData->mEventsXMLPath) {
+               strncpy(path, gSessionData->mEventsXMLPath, PATH_MAX);
+       } else {
+               util->getApplicationFullPath(path, PATH_MAX);
+               strncat(path, "events.xml", PATH_MAX - strlen(path) - 1);
+       }
        buffer = util->readFromDisk(path, &size);
        if (buffer == NULL) {
                logg->logMessage("Unable to locate events.xml, using default");
@@ -274,8 +280,10 @@ void StreamlineSetup::sendDefaults() {
 
 #include <dirent.h>
 void StreamlineSetup::sendCounters() {
-       XMLOut out;
        struct dirent *ent;
+       mxml_node_t *xml;
+    mxml_node_t *counters;
+       mxml_node_t *counter;
 
        // counters.xml is simply a file listing of /dev/gator/events
        DIR* dir = opendir("/dev/gator/events");
@@ -284,27 +292,29 @@ void StreamlineSetup::sendCounters() {
                handleException();
        }
 
-       out.xmlHeader();
-       out.startElement("counters");
+       xml = mxmlNewXML("1.0");
+       counters = mxmlNewElement(xml, "counters");
        while ((ent = readdir(dir)) != NULL) {
                // skip hidden files, current dir, and parent dir
                if (ent->d_name[0] == '.')
                        continue;
-               out.startElement("counter");
-               out.attributeString("name", ent->d_name);
-               out.endElement("counter");
+               counter = mxmlNewElement(counters, "counter");
+               mxmlElementSetAttr(counter, "name", ent->d_name);
        }
-       out.endElement("counters");
        closedir (dir);
 
-       sendString(out.getXmlString(), RESPONSE_XML);
+       char* string = mxmlSaveAllocString(xml, mxmlWhitespaceCB);
+       sendString(string, RESPONSE_XML);
+
+       free(string);
+       mxmlDelete(xml);
 }
 
 void StreamlineSetup::writeConfiguration(char* xml) {
        char* path = (char*)malloc(PATH_MAX);
 
-       if (gSessionData->configurationXMLPath) {
-               strncpy(path, gSessionData->configurationXMLPath, PATH_MAX);
+       if (gSessionData->mConfigurationXMLPath) {
+               strncpy(path, gSessionData->mConfigurationXMLPath, PATH_MAX);
        } else {
                util->getApplicationFullPath(path, PATH_MAX);
                strncat(path, "configuration.xml", PATH_MAX - strlen(path) - 1);
index 10327e00bc7f2874e45d2cf662ad6577aefb652b..c46ae0891a31e20c41b2291e06d3c5d19a8bdc6f 100644 (file)
@@ -26,8 +26,8 @@ public:
        StreamlineSetup(OlySocket *socket);
        ~StreamlineSetup();
 private:
-       int numConnections;
-       OlySocket* socket;
+       int mNumConnections;
+       OlySocket* mSocket;
        char* mSessionXML;
 
        char* readCommand(int*);
diff --git a/daemon/XMLOut.cpp b/daemon/XMLOut.cpp
deleted file mode 100644 (file)
index c194fc0..0000000
+++ /dev/null
@@ -1,175 +0,0 @@
-/**
- * Copyright (C) ARM Limited 2010-2012. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdarg.h>
-#include "XMLOut.h"
-
-XMLOut::XMLOut() {
-       indent = 0;
-       incomplete = false;
-       xml_string[0] = 0;
-}
-
-XMLOut::~XMLOut() {
-}
-
-void XMLOut::writeTabs() {
-       for (int i = 0; i < indent; i++) {
-               writeData("  ");
-       }
-}
-
-void XMLOut::encodeAttributeData(const char* data) {
-       if (data) {
-               while (*data) {
-                       char ch = *data++;
-
-                       if (ch == '<') {
-                               writeData("&lt;");
-                       } else if (ch == '>') {
-                               writeData("&gt;");
-                       } else if (ch == '&') {
-                               writeData("&amp;");
-                       } else if (ch == '"') {
-                               writeData("&quot;");
-                       } else if (ch == '\'') {
-                               writeData("&apos;");
-                       } else if (ch >= ' ' && ch <= '~') {
-                               writeData("%c",ch);
-                       } else {
-                               writeData("&#%u;",(unsigned int)ch);
-                       }
-               }
-       }
-}
-
-void XMLOut::writeData(const char *format, ...) {
-       va_list ap;
-
-       va_start(ap, format);
-       vsnprintf(temp_buffer, sizeof(temp_buffer), format, ap);
-       va_end(ap);
-
-       strncat(xml_string, temp_buffer, sizeof(xml_string) - strlen(xml_string) - 1);
-}
-
-const XMLOut & XMLOut::xmlHeader(void) {
-       writeData("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
-       incomplete = false;
-       return *this;
-}
-
-const XMLOut & XMLOut::comment(const char* text, const bool newline) {
-       if (incomplete) {
-               writeData(">\n");                               
-       }
-       writeTabs();
-       writeData("<!-- %s -->", text);
-       if (newline) {
-               writeData("\n");
-       }
-       incomplete = false;
-       return *this;
-}
-
-const XMLOut & XMLOut::startElement(const char* tag) {
-       if (incomplete) {
-               writeData(">\n");                               
-       }
-       writeTabs();
-       writeData("<%s", tag);
-       incomplete = true;
-       indent++;
-       return *this;
-}
-
-const XMLOut & XMLOut::startElement(const char* tag, int index) {
-       if (incomplete) {
-               writeData(">\n");                               
-       }
-       writeTabs();
-       writeData("<!-- %d -->", index);
-       writeData("<%s", tag);
-       incomplete = true;
-       indent++;
-       return *this;
-}
-
-const XMLOut & XMLOut::endElement(const char* tag) {
-       indent--;
-       if (indent < 0) {
-               indent = 0;     
-       }
-       if (incomplete) {
-               writeData("/>\n");
-               incomplete = false;
-       } else {
-               writeTabs();
-               writeData("</%s>\n", tag);
-       }
-       return *this;
-}
-
-const XMLOut & XMLOut::attributeString(const char* name, const char* value) {
-       writeData(" %s=\"", name);
-       encodeAttributeData(value);
-       writeData("\"");
-       return *this;
-}
-
-const XMLOut & XMLOut::attributeInt(const char* name, int value) {
-       writeData(" %s=\"%d\"", name, value);
-       return *this;
-}
-
-const XMLOut & XMLOut::attributeUInt(const char* name, unsigned int value) {
-       writeData(" %s=\"%u\"", name, value);
-       return *this;
-}
-
-const XMLOut & XMLOut::attributeLong(const char* name, long value) {
-       writeData(" %s=\"%ld\"", name, value);
-       return *this;
-}
-
-const XMLOut & XMLOut::attributeULong(const char* name, unsigned long value) {
-       writeData(" %s=\"%lu\"", name, value);
-       return *this;
-}
-
-const XMLOut & XMLOut::attributeLongLong(const char* name, long long value) {
-       writeData(" %s=\"%lld\"", name, value);
-       return *this;
-}
-
-const XMLOut & XMLOut::attributeULongLong(const char* name, unsigned long long value) {
-       writeData(" %s=\"%llu\"", name, value);
-       return *this;
-}
-
-const XMLOut & XMLOut::attributeDouble(const char* name, double value) {
-       writeData(" %s=\"%f\"", name, value);
-       return *this;
-}
-
-const XMLOut & XMLOut::attributeBool(const char* name, bool value) {
-       writeData(" %s=\"%s\"", name, value ? "yes" : "no");
-       return *this;
-}
-
-const XMLOut & XMLOut::attributeHex4(const char* name, int value) {
-       writeData(" %s=\"0x%04x\"", name, value);
-       return *this;
-}
-
-const XMLOut & XMLOut::attributeHex8(const char* name, int value) {
-       writeData(" %s=\"0x%08x\"", name, value);
-       return *this;
-}
diff --git a/daemon/XMLOut.h b/daemon/XMLOut.h
deleted file mode 100644 (file)
index 3af253d..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * Copyright (C) ARM Limited 2010-2012. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifndef __XMLOUT_H
-#define __XMLOUT_H
-
-class XMLOut {
-       int indent;
-       bool incomplete;
-       char temp_buffer[4096];   // arbitrarilly large buffer to hold variable arguments
-       char xml_string[64*1024]; // arbitrarilly large buffer to hold an xml file output by the daemon
-       
-       void writeTabs();
-       void encodeAttributeData(const char* data);
-       void writeData(const char *format, ...);
-
-public:
-       XMLOut();
-       ~XMLOut();
-       char* getXmlString() {return xml_string;}
-       void clearXmlString() {xml_string[0]=0;}
-       const XMLOut & xmlHeader(void);
-       const XMLOut & comment(const char* text, const bool newline);
-       const XMLOut & startElement(const char* tag);
-       const XMLOut & startElement(const char* tag, int index);
-       const XMLOut & endElement(const char* tag);
-       const XMLOut & attributeString(const char* name, const char* value);
-       const XMLOut & attributeInt(const char* name, int value);
-       const XMLOut & attributeUInt(const char* name, unsigned int value);
-       const XMLOut & attributeLong(const char* name, long value);
-       const XMLOut & attributeULong(const char* name, unsigned long value);
-       const XMLOut & attributeLongLong(const char* name, long long value);
-       const XMLOut & attributeULongLong(const char* name, unsigned long long value);
-       const XMLOut & attributeDouble(const char* name, double value);
-       const XMLOut & attributeBool(const char* name, bool value);
-       const XMLOut & attributeHex4(const char* name, int value);
-       const XMLOut & attributeHex8(const char* name, int value);
-};
-
-#endif // __XMLOUT_H
diff --git a/daemon/XMLReader.cpp b/daemon/XMLReader.cpp
deleted file mode 100644 (file)
index 77c76e2..0000000
+++ /dev/null
@@ -1,164 +0,0 @@
-/**
- * Copyright (C) ARM Limited 2010-2012. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <string.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include "XMLReader.h"
-extern void handleException();
-
-XMLReader::XMLReader(const char* xmlstring) {
-       mPtr = (char*)xmlstring;
-       mNoMore = false;
-       mFirstTime = true;
-}
-
-XMLReader::~XMLReader() {
-}
-
-char* XMLReader::nextTag() {
-       static char tag[128]; // arbitrarily set max tag size to 127 characters + nul
-
-       // Check if past the end of the root tag
-       if (mNoMore) return NULL;
-
-       // Find start character
-       mPtr = strchr(mPtr, '<');
-
-       if (mPtr == NULL) return mPtr;
-
-       // Skip tag if it begins with <?
-       if (mPtr[1] == '?') {
-               mPtr++;
-               return nextTag();
-       }
-
-       // Find end of tag name
-       mPtr++;
-       char* end = strchr(mPtr, ' ');
-       if (end == NULL)
-               end = strchr(mPtr, '>');
-       if (end == NULL)
-               return 0;
-
-       // Check if tag has no attributes
-       char* tagend = strchr(mPtr, '>');
-       if (tagend < end) end = tagend;
-       
-       // Check the tag name length
-       unsigned int length = (int)end - (int)mPtr;
-       if (length > sizeof(tag) - 1) {
-               // tag name too long, skip it
-               return nextTag();
-       }
-       
-       // Return the tag name
-       strncpy(tag, mPtr, length);
-       tag[length] = 0;
-
-       // Mark the root tag
-       if (mFirstTime) {
-               mEndXML[0] = '/';
-               strcpy(&mEndXML[1], tag);
-               mFirstTime = false;
-       } else if (strcmp(tag, mEndXML) == 0) {
-               // End of root tag found
-               mNoMore = true;
-       }
-
-       return tag;
-}
-
-void XMLReader::getAttribute(const char* name, char* value, int maxSize, const char* defValue) {
-       char searchString[128];
-
-       // Set up default
-       strncpy(value, defValue, maxSize - 1);
-       value[maxSize - 1] = 0;
-       
-       // Determine search string by ending the name with ="
-       if (strlen(name) > sizeof(searchString) - 3) return;
-       strcpy(searchString, name);
-       strcat(searchString, "=\"");
-
-       // Find the beginning of the attribute's search string
-       char* begin = strstr(mPtr, searchString);
-       if (begin == NULL) return;
-
-       // Find the beginning of the attribute's value
-       begin += strlen(searchString);
-
-       // Find the end of the current tag to make sure the attribute exists within the tag
-       char* endtag = strchr(mPtr, '>');
-       if (endtag < begin) return;
-
-       // Find the end of the attribute's value
-       char* end = strchr(begin, '"');
-       if (end == NULL) return;
-
-       // Determine length
-       int length = (int)end - (int)begin;
-       if (length > maxSize - 1) return;
-
-       strncpy(value, begin, length);
-       value[length] = 0;
-}
-
-int XMLReader::getAttributeAsInteger(const char* name, int defValue) {
-       char value[32];
-       getAttribute(name, value, sizeof(value), "");
-       if (value[0] == 0) return defValue;
-       if (value[0] == '0' && value[1] == 'x') {
-               return (int) strtoul(&value[2], (char**)NULL, 16);
-       }
-       return strtol(value, NULL, 10);
-}
-
-bool XMLReader::getAttributeAsBoolean(const char* name, bool defValue) {
-       char value[32];
-       getAttribute(name, value, sizeof(value), "");
-       if (value[0] == 0) return defValue;
-
-       // Convert to lowercase
-       int i = 0;
-       while (value[i]) {
-               value[i] = tolower(value[i]);
-               i++;
-       }
-
-       if (strcmp(value, "true") == 0 || strcmp(value, "yes") == 0 || strcmp(value, "1") == 0 || strcmp(value, "on") == 0) return true;
-       else if (strcmp(value, "false") == 0 || strcmp(value, "no") == 0 || strcmp(value, "0") == 0 || strcmp(value, "off") == 0) return false;
-       else return defValue;
-}
-
-int XMLReader::getAttributeLength(const char* name) {
-       char searchString[128]; // arbitrarily large amount
-
-       // Determine search string by ending the name with ="
-       if (strlen(name) > sizeof(searchString) - 3) return 0;
-       strcpy(searchString, name);
-       strcat(searchString, "=\"");
-
-       // Find the beginning of the attribute's search string
-       char* begin = strstr(mPtr, searchString);
-       if (begin == NULL) return 0;
-
-       // Find the beginning of the attribute's value
-       begin += strlen(searchString);
-
-       // Find the end of the current tag to make sure the attribute exists within the tag
-       char* endtag = strchr(mPtr, '>');
-       if (endtag < begin) return 0;
-
-       // Find the end of the attribute's value
-       char* end = strchr(begin, '"');
-       if (end == NULL) return 0;
-
-       // Determine length
-       return (int)end - (int)begin;
-}
diff --git a/daemon/XMLReader.h b/daemon/XMLReader.h
deleted file mode 100644 (file)
index ac0098a..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * Copyright (C) ARM Limited 2010-2012. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifndef _XMLREADER_H
-#define _XMLREADER_H
-
-class XMLReader {
-public:
-       XMLReader(const char* xmlstring);
-       ~XMLReader();
-       char* nextTag();
-       void getAttribute(const char* name, char* value, int maxSize, const char* defValue);
-       int getAttributeAsInteger(const char* name, int defValue);
-       bool getAttributeAsBoolean(const char* name, bool defValue);
-       int getAttributeLength(const char* name);
-private:
-       char* mPtr;
-       bool mFirstTime, mNoMore;
-       char mEndXML[128];
-};
-
-#endif // _XMLREADER_H
index 0f910651950e28b3317c479433831eacbea8e0a1..9d083d55c2461980bbdba5c2da45838b96c0b5cc 100644 (file)
@@ -1,39 +1,51 @@
 <?xml version="1.0" encoding='UTF-8'?>
-<configurations version="1">
-  <configuration counter="ARM_ARM11_ccnt" title="Clock" name="Cycles" color="0x800084AB" per_cpu="yes" description="The number of core clock cycles"/>
-  <configuration counter="ARM_ARM11_cnt0" event="0x7" title="Instruction" name="Executed" color="0x80008000" per_cpu="yes" description="Instructions executed"/>
-  <configuration counter="ARM_ARM11_cnt1" event="0xa" title="Cache" name="Data miss" color="0x80C92211" per_cpu="yes" description="Data cache miss, not including Cache Operations"/>
-  <configuration counter="ARM_ARM11MPCore_ccnt" title="Clock" name="Cycles" color="0x800084AB" per_cpu="yes" description="The number of core clock cycles"/>
-  <configuration counter="ARM_ARM11MPCore_cnt0" event="0x08" title="Core" name="Instructions" color="0x80008000" per_cpu="yes" description="Instructions executed"/>
-  <configuration counter="ARM_ARM11MPCore_cnt1" event="0x0b" title="Cache" name="Data read miss" color="0x000080FF" per_cpu="yes" description="Data cache miss, not including Cache Operations"/>
-  <configuration counter="ARM_Cortex-A5_ccnt" title="Clock" name="Cycles" color="0x800084AB" per_cpu="yes" event_based_sampling="yes" description="The number of core clock cycles"/>
-  <configuration counter="ARM_Cortex-A5_cnt0" event="0x8" title="Instruction" name="Executed" color="0x80008000" per_cpu="yes" event_based_sampling="yes" description="Instruction architecturally executed"/>
-  <configuration counter="ARM_Cortex-A5_cnt1" event="0x1" title="Cache" name="Instruction refill" color="0x80C92211" per_cpu="yes" event_based_sampling="yes" description="Instruction fetch that causes a refill of at least the level of instruction or unified cache closest to the processor"/>
-  <configuration counter="ARM_Cortex-A8_ccnt" title="Clock" name="Cycles" color="0x800084AB" per_cpu="yes" event_based_sampling="yes" description="The number of core clock cycles"/>
-  <configuration counter="ARM_Cortex-A8_cnt0" event="0x8" title="Instruction" name="Executed" color="0x80008000" per_cpu="yes" event_based_sampling="yes" description="Instruction architecturally executed"/>
-  <configuration counter="ARM_Cortex-A8_cnt1" event="0x44" title="Cache" name="L2 miss" color="0x80C92211" per_cpu="yes" event_based_sampling="yes" description="Any cacheable miss in the L2 cache"/>
-  <configuration counter="ARM_Cortex-A8_cnt2" event="0x43" title="Cache" name="L1 miss" color="0x80FFC000" per_cpu="yes" event_based_sampling="yes" description="Any accesses to the L2 cache"/>
-  <configuration counter="ARM_Cortex-A8_cnt3" event="0x10" title="Branch" name="Mispredicted" color="0x80FFFF33" per_cpu="yes" event_based_sampling="yes" description="Branch mispredicted or not predicted"/>
-  <configuration counter="ARM_Cortex-A9_ccnt" title="Clock" name="Cycles" color="0x800084AB" per_cpu="yes" event_based_sampling="yes" description="The number of core clock cycles"/>
-  <configuration counter="ARM_Cortex-A9_cnt0" event="0x68" title="Instruction" name="Executed" color="0x80008000" per_cpu="yes" event_based_sampling="yes" description="Counts the number of instructions going through the Register Renaming stage. This number is an approximate number of the total number of instructions speculatively executed, and even more approximate of the total number of instructions architecturally executed"/>
-  <configuration counter="ARM_Cortex-A9_cnt1" event="0x50" title="Cache" name="Coherency miss" color="0x80C92211" per_cpu="yes" event_based_sampling="yes" description="Counts the number of coherent linefill requests performed by the Cortex-A9 processor which also miss in all the other Cortex-A9 processors, meaning that the request is sent to the external memory"/>
-  <configuration counter="ARM_Cortex-A9_cnt2" event="0x51" title="Cache" name="Coherency hit" color="0x80FFC000" per_cpu="yes" event_based_sampling="yes" description="Counts the number of coherent linefill requests performed by the Cortex-A9 processor which hit in another Cortex-A9 processor, meaning that the linefill data is fetched directly from the relevant Cortex-A9 cache"/>
-  <configuration counter="ARM_Cortex-A9_cnt3" event="0x0c" title="Branch" name="PC change" color="0x809900FF" per_cpu="yes" event_based_sampling="yes" description="Software change of Program Counter, except by an exception, architecturally executed"/>
-  <configuration counter="ARM_Cortex-A9_cnt4" event="0x10" title="Branch" name="Mispredicted" color="0x80FFFF33" per_cpu="yes" event_based_sampling="yes" description="Branch mispredicted or not predicted"/>
-  <configuration counter="ARM_Cortex-A9_cnt5" event="0x0f" title="Fault" name="Unaligned access" color="0x666666" per_cpu="yes" event_based_sampling="yes" description="Unaligned access architecturally executed"/>
-  <configuration counter="ARM_Cortex-A15_ccnt" title="Clock" name="Cycles" color="0x800084AB" per_cpu="yes" event_based_sampling="yes" description="The number of core clock cycles"/>
-  <configuration counter="ARM_Cortex-A15_cnt0" event="0x8" title="Instruction" name="Executed" color="0x80008000" per_cpu="yes" event_based_sampling="yes" description="Instruction architecturally executed"/>
-  <configuration counter="ARM_Cortex-A15_cnt1" event="0x16" title="Cache" name="L2 data access" color="0x80C92211" per_cpu="yes" event_based_sampling="yes" description="Level 2 data cache access"/>
-  <configuration counter="ARM_Cortex-A15_cnt2" event="0x10" title="Branch" name="Mispredicted" color="0x80FFFF33" per_cpu="yes" event_based_sampling="yes" description="Branch mispredicted or not predicted"/>
-  <configuration counter="ARM_Cortex-A15_cnt3" event="0x19" title="Bus" name="Access" color="0x809900FF" per_cpu="yes" event_based_sampling="yes" description=""/>
-  <configuration counter="Linux_irq_irq" title="Interrupts" name="IRQ" color="0x805050F4" per_cpu="yes" description="Linux IRQ taken"/>
-  <configuration counter="Linux_irq_softirq" title="Interrupts" name="SoftIRQ" color="0x80FF9000" per_cpu="yes" description="Linux SoftIRQ taken"/>
-  <configuration counter="Linux_block_rq_wr" title="Disk IO" name="Write" color="0x80FF4020" description="Disk IO Bytes Written"/>
-  <configuration counter="Linux_block_rq_rd" title="Disk IO" name="Read" color="0x800090FF" description="Disk IO Bytes Read"/>
-  <configuration counter="Linux_meminfo_memused" title="Memory" name="Used" color="0x800084ab" operation="maximum" description="Total used memory size"/>
-  <configuration counter="Linux_meminfo_memfree" title="Memory" name="Free" color="0x80e9e9e9" operation="maximum" description="Available memory size"/>
-  <configuration counter="Linux_net_rx" title="Network" name="Receive" color="0x805050F4" description="Receive network traffic, excluding effect from Streamline"/>
-  <configuration counter="Linux_net_tx" title="Network" name="Transmit" color="0x80FF9000" description="Transmit network traffic, excluding effect from Streamline"/>
-  <configuration counter="Linux_cpuload_system" title="CPU Load" name="System" color="0x80FF0000" description="Scheduler CPU Load of System Behavior"/>
-  <configuration counter="Linux_cpuload_user" title="CPU Load" name="User" color="0x8000FF00" description="Scheduler CPU Load of User Application"/>
+<configurations version="1" revision="1">
+  <configuration counter="ARM_ARM11_ccnt" title="Clock" name="Cycles" per_cpu="yes" alias="ClockCycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
+  <configuration counter="ARM_ARM11_cnt0" event="0x7" title="Instruction" name="Executed" per_cpu="yes" alias="InstructionsExecuted" description="Instructions executed"/>
+  <configuration counter="ARM_ARM11_cnt1" event="0xb" title="Cache" name="Data miss" per_cpu="yes" alias="L1Miss" description="Data cache miss, not including Cache Operations"/>
+  <configuration counter="ARM_ARM11MPCore_ccnt" title="Clock" name="Cycles" per_cpu="yes" alias="ClockCycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
+  <configuration counter="ARM_ARM11MPCore_cnt0" event="0x08" title="Core" name="Instructions" per_cpu="yes" alias="InstructionsExecuted" description="Instructions executed"/>
+  <configuration counter="ARM_ARM11MPCore_cnt1" event="0x0b" title="Cache" name="Data read miss" per_cpu="yes" alias="L1Miss" description="Data cache miss, not including Cache Operations"/>
+  <configuration counter="ARM_Cortex-A5_ccnt" title="Clock" name="Cycles" per_cpu="yes" event_based_sampling="yes" alias="ClockCycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
+  <configuration counter="ARM_Cortex-A5_cnt0" event="0x8" title="Instruction" name="Executed" per_cpu="yes" event_based_sampling="yes" alias="InstructionsExecuted" description="Instruction architecturally executed"/>
+  <configuration counter="ARM_Cortex-A5_cnt1" event="0x1" title="Cache" name="Instruction refill" per_cpu="yes" event_based_sampling="yes" description="Instruction fetch that causes a refill of at least the level of instruction or unified cache closest to the processor"/>
+  <configuration counter="ARM_Cortex-A7_ccnt" title="Clock" name="Cycles" per_cpu="yes" event_based_sampling="yes" alias="ClockCycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
+  <configuration counter="ARM_Cortex-A7_cnt0" event="0x08" title="Instruction" name="Executed" per_cpu="yes" event_based_sampling="yes" alias="InstructionsExecuted" description="Instruction architecturally executed"/>
+  <configuration counter="ARM_Cortex-A7_cnt1" event="0x10" title="Branch" name="Mispredicted" per_cpu="yes" event_based_sampling="yes" alias="BranchMispredicted" description="Branch mispredicted or not predicted"/>
+  <configuration counter="ARM_Cortex-A7_cnt2" event="0x16" title="Cache" name="L2 data access" per_cpu="yes" event_based_sampling="yes" alias="L1Miss" description="Level 2 data cache access"/>
+  <configuration counter="ARM_Cortex-A8_ccnt" title="Clock" name="Cycles" per_cpu="yes" event_based_sampling="yes" alias="ClockCycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
+  <configuration counter="ARM_Cortex-A8_cnt0" event="0x8" title="Instruction" name="Executed" per_cpu="yes" event_based_sampling="yes" alias="InstructionsExecuted" description="Instruction architecturally executed"/>
+  <configuration counter="ARM_Cortex-A8_cnt1" event="0x44" title="Cache" name="L2 miss" per_cpu="yes" event_based_sampling="yes" alias="L2Miss" description="Any cacheable miss in the L2 cache"/>
+  <configuration counter="ARM_Cortex-A8_cnt2" event="0x43" title="Cache" name="L1 miss" per_cpu="yes" event_based_sampling="yes" alias="L1Miss" description="Any accesses to the L2 cache"/>
+  <configuration counter="ARM_Cortex-A8_cnt3" event="0x10" title="Branch" name="Mispredicted" per_cpu="yes" event_based_sampling="yes" alias="BranchMispredicted" description="Branch mispredicted or not predicted"/>
+  <configuration counter="ARM_Cortex-A9_ccnt" title="Clock" name="Cycles" per_cpu="yes" event_based_sampling="yes" alias="ClockCycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
+  <configuration counter="ARM_Cortex-A9_cnt0" event="0x68" title="Instruction" name="Executed" per_cpu="yes" event_based_sampling="yes" alias="InstructionsExecuted" description="Counts the number of instructions going through the Register Renaming stage. This number is an approximate number of the total number of instructions speculatively executed, and even more approximate of the total number of instructions architecturally executed"/>
+  <configuration counter="ARM_Cortex-A9_cnt1" event="0x06" title="Instruction" name="Memory read" per_cpu="yes" event_based_sampling="yes" alias="MemoryRead" description="Memory-reading instruction architecturally executed"/>
+  <configuration counter="ARM_Cortex-A9_cnt2" event="0x07" title="Instruction" name="Memory write" per_cpu="yes" event_based_sampling="yes" alias="MemoryWrite" description="Memory-writing instruction architecturally executed"/>
+  <configuration counter="ARM_Cortex-A9_cnt3" event="0x03" title="Cache" name="Data refill" per_cpu="yes" event_based_sampling="yes" alias="DataRefill" description="Memory Read or Write operation that causes a refill of at least the level of data or unified cache closest to the processor"/>
+  <configuration counter="ARM_Cortex-A9_cnt4" event="0x04" title="Cache" name="Data access" per_cpu="yes" event_based_sampling="yes" alias="DataAccess" description="Memory Read or Write operation that causes a cache access to at least the level of data or unified cache closest to the processor"/>
+  <configuration counter="ARM_Cortex-A15_ccnt" title="Clock" name="Cycles" per_cpu="yes" event_based_sampling="yes" alias="ClockCycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
+  <configuration counter="ARM_Cortex-A15_cnt0" event="0x8" title="Instruction" name="Executed" per_cpu="yes" event_based_sampling="yes" alias="InstructionsExecuted" description="Instruction architecturally executed"/>
+  <configuration counter="ARM_Cortex-A15_cnt1" event="0x16" title="Cache" name="L2 data access" per_cpu="yes" event_based_sampling="yes" alias="L1Miss" description="Level 2 data cache access"/>
+  <configuration counter="ARM_Cortex-A15_cnt2" event="0x10" title="Branch" name="Mispredicted" per_cpu="yes" event_based_sampling="yes" alias="BranchMispredicted" description="Branch mispredicted or not predicted"/>
+  <configuration counter="ARM_Cortex-A15_cnt3" event="0x19" title="Bus" name="Access" per_cpu="yes" event_based_sampling="yes" description=""/>
+  <configuration counter="Scorpion_ccnt" title="Clock" name="Cycles" per_cpu="yes" event_based_sampling="yes" alias="ClockCycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
+  <configuration counter="Scorpion_cnt0" event="0x08" title="Instruction" name="Executed" per_cpu="yes" event_based_sampling="yes" alias="InstructionsExecuted" description="Instruction architecturally executed"/>
+  <configuration counter="Scorpion_cnt1" event="0x10" title="Branch" name="Mispredicted" per_cpu="yes" event_based_sampling="yes" alias="BranchMispredicted" description="Branch mispredicted or not predicted"/>
+  <configuration counter="ScorpionMP_ccnt" title="Clock" name="Cycles" per_cpu="yes" event_based_sampling="yes" alias="ClockCycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
+  <configuration counter="ScorpionMP_cnt0" event="0x08" title="Instruction" name="Executed" per_cpu="yes" event_based_sampling="yes" alias="InstructionsExecuted" description="Instruction architecturally executed"/>
+  <configuration counter="ScorpionMP_cnt1" event="0x10" title="Branch" name="Mispredicted" per_cpu="yes" event_based_sampling="yes" alias="BranchMispredicted" description="Branch mispredicted or not predicted"/>
+  <configuration counter="Krait_ccnt" title="Clock" name="Cycles" per_cpu="yes" event_based_sampling="yes" alias="ClockCycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
+  <configuration counter="Krait_cnt0" event="0x08" title="Instruction" name="Executed" per_cpu="yes" event_based_sampling="yes" alias="InstructionsExecuted" description="Instruction architecturally executed"/>
+  <configuration counter="Krait_cnt1" event="0x10" title="Branch" name="Mispredicted" per_cpu="yes" event_based_sampling="yes" alias="BranchMispredicted" description="Branch mispredicted or not predicted"/>
+  <configuration counter="Linux_block_rq_wr" title="Disk IO" name="Write" units="B" description="Disk IO Bytes Written"/>
+  <configuration counter="Linux_block_rq_rd" title="Disk IO" name="Read" units="B" description="Disk IO Bytes Read"/>
+  <configuration counter="Linux_net_rx" title="Network" name="Receive" units="B" description="Receive network traffic, excluding effect from Streamline"/>
+  <configuration counter="Linux_net_tx" title="Network" name="Transmit" units="B" description="Transmit network traffic, excluding effect from Streamline"/>
+  <configuration counter="Linux_cpuload_system" title="CPU Load" name="System" description="Scheduler CPU Load of System Behavior"/>
+  <configuration counter="Linux_cpuload_user" title="CPU Load" name="User" description="Scheduler CPU Load of User Application"/>
+  <configuration counter="Linux_meminfo_memused" title="Memory" name="Used" display="maximum" units="B" average_selection="yes" description="Total used memory size"/>
+  <configuration counter="Linux_meminfo_memfree" title="Memory" name="Free" display="minimum" units="B" average_selection="yes" description="Available memory size"/>
+  <configuration counter="Linux_power_cpu_freq" title="Clock" name="DVFS" per_cpu="yes" display="maximum" units="Hz" average_selection="yes" description="Target frequency of the CPU"/>
+  <configuration counter="L2C-310_cnt0" event="0x1" title="L2 Cache" name="CO" description="Eviction, CastOut, of a line from the L2 cache"/>
 </configurations>
index 5742271c29b89d9482e1856baf667c763479384f..c9d188f81a12b8d56a58c7cbb9e46b5cedbb65a3 100644 (file)
@@ -4,18 +4,18 @@
     <counter name="ARM_ARM11_cnt2"/>\r
   </counter_set>\r
   <category name="ARM11" counter_set="ARM_ARM11_cntX" per_cpu="yes">\r
-    <event counter="ARM_ARM11_ccnt" title="Clock" name="Cycles" description="The number of core clock cycles"/>\r
+    <event counter="ARM_ARM11_ccnt" title="Clock" name="Cycles" alias="ClockCycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>\r
     <event event="0x00" title="Cache" name="Inst miss" description="Instruction cache miss to a cacheable location, which requires a fetch from external memory"/>\r
     <event event="0x01" title="Pipeline" name="Instruction stall" description="Stall because instruction buffer cannot deliver an instruction"/>\r
     <event event="0x02" title="Pipeline" name="Data stall" description="Stall because of a data dependency"/>\r
     <event event="0x03" title="Cache" name="Inst micro TLB miss" description="Instruction MicroTLB miss (unused on ARM1156)"/>\r
     <event event="0x04" title="Cache" name="Data micro TLB miss" description="Data MicroTLB miss (unused on ARM1156)"/>\r
     <event event="0x05" title="Branch" name="Instruction executed" description="Branch instruction executed, branch might or might not have changed program flow"/>\r
-    <event event="0x06" title="Branch" name="Mispredicted" description="Branch mis-predicted"/>\r
-    <event event="0x07" title="Instruction" name="Executed" description="Instructions executed"/>\r
+    <event event="0x06" title="Branch" name="Mispredicted" alias="BranchMispredicted" description="Branch mis-predicted"/>\r
+    <event event="0x07" title="Instruction" name="Executed" alias="InstructionsExecuted" description="Instructions executed"/>\r
     <event event="0x09" title="Cache" name="Data access" description="Data cache access, not including Cache operations"/>\r
     <event event="0x0a" title="Cache" name="Data all access" description="Data cache access, not including Cache Operations regardless of whether or not the location is cacheable"/>\r
-    <event event="0x0b" title="Cache" name="Data miss" description="Data cache miss, not including Cache Operations"/>\r
+    <event event="0x0b" title="Cache" name="Data miss" alias="L1Miss" description="Data cache miss, not including Cache Operations"/>\r
     <event event="0x0c" title="Cache" name="Write-back" description="Data cache write-back"/>\r
     <event event="0x0d" title="Program Counter" name="SW change" description="Software changed the PC"/>\r
     <event event="0x0f" title="Cache " name="TLB miss" description="Main TLB miss (unused on ARM1156)"/>\r
index 6da9ecb49ddf12010692192fab439510c8bb1481..74a29e68032b3c36cf380427a4817b584685e66a 100644 (file)
@@ -4,7 +4,7 @@
     <counter name="ARM_ARM11MPCore_cnt2"/>
   </counter_set>
   <category name="ARM11MPCore" counter_set="ARM_ARM11MPCore_cntX" per_cpu="yes">
-    <event counter="ARM_ARM11MPCore_ccnt" title="Clock" name="Cycles" description="The number of core clock cycles"/>
+    <event counter="ARM_ARM11MPCore_ccnt" title="Clock" name="Cycles" alias="ClockCycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
     <event event="0x00" title="Cache" name="Inst miss" description="Instruction cache miss to a cacheable location, which requires a fetch from external memory"/>
     <event event="0x01" title="Pipeline" name="Instruction stall" description="Stall because instruction buffer cannot deliver an instruction"/>
     <event event="0x02" title="Pipeline" name="Data stall" description="Stall because of a data dependency"/>
     <event event="0x04" title="Cache" name="Data micro TLB miss" description="Data MicroTLB miss (unused on ARM1156)"/>
     <event event="0x05" title="Branch" name="Instruction executed" description="Branch instructions executed, branch might or might not have changed program flow"/>
     <event event="0x06" title="Branch" name="Not predicted" description="Branch not predicted"/>
-    <event event="0x07" title="Branch" name="Mispredicted" description="Branch mispredicted"/>
-    <event event="0x08" title="Core" name="Instructions" description="Instructions executed"/>
+    <event event="0x07" title="Branch" name="Mispredicted" alias="BranchMispredicted" description="Branch mispredicted"/>
+    <event event="0x08" title="Core" name="Instructions" alias="InstructionsExecuted" description="Instructions executed"/>
     <event event="0x09" title="Core" name="Folded Instructions" description="Folded instructions executed"/>
     <event event="0x0a" title="Cache" name="Data read access" description="Data cache read access, not including cache operations"/>
-    <event event="0x0b" title="Cache" name="Data read miss" description="Data cache miss, not including Cache Operations"/>
+    <event event="0x0b" title="Cache" name="Data read miss" alias="L1Miss" description="Data cache miss, not including Cache Operations"/>
     <event event="0x0c" title="Cache" name="Data write access" description="Data cache write access"/>
     <event event="0x0d" title="Cache" name="Data write miss" description="Data cache write miss"/>
     <event event="0x0e" title="Cache" name="Data line eviction" description="Data cache line eviction, not including cache operations"/>
@@ -27,4 +27,4 @@
     <event event="0x13" title="Write Buffer" name="Drains" description="The number of times the Write Buffer was drained because of LSU ordering constraints or CP15 operations (Data Synchronization Barrier command) or Strongly Ordered operation"/>
     <event event="0x14" title="Write Buffer" name="Write Merges" description="Buffered write merged in a store buffer slot"/>
     <event event="0xFF" title="Core" name="Cycle counter" description="An increment each cycle"/>
-  </category>
\ No newline at end of file
+  </category>
index 86a3d17e9d8b0fb42e54d83e4a4a9efbb33f7976..74c7290dad0e2477a6bb20b6911d099c8268a8bd 100644 (file)
@@ -7,31 +7,31 @@
     <counter name="ARM_Cortex-A15_cnt5"/>\r
   </counter_set>\r
   <category name="Cortex-A15" counter_set="ARM_Cortex-A15_cntX" per_cpu="yes" event_based_sampling="yes">\r
-    <event counter="ARM_Cortex-A15_ccnt" title="Clock" name="Cycles" description="The number of core clock cycles"/>\r
+    <event counter="ARM_Cortex-A15_ccnt" title="Clock" name="Cycles" alias="ClockCycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>\r
     <event event="0x00" title="Software" name="Increment" description="Software increment architecturally executed"/>\r
     <event event="0x01" title="Cache" name="Instruction refill" description="Instruction fetch that causes a refill of at least the level of instruction or unified cache closest to the processor"/>\r
     <event event="0x02" title="Cache" name="Inst TLB refill" description="Instruction fetch that causes a TLB refill of at least the level of TLB closest to the processor"/>\r
     <event event="0x03" title="Cache" name="Data refill" description="Memory Read or Write operation that causes a refill of at least the level of data or unified cache closest to the processor"/>\r
     <event event="0x04" title="Cache" name="Data access" description="Memory Read or Write operation that causes a cache access to at least the level of data or unified cache closest to the processor"/>\r
     <event event="0x05" title="Cache" name="Data TLB refill" description="Memory Read or Write operation that causes a TLB refill of at least the level of TLB closest to the processor"/>\r
-    <event event="0x08" title="Instruction" name="Executed" description="Instruction architecturally executed"/>\r
+    <event event="0x08" title="Instruction" name="Executed" alias="InstructionsExecuted" description="Instruction architecturally executed"/>\r
     <event event="0x09" title="Exception" name="Taken" description="Exceptions taken"/>\r
     <event event="0x0a" title="Exception" name="Return" description="Exception return architecturally executed"/>\r
     <event event="0x0b" title="Instruction" name="CONTEXTIDR" description="Instruction that writes to the CONTEXTIDR architecturally executed"/>\r
-    <event event="0x10" title="Branch" name="Mispredicted" description="Branch mispredicted or not predicted"/>\r
-       <event event="0x11" title="Cycle" name="Cycle" description=""/>\r
-    <event event="0x12" title="Branch" name="Potential prediction" description="Branch or other change in program flow that could have been predicted by the branch prediction resources of the processor"/>\r
+    <event event="0x10" title="Branch" name="Mispredicted" alias="BranchMispredicted" description="Branch mispredicted or not predicted"/>\r
+    <event event="0x11" title="Cycle" name="Cycle" description=""/>\r
+    <event event="0x12" title="Branch" name="Potential prediction" alias="PotentialPrediction" description="Branch or other change in program flow that could have been predicted by the branch prediction resources of the processor"/>\r
     <event event="0x13" title="Memory" name="Memory access" description="Data memory access"/>\r
     <event event="0x14" title="Cache" name="L1 inst access" description="Instruction cache access"/>\r
     <event event="0x15" title="Cache" name="L1 data write" description="Level 1 data cache Write-Back"/>\r
-       <event event="0x16" title="Cache" name="L2 data access" description="Level 2 data cache access"/>\r
-       <event event="0x17" title="Cache" name="L2 data refill" description="Level 2 data cache refill"/>\r
-       <event event="0x18" title="Cache" name="L2 data write" description="Level 2 data cache Write-Back"/>\r
-       <event event="0x19" title="Bus" name="Access" description=""/>\r
-       <event event="0x1a" title="Memory" name="Error" description="Local memory error"/>\r
-       <event event="0x1b" title="Instruction" name="Speculative" description="Instruction speculatively executed"/>\r
-       <event event="0x1c" title="Memory" name="Translation table" description="Write to translation table base architecturally executed"/>\r
-       <event event="0x1d" title="Bus" name="Cycle" description=""/>\r
+    <event event="0x16" title="Cache" name="L2 data access" alias="L1Miss" description="Level 2 data cache access"/>\r
+    <event event="0x17" title="Cache" name="L2 data refill" description="Level 2 data cache refill"/>\r
+    <event event="0x18" title="Cache" name="L2 data write" description="Level 2 data cache Write-Back"/>\r
+    <event event="0x19" title="Bus" name="Access" description=""/>\r
+    <event event="0x1a" title="Memory" name="Error" description="Local memory error"/>\r
+    <event event="0x1b" title="Instruction" name="Speculative" description="Instruction speculatively executed"/>\r
+    <event event="0x1c" title="Memory" name="Translation table" description="Write to translation table base architecturally executed"/>\r
+    <event event="0x1d" title="Bus" name="Cycle" description=""/>\r
     <event event="0x40" title="Cache" name="L1 data read" description="Level 1 data cache access - Read"/>\r
     <event event="0x41" title="Cache" name="L1 data write" description="Level 1 data cache access - Write"/>\r
     <event event="0x42" title="Cache" name="L1 data refill read" description="Level 1 data cache refill - Read"/>\r
     <event event="0x61" title="Bus" name="Write" description="Bus access - Write"/>\r
     <event event="0x64" title="Bus" name="Access" description="Bus access - Normal"/>\r
     <event event="0x65" title="Bus" name="Peripheral" description="Bus access - Peripheral"/>\r
-    <event event="0x66" title="Memory" name="Read" description="Data memory access - Read"/>\r
-    <event event="0x67" title="Memory" name="Write" description="Data memory access - Write"/>\r
+    <event event="0x66" title="Memory" name="Read" alias="MemoryRead" description="Data memory access - Read"/>\r
+    <event event="0x67" title="Memory" name="Write" alias="MemoryWrite" description="Data memory access - Write"/>\r
     <event event="0x68" title="Memory" name="Unaligned Read" description="Unaligned access - Read"/>\r
     <event event="0x69" title="Memory" name="Unaligned Write" description="Unaligned access - Write"/>\r
-       <event event="0x6a" title="Memory" name="Unaligned" description="Unaligned access"/>\r
-       <event event="0x6c" title="Intrinsic" name="LDREX" description="Exclusive instruction speculatively executed - LDREX"/>\r
-       <event event="0x6d" title="Intrinsic" name="STREX pass" description="Exclusive instruction speculatively executed - STREX pass"/>\r
-       <event event="0x6e" title="Intrinsic" name="STREX fail" description="Exclusive instruction speculatively executed - STREX fail"/>\r
-    <event event="0x70" title="Instructions" name="Load" description="Instruction speculatively executed - Load"/>\r
-    <event event="0x71" title="Instructions" name="Store" description="Instruction speculatively executed - Store"/>\r
-    <event event="0x72" title="Instructions" name="Load/Store" description="Instruction speculatively executed - Load or store"/>\r
-    <event event="0x73" title="Instructions" name="Integer" description="Instruction speculatively executed - Integer data processing"/>\r
-    <event event="0x74" title="Instructions" name="Advanced SIMD" description="Instruction speculatively executed - Advanced SIMD"/>\r
-    <event event="0x75" title="Instructions" name="VFP" description="Instruction speculatively executed - VFP"/>\r
-    <event event="0x76" title="Instructions" name="Software change" description="Instruction speculatively executed - Software change of the PC"/>\r
-    <event event="0x78" title="Instructions" name="Immediate branch" description="Branch speculatively executed - Immediate branch"/>\r
-    <event event="0x79" title="Instructions" name="Procedure return" description="Branch speculatively executed - Procedure return"/>\r
-    <event event="0x7a" title="Instructions" name="Indirect branch" description="Branch speculatively executed - Indirect branch"/>\r
-    <event event="0x7c" title="Instructions" name="ISB" description="Barrier speculatively executed - ISB"/>\r
-    <event event="0x7d" title="Instructions" name="DSB" description="Barrier speculatively executed - DSB"/>\r
-    <event event="0x7e" title="Instructions" name="DMB" description="Barrier speculatively executed - DMB"/>\r
+    <event event="0x6a" title="Memory" name="Unaligned" alias="UnalignedAccess" description="Unaligned access"/>\r
+    <event event="0x6c" title="Intrinsic" name="LDREX" description="Exclusive instruction speculatively executed - LDREX"/>\r
+    <event event="0x6d" title="Intrinsic" name="STREX pass" description="Exclusive instruction speculatively executed - STREX pass"/>\r
+    <event event="0x6e" title="Intrinsic" name="STREX fail" description="Exclusive instruction speculatively executed - STREX fail"/>\r
+    <event event="0x70" title="Instruction" name="Load" description="Instruction speculatively executed - Load"/>\r
+    <event event="0x71" title="Instruction" name="Store" description="Instruction speculatively executed - Store"/>\r
+    <event event="0x72" title="Instruction" name="Load/Store" description="Instruction speculatively executed - Load or store"/>\r
+    <event event="0x73" title="Instruction" name="Integer" description="Instruction speculatively executed - Integer data processing"/>\r
+    <event event="0x74" title="Instruction" name="Advanced SIMD" description="Instruction speculatively executed - Advanced SIMD"/>\r
+    <event event="0x75" title="Instruction" name="VFP" description="Instruction speculatively executed - VFP"/>\r
+    <event event="0x76" title="Instruction" name="Software change" description="Instruction speculatively executed - Software change of the PC"/>\r
+    <event event="0x78" title="Instruction" name="Immediate branch" description="Branch speculatively executed - Immediate branch"/>\r
+    <event event="0x79" title="Instruction" name="Procedure return" description="Branch speculatively executed - Procedure return"/>\r
+    <event event="0x7a" title="Instruction" name="Indirect branch" description="Branch speculatively executed - Indirect branch"/>\r
+    <event event="0x7c" title="Instruction" name="ISB" description="Barrier speculatively executed - ISB"/>\r
+    <event event="0x7d" title="Instruction" name="DSB" description="Barrier speculatively executed - DSB"/>\r
+    <event event="0x7e" title="Instruction" name="DMB" description="Barrier speculatively executed - DMB"/>\r
   </category>  \r
-  
\ No newline at end of file
index 3683947cbe565c659a0d14673f256c6b795c4ec4..0a70a62123bf7965a7873eadc97be78f62645aa2 100644 (file)
@@ -3,25 +3,25 @@
     <counter name="ARM_Cortex-A5_cnt1"/>\r
   </counter_set>\r
   <category name="Cortex-A5" counter_set="ARM_Cortex-A5_cntX" per_cpu="yes" event_based_sampling="yes">\r
-    <event counter="ARM_Cortex-A5_ccnt" title="Clock" name="Cycles" description="The number of core clock cycles"/>\r
+    <event counter="ARM_Cortex-A5_ccnt" title="Clock" name="Cycles" alias="ClockCycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>\r
     <event event="0x00" title="Software" name="Increment" description="Incremented only on writes to the Software Increment Register"/>\r
     <event event="0x01" title="Cache" name="Instruction refill" description="Instruction fetch that causes a refill of at least the level of instruction or unified cache closest to the processor"/>\r
     <event event="0x02" title="Cache" name="Inst TLB refill" description="Instruction fetch that causes a TLB refill of at least the level of TLB closest to the processor"/>\r
     <event event="0x03" title="Cache" name="Data refill" description="Memory Read or Write operation that causes a refill of at least the level of data or unified cache closest to the processor"/>\r
     <event event="0x04" title="Cache" name="Data access" description="Memory Read or Write operation that causes a cache access to at least the level of data or unified cache closest to the processor"/>\r
     <event event="0x05" title="Cache" name="Data TLB refill" description="Memory Read or Write operation that causes a TLB refill of at least the level of TLB closest to the processor"/>\r
-    <event event="0x06" title="Instruction" name="Memory read" description="Memory-reading instruction architecturally executed"/>\r
-    <event event="0x07" title="Instruction" name="Memory write" description="Memory-writing instruction architecturally executed"/>\r
-    <event event="0x08" title="Instruction" name="Executed" description="Instruction architecturally executed"/>\r
+    <event event="0x06" title="Instruction" name="Memory read" alias="MemoryRead" description="Memory-reading instruction architecturally executed"/>\r
+    <event event="0x07" title="Instruction" name="Memory write" alias="MemoryWrite" description="Memory-writing instruction architecturally executed"/>\r
+    <event event="0x08" title="Instruction" name="Executed" alias="InstructionsExecuted" description="Instruction architecturally executed"/>\r
     <event event="0x09" title="Exception" name="Taken" description="Exceptions taken"/>\r
     <event event="0x0a" title="Exception" name="Return" description="Exception return architecturally executed"/>\r
     <event event="0x0b" title="Instruction" name="CONTEXTIDR" description="Instruction that writes to the CONTEXTIDR architecturally executed"/>\r
     <event event="0x0c" title="Branch" name="PC change" description="Software change of the Program Counter, except by an exception, architecturally executed"/>\r
     <event event="0x0d" title="Branch" name="Immediate" description="Immediate branch architecturally executed"/>\r
     <event event="0x0e" title="Procedure" name="Return" description="Procedure return, other than exception return, architecturally executed"/>\r
-    <event event="0x0f" title="Memory" name="Unaligned access" description="Unaligned access architecturally executed"/>\r
-    <event event="0x10" title="Branch" name="Mispredicted" description="Branch mispredicted or not predicted"/>\r
-    <event event="0x12" title="Branch" name="Potential prediction" description="Branch or other change in program flow that could have been predicted by the branch prediction resources of the processor"/>\r
+    <event event="0x0f" title="Memory" name="Unaligned access" alias="UnalignedAccess" description="Unaligned access architecturally executed"/>\r
+    <event event="0x10" title="Branch" name="Mispredicted" alias="BranchMispredicted" description="Branch mispredicted or not predicted"/>\r
+    <event event="0x12" title="Branch" name="Potential prediction" alias="PotentialPrediction" description="Branch or other change in program flow that could have been predicted by the branch prediction resources of the processor"/>\r
     <event event="0x13" title="Memory" name="Memory access" description="Data memory access"/>\r
     <event event="0x14" title="Cache" name="Instruction access" description="Instruction cache access"/>\r
     <event event="0x15" title="Cache" name="Data eviction" description="Data cache eviction"/>\r
old mode 100644 (file)
new mode 100755 (executable)
index db9f180..1a55817
@@ -5,37 +5,37 @@
     <counter name="ARM_Cortex-A7_cnt3"/>\r
   </counter_set>\r
   <category name="Cortex-A7" counter_set="ARM_Cortex-A7_cntX" per_cpu="yes" event_based_sampling="yes">\r
-    <event counter="ARM_Cortex-A7_ccnt" title="Clock" name="Cycles" description="The number of core clock cycles"/>\r
+    <event counter="ARM_Cortex-A7_ccnt" title="Clock" name="Cycles" alias="ClockCycles" display="hertz" units="Hz" average_selection="yes"  description="The number of core clock cycles"/>\r
     <event event="0x00" title="Software" name="Increment" description="Software increment architecturally executed"/>\r
     <event event="0x01" title="Cache" name="Instruction refill" description="Instruction fetch that causes a refill of at least the level of instruction or unified cache closest to the processor"/>\r
     <event event="0x02" title="Cache" name="Inst TLB refill" description="Instruction fetch that causes a TLB refill of at least the level of TLB closest to the processor"/>\r
     <event event="0x03" title="Cache" name="Data refill" description="Memory Read or Write operation that causes a refill of at least the level of data or unified cache closest to the processor"/>\r
     <event event="0x04" title="Cache" name="Data access" description="Memory Read or Write operation that causes a cache access to at least the level of data or unified cache closest to the processor"/>\r
     <event event="0x05" title="Cache" name="Data TLB refill" description="Memory Read or Write operation that causes a TLB refill of at least the level of TLB closest to the processor"/>\r
-    <event event="0x06" title="Memory" name="Data Read" description="Data read architecturally executed"/>\r
-    <event event="0x07" title="Memory" name="Data Write" description="Data write architecturally executed"/>\r
-       <event event="0x08" title="Instruction" name="Executed" description="Instruction architecturally executed"/>\r
+    <event event="0x06" title="Memory" name="Data Read" alias="MemoryRead" description="Data read architecturally executed"/>\r
+    <event event="0x07" title="Memory" name="Data Write" alias="MemoryWrite" description="Data write architecturally executed"/>\r
+    <event event="0x08" title="Instruction" name="Executed" alias="InstructionsExecuted" description="Instruction architecturally executed"/>\r
     <event event="0x09" title="Exception" name="Taken" description="Exceptions taken"/>\r
     <event event="0x0a" title="Exception" name="Return" description="Exception return architecturally executed"/>\r
     <event event="0x0b" title="Instruction" name="CONTEXTIDR" description="Instruction that writes to the CONTEXTIDR architecturally executed"/>\r
     <event event="0x0c" title="Branch" name="PC change" description="Software change of the Program Counter, except by an exception, architecturally executed"/>\r
     <event event="0x0d" title="Branch" name="Immediate" description="Immediate branch architecturally executed"/>\r
-    <event event="0x0f" title="Memory" name="Unaligned access" description="Unaligned access architecturally executed"/>\r
-    <event event="0x10" title="Branch" name="Mispredicted" description="Branch mispredicted or not predicted"/>\r
-       <event event="0x11" title="Cycle" name="Counter" description=""/>\r
-    <event event="0x12" title="Branch" name="Potential prediction" description="Branch or other change in program flow that could have been predicted by the branch prediction resources of the processor"/>\r
+    <event event="0x0f" title="Memory" name="Unaligned access" alias="UnalignedAccess" description="Unaligned access architecturally executed"/>\r
+    <event event="0x10" title="Branch" name="Mispredicted" alias="BranchMispredicted" description="Branch mispredicted or not predicted"/>\r
+    <event event="0x11" title="Cycle" name="Counter" description=""/>\r
+    <event event="0x12" title="Branch" name="Potential prediction" alias="PotentialPrediction" description="Branch or other change in program flow that could have been predicted by the branch prediction resources of the processor"/>\r
     <event event="0x13" title="Memory" name="Memory access" description="Data memory access"/>\r
     <event event="0x14" title="Cache" name="L1 inst access" description="Instruction cache access"/>\r
     <event event="0x15" title="Cache" name="L1 data eviction" description="Level 1 data cache eviction"/>\r
-       <event event="0x16" title="Cache" name="L2 data access" description="Level 2 data cache access"/>\r
-       <event event="0x17" title="Cache" name="L2 data refill" description="Level 2 data cache refill"/>\r
-       <event event="0x18" title="Cache" name="L2 data write" description="Level 2 data cache Write-Back"/>\r
-       <event event="0x19" title="Bus" name="Access" description=""/>\r
-       <event event="0x1d" title="Bus" name="Cycle" description=""/>\r
+    <event event="0x16" title="Cache" name="L2 data access" alias="L1Miss" description="Level 2 data cache access"/>\r
+    <event event="0x17" title="Cache" name="L2 data refill" description="Level 2 data cache refill"/>\r
+    <event event="0x18" title="Cache" name="L2 data write" description="Level 2 data cache Write-Back"/>\r
+    <event event="0x19" title="Bus" name="Access" description=""/>\r
+    <event event="0x1d" title="Bus" name="Cycle" description=""/>\r
     <event event="0x60" title="Bus" name="Read" description="Bus access - Read"/>\r
     <event event="0x61" title="Bus" name="Write" description="Bus access - Write"/>\r
-       <event event="0x86" title="Exception" name="IRQ" description="IRQ exception taken"/>\r
-       <event event="0x87" title="Exception" name="FIQ" description="FIQ exception taken"/>\r
+    <event event="0x86" title="Exception" name="IRQ" description="IRQ exception taken"/>\r
+    <event event="0x87" title="Exception" name="FIQ" description="FIQ exception taken"/>\r
     <event event="0xC0" title="Memory" name="External request" description="External memory request"/>\r
     <event event="0xC1" title="Memory" name="Non-cacheable ext req" description="Non-cacheable external memory request"/>\r
     <event event="0xC2" title="Cache" name="Linefill" description="Linefill because of prefetch"/>\r
@@ -47,4 +47,3 @@
     <event event="0xC9" title="Instruction" name="Pipeline stall" description="Data Write operation that stalls the pipeline because the store buffer is full"/>\r
     <event event="0xCA" title="Memory" name="Snoop" description="Data snooped from other processor. This event counts memory-read operations that read data from another processor within the local cluster, rather than accessing the L2 cache or issuing an external read."/>\r
   </category>  \r
-  
\ No newline at end of file
index f3396b71144103bc941e884731cf6de312ea4a16..02260ba311e602f8affaa6e74fcb227742d0bc2b 100644 (file)
@@ -5,30 +5,30 @@
     <counter name="ARM_Cortex-A8_cnt3"/>\r
   </counter_set>\r
   <category name="Cortex-A8" counter_set="ARM_Cortex-A8_cntX" per_cpu="yes" event_based_sampling="yes">\r
-    <event counter="ARM_Cortex-A8_ccnt" title="Clock" name="Cycles" description="The number of core clock cycles"/>\r
+    <event counter="ARM_Cortex-A8_ccnt" title="Clock" name="Cycles" alias="ClockCycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>\r
     <event event="0x00" title="Software" name="Increment" description="Incremented only on writes to the Software Increment Register"/>\r
     <event event="0x01" title="Cache" name="Instruction refill" description="Instruction fetch that causes a refill of at least the level of instruction or unified cache closest to the processor"/>\r
     <event event="0x02" title="Cache" name="Inst TLB refill" description="Instruction fetch that causes a TLB refill of at least the level of TLB closest to the processor"/>\r
     <event event="0x03" title="Cache" name="Data refill" description="Memory Read or Write operation that causes a refill of at least the level of data or unified cache closest to the processor"/>\r
     <event event="0x04" title="Cache" name="Data access" description="Memory Read or Write operation that causes a cache access to at least the level of data or unified cache closest to the processor"/>\r
     <event event="0x05" title="Cache" name="Data TLB refill" description="Memory Read or Write operation that causes a TLB refill of at least the level of TLB closest to the processor"/>\r
-    <event event="0x06" title="Instruction" name="Memory read" description="Memory-reading instruction architecturally executed"/>\r
-    <event event="0x07" title="Instruction" name="Memory write" description="Memory-writing instruction architecturally executed"/>\r
-    <event event="0x08" title="Instruction" name="Executed" description="Instruction architecturally executed"/>\r
+    <event event="0x06" title="Instruction" name="Memory read" alias="MemoryRead" description="Memory-reading instruction architecturally executed"/>\r
+    <event event="0x07" title="Instruction" name="Memory write" alias="MemoryWrite" description="Memory-writing instruction architecturally executed"/>\r
+    <event event="0x08" title="Instruction" name="Executed" alias="InstructionsExecuted" description="Instruction architecturally executed"/>\r
     <event event="0x09" title="Exception" name="Taken" description="Exceptions taken"/>\r
     <event event="0x0a" title="Exception" name="Return" description="Exception return architecturally executed"/>\r
     <event event="0x0b" title="Instruction" name="CONTEXTIDR" description="Instruction that writes to the CONTEXTIDR architecturally executed"/>\r
     <event event="0x0c" title="Branch" name="PC change" description="Software change of the Program Counter, except by an exception, architecturally executed"/>\r
     <event event="0x0d" title="Branch" name="Immediate" description="Immediate branch architecturally executed"/>\r
     <event event="0x0e" title="Procedure" name="Return" description="Procedure return, other than exception return, architecturally executed"/>\r
-    <event event="0x0f" title="Memory" name="Unaligned access" description="Unaligned access architecturally executed"/>\r
-    <event event="0x10" title="Branch" name="Mispredicted" description="Branch mispredicted or not predicted"/>\r
-    <event event="0x12" title="Branch" name="Potential prediction" description="Branch or other change in program flow that could have been predicted by the branch prediction resources of the processor"/>\r
+    <event event="0x0f" title="Memory" name="Unaligned access" alias="UnalignedAccess" description="Unaligned access architecturally executed"/>\r
+    <event event="0x10" title="Branch" name="Mispredicted" alias="BranchMispredicted" description="Branch mispredicted or not predicted"/>\r
+    <event event="0x12" title="Branch" name="Potential prediction" alias="PotentialPrediction" description="Branch or other change in program flow that could have been predicted by the branch prediction resources of the processor"/>\r
     <event event="0x40" title="Cache" name="Write buffer full" description="Any write buffer full cycle"/>\r
     <event event="0x41" title="Cache" name="L2 store" description="Any store that is merged in the L2 memory system"/>\r
     <event event="0x42" title="Cache" name="Bufferable transaction" description="Any bufferable store transaction from load/store to L2 cache, excluding eviction or cast out data"/>\r
-    <event event="0x43" title="Cache" name="L1 miss" description="Any accesses to the L2 cache"/>\r
-    <event event="0x44" title="Cache" name="L2 miss" description="Any cacheable miss in the L2 cache"/>\r
+    <event event="0x43" title="Cache" name="L1 miss" alias="L1Miss" description="Any accesses to the L2 cache"/>\r
+    <event event="0x44" title="Cache" name="L2 miss" alias="L2Miss" description="Any cacheable miss in the L2 cache"/>\r
     <event event="0x45" title="AXI" name="Read" description="The number of AXI read data transfers"/>\r
     <event event="0x46" title="AXI" name="Write" description="The number of AXI write data transfers"/>\r
     <event event="0x47" title="Memory" name="Replay event" description="Any replay event in the memory system"/>\r
@@ -55,4 +55,3 @@
     <event event="0x71" title="External" name="PMUEXTIN[1]" description="Counts any event from external input source PMUEXTIN[1]"/>\r
     <event event="0x72" title="External" name="PMUEXTIN[0,1]" description="Counts any event from both external input sources PMUEXTIN[0] and PMUEXTIN[1]"/>\r
   </category>\r
-  
\ No newline at end of file
index 1edb54a935934cfc81d36faa568e01e0ce7a36f2..363862ce3e4c65a297feceb7762dc2900b44be3b 100644 (file)
@@ -7,28 +7,28 @@
     <counter name="ARM_Cortex-A9_cnt5"/>\r
   </counter_set>\r
   <category name="Cortex-A9" counter_set="ARM_Cortex-A9_cntX" per_cpu="yes" event_based_sampling="yes">\r
-    <event counter="ARM_Cortex-A9_ccnt" title="Clock" name="Cycles" description="The number of core clock cycles"/>\r
+    <event counter="ARM_Cortex-A9_ccnt" title="Clock" name="Cycles" alias="ClockCycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>\r
     <event event="0x00" title="Software" name="Increment" description="Incremented only on writes to the Software Increment Register"/>\r
     <event event="0x01" title="Cache" name="Instruction refill" description="Instruction fetch that causes a refill of at least the level of instruction or unified cache closest to the processor"/>\r
     <event event="0x02" title="Cache" name="Inst TLB refill" description="Instruction fetch that causes a TLB refill of at least the level of TLB closest to the processor"/>\r
-    <event event="0x03" title="Cache" name="Data refill" description="Memory Read or Write operation that causes a refill of at least the level of data or unified cache closest to the processor"/>\r
-    <event event="0x04" title="Cache" name="Data access" description="Memory Read or Write operation that causes a cache access to at least the level of data or unified cache closest to the processor"/>\r
+    <event event="0x03" title="Cache" name="Data refill" alias="DataRefill" description="Memory Read or Write operation that causes a refill of at least the level of data or unified cache closest to the processor"/>\r
+    <event event="0x04" title="Cache" name="Data access" alias="DataAccess" description="Memory Read or Write operation that causes a cache access to at least the level of data or unified cache closest to the processor"/>\r
     <event event="0x05" title="Cache" name="Data TLB refill" description="Memory Read or Write operation that causes a TLB refill of at least the level of TLB closest to the processor"/>\r
-    <event event="0x06" title="Instruction" name="Memory read" description="Memory-reading instruction architecturally executed"/>\r
-    <event event="0x07" title="Instruction" name="Memory write" description="Memory-writing instruction architecturally executed"/>\r
+    <event event="0x06" title="Instruction" name="Memory read" alias="MemoryRead" description="Memory-reading instruction architecturally executed"/>\r
+    <event event="0x07" title="Instruction" name="Memory write" alias="MemoryWrite" description="Memory-writing instruction architecturally executed"/>\r
     <event event="0x09" title="Exception" name="Taken" description="Exceptions taken"/>\r
     <event event="0x0a" title="Exception" name="Return" description="Exception return architecturally executed"/>\r
     <event event="0x0b" title="Instruction" name="CONTEXTIDR" description="Instruction that writes to the CONTEXTIDR architecturally executed"/>\r
     <event event="0x0c" title="Branch" name="PC change" description="Software change of the Program Counter, except by an exception, architecturally executed"/>\r
     <event event="0x0d" title="Branch" name="Immediate" description="Immediate branch architecturally executed"/>\r
-    <event event="0x0f" title="Memory" name="Unaligned access" description="Unaligned access architecturally executed"/>\r
-    <event event="0x10" title="Branch" name="Mispredicted" description="Branch mispredicted or not predicted"/>\r
-    <event event="0x12" title="Branch" name="Potential prediction" description="Branch or other change in program flow that could have been predicted by the branch prediction resources of the processor"/>\r
+    <event event="0x0f" title="Memory" name="Unaligned access" alias="UnalignedAccess" description="Unaligned access architecturally executed"/>\r
+    <event event="0x10" title="Branch" name="Mispredicted" alias="BranchMispredicted" description="Branch mispredicted or not predicted"/>\r
+    <event event="0x12" title="Branch" name="Potential prediction" alias="PotentialPrediction" description="Branch or other change in program flow that could have been predicted by the branch prediction resources of the processor"/>\r
     <event event="0x40" title="Java" name="Bytecode execute" description="Counts the number of Java bytecodes being decoded, including speculative ones"/>\r
     <event event="0x41" title="Java" name="SW bytecode execute" description="Counts the number of software java bytecodes being decoded, including speculative ones"/>\r
     <event event="0x42" title="Jazelle" name="Backward branch execute" description="Counts the number of Jazelle taken branches being executed"/>\r
-    <event event="0x50" title="Cache" name="Coherency miss" description="Counts the number of coherent linefill requests performed by the Cortex-A9 processor which also miss in all the other Cortex-A9 processors, meaning that the request is sent to the external memory"/>\r
-    <event event="0x51" title="Cache" name="Coherency hit" description="Counts the number of coherent linefill requests performed by the Cortex-A9 processor which hit in another Cortex-A9 processor, meaning that the linefill data is fetched directly from the relevant Cortex-A9 cache"/>\r
+    <event event="0x50" title="Cache" name="Coherency miss" alias="L1CoherencyMiss" description="Counts the number of coherent linefill requests performed by the Cortex-A9 processor which also miss in all the other Cortex-A9 processors, meaning that the request is sent to the external memory"/>\r
+    <event event="0x51" title="Cache" name="Coherency hit" alias="L1CoherencyHit" description="Counts the number of coherent linefill requests performed by the Cortex-A9 processor which hit in another Cortex-A9 processor, meaning that the linefill data is fetched directly from the relevant Cortex-A9 cache"/>\r
     <event event="0x60" title="Cache" name="Inst dependent stall" description="Counts the number of cycles where the processor is ready to accept new instructions, but does not receive any because of the instruction side not being able to provide any and the instruction cache is currently performing at least one linefill"/>\r
     <event event="0x61" title="Cache" name="Data dependent stall" description="Counts the number of cycles where the core has some instructions that it cannot issue to any pipeline, and the Load Store unit has at least one pending linefill request, and no pending TLB requests"/>\r
     <event event="0x62" title="Cache" name="TLB stall" description="Counts the number of cycles where the processor is stalled waiting for the completion of translation table walks from the main TLB"/>\r
     <event event="0x65" title="Cache" name="Data eviction" description="Counts the number of eviction requests because of a linefill in the data cache"/>\r
     <event event="0x66" title="Pipeline" name="Issue stage no dispatch" description="Counts the number of cycles where the issue stage does not dispatch any instruction because it is empty or cannot dispatch any instructions"/>\r
     <event event="0x67" title="Pipeline" name="Issue stage empty" description="Counts the number of cycles where the issue stage is empty"/>\r
-    <event event="0x68" title="Instruction" name="Executed" description="Counts the number of instructions going through the Register Renaming stage. This number is an approximate number of the total number of instructions speculatively executed, and even more approximate of the total number of instructions architecturally executed"/>\r
+    <event event="0x68" title="Instruction" name="Executed" alias="InstructionsExecuted" description="Counts the number of instructions going through the Register Renaming stage. This number is an approximate number of the total number of instructions speculatively executed, and even more approximate of the total number of instructions architecturally executed"/>\r
     <event event="0x6E" title="Core" name="Functions" description="Counts the number of procedure returns whose condition codes do not fail, excluding all returns from exception"/>\r
-    <event event="0x70" title="Instructions" name="Main execution unit" description="Counts the number of instructions being executed in the main execution pipeline of the processor, the multiply pipeline and arithmetic logic unit pipeline"/>\r
-    <event event="0x71" title="Instructions" name="Second execution unit" description="Counts the number of instructions being executed in the processor second execution pipeline (ALU)"/>\r
-    <event event="0x72" title="Instructions" name="Load/Store" description="Counts the number of instructions being executed in the Load/Store unit"/>\r
-    <event event="0x73" title="Instructions" name="Floating point" description="Counts the number of Floating-point instructions going through the Register Rename stage"/>\r
-    <event event="0x74" title="Instructions" name="NEON" description="Counts the number of NEON instructions going through the Register Rename stage"/>\r
+    <event event="0x70" title="Instruction" name="Main execution unit" description="Counts the number of instructions being executed in the main execution pipeline of the processor, the multiply pipeline and arithmetic logic unit pipeline"/>\r
+    <event event="0x71" title="Instruction" name="Second execution unit" description="Counts the number of instructions being executed in the processor second execution pipeline (ALU)"/>\r
+    <event event="0x72" title="Instruction" name="Load/Store" description="Counts the number of instructions being executed in the Load/Store unit"/>\r
+    <event event="0x73" title="Instruction" name="Floating point" description="Counts the number of Floating-point instructions going through the Register Rename stage"/>\r
+    <event event="0x74" title="Instruction" name="NEON" description="Counts the number of NEON instructions going through the Register Rename stage"/>\r
     <event event="0x80" title="Stalls" name="PLD" description="Counts the number of cycles where the processor is stalled because PLD slots are all full"/>\r
     <event event="0x81" title="Stalls" name="Memory write" description="Counts the number of cycles when the processor is stalled and the data side is stalled too because it is full and executing writes to the external memory"/>\r
     <event event="0x82" title="Stalls" name="Inst main TLB miss" description="Counts the number of stall cycles because of main TLB misses on requests issued by the instruction side"/>\r
@@ -53,9 +53,9 @@
     <event event="0x86" title="Stalls" name="DMB" description="Counts the number of stall cycles because of the execution of a DMB memory barrier"/>\r
     <event event="0x8A" title="Clock" name="Integer core" description="Counts the number of cycles during which the integer core clock is enabled"/>\r
     <event event="0x8B" title="Clock" name="Data engine" description="Counts the number of cycles during which the Data Engine clock is enabled"/>\r
-    <event event="0x90" title="Instructions" name="ISB" description="Counts the number of ISB instructions architecturally executed"/>\r
-    <event event="0x91" title="Instructions" name="DSB" description="Counts the number of DSB instructions architecturally executed"/>\r
-    <event event="0x92" title="Instructions" name="DMB" description="Counts the number of DMB instructions speculatively executed"/>\r
+    <event event="0x90" title="Instruction" name="ISB" description="Counts the number of ISB instructions architecturally executed"/>\r
+    <event event="0x91" title="Instruction" name="DSB" description="Counts the number of DSB instructions architecturally executed"/>\r
+    <event event="0x92" title="Instruction" name="DMB" description="Counts the number of DMB instructions speculatively executed"/>\r
     <event event="0x93" title="External" name="Interrupts" description="Counts the number of external interrupts executed by the processor"/>\r
     <event event="0xA0" title="PLE" name="Cache line rq completed" description="Counts the number of PLE cache line requests completed"/>\r
     <event event="0xA1" title="PLE" name="Cache line rq skipped" description="Counts the number of PLE cache line requests skipped"/>\r
@@ -64,4 +64,3 @@
     <event event="0xA4" title="PLE" name="FIFO overflow" description="Counts the number of PLE FIFO flush overflowed"/>\r
     <event event="0xA5" title="PLE" name="Request programmed" description="Counts the number of PLE FIFO flush program requests"/>\r
   </category>\r
-  
\ No newline at end of file
old mode 100644 (file)
new mode 100755 (executable)
index 46d6a61..cc3f4e5
@@ -5,24 +5,23 @@
     <counter name="Krait_cnt3"/>\r
   </counter_set>\r
   <category name="Krait" counter_set="Krait_cntX" per_cpu="yes">\r
-    <event counter="Krait_ccnt" title="Clock" name="Cycles" description="The number of core clock cycles"/>\r
+    <event counter="Krait_ccnt" title="Clock" name="Cycles" alias="ClockCycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>\r
     <event event="0x00" title="Software" name="Increment" description="Incremented only on writes to the Software Increment Register"/>\r
     <event event="0x01" title="Cache" name="Instruction refill" description="Instruction fetch that causes a refill of at least the level of instruction or unified cache closest to the processor"/>\r
     <event event="0x02" title="Cache" name="Inst TLB refill" description="Instruction fetch that causes a TLB refill of at least the level of TLB closest to the processor"/>\r
     <event event="0x03" title="Cache" name="Data refill" description="Memory Read or Write operation that causes a refill of at least the level of data or unified cache closest to the processor"/>\r
     <event event="0x04" title="Cache" name="Data access" description="Memory Read or Write operation that causes a cache access to at least the level of data or unified cache closest to the processor"/>\r
     <event event="0x05" title="Cache" name="Data TLB refill" description="Memory Read or Write operation that causes a TLB refill of at least the level of TLB closest to the processor"/>\r
-    <event event="0x06" title="Instruction" name="Memory read" description="Memory-reading instruction architecturally executed"/>\r
-    <event event="0x07" title="Instruction" name="Memory write" description="Memory-writing instruction architecturally executed"/>\r
-       <event event="0x08" title="Instruction" name="Executed" description="Instruction architecturally executed"/>\r
+    <event event="0x06" title="Instruction" name="Memory read" alias="MemoryRead" description="Memory-reading instruction architecturally executed"/>\r
+    <event event="0x07" title="Instruction" name="Memory write" alias="MemoryWrite" description="Memory-writing instruction architecturally executed"/>\r
+    <event event="0x08" title="Instruction" name="Executed" alias="InstructionsExecuted" description="Instruction architecturally executed"/>\r
     <event event="0x09" title="Exception" name="Taken" description="Exceptions taken"/>\r
     <event event="0x0a" title="Exception" name="Return" description="Exception return architecturally executed"/>\r
     <event event="0x0b" title="Instruction" name="CONTEXTIDR" description="Instruction that writes to the CONTEXTIDR architecturally executed"/>\r
     <event event="0x0c" title="Program Counter" name="SW change" description="Software change of PC, except by an exception, architecturally executed"/>\r
     <event event="0x0d" title="Branch" name="Immediate" description="Immediate branch architecturally executed"/>\r
     <event event="0x0e" title="Branch" name="Procedure Return" description="Procedure return architecturally executed (not by exceptions)"/>\r
-    <event event="0x0f" title="Memory" name="Unaligned access" description="Unaligned access architecturally executed"/>\r
-    <event event="0x10" title="Branch" name="Mispredicted" description="Branch mispredicted or not predicted"/>\r
-    <event event="0x12" title="Branch" name="Potential prediction" description="Branch or other change in program flow that could have been predicted by the branch prediction resources of the processor"/>\r
+    <event event="0x0f" title="Memory" name="Unaligned access" alias="UnalignedAccess" description="Unaligned access architecturally executed"/>\r
+    <event event="0x10" title="Branch" name="Mispredicted" alias="BranchMispredicted" description="Branch mispredicted or not predicted"/>\r
+    <event event="0x12" title="Branch" name="Potential prediction" alias="PotentialPrediction" description="Branch or other change in program flow that could have been predicted by the branch prediction resources of the processor"/>\r
   </category>\r
-  
\ No newline at end of file
index b1cd8dff5b50603325c550ec568b45a667c4fa24..35592cf8448bf029b2ded282e46da9b91c39dd67 100644 (file)
@@ -3,19 +3,19 @@
     <counter name="L2C-310_cnt1"/>\r
   </counter_set>\r
   <category name="L2C-310" counter_set="L2C-310_cntX" per_cpu="no">\r
-    <event event="0x1" title="L2Cache" name="CO" description="Eviction, CastOut, of a line from the L2 cache"/>\r
-    <event event="0x2" title="L2Cache" name="DRH" description="Data read hit"/>\r
-    <event event="0x3" title="L2Cache" name="DRREQ" description="Data read request"/>\r
-    <event event="0x4" title="L2Cache" name="DWHIT" description="Data write hit"/>\r
-    <event event="0x5" title="L2Cache" name="DWREQ" description="Data write request"/>\r
-    <event event="0x6" title="L2Cache" name="DWTREQ" description="Data write request with write-through attribute"/>\r
-    <event event="0x7" title="L2Cache" name="IRHIT" description="Instruction read hit"/>\r
-    <event event="0x8" title="L2Cache" name="IRREQ" description="Instruction read request"/>\r
-    <event event="0x9" title="L2Cache" name="WA" description="Write allocate"/>\r
-    <event event="0xa" title="L2Cache" name="IPFALLOC" description="Allocation of a prefetch generated by L2C-310 into the L2 cache"/>\r
-    <event event="0xb" title="L2Cache" name="EPFHIT" description="Prefetch hint hits in the L2 cache"/>\r
-    <event event="0xc" title="L2Cache" name="EPFALLOC" description="Prefetch hint allocated into the L2 cache"/>\r
-    <event event="0xd" title="L2Cache" name="SRRCVD" description="Speculative read received"/>\r
-    <event event="0xe" title="L2Cache" name="SRCONF" description="Speculative read confirmed"/>\r
-    <event event="0xf" title="L2Cache" name="EPFRCVD" description="Prefetch hint received"/>\r
+    <event event="0x1" title="L2 Cache" name="CO" description="Eviction, CastOut, of a line from the L2 cache"/>\r
+    <event event="0x2" title="L2 Cache" name="DRH" description="Data read hit"/>\r
+    <event event="0x3" title="L2 Cache" name="DRREQ" description="Data read request"/>\r
+    <event event="0x4" title="L2 Cache" name="DWHIT" description="Data write hit"/>\r
+    <event event="0x5" title="L2 Cache" name="DWREQ" description="Data write request"/>\r
+    <event event="0x6" title="L2 Cache" name="DWTREQ" description="Data write request with write-through attribute"/>\r
+    <event event="0x7" title="L2 Cache" name="IRHIT" description="Instruction read hit"/>\r
+    <event event="0x8" title="L2 Cache" name="IRREQ" description="Instruction read request"/>\r
+    <event event="0x9" title="L2 Cache" name="WA" description="Write allocate"/>\r
+    <event event="0xa" title="L2 Cache" name="IPFALLOC" description="Allocation of a prefetch generated by L2C-310 into the L2 cache"/>\r
+    <event event="0xb" title="L2 Cache" name="EPFHIT" description="Prefetch hint hits in the L2 cache"/>\r
+    <event event="0xc" title="L2 Cache" name="EPFALLOC" description="Prefetch hint allocated into the L2 cache"/>\r
+    <event event="0xd" title="L2 Cache" name="SRRCVD" description="Speculative read received"/>\r
+    <event event="0xe" title="L2 Cache" name="SRCONF" description="Speculative read confirmed"/>\r
+    <event event="0xf" title="L2 Cache" name="EPFRCVD" description="Prefetch hint received"/>\r
   </category>\r
index 338e1605506873c79620d39781745f07604aca93..85ce63c1dd9eb0f60bfc864aa0c652447f2f2828 100644 (file)
@@ -1,16 +1,17 @@
   <category name="Linux">\r
-    <event counter="Linux_cpuload_user" title="CPU Load" name="User" per_cpu="yes" description="Scheduler CPU Load of User Application" operation="percentage"/>\r
-    <event counter="Linux_cpuload_system" title="CPU Load" name="System" per_cpu="yes" description="Scheduler CPU Load of System Behavior" operation="percentage"/>\r
+    <event counter="Linux_cpuload_user" title="CPU Load" name="User" per_cpu="yes" description="Scheduler CPU Load of User Application"/>\r
+    <event counter="Linux_cpuload_system" title="CPU Load" name="System" per_cpu="yes" description="Scheduler CPU Load of System Behavior"/>\r
     <event counter="Linux_irq_softirq" title="Interrupts" name="SoftIRQ" per_cpu="yes" description="Linux SoftIRQ taken"/>\r
     <event counter="Linux_irq_irq" title="Interrupts" name="IRQ" per_cpu="yes" description="Linux IRQ taken"/>\r
-    <event counter="Linux_block_rq_wr" title="Disk IO" name="Write" description="Disk IO Bytes Written"/>\r
-    <event counter="Linux_block_rq_rd" title="Disk IO" name="Read" description="Disk IO Bytes Read"/>\r
-    <event counter="Linux_meminfo_memused" title="Memory" name="Used" description="Total used memory size" operation="maximum"/>\r
-    <event counter="Linux_meminfo_memfree" title="Memory" name="Free" description="Available memory size" operation="maximum"/>\r
-    <event counter="Linux_meminfo_bufferram" title="Memory" name="Buffer" description="Memory used by buffers" operation="maximum"/>\r
-    <event counter="Linux_net_rx" title="Network" name="Receive" description="Receive network traffic, excluding effect from Streamline"/>\r
-    <event counter="Linux_net_tx" title="Network" name="Transmit" description="Transmit network traffic, excluding effect from Streamline"/>\r
+    <event counter="Linux_block_rq_wr" title="Disk IO" name="Write" units="B" description="Disk IO Bytes Written"/>\r
+    <event counter="Linux_block_rq_rd" title="Disk IO" name="Read" units="B" description="Disk IO Bytes Read"/>\r
+    <event counter="Linux_net_rx" title="Network" name="Receive" units="B" description="Receive network traffic, excluding effect from Streamline"/>\r
+    <event counter="Linux_net_tx" title="Network" name="Transmit" units="B" description="Transmit network traffic, excluding effect from Streamline"/>\r
     <event counter="Linux_sched_switch" title="Scheduler" name="Switch" description="Context switch events"/>\r
-    <event counter="Linux_power_cpu_freq" title="Clock" name="Frequency" per_cpu="yes" description="Target frequency of the CPU" operation="frequency"/>\r
+    <event counter="Linux_meminfo_memused" title="Memory" name="Used" display="maximum" units="B" average_selection="yes" description="Total used memory size"/>\r
+    <event counter="Linux_meminfo_memfree" title="Memory" name="Free" display="minimum" units="B" average_selection="yes" description="Available memory size"/>\r
+    <event counter="Linux_meminfo_bufferram" title="Memory" name="Buffer" display="maximum" units="B" average_selection="yes" description="Memory used by buffers"/>\r
+    <event counter="Linux_power_cpu_freq" title="Clock" name="DVFS" per_cpu="yes" display="maximum" units="Hz" average_selection="yes" description="Target frequency of the CPU"/>\r
+    <event counter="Linux_power_cpu_idle" title="Power" name="Idle" per_cpu="yes" display="maximum" average_selection="yes" description="CPU Idle State, set the Sample Rate to None to prevent the hrtimer from interrupting the system"/>\r
   </category>\r
   \r
index f64fec8aaacac3ddb3260aa08dac781f021499f3..895d0c893cca86ab26112dbc9929a0f69d24c100 100644 (file)
     <event event="0x68" title="Mali L2 Cache" name="Cacheable read transactions, slave 4" description="Cacheable read transactions, slave 4" />\r
   </category>\r
   <category name="ARM_Mali-400_Filmstrip" counter_set="ARM_Mali-400_Filmstrip_cntX" per_cpu="no">\r
-    <event event="0x040a" title="ARM_Mali-400_Filmstrip" name="Size 1:4, freq 1:10" description="Scaled framebuffer captures every 10th frame" />\r
+    <event event="0x040a" title="ARM_Mali-400_Filmstrip" name="Freq 1:10" description="Scaled framebuffer captures every 10th frame" />\r
+    <event event="0x041e" title="ARM_Mali-400_Filmstrip" name="Freq 1:30" description="Scaled framebuffer captures every 30th frame" />\r
+    <event event="0x043c" title="ARM_Mali-400_Filmstrip" name="Freq 1:60" description="Scaled framebuffer captures every 60th frame" />\r
   </category>\r
   <category name="Mali-400-SW" counter_set="ARM_Mali-400_SW_cntX" per_cpu="no">\r
     <!-- EGL Counters -->\r
index 8ad196a2dbfa05b70a10805a6a7f3d76963dc665..6c2b6f8c9f70a3af7b242e8c5a1c3e2ac94b7cd1 100644 (file)
     <counter name="Scorpion_cnt3"/>\r
   </counter_set>\r
   <category name="Scorpion" counter_set="Scorpion_cntX" per_cpu="yes">\r
-    <event counter="Scorpion_ccnt" title="Clock" name="Cycles" description="The number of core clock cycles"/>\r
+    <event counter="Scorpion_ccnt" title="Clock" name="Cycles" alias="ClockCycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>\r
     <event event="0x00" title="Software" name="Increment" description="Incremented only on writes to the Software Increment Register"/>\r
     <event event="0x01" title="Cache" name="Instruction refill" description="Instruction fetch that causes a refill of at least the level of instruction or unified cache closest to the processor"/>\r
     <event event="0x02" title="Cache" name="Inst TLB refill" description="Instruction fetch that causes a TLB refill of at least the level of TLB closest to the processor"/>\r
     <event event="0x03" title="Cache" name="Data refill" description="Memory Read or Write operation that causes a refill of at least the level of data or unified cache closest to the processor"/>\r
     <event event="0x04" title="Cache" name="Data access" description="Memory Read or Write operation that causes a cache access to at least the level of data or unified cache closest to the processor"/>\r
     <event event="0x05" title="Cache" name="Data TLB refill" description="Memory Read or Write operation that causes a TLB refill of at least the level of TLB closest to the processor"/>\r
-    <event event="0x06" title="Instruction" name="Memory read" description="Memory-reading instruction architecturally executed"/>\r
-    <event event="0x07" title="Instruction" name="Memory write" description="Memory-writing instruction architecturally executed"/>\r
-       <event event="0x08" title="Instruction" name="Executed" description="Instruction architecturally executed"/>\r
+    <event event="0x06" title="Instruction" name="Memory read" alias="MemoryRead" description="Memory-reading instruction architecturally executed"/>\r
+    <event event="0x07" title="Instruction" name="Memory write" alias="MemoryWrite" description="Memory-writing instruction architecturally executed"/>\r
+    <event event="0x08" title="Instruction" name="Executed" alias="InstructionsExecuted" description="Instruction architecturally executed"/>\r
     <event event="0x09" title="Exception" name="Taken" description="Exceptions taken"/>\r
     <event event="0x0a" title="Exception" name="Return" description="Exception return architecturally executed"/>\r
     <event event="0x0b" title="Instruction" name="CONTEXTIDR" description="Instruction that writes to the CONTEXTIDR architecturally executed"/>\r
     <event event="0x0c" title="Program Counter" name="SW change" description="Software change of PC, except by an exception, architecturally executed"/>\r
     <event event="0x0d" title="Branch" name="Immediate" description="Immediate branch architecturally executed"/>\r
     <event event="0x0e" title="Branch" name="Procedure Return" description="Procedure return architecturally executed (not by exceptions)"/>\r
-    <event event="0x0f" title="Memory" name="Unaligned access" description="Unaligned access architecturally executed"/>\r
-    <event event="0x10" title="Branch" name="Mispredicted" description="Branch mispredicted or not predicted"/>\r
-    <event event="0x12" title="Branch" name="Potential prediction" description="Branch or other change in program flow that could have been predicted by the branch prediction resources of the processor"/>\r
-       <event event="0x4c" title="Scorpion" name="ICACHE_EXPL_INV" description="I-cache explicit invalidates"/>\r
-       <event event="0x4d" title="Scorpion" name="ICACHE_MISS" description="I-cache misses"/>\r
-       <event event="0x4e" title="Scorpion" name="ICACHE_ACCESS" description="I-cache accesses"/>\r
-       <event event="0x4f" title="Scorpion" name="ICACHE_CACHEREQ_L2" description="I-cache cacheable requests to L2"/>\r
-       <event event="0x50" title="Scorpion" name="ICACHE_NOCACHE_L2" description="I-cache non-cacheable requests to L2"/>\r
-       <event event="0x51" title="Scorpion" name="HIQUP_NOPED" description="Conditional instructions HIQUPs NOPed"/>\r
-       <event event="0x52" title="Scorpion" name="DATA_ABORT" description="Interrupts and Exceptions Data Abort"/>\r
-       <event event="0x53" title="Scorpion" name="IRQ" description="Interrupts and Exceptions IRQ"/>\r
-       <event event="0x54" title="Scorpion" name="FIQ" description="Interrupts and Exceptions FIQ"/>\r
-       <event event="0x55" title="Scorpion" name="ALL_EXCPT" description="Interrupts and Exceptions All interrupts"/>\r
-       <event event="0x56" title="Scorpion" name="UNDEF" description="Interrupts and Exceptions Undefined"/>\r
-       <event event="0x57" title="Scorpion" name="SVC" description="Interrupts and Exceptions SVC"/>\r
-       <event event="0x58" title="Scorpion" name="SMC" description="Interrupts and Exceptions SMC"/>\r
-       <event event="0x59" title="Scorpion" name="PREFETCH_ABORT" description="Interrupts and Exceptions Prefetch Abort"/>\r
-       <event event="0x5a" title="Scorpion" name="INDEX_CHECK" description="Interrupts and Exceptions Index Check"/>\r
-       <event event="0x5b" title="Scorpion" name="NULL_CHECK" description="Interrupts and Exceptions Null Check"/>\r
-       <event event="0x5c" title="Scorpion" name="EXPL_ICIALLU" description="I-cache and BTAC Invalidates Explicit ICIALLU"/>\r
-       <event event="0x5d" title="Scorpion" name="IMPL_ICIALLU" description="I-cache and BTAC Invalidates Implicit ICIALLU"/>\r
-       <event event="0x5e" title="Scorpion" name="NONICIALLU_BTAC_INV" description="I-cache and BTAC Invalidates Non-ICIALLU BTAC Invalidate"/>\r
-       <event event="0x5f" title="Scorpion" name="ICIMVAU_IMPL_ICIALLU" description="I-cache and BTAC Invalidates ICIMVAU-implied ICIALLU"/>\r
-       <event event="0x60" title="Scorpion" name="SPIPE_ONLY_CYCLES" description="Issue S-pipe only issue cycles"/>\r
-       <event event="0x61" title="Scorpion" name="XPIPE_ONLY_CYCLES" description="Issue X-pipe only issue cycles"/>\r
-       <event event="0x62" title="Scorpion" name="DUAL_CYCLES" description="Issue dual issue cycles"/>\r
-       <event event="0x63" title="Scorpion" name="DISPATCH_ANY_CYCLES" description="Dispatch any dispatch cycles"/>\r
-       <event event="0x64" title="Scorpion" name="FIFO_FULLBLK_CMT" description="Commits Trace FIFO full Blk CMT"/>\r
-       <event event="0x65" title="Scorpion" name="FAIL_COND_INST" description="Conditional instructions failing conditional instrs (excluding branches)"/>\r
-       <event event="0x66" title="Scorpion" name="PASS_COND_INST" description="Conditional instructions passing conditional instrs (excluding branches)"/>\r
-       <event event="0x67" title="Scorpion" name="ALLOW_VU_CLK" description="Unit Clock Gating Allow VU Clks"/>\r
-       <event event="0x68" title="Scorpion" name="VU_IDLE" description="Unit Clock Gating VU Idle"/>\r
-       <event event="0x69" title="Scorpion" name="ALLOW_L2_CLK" description="Unit Clock Gating Allow L2 Clks"/>\r
-       <event event="0x6a" title="Scorpion" name="L2_IDLE" description="Unit Clock Gating L2 Idle"/>\r
-       <event event="0x6b" title="Scorpion" name="DTLB_IMPL_INV_SCTLR_DACR" description="DTLB implicit invalidates writes to SCTLR and DACR"/>\r
-       <event event="0x6c" title="Scorpion" name="DTLB_EXPL_INV" description="DTLB explicit invalidates"/>\r
-       <event event="0x6d" title="Scorpion" name="DTLB_MISS" description="DTLB misses"/>\r
-       <event event="0x6e" title="Scorpion" name="DTLB_ACCESS" description="DTLB accesses"/>\r
-       <event event="0x6f" title="Scorpion" name="ITLB_MISS" description="ITLB misses"/>\r
-       <event event="0x70" title="Scorpion" name="ITLB_IMPL_INV" description="ITLB implicit ITLB invalidates"/>\r
-       <event event="0x71" title="Scorpion" name="ITLB_EXPL_INV" description="ITLB explicit ITLB invalidates"/>\r
-       <event event="0x72" title="Scorpion" name="UTLB_D_MISS" description="UTLB d-side misses"/>\r
-       <event event="0x73" title="Scorpion" name="UTLB_D_ACCESS" description="UTLB d-side accesses"/>\r
-       <event event="0x74" title="Scorpion" name="UTLB_I_MISS" description="UTLB i-side misses"/>\r
-       <event event="0x75" title="Scorpion" name="UTLB_I_ACCESS" description="UTLB i-side accesses"/>\r
-       <event event="0x76" title="Scorpion" name="UTLB_INV_ASID" description="UTLB invalidate by ASID"/>\r
-       <event event="0x77" title="Scorpion" name="UTLB_INV_MVA" description="UTLB invalidate by MVA"/>\r
-       <event event="0x78" title="Scorpion" name="UTLB_INV_ALL" description="UTLB invalidate all"/>\r
-       <event event="0x79" title="Scorpion" name="S2_HOLD_RDQ_UNAVAIL" description="S2 hold RDQ unavail"/>\r
-       <event event="0x7a" title="Scorpion" name="S2_HOLD" description="S2 hold"/>\r
-       <event event="0x7b" title="Scorpion" name="S2_HOLD_DEV_OP" description="S2 hold device op"/>\r
-       <event event="0x7c" title="Scorpion" name="S2_HOLD_ORDER" description="S2 hold strongly ordered op"/>\r
-       <event event="0x7d" title="Scorpion" name="S2_HOLD_BARRIER" description="S2 hold barrier"/>\r
-       <event event="0x7e" title="Scorpion" name="VIU_DUAL_CYCLE" description="Scorpion VIU dual cycle"/>\r
-       <event event="0x7f" title="Scorpion" name="VIU_SINGLE_CYCLE" description="Scorpion VIU single cycle"/>\r
-       <event event="0x80" title="Scorpion" name="VX_PIPE_WAR_STALL_CYCLES" description="Scorpion VX pipe WAR cycles"/>\r
-       <event event="0x81" title="Scorpion" name="VX_PIPE_WAW_STALL_CYCLES" description="Scorpion VX pipe WAW cycles"/>\r
-       <event event="0x82" title="Scorpion" name="VX_PIPE_RAW_STALL_CYCLES" description="Scorpion VX pipe RAW cycles"/>\r
-       <event event="0x83" title="Scorpion" name="VX_PIPE_LOAD_USE_STALL" description="Scorpion VX pipe load use stall"/>\r
-       <event event="0x84" title="Scorpion" name="VS_PIPE_WAR_STALL_CYCLES" description="Scorpion VS pipe WAR stall cycles"/>\r
-       <event event="0x85" title="Scorpion" name="VS_PIPE_WAW_STALL_CYCLES" description="Scorpion VS pipe WAW stall cycles"/>\r
-       <event event="0x86" title="Scorpion" name="VS_PIPE_RAW_STALL_CYCLES" description="Scorpion VS pipe RAW stall cycles"/>\r
-       <event event="0x87" title="Scorpion" name="EXCEPTIONS_INV_OPERATION" description="Scorpion invalid operation exceptions"/>\r
-       <event event="0x88" title="Scorpion" name="EXCEPTIONS_DIV_BY_ZERO" description="Scorpion divide by zero exceptions"/>\r
-       <event event="0x89" title="Scorpion" name="COND_INST_FAIL_VX_PIPE" description="Scorpion conditional instruction fail VX pipe"/>\r
-       <event event="0x8a" title="Scorpion" name="COND_INST_FAIL_VS_PIPE" description="Scorpion conditional instruction fail VS pipe"/>\r
-       <event event="0x8b" title="Scorpion" name="EXCEPTIONS_OVERFLOW" description="Scorpion overflow exceptions"/>\r
-       <event event="0x8c" title="Scorpion" name="EXCEPTIONS_UNDERFLOW" description="Scorpion underflow exceptions"/>\r
-       <event event="0x8d" title="Scorpion" name="EXCEPTIONS_DENORM" description="Scorpion denorm exceptions"/>\r
-       <event event="0x8e" title="Scorpion" name="BANK_AB_HIT" description="L2 hit rates bank A/B hits"/>\r
-       <event event="0x8f" title="Scorpion" name="BANK_AB_ACCESS" description="L2 hit rates bank A/B accesses"/>\r
-       <event event="0x90" title="Scorpion" name="BANK_CD_HIT" description="L2 hit rates bank C/D hits"/>\r
-       <event event="0x91" title="Scorpion" name="BANK_CD_ACCESS" description="L2 hit rates bank C/D accesses"/>\r
-       <event event="0x92" title="Scorpion" name="BANK_AB_DSIDE_HIT" description="L2 hit rates bank A/B d-side hits"/>\r
-       <event event="0x93" title="Scorpion" name="BANK_AB_DSIDE_ACCESS" description="L2 hit rates bank A/B d-side accesses"/>\r
-       <event event="0x94" title="Scorpion" name="BANK_CD_DSIDE_HIT" description="L2 hit rates bank C/D d-side hits"/>\r
-       <event event="0x95" title="Scorpion" name="BANK_CD_DSIDE_ACCESS" description="L2 hit rates bank C/D d-side accesses"/>\r
-       <event event="0x96" title="Scorpion" name="BANK_AB_ISIDE_HIT" description="L2 hit rates bank A/B i-side hits"/>\r
-       <event event="0x97" title="Scorpion" name="BANK_AB_ISIDE_ACCESS" description="L2 hit rates bank A/B i-side accesses"/>\r
-       <event event="0x98" title="Scorpion" name="BANK_CD_ISIDE_HIT" description="L2 hit rates bank C/D i-side hits"/>\r
-       <event event="0x99" title="Scorpion" name="BANK_CD_ISIDE_ACCESS" description="L2 hit rates bank C/D i-side accesses"/>\r
-       <event event="0x9a" title="Scorpion" name="ISIDE_RD_WAIT" description="fills and castouts cycles that i-side RD requests wait on data from bus"/>\r
-       <event event="0x9b" title="Scorpion" name="DSIDE_RD_WAIT" description="fills and castouts cycles that d-side RD requests wait on data from bus"/>\r
-       <event event="0x9c" title="Scorpion" name="BANK_BYPASS_WRITE" description="fills and castouts bank bypass writes"/>\r
-       <event event="0x9d" title="Scorpion" name="BANK_AB_NON_CASTOUT" description="fills and castouts bank A/B non-castout writes to bus"/>\r
-       <event event="0x9e" title="Scorpion" name="BANK_AB_L2_CASTOUT" description="fills and castouts bank A/B L2 castouts (granules)"/>\r
-       <event event="0x9f" title="Scorpion" name="BANK_CD_NON_CASTOUT" description="fills and castouts bank C/D non-castout writes to bus"/>\r
-       <event event="0xa0" title="Scorpion" name="BANK_CD_L2_CASTOUT" description="fills and castouts bank C/D L2 castouts (granules)"/>\r
+    <event event="0x0f" title="Memory" name="Unaligned access" alias="UnalignedAccess" description="Unaligned access architecturally executed"/>\r
+    <event event="0x10" title="Branch" name="Mispredicted" alias="BranchMispredicted" description="Branch mispredicted or not predicted"/>\r
+    <event event="0x12" title="Branch" name="Potential prediction" alias="PotentialPrediction" description="Branch or other change in program flow that could have been predicted by the branch prediction resources of the processor"/>\r
+    <event event="0x4c" title="Scorpion" name="ICACHE_EXPL_INV" description="I-cache explicit invalidates"/>\r
+    <event event="0x4d" title="Scorpion" name="ICACHE_MISS" description="I-cache misses"/>\r
+    <event event="0x4e" title="Scorpion" name="ICACHE_ACCESS" description="I-cache accesses"/>\r
+    <event event="0x4f" title="Scorpion" name="ICACHE_CACHEREQ_L2" description="I-cache cacheable requests to L2"/>\r
+    <event event="0x50" title="Scorpion" name="ICACHE_NOCACHE_L2" description="I-cache non-cacheable requests to L2"/>\r
+    <event event="0x51" title="Scorpion" name="HIQUP_NOPED" description="Conditional instructions HIQUPs NOPed"/>\r
+    <event event="0x52" title="Scorpion" name="DATA_ABORT" description="Interrupts and Exceptions Data Abort"/>\r
+    <event event="0x53" title="Scorpion" name="IRQ" description="Interrupts and Exceptions IRQ"/>\r
+    <event event="0x54" title="Scorpion" name="FIQ" description="Interrupts and Exceptions FIQ"/>\r
+    <event event="0x55" title="Scorpion" name="ALL_EXCPT" description="Interrupts and Exceptions All interrupts"/>\r
+    <event event="0x56" title="Scorpion" name="UNDEF" description="Interrupts and Exceptions Undefined"/>\r
+    <event event="0x57" title="Scorpion" name="SVC" description="Interrupts and Exceptions SVC"/>\r
+    <event event="0x58" title="Scorpion" name="SMC" description="Interrupts and Exceptions SMC"/>\r
+    <event event="0x59" title="Scorpion" name="PREFETCH_ABORT" description="Interrupts and Exceptions Prefetch Abort"/>\r
+    <event event="0x5a" title="Scorpion" name="INDEX_CHECK" description="Interrupts and Exceptions Index Check"/>\r
+    <event event="0x5b" title="Scorpion" name="NULL_CHECK" description="Interrupts and Exceptions Null Check"/>\r
+    <event event="0x5c" title="Scorpion" name="EXPL_ICIALLU" description="I-cache and BTAC Invalidates Explicit ICIALLU"/>\r
+    <event event="0x5d" title="Scorpion" name="IMPL_ICIALLU" description="I-cache and BTAC Invalidates Implicit ICIALLU"/>\r
+    <event event="0x5e" title="Scorpion" name="NONICIALLU_BTAC_INV" description="I-cache and BTAC Invalidates Non-ICIALLU BTAC Invalidate"/>\r
+    <event event="0x5f" title="Scorpion" name="ICIMVAU_IMPL_ICIALLU" description="I-cache and BTAC Invalidates ICIMVAU-implied ICIALLU"/>\r
+    <event event="0x60" title="Scorpion" name="SPIPE_ONLY_CYCLES" description="Issue S-pipe only issue cycles"/>\r
+    <event event="0x61" title="Scorpion" name="XPIPE_ONLY_CYCLES" description="Issue X-pipe only issue cycles"/>\r
+    <event event="0x62" title="Scorpion" name="DUAL_CYCLES" description="Issue dual issue cycles"/>\r
+    <event event="0x63" title="Scorpion" name="DISPATCH_ANY_CYCLES" description="Dispatch any dispatch cycles"/>\r
+    <event event="0x64" title="Scorpion" name="FIFO_FULLBLK_CMT" description="Commits Trace FIFO full Blk CMT"/>\r
+    <event event="0x65" title="Scorpion" name="FAIL_COND_INST" description="Conditional instructions failing conditional instrs (excluding branches)"/>\r
+    <event event="0x66" title="Scorpion" name="PASS_COND_INST" description="Conditional instructions passing conditional instrs (excluding branches)"/>\r
+    <event event="0x67" title="Scorpion" name="ALLOW_VU_CLK" description="Unit Clock Gating Allow VU Clks"/>\r
+    <event event="0x68" title="Scorpion" name="VU_IDLE" description="Unit Clock Gating VU Idle"/>\r
+    <event event="0x69" title="Scorpion" name="ALLOW_L2_CLK" description="Unit Clock Gating Allow L2 Clks"/>\r
+    <event event="0x6a" title="Scorpion" name="L2_IDLE" description="Unit Clock Gating L2 Idle"/>\r
+    <event event="0x6b" title="Scorpion" name="DTLB_IMPL_INV_SCTLR_DACR" description="DTLB implicit invalidates writes to SCTLR and DACR"/>\r
+    <event event="0x6c" title="Scorpion" name="DTLB_EXPL_INV" description="DTLB explicit invalidates"/>\r
+    <event event="0x6d" title="Scorpion" name="DTLB_MISS" description="DTLB misses"/>\r
+    <event event="0x6e" title="Scorpion" name="DTLB_ACCESS" description="DTLB accesses"/>\r
+    <event event="0x6f" title="Scorpion" name="ITLB_MISS" description="ITLB misses"/>\r
+    <event event="0x70" title="Scorpion" name="ITLB_IMPL_INV" description="ITLB implicit ITLB invalidates"/>\r
+    <event event="0x71" title="Scorpion" name="ITLB_EXPL_INV" description="ITLB explicit ITLB invalidates"/>\r
+    <event event="0x72" title="Scorpion" name="UTLB_D_MISS" description="UTLB d-side misses"/>\r
+    <event event="0x73" title="Scorpion" name="UTLB_D_ACCESS" description="UTLB d-side accesses"/>\r
+    <event event="0x74" title="Scorpion" name="UTLB_I_MISS" description="UTLB i-side misses"/>\r
+    <event event="0x75" title="Scorpion" name="UTLB_I_ACCESS" description="UTLB i-side accesses"/>\r
+    <event event="0x76" title="Scorpion" name="UTLB_INV_ASID" description="UTLB invalidate by ASID"/>\r
+    <event event="0x77" title="Scorpion" name="UTLB_INV_MVA" description="UTLB invalidate by MVA"/>\r
+    <event event="0x78" title="Scorpion" name="UTLB_INV_ALL" description="UTLB invalidate all"/>\r
+    <event event="0x79" title="Scorpion" name="S2_HOLD_RDQ_UNAVAIL" description="S2 hold RDQ unavail"/>\r
+    <event event="0x7a" title="Scorpion" name="S2_HOLD" description="S2 hold"/>\r
+    <event event="0x7b" title="Scorpion" name="S2_HOLD_DEV_OP" description="S2 hold device op"/>\r
+    <event event="0x7c" title="Scorpion" name="S2_HOLD_ORDER" description="S2 hold strongly ordered op"/>\r
+    <event event="0x7d" title="Scorpion" name="S2_HOLD_BARRIER" description="S2 hold barrier"/>\r
+    <event event="0x7e" title="Scorpion" name="VIU_DUAL_CYCLE" description="Scorpion VIU dual cycle"/>\r
+    <event event="0x7f" title="Scorpion" name="VIU_SINGLE_CYCLE" description="Scorpion VIU single cycle"/>\r
+    <event event="0x80" title="Scorpion" name="VX_PIPE_WAR_STALL_CYCLES" description="Scorpion VX pipe WAR cycles"/>\r
+    <event event="0x81" title="Scorpion" name="VX_PIPE_WAW_STALL_CYCLES" description="Scorpion VX pipe WAW cycles"/>\r
+    <event event="0x82" title="Scorpion" name="VX_PIPE_RAW_STALL_CYCLES" description="Scorpion VX pipe RAW cycles"/>\r
+    <event event="0x83" title="Scorpion" name="VX_PIPE_LOAD_USE_STALL" description="Scorpion VX pipe load use stall"/>\r
+    <event event="0x84" title="Scorpion" name="VS_PIPE_WAR_STALL_CYCLES" description="Scorpion VS pipe WAR stall cycles"/>\r
+    <event event="0x85" title="Scorpion" name="VS_PIPE_WAW_STALL_CYCLES" description="Scorpion VS pipe WAW stall cycles"/>\r
+    <event event="0x86" title="Scorpion" name="VS_PIPE_RAW_STALL_CYCLES" description="Scorpion VS pipe RAW stall cycles"/>\r
+    <event event="0x87" title="Scorpion" name="EXCEPTIONS_INV_OPERATION" description="Scorpion invalid operation exceptions"/>\r
+    <event event="0x88" title="Scorpion" name="EXCEPTIONS_DIV_BY_ZERO" description="Scorpion divide by zero exceptions"/>\r
+    <event event="0x89" title="Scorpion" name="COND_INST_FAIL_VX_PIPE" description="Scorpion conditional instruction fail VX pipe"/>\r
+    <event event="0x8a" title="Scorpion" name="COND_INST_FAIL_VS_PIPE" description="Scorpion conditional instruction fail VS pipe"/>\r
+    <event event="0x8b" title="Scorpion" name="EXCEPTIONS_OVERFLOW" description="Scorpion overflow exceptions"/>\r
+    <event event="0x8c" title="Scorpion" name="EXCEPTIONS_UNDERFLOW" description="Scorpion underflow exceptions"/>\r
+    <event event="0x8d" title="Scorpion" name="EXCEPTIONS_DENORM" description="Scorpion denorm exceptions"/>\r
+    <event event="0x8e" title="Scorpion" name="BANK_AB_HIT" description="L2 hit rates bank A/B hits"/>\r
+    <event event="0x8f" title="Scorpion" name="BANK_AB_ACCESS" description="L2 hit rates bank A/B accesses"/>\r
+    <event event="0x90" title="Scorpion" name="BANK_CD_HIT" description="L2 hit rates bank C/D hits"/>\r
+    <event event="0x91" title="Scorpion" name="BANK_CD_ACCESS" description="L2 hit rates bank C/D accesses"/>\r
+    <event event="0x92" title="Scorpion" name="BANK_AB_DSIDE_HIT" description="L2 hit rates bank A/B d-side hits"/>\r
+    <event event="0x93" title="Scorpion" name="BANK_AB_DSIDE_ACCESS" description="L2 hit rates bank A/B d-side accesses"/>\r
+    <event event="0x94" title="Scorpion" name="BANK_CD_DSIDE_HIT" description="L2 hit rates bank C/D d-side hits"/>\r
+    <event event="0x95" title="Scorpion" name="BANK_CD_DSIDE_ACCESS" description="L2 hit rates bank C/D d-side accesses"/>\r
+    <event event="0x96" title="Scorpion" name="BANK_AB_ISIDE_HIT" description="L2 hit rates bank A/B i-side hits"/>\r
+    <event event="0x97" title="Scorpion" name="BANK_AB_ISIDE_ACCESS" description="L2 hit rates bank A/B i-side accesses"/>\r
+    <event event="0x98" title="Scorpion" name="BANK_CD_ISIDE_HIT" description="L2 hit rates bank C/D i-side hits"/>\r
+    <event event="0x99" title="Scorpion" name="BANK_CD_ISIDE_ACCESS" description="L2 hit rates bank C/D i-side accesses"/>\r
+    <event event="0x9a" title="Scorpion" name="ISIDE_RD_WAIT" description="fills and castouts cycles that i-side RD requests wait on data from bus"/>\r
+    <event event="0x9b" title="Scorpion" name="DSIDE_RD_WAIT" description="fills and castouts cycles that d-side RD requests wait on data from bus"/>\r
+    <event event="0x9c" title="Scorpion" name="BANK_BYPASS_WRITE" description="fills and castouts bank bypass writes"/>\r
+    <event event="0x9d" title="Scorpion" name="BANK_AB_NON_CASTOUT" description="fills and castouts bank A/B non-castout writes to bus"/>\r
+    <event event="0x9e" title="Scorpion" name="BANK_AB_L2_CASTOUT" description="fills and castouts bank A/B L2 castouts (granules)"/>\r
+    <event event="0x9f" title="Scorpion" name="BANK_CD_NON_CASTOUT" description="fills and castouts bank C/D non-castout writes to bus"/>\r
+    <event event="0xa0" title="Scorpion" name="BANK_CD_L2_CASTOUT" description="fills and castouts bank C/D L2 castouts (granules)"/>\r
   </category>\r
-  
\ No newline at end of file
index bd13b8a9b3a09e0f05e70d95463dba935ac4256d..87f5657f7961670b8378a929d5dbac00c1754d87 100644 (file)
@@ -5,92 +5,91 @@
     <counter name="ScorpionMP_cnt3"/>\r
   </counter_set>\r
   <category name="ScorpionMP" counter_set="ScorpionMP_cntX" per_cpu="yes">\r
-    <event counter="ScorpionMP_ccnt" title="Clock" name="Cycles" description="The number of core clock cycles"/>\r
+    <event counter="ScorpionMP_ccnt" title="Clock" name="Cycles" alias="ClockCycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>\r
     <event event="0x00" title="Software" name="Increment" description="Incremented only on writes to the Software Increment Register"/>\r
     <event event="0x01" title="Cache" name="Instruction refill" description="Instruction fetch that causes a refill of at least the level of instruction or unified cache closest to the processor"/>\r
     <event event="0x02" title="Cache" name="Inst TLB refill" description="Instruction fetch that causes a TLB refill of at least the level of TLB closest to the processor"/>\r
     <event event="0x03" title="Cache" name="Data refill" description="Memory Read or Write operation that causes a refill of at least the level of data or unified cache closest to the processor"/>\r
     <event event="0x04" title="Cache" name="Data access" description="Memory Read or Write operation that causes a cache access to at least the level of data or unified cache closest to the processor"/>\r
     <event event="0x05" title="Cache" name="Data TLB refill" description="Memory Read or Write operation that causes a TLB refill of at least the level of TLB closest to the processor"/>\r
-    <event event="0x06" title="Instruction" name="Memory read" description="Memory-reading instruction architecturally executed"/>\r
-    <event event="0x07" title="Instruction" name="Memory write" description="Memory-writing instruction architecturally executed"/>\r
-       <event event="0x08" title="Instruction" name="Executed" description="Instruction architecturally executed"/>\r
+    <event event="0x06" title="Instruction" name="Memory read" alias="MemoryRead" description="Memory-reading instruction architecturally executed"/>\r
+    <event event="0x07" title="Instruction" name="Memory write" alias="MemoryWrite" description="Memory-writing instruction architecturally executed"/>\r
+    <event event="0x08" title="Instruction" name="Executed" alias="InstructionsExecuted" description="Instruction architecturally executed"/>\r
     <event event="0x09" title="Exception" name="Taken" description="Exceptions taken"/>\r
     <event event="0x0a" title="Exception" name="Return" description="Exception return architecturally executed"/>\r
     <event event="0x0b" title="Instruction" name="CONTEXTIDR" description="Instruction that writes to the CONTEXTIDR architecturally executed"/>\r
     <event event="0x0c" title="Program Counter" name="SW change" description="Software change of PC, except by an exception, architecturally executed"/>\r
     <event event="0x0d" title="Branch" name="Immediate" description="Immediate branch architecturally executed"/>\r
     <event event="0x0e" title="Branch" name="Procedure Return" description="Procedure return architecturally executed (not by exceptions)"/>\r
-    <event event="0x0f" title="Memory" name="Unaligned access" description="Unaligned access architecturally executed"/>\r
-    <event event="0x10" title="Branch" name="Mispredicted" description="Branch mispredicted or not predicted"/>\r
-    <event event="0x12" title="Branch" name="Potential prediction" description="Branch or other change in program flow that could have been predicted by the branch prediction resources of the processor"/>\r
-       <event event="0x4c" title="Scorpion" name="ICACHE_EXPL_INV" description="I-cache explicit invalidates"/>\r
-       <event event="0x4d" title="Scorpion" name="ICACHE_MISS" description="I-cache misses"/>\r
-       <event event="0x4e" title="Scorpion" name="ICACHE_ACCESS" description="I-cache accesses"/>\r
-       <event event="0x4f" title="Scorpion" name="ICACHE_CACHEREQ_L2" description="I-cache cacheable requests to L2"/>\r
-       <event event="0x50" title="Scorpion" name="ICACHE_NOCACHE_L2" description="I-cache non-cacheable requests to L2"/>\r
-       <event event="0x51" title="Scorpion" name="HIQUP_NOPED" description="Conditional instructions HIQUPs NOPed"/>\r
-       <event event="0x52" title="Scorpion" name="DATA_ABORT" description="Interrupts and Exceptions Data Abort"/>\r
-       <event event="0x53" title="Scorpion" name="IRQ" description="Interrupts and Exceptions IRQ"/>\r
-       <event event="0x54" title="Scorpion" name="FIQ" description="Interrupts and Exceptions FIQ"/>\r
-       <event event="0x55" title="Scorpion" name="ALL_EXCPT" description="Interrupts and Exceptions All interrupts"/>\r
-       <event event="0x56" title="Scorpion" name="UNDEF" description="Interrupts and Exceptions Undefined"/>\r
-       <event event="0x57" title="Scorpion" name="SVC" description="Interrupts and Exceptions SVC"/>\r
-       <event event="0x58" title="Scorpion" name="SMC" description="Interrupts and Exceptions SMC"/>\r
-       <event event="0x59" title="Scorpion" name="PREFETCH_ABORT" description="Interrupts and Exceptions Prefetch Abort"/>\r
-       <event event="0x5a" title="Scorpion" name="INDEX_CHECK" description="Interrupts and Exceptions Index Check"/>\r
-       <event event="0x5b" title="Scorpion" name="NULL_CHECK" description="Interrupts and Exceptions Null Check"/>\r
-       <event event="0x5c" title="Scorpion" name="EXPL_ICIALLU" description="I-cache and BTAC Invalidates Explicit ICIALLU"/>\r
-       <event event="0x5d" title="Scorpion" name="IMPL_ICIALLU" description="I-cache and BTAC Invalidates Implicit ICIALLU"/>\r
-       <event event="0x5e" title="Scorpion" name="NONICIALLU_BTAC_INV" description="I-cache and BTAC Invalidates Non-ICIALLU BTAC Invalidate"/>\r
-       <event event="0x5f" title="Scorpion" name="ICIMVAU_IMPL_ICIALLU" description="I-cache and BTAC Invalidates ICIMVAU-implied ICIALLU"/>\r
-       <event event="0x60" title="Scorpion" name="SPIPE_ONLY_CYCLES" description="Issue S-pipe only issue cycles"/>\r
-       <event event="0x61" title="Scorpion" name="XPIPE_ONLY_CYCLES" description="Issue X-pipe only issue cycles"/>\r
-       <event event="0x62" title="Scorpion" name="DUAL_CYCLES" description="Issue dual issue cycles"/>\r
-       <event event="0x63" title="Scorpion" name="DISPATCH_ANY_CYCLES" description="Dispatch any dispatch cycles"/>\r
-       <event event="0x64" title="Scorpion" name="FIFO_FULLBLK_CMT" description="Commits Trace FIFO full Blk CMT"/>\r
-       <event event="0x65" title="Scorpion" name="FAIL_COND_INST" description="Conditional instructions failing conditional instrs (excluding branches)"/>\r
-       <event event="0x66" title="Scorpion" name="PASS_COND_INST" description="Conditional instructions passing conditional instrs (excluding branches)"/>\r
-       <event event="0x67" title="Scorpion" name="ALLOW_VU_CLK" description="Unit Clock Gating Allow VU Clks"/>\r
-       <event event="0x68" title="Scorpion" name="VU_IDLE" description="Unit Clock Gating VU Idle"/>\r
-       <event event="0x69" title="Scorpion" name="ALLOW_L2_CLK" description="Unit Clock Gating Allow L2 Clks"/>\r
-       <event event="0x6a" title="Scorpion" name="L2_IDLE" description="Unit Clock Gating L2 Idle"/>\r
-       <event event="0x6b" title="Scorpion" name="DTLB_IMPL_INV_SCTLR_DACR" description="DTLB implicit invalidates writes to SCTLR and DACR"/>\r
-       <event event="0x6c" title="Scorpion" name="DTLB_EXPL_INV" description="DTLB explicit invalidates"/>\r
-       <event event="0x6d" title="Scorpion" name="DTLB_MISS" description="DTLB misses"/>\r
-       <event event="0x6e" title="Scorpion" name="DTLB_ACCESS" description="DTLB accesses"/>\r
-       <event event="0x6f" title="Scorpion" name="ITLB_MISS" description="ITLB misses"/>\r
-       <event event="0x70" title="Scorpion" name="ITLB_IMPL_INV" description="ITLB implicit ITLB invalidates"/>\r
-       <event event="0x71" title="Scorpion" name="ITLB_EXPL_INV" description="ITLB explicit ITLB invalidates"/>\r
-       <event event="0x72" title="Scorpion" name="UTLB_D_MISS" description="UTLB d-side misses"/>\r
-       <event event="0x73" title="Scorpion" name="UTLB_D_ACCESS" description="UTLB d-side accesses"/>\r
-       <event event="0x74" title="Scorpion" name="UTLB_I_MISS" description="UTLB i-side misses"/>\r
-       <event event="0x75" title="Scorpion" name="UTLB_I_ACCESS" description="UTLB i-side accesses"/>\r
-       <event event="0x76" title="Scorpion" name="UTLB_INV_ASID" description="UTLB invalidate by ASID"/>\r
-       <event event="0x77" title="Scorpion" name="UTLB_INV_MVA" description="UTLB invalidate by MVA"/>\r
-       <event event="0x78" title="Scorpion" name="UTLB_INV_ALL" description="UTLB invalidate all"/>\r
-       <event event="0x79" title="Scorpion" name="S2_HOLD_RDQ_UNAVAIL" description="S2 hold RDQ unavail"/>\r
-       <event event="0x7a" title="Scorpion" name="S2_HOLD" description="S2 hold"/>\r
-       <event event="0x7b" title="Scorpion" name="S2_HOLD_DEV_OP" description="S2 hold device op"/>\r
-       <event event="0x7c" title="Scorpion" name="S2_HOLD_ORDER" description="S2 hold strongly ordered op"/>\r
-       <event event="0x7d" title="Scorpion" name="S2_HOLD_BARRIER" description="S2 hold barrier"/>\r
-       <event event="0x7e" title="Scorpion" name="VIU_DUAL_CYCLE" description="Scorpion VIU dual cycle"/>\r
-       <event event="0x7f" title="Scorpion" name="VIU_SINGLE_CYCLE" description="Scorpion VIU single cycle"/>\r
-       <event event="0x80" title="Scorpion" name="VX_PIPE_WAR_STALL_CYCLES" description="Scorpion VX pipe WAR cycles"/>\r
-       <event event="0x81" title="Scorpion" name="VX_PIPE_WAW_STALL_CYCLES" description="Scorpion VX pipe WAW cycles"/>\r
-       <event event="0x82" title="Scorpion" name="VX_PIPE_RAW_STALL_CYCLES" description="Scorpion VX pipe RAW cycles"/>\r
-       <event event="0x83" title="Scorpion" name="VX_PIPE_LOAD_USE_STALL" description="Scorpion VX pipe load use stall"/>\r
-       <event event="0x84" title="Scorpion" name="VS_PIPE_WAR_STALL_CYCLES" description="Scorpion VS pipe WAR stall cycles"/>\r
-       <event event="0x85" title="Scorpion" name="VS_PIPE_WAW_STALL_CYCLES" description="Scorpion VS pipe WAW stall cycles"/>\r
-       <event event="0x86" title="Scorpion" name="VS_PIPE_RAW_STALL_CYCLES" description="Scorpion VS pipe RAW stall cycles"/>\r
-       <event event="0x87" title="Scorpion" name="EXCEPTIONS_INV_OPERATION" description="Scorpion invalid operation exceptions"/>\r
-       <event event="0x88" title="Scorpion" name="EXCEPTIONS_DIV_BY_ZERO" description="Scorpion divide by zero exceptions"/>\r
-       <event event="0x89" title="Scorpion" name="COND_INST_FAIL_VX_PIPE" description="Scorpion conditional instruction fail VX pipe"/>\r
-       <event event="0x8a" title="Scorpion" name="COND_INST_FAIL_VS_PIPE" description="Scorpion conditional instruction fail VS pipe"/>\r
-       <event event="0x8b" title="Scorpion" name="EXCEPTIONS_OVERFLOW" description="Scorpion overflow exceptions"/>\r
-       <event event="0x8c" title="Scorpion" name="EXCEPTIONS_UNDERFLOW" description="Scorpion underflow exceptions"/>\r
-       <event event="0x8d" title="Scorpion" name="EXCEPTIONS_DENORM" description="Scorpion denorm exceptions"/>\r
-       <event event="0x8e" title="ScorpionMP" name="NUM_BARRIERS" description="Barriers"/>\r
-       <event event="0x8f" title="ScorpionMP" name="BARRIER_CYCLES" description="Barrier cycles"/>\r
+    <event event="0x0f" title="Memory" name="Unaligned access" alias="UnalignedAccess" description="Unaligned access architecturally executed"/>\r
+    <event event="0x10" title="Branch" name="Mispredicted" alias="BranchMispredicted" description="Branch mispredicted or not predicted"/>\r
+    <event event="0x12" title="Branch" name="Potential prediction" alias="PotentialPrediction" description="Branch or other change in program flow that could have been predicted by the branch prediction resources of the processor"/>\r
+    <event event="0x4c" title="Scorpion" name="ICACHE_EXPL_INV" description="I-cache explicit invalidates"/>\r
+    <event event="0x4d" title="Scorpion" name="ICACHE_MISS" description="I-cache misses"/>\r
+    <event event="0x4e" title="Scorpion" name="ICACHE_ACCESS" description="I-cache accesses"/>\r
+    <event event="0x4f" title="Scorpion" name="ICACHE_CACHEREQ_L2" description="I-cache cacheable requests to L2"/>\r
+    <event event="0x50" title="Scorpion" name="ICACHE_NOCACHE_L2" description="I-cache non-cacheable requests to L2"/>\r
+    <event event="0x51" title="Scorpion" name="HIQUP_NOPED" description="Conditional instructions HIQUPs NOPed"/>\r
+    <event event="0x52" title="Scorpion" name="DATA_ABORT" description="Interrupts and Exceptions Data Abort"/>\r
+    <event event="0x53" title="Scorpion" name="IRQ" description="Interrupts and Exceptions IRQ"/>\r
+    <event event="0x54" title="Scorpion" name="FIQ" description="Interrupts and Exceptions FIQ"/>\r
+    <event event="0x55" title="Scorpion" name="ALL_EXCPT" description="Interrupts and Exceptions All interrupts"/>\r
+    <event event="0x56" title="Scorpion" name="UNDEF" description="Interrupts and Exceptions Undefined"/>\r
+    <event event="0x57" title="Scorpion" name="SVC" description="Interrupts and Exceptions SVC"/>\r
+    <event event="0x58" title="Scorpion" name="SMC" description="Interrupts and Exceptions SMC"/>\r
+    <event event="0x59" title="Scorpion" name="PREFETCH_ABORT" description="Interrupts and Exceptions Prefetch Abort"/>\r
+    <event event="0x5a" title="Scorpion" name="INDEX_CHECK" description="Interrupts and Exceptions Index Check"/>\r
+    <event event="0x5b" title="Scorpion" name="NULL_CHECK" description="Interrupts and Exceptions Null Check"/>\r
+    <event event="0x5c" title="Scorpion" name="EXPL_ICIALLU" description="I-cache and BTAC Invalidates Explicit ICIALLU"/>\r
+    <event event="0x5d" title="Scorpion" name="IMPL_ICIALLU" description="I-cache and BTAC Invalidates Implicit ICIALLU"/>\r
+    <event event="0x5e" title="Scorpion" name="NONICIALLU_BTAC_INV" description="I-cache and BTAC Invalidates Non-ICIALLU BTAC Invalidate"/>\r
+    <event event="0x5f" title="Scorpion" name="ICIMVAU_IMPL_ICIALLU" description="I-cache and BTAC Invalidates ICIMVAU-implied ICIALLU"/>\r
+    <event event="0x60" title="Scorpion" name="SPIPE_ONLY_CYCLES" description="Issue S-pipe only issue cycles"/>\r
+    <event event="0x61" title="Scorpion" name="XPIPE_ONLY_CYCLES" description="Issue X-pipe only issue cycles"/>\r
+    <event event="0x62" title="Scorpion" name="DUAL_CYCLES" description="Issue dual issue cycles"/>\r
+    <event event="0x63" title="Scorpion" name="DISPATCH_ANY_CYCLES" description="Dispatch any dispatch cycles"/>\r
+    <event event="0x64" title="Scorpion" name="FIFO_FULLBLK_CMT" description="Commits Trace FIFO full Blk CMT"/>\r
+    <event event="0x65" title="Scorpion" name="FAIL_COND_INST" description="Conditional instructions failing conditional instrs (excluding branches)"/>\r
+    <event event="0x66" title="Scorpion" name="PASS_COND_INST" description="Conditional instructions passing conditional instrs (excluding branches)"/>\r
+    <event event="0x67" title="Scorpion" name="ALLOW_VU_CLK" description="Unit Clock Gating Allow VU Clks"/>\r
+    <event event="0x68" title="Scorpion" name="VU_IDLE" description="Unit Clock Gating VU Idle"/>\r
+    <event event="0x69" title="Scorpion" name="ALLOW_L2_CLK" description="Unit Clock Gating Allow L2 Clks"/>\r
+    <event event="0x6a" title="Scorpion" name="L2_IDLE" description="Unit Clock Gating L2 Idle"/>\r
+    <event event="0x6b" title="Scorpion" name="DTLB_IMPL_INV_SCTLR_DACR" description="DTLB implicit invalidates writes to SCTLR and DACR"/>\r
+    <event event="0x6c" title="Scorpion" name="DTLB_EXPL_INV" description="DTLB explicit invalidates"/>\r
+    <event event="0x6d" title="Scorpion" name="DTLB_MISS" description="DTLB misses"/>\r
+    <event event="0x6e" title="Scorpion" name="DTLB_ACCESS" description="DTLB accesses"/>\r
+    <event event="0x6f" title="Scorpion" name="ITLB_MISS" description="ITLB misses"/>\r
+    <event event="0x70" title="Scorpion" name="ITLB_IMPL_INV" description="ITLB implicit ITLB invalidates"/>\r
+    <event event="0x71" title="Scorpion" name="ITLB_EXPL_INV" description="ITLB explicit ITLB invalidates"/>\r
+    <event event="0x72" title="Scorpion" name="UTLB_D_MISS" description="UTLB d-side misses"/>\r
+    <event event="0x73" title="Scorpion" name="UTLB_D_ACCESS" description="UTLB d-side accesses"/>\r
+    <event event="0x74" title="Scorpion" name="UTLB_I_MISS" description="UTLB i-side misses"/>\r
+    <event event="0x75" title="Scorpion" name="UTLB_I_ACCESS" description="UTLB i-side accesses"/>\r
+    <event event="0x76" title="Scorpion" name="UTLB_INV_ASID" description="UTLB invalidate by ASID"/>\r
+    <event event="0x77" title="Scorpion" name="UTLB_INV_MVA" description="UTLB invalidate by MVA"/>\r
+    <event event="0x78" title="Scorpion" name="UTLB_INV_ALL" description="UTLB invalidate all"/>\r
+    <event event="0x79" title="Scorpion" name="S2_HOLD_RDQ_UNAVAIL" description="S2 hold RDQ unavail"/>\r
+    <event event="0x7a" title="Scorpion" name="S2_HOLD" description="S2 hold"/>\r
+    <event event="0x7b" title="Scorpion" name="S2_HOLD_DEV_OP" description="S2 hold device op"/>\r
+    <event event="0x7c" title="Scorpion" name="S2_HOLD_ORDER" description="S2 hold strongly ordered op"/>\r
+    <event event="0x7d" title="Scorpion" name="S2_HOLD_BARRIER" description="S2 hold barrier"/>\r
+    <event event="0x7e" title="Scorpion" name="VIU_DUAL_CYCLE" description="Scorpion VIU dual cycle"/>\r
+    <event event="0x7f" title="Scorpion" name="VIU_SINGLE_CYCLE" description="Scorpion VIU single cycle"/>\r
+    <event event="0x80" title="Scorpion" name="VX_PIPE_WAR_STALL_CYCLES" description="Scorpion VX pipe WAR cycles"/>\r
+    <event event="0x81" title="Scorpion" name="VX_PIPE_WAW_STALL_CYCLES" description="Scorpion VX pipe WAW cycles"/>\r
+    <event event="0x82" title="Scorpion" name="VX_PIPE_RAW_STALL_CYCLES" description="Scorpion VX pipe RAW cycles"/>\r
+    <event event="0x83" title="Scorpion" name="VX_PIPE_LOAD_USE_STALL" description="Scorpion VX pipe load use stall"/>\r
+    <event event="0x84" title="Scorpion" name="VS_PIPE_WAR_STALL_CYCLES" description="Scorpion VS pipe WAR stall cycles"/>\r
+    <event event="0x85" title="Scorpion" name="VS_PIPE_WAW_STALL_CYCLES" description="Scorpion VS pipe WAW stall cycles"/>\r
+    <event event="0x86" title="Scorpion" name="VS_PIPE_RAW_STALL_CYCLES" description="Scorpion VS pipe RAW stall cycles"/>\r
+    <event event="0x87" title="Scorpion" name="EXCEPTIONS_INV_OPERATION" description="Scorpion invalid operation exceptions"/>\r
+    <event event="0x88" title="Scorpion" name="EXCEPTIONS_DIV_BY_ZERO" description="Scorpion divide by zero exceptions"/>\r
+    <event event="0x89" title="Scorpion" name="COND_INST_FAIL_VX_PIPE" description="Scorpion conditional instruction fail VX pipe"/>\r
+    <event event="0x8a" title="Scorpion" name="COND_INST_FAIL_VS_PIPE" description="Scorpion conditional instruction fail VS pipe"/>\r
+    <event event="0x8b" title="Scorpion" name="EXCEPTIONS_OVERFLOW" description="Scorpion overflow exceptions"/>\r
+    <event event="0x8c" title="Scorpion" name="EXCEPTIONS_UNDERFLOW" description="Scorpion underflow exceptions"/>\r
+    <event event="0x8d" title="Scorpion" name="EXCEPTIONS_DENORM" description="Scorpion denorm exceptions"/>\r
+    <event event="0x8e" title="ScorpionMP" name="NUM_BARRIERS" description="Barriers"/>\r
+    <event event="0x8f" title="ScorpionMP" name="BARRIER_CYCLES" description="Barrier cycles"/>\r
   </category>  \r
-  
\ No newline at end of file
index 51237cbcf758d9699a8a72c16ce086add4c8856e..df6913b92cbeab2b1f1a86af28b1debca67ef8db 100644 (file)
@@ -36,7 +36,7 @@ static bool driverMountedAtStart = false;
 
 struct cmdline_t {
        int port;
-       char* sessionXML;
+       char* module;
 };
 
 void cleanUp() {
@@ -101,18 +101,20 @@ void child_exit(int signum) {
 // retval: -1 = failure; 0 = was already mounted; 1 = successfully mounted
 int mountGatorFS() {
        // If already mounted,
-       if (access("/dev/gator/buffer", F_OK) == 0)
+       if (access("/dev/gator/buffer", F_OK) == 0) {
                return 0;
+       }
 
        // else, mount the filesystem
        mkdir("/dev/gator", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
-       if (mount("nodev", "/dev/gator", "gatorfs", 0, NULL) != 0)
+       if (mount("nodev", "/dev/gator", "gatorfs", 0, NULL) != 0) {
                return -1;
-       else
+       } else {
                return 1;
+       }
 }
 
-int setupFilesystem() {
+int setupFilesystem(char* module) {
        int retval;
 
        // Verify root permissions
@@ -122,6 +124,17 @@ int setupFilesystem() {
                handleException();
        }
 
+       if (module) {
+               // unmount and rmmod if the module was specified on the commandline, i.e. ensure that the specified module is indeed running
+               shutdownFilesystem();
+
+               // if still mounted
+               if (access("/dev/gator/buffer", F_OK) == 0) {
+                       logg->logError(__FILE__, __LINE__, "Unable to remove the running gator.ko. Manually remove the module or use the running module by not specifying one on the commandline");
+                       handleException();
+               }
+       }
+
        retval = mountGatorFS();
        if (retval == 1) {
                logg->logMessage("Driver already running at startup");
@@ -131,22 +144,25 @@ int setupFilesystem() {
                driverRunningAtStart = driverMountedAtStart = true;
        } else {
                char command[256]; // arbitrarily large amount
-
-               // Is the driver co-located in the same directory?
-               if (util->getApplicationFullPath(command, sizeof(command)) != 0) { // allow some buffer space
-                       logg->logMessage("Unable to determine the full path of gatord, the cwd will be used");
+               char location[256]; // arbitrarily large amount
+
+               if (module) {
+                       strncpy(location, module, sizeof(location));
+               } else {
+                       // Is the driver co-located in the same directory?
+                       if (util->getApplicationFullPath(location, sizeof(location)) != 0) { // allow some buffer space
+                               logg->logMessage("Unable to determine the full path of gatord, the cwd will be used");
+                       }
+                       strncat(location, "gator.ko", sizeof(location) - strlen(location) - 1);
                }
-               strcat(command, "gator.ko");
-               if (access(command, F_OK) == -1) {
-                       logg->logError(__FILE__, __LINE__, "Unable to locate gator.ko driver:\n  >>> gator.ko should be co-located with gatord in the same directory\n  >>> OR insmod gator.ko prior to launching gatord");
+
+               if (access(location, F_OK) == -1) {
+                       logg->logError(__FILE__, __LINE__, "Unable to locate gator.ko driver:\n  >>> gator.ko should be co-located with gatord in the same directory\n  >>> OR insmod gator.ko prior to launching gatord\n  >>> OR specify the location of gator.ko on the command line");
                        handleException();
                }
 
                // Load driver
-               strcpy(command, "insmod ");
-               util->getApplicationFullPath(&command[7], sizeof(command) - 64); // allow some buffer space
-               strcat(command, "gator.ko >/dev/null 2>&1");
-
+               snprintf(command, sizeof(command), "insmod %s >/dev/null 2>&1", location);
                if (system(command) != 0) {
                        logg->logMessage("Unable to load gator.ko driver with command: %s", command);
                        logg->logError(__FILE__, __LINE__, "Unable to load (insmod) gator.ko driver:\n  >>> gator.ko must be built against the current kernel version & configuration\n  >>> See dmesg for more details");
@@ -163,11 +179,14 @@ int setupFilesystem() {
 }
 
 int shutdownFilesystem() {
-       if (driverMountedAtStart == false)
+       if (driverMountedAtStart == false) {
                umount("/dev/gator");
-       if (driverRunningAtStart == false)
-               if (system("rmmod gator >/dev/null 2>&1") != 0)
+       }
+       if (driverRunningAtStart == false) {
+               if (system("rmmod gator >/dev/null 2>&1") != 0) {
                        return -1;
+               }
+       }
 
        return 0; // success
 }
@@ -175,29 +194,38 @@ int shutdownFilesystem() {
 struct cmdline_t parseCommandLine(int argc, char** argv) {
        struct cmdline_t cmdline;
        cmdline.port = 8080;
-       cmdline.sessionXML = NULL;
+       cmdline.module = NULL;
        int c;
 
-       while ((c = getopt (argc, argv, "hvp:s:c:")) != -1) {
+       while ((c = getopt(argc, argv, "hvp:s:c:e:m:")) != -1) {
                switch(c) {
+                       case 'c':
+                               gSessionData->mConfigurationXMLPath = optarg;
+                               break;
+                       case 'e':
+                               gSessionData->mEventsXMLPath = optarg;
+                               break;
+                       case 'm':
+                               cmdline.module = optarg;
+                               break;
                        case 'p':
                                cmdline.port = strtol(optarg, NULL, 10);
                                break;
                        case 's':
-                               cmdline.sessionXML = optarg;
-                               break;
-                       case 'c':
-                               gSessionData->configurationXMLPath = optarg;
+                               gSessionData->mSessionXMLPath = optarg;
                                break;
                        case 'h':
                        case '?':
                                logg->logError(__FILE__, __LINE__,
                                        "Streamline gatord version %d. All parameters are optional:\n"
+                                       "-c config_xml\tpath and filename of the configuration.xml to use\n"
+                                       "-e events_xml\tpath and filename of the events.xml to use\n"
+                                       "-h\t\tthis help page\n"
+                                       "-m module\tpath and filename of gator.ko\n"
                                        "-p port_number\tport upon which the server listens; default is 8080\n"
                                        "-s session_xml\tpath and filename of a session xml used for local capture\n"
-                                       "-c config_xml\tpath and filename of the configuration.xml to use\n"
                                        "-v\t\tversion information\n"
-                                       "-h\t\tthis help page\n", PROTOCOL_VERSION);
+                                       , PROTOCOL_VERSION);
                                handleException();
                                break;
                        case 'v':
@@ -208,7 +236,7 @@ struct cmdline_t parseCommandLine(int argc, char** argv) {
        }
 
        // Error checking
-       if (cmdline.port != 8080 && cmdline.sessionXML != NULL) {
+       if (cmdline.port != 8080 && gSessionData->mSessionXMLPath != NULL) {
                logg->logError(__FILE__, __LINE__, "Only a port or a session xml can be specified, not both");
                handleException();
        }
@@ -222,7 +250,7 @@ struct cmdline_t parseCommandLine(int argc, char** argv) {
 }
 
 // Gator data flow: collector -> collector fifo -> sender
-int main(int argc, char** argv, char *envp[]) {
+int main(int argc, char** argv, charenvp[]) {
        gSessionData = new SessionData(); // Global data class
        logg = new Logging(DEBUG);  // Set up global thread-safe logging
        util = new OlyUtility();        // Set up global utility class
@@ -235,8 +263,9 @@ int main(int argc, char** argv, char *envp[]) {
        signal(SIGABRT, handler);
 
        // Set to high priority
-       if (setpriority(PRIO_PROCESS, syscall(__NR_gettid), -19) == -1)
+       if (setpriority(PRIO_PROCESS, syscall(__NR_gettid), -19) == -1) {
                logg->logMessage("setpriority() failed");
+       }
 
        // Initialize session data
        gSessionData->initialize();
@@ -245,7 +274,7 @@ int main(int argc, char** argv, char *envp[]) {
        struct cmdline_t cmdline = parseCommandLine(argc, argv);
 
        // Call before setting up the SIGCHLD handler, as system() spawns child processes
-       setupFilesystem();
+       setupFilesystem(cmdline.module);
 
        // Handle child exit codes
        signal(SIGCHLD, child_exit);
@@ -255,8 +284,8 @@ int main(int argc, char** argv, char *envp[]) {
        signal(SIGPIPE, SIG_IGN);
 
        // If the command line argument is a session xml file, no need to open a socket
-       if (cmdline.sessionXML) {
-               child = new Child(cmdline.sessionXML);
+       if (gSessionData->mSessionXMLPath) {
+               child = new Child();
                child->run();
                delete child;
        } else {
diff --git a/daemon/mxml/COPYING b/daemon/mxml/COPYING
new file mode 100644 (file)
index 0000000..4d0aa78
--- /dev/null
@@ -0,0 +1,507 @@
+                          Mini-XML License
+                         September 18, 2010
+
+
+The Mini-XML library and included programs are provided under the
+terms of the GNU Library General Public License version 2 (LGPL2)
+with the following exceptions:
+
+  1. Static linking of applications to the Mini-XML library
+does not constitute a derivative work and does not require
+the author to provide source code for the application, use
+the shared Mini-XML libraries, or link their applications
+against a user-supplied version of Mini-XML.
+
+If you link the application to a modified version of
+Mini-XML, then the changes to Mini-XML must be provided
+under the terms of the LGPL2 in sections 1, 2, and 4.
+
+  2. You do not have to provide a copy of the Mini-XML license
+with programs that are linked to the Mini-XML library, nor
+do you have to identify the Mini-XML license in your
+program or documentation as required by section 6 of the
+LGPL2.
+
+
+\f                GNU LIBRARY GENERAL PUBLIC LICENSE
+                        Version 2, June 1991
+
+         Copyright (C) 1991 Free Software Foundation, Inc.
+       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+     Everyone is permitted to copy and distribute verbatim copies
+      of this license document, but changing it is not allowed.
+
+    [This is the first released version of the library GPL.  It is
+   numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+                              Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it.  You can use it for
+your libraries, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library.  If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+\f
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software.  To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+  Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs.  This
+license, the GNU Library General Public License, applies to certain
+designated libraries.  This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+  The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it.  Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program.  However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+  Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries.  We
+concluded that weaker conditions might promote sharing better.
+
+  However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves.  This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them.  (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.)  The hope is that this
+will lead to faster development of free libraries.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+  Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+\f
+                 GNU LIBRARY GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License").  Each licensee is
+addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+\f
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+\f
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+\f
+  6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    c) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    d) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+\f
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+\f
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+\f
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                           NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+\f
+     Appendix: How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public
+    License along with this library; if not, write to the Free
+    Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/daemon/mxml/config.h b/daemon/mxml/config.h
new file mode 100644 (file)
index 0000000..1f59ba3
--- /dev/null
@@ -0,0 +1,96 @@
+/* config.h.  Generated from config.h.in by configure.  */
+/*
+ * "$Id: config.h.in 408 2010-09-19 05:26:46Z mike $"
+ *
+ * Configuration file for Mini-XML, a small XML-like file parsing library.
+ *
+ * Copyright 2003-2010 by Michael R Sweet.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Michael R Sweet and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "COPYING"
+ * which should have been included with this file.  If this file is
+ * missing or damaged, see the license at:
+ *
+ *     http://www.minixml.org/
+ */
+
+/*
+ * Include necessary headers...
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <ctype.h>
+
+
+/*
+ * Version number...
+ */
+
+#define MXML_VERSION "Mini-XML v2.7"
+
+
+/*
+ * Inline function support...
+ */
+
+#define inline
+
+
+/*
+ * Long long support...
+ */
+
+#define HAVE_LONG_LONG 1
+
+
+/*
+ * Do we have the snprintf() and vsnprintf() functions?
+ */
+
+#define HAVE_SNPRINTF 1
+#define HAVE_VSNPRINTF 1
+
+
+/*
+ * Do we have the strXXX() functions?
+ */
+
+#define HAVE_STRDUP 1
+
+
+/*
+ * Do we have threading support?
+ */
+
+#define HAVE_PTHREAD_H 1
+
+
+/*
+ * Define prototypes for string functions as needed...
+ */
+
+#  ifndef HAVE_STRDUP
+extern char    *_mxml_strdup(const char *);
+#    define strdup _mxml_strdup
+#  endif /* !HAVE_STRDUP */
+
+extern char    *_mxml_strdupf(const char *, ...);
+extern char    *_mxml_vstrdupf(const char *, va_list);
+
+#  ifndef HAVE_SNPRINTF
+extern int     _mxml_snprintf(char *, size_t, const char *, ...);
+#    define snprintf _mxml_snprintf
+#  endif /* !HAVE_SNPRINTF */
+
+#  ifndef HAVE_VSNPRINTF
+extern int     _mxml_vsnprintf(char *, size_t, const char *, va_list);
+#    define vsnprintf _mxml_vsnprintf
+#  endif /* !HAVE_VSNPRINTF */
+
+/*
+ * End of "$Id: config.h.in 408 2010-09-19 05:26:46Z mike $".
+ */
diff --git a/daemon/mxml/mxml-attr.c b/daemon/mxml/mxml-attr.c
new file mode 100644 (file)
index 0000000..c9950f5
--- /dev/null
@@ -0,0 +1,319 @@
+/*
+ * "$Id: mxml-attr.c 408 2010-09-19 05:26:46Z mike $"
+ *
+ * Attribute support code for Mini-XML, a small XML-like file parsing library.
+ *
+ * Copyright 2003-2010 by Michael R Sweet.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Michael R Sweet and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "COPYING"
+ * which should have been included with this file.  If this file is
+ * missing or damaged, see the license at:
+ *
+ *     http://www.minixml.org/
+ *
+ * Contents:
+ *
+ *   mxmlElementDeleteAttr() - Delete an attribute.
+ *   mxmlElementGetAttr()    - Get an attribute.
+ *   mxmlElementSetAttr()    - Set an attribute.
+ *   mxmlElementSetAttrf()   - Set an attribute with a formatted value.
+ *   mxml_set_attr()         - Set or add an attribute name/value pair.
+ */
+
+/*
+ * Include necessary headers...
+ */
+
+#include "config.h"
+#include "mxml.h"
+
+
+/*
+ * Local functions...
+ */
+
+static int     mxml_set_attr(mxml_node_t *node, const char *name,
+                             char *value);
+
+
+/*
+ * 'mxmlElementDeleteAttr()' - Delete an attribute.
+ *
+ * @since Mini-XML 2.4@
+ */
+
+void
+mxmlElementDeleteAttr(mxml_node_t *node,/* I - Element */
+                      const char  *name)/* I - Attribute name */
+{
+  int          i;                      /* Looping var */
+  mxml_attr_t  *attr;                  /* Cirrent attribute */
+
+
+#ifdef DEBUG
+  fprintf(stderr, "mxmlElementDeleteAttr(node=%p, name=\"%s\")\n",
+          node, name ? name : "(null)");
+#endif /* DEBUG */
+
+ /*
+  * Range check input...
+  */
+
+  if (!node || node->type != MXML_ELEMENT || !name)
+    return;
+
+ /*
+  * Look for the attribute...
+  */
+
+  for (i = node->value.element.num_attrs, attr = node->value.element.attrs;
+       i > 0;
+       i --, attr ++)
+  {
+#ifdef DEBUG
+    printf("    %s=\"%s\"\n", attr->name, attr->value);
+#endif /* DEBUG */
+
+    if (!strcmp(attr->name, name))
+    {
+     /*
+      * Delete this attribute...
+      */
+
+      free(attr->name);
+      free(attr->value);
+
+      i --;
+      if (i > 0)
+        memmove(attr, attr + 1, i * sizeof(mxml_attr_t));
+
+      node->value.element.num_attrs --;
+      return;
+    }
+  }
+}
+
+
+/*
+ * 'mxmlElementGetAttr()' - Get an attribute.
+ *
+ * This function returns NULL if the node is not an element or the
+ * named attribute does not exist.
+ */
+
+const char *                           /* O - Attribute value or NULL */
+mxmlElementGetAttr(mxml_node_t *node,  /* I - Element node */
+                   const char  *name)  /* I - Name of attribute */
+{
+  int          i;                      /* Looping var */
+  mxml_attr_t  *attr;                  /* Cirrent attribute */
+
+
+#ifdef DEBUG
+  fprintf(stderr, "mxmlElementGetAttr(node=%p, name=\"%s\")\n",
+          node, name ? name : "(null)");
+#endif /* DEBUG */
+
+ /*
+  * Range check input...
+  */
+
+  if (!node || node->type != MXML_ELEMENT || !name)
+    return (NULL);
+
+ /*
+  * Look for the attribute...
+  */
+
+  for (i = node->value.element.num_attrs, attr = node->value.element.attrs;
+       i > 0;
+       i --, attr ++)
+  {
+#ifdef DEBUG
+    printf("    %s=\"%s\"\n", attr->name, attr->value);
+#endif /* DEBUG */
+
+    if (!strcmp(attr->name, name))
+    {
+#ifdef DEBUG
+      printf("    Returning \"%s\"!\n", attr->value);
+#endif /* DEBUG */
+      return (attr->value);
+    }
+  }
+
+ /*
+  * Didn't find attribute, so return NULL...
+  */
+
+#ifdef DEBUG
+  puts("    Returning NULL!\n");
+#endif /* DEBUG */
+
+  return (NULL);
+}
+
+
+/*
+ * 'mxmlElementSetAttr()' - Set an attribute.
+ *
+ * If the named attribute already exists, the value of the attribute
+ * is replaced by the new string value. The string value is copied
+ * into the element node. This function does nothing if the node is
+ * not an element.
+ */
+
+void
+mxmlElementSetAttr(mxml_node_t *node,  /* I - Element node */
+                   const char  *name,  /* I - Name of attribute */
+                   const char  *value) /* I - Attribute value */
+{
+  char *valuec;                        /* Copy of value */
+
+
+#ifdef DEBUG
+  fprintf(stderr, "mxmlElementSetAttr(node=%p, name=\"%s\", value=\"%s\")\n",
+          node, name ? name : "(null)", value ? value : "(null)");
+#endif /* DEBUG */
+
+ /*
+  * Range check input...
+  */
+
+  if (!node || node->type != MXML_ELEMENT || !name)
+    return;
+
+  if (value)
+    valuec = strdup(value);
+  else
+    valuec = NULL;
+
+  if (mxml_set_attr(node, name, valuec))
+    free(valuec);
+}
+
+
+/*
+ * 'mxmlElementSetAttrf()' - Set an attribute with a formatted value.
+ *
+ * If the named attribute already exists, the value of the attribute
+ * is replaced by the new formatted string. The formatted string value is
+ * copied into the element node. This function does nothing if the node
+ * is not an element.
+ *
+ * @since Mini-XML 2.3@
+ */
+
+void
+mxmlElementSetAttrf(mxml_node_t *node, /* I - Element node */
+                    const char  *name, /* I - Name of attribute */
+                    const char  *format,/* I - Printf-style attribute value */
+                   ...)                /* I - Additional arguments as needed */
+{
+  va_list      ap;                     /* Argument pointer */
+  char         *value;                 /* Value */
+
+
+#ifdef DEBUG
+  fprintf(stderr,
+          "mxmlElementSetAttrf(node=%p, name=\"%s\", format=\"%s\", ...)\n",
+          node, name ? name : "(null)", format ? format : "(null)");
+#endif /* DEBUG */
+
+ /*
+  * Range check input...
+  */
+
+  if (!node || node->type != MXML_ELEMENT || !name || !format)
+    return;
+
+ /*
+  * Format the value...
+  */
+
+  va_start(ap, format);
+  value = _mxml_vstrdupf(format, ap);
+  va_end(ap);
+
+  if (!value)
+    mxml_error("Unable to allocate memory for attribute '%s' in element %s!",
+               name, node->value.element.name);
+  else if (mxml_set_attr(node, name, value))
+    free(value);
+}
+
+
+/*
+ * 'mxml_set_attr()' - Set or add an attribute name/value pair.
+ */
+
+static int                             /* O - 0 on success, -1 on failure */
+mxml_set_attr(mxml_node_t *node,       /* I - Element node */
+              const char  *name,       /* I - Attribute name */
+              char        *value)      /* I - Attribute value */
+{
+  int          i;                      /* Looping var */
+  mxml_attr_t  *attr;                  /* New attribute */
+
+
+ /*
+  * Look for the attribute...
+  */
+
+  for (i = node->value.element.num_attrs, attr = node->value.element.attrs;
+       i > 0;
+       i --, attr ++)
+    if (!strcmp(attr->name, name))
+    {
+     /*
+      * Free the old value as needed...
+      */
+
+      if (attr->value)
+        free(attr->value);
+
+      attr->value = value;
+
+      return (0);
+    }
+
+ /*
+  * Add a new attribute...
+  */
+
+  if (node->value.element.num_attrs == 0)
+    attr = malloc(sizeof(mxml_attr_t));
+  else
+    attr = realloc(node->value.element.attrs,
+                   (node->value.element.num_attrs + 1) * sizeof(mxml_attr_t));
+
+  if (!attr)
+  {
+    mxml_error("Unable to allocate memory for attribute '%s' in element %s!",
+               name, node->value.element.name);
+    return (-1);
+  }
+
+  node->value.element.attrs = attr;
+  attr += node->value.element.num_attrs;
+
+  if ((attr->name = strdup(name)) == NULL)
+  {
+    mxml_error("Unable to allocate memory for attribute '%s' in element %s!",
+               name, node->value.element.name);
+    return (-1);
+  }
+
+  attr->value = value;
+
+  node->value.element.num_attrs ++;
+
+  return (0);
+}
+
+
+/*
+ * End of "$Id: mxml-attr.c 408 2010-09-19 05:26:46Z mike $".
+ */
diff --git a/daemon/mxml/mxml-entity.c b/daemon/mxml/mxml-entity.c
new file mode 100644 (file)
index 0000000..c5c9f61
--- /dev/null
@@ -0,0 +1,460 @@
+/*
+ * "$Id: mxml-entity.c 408 2010-09-19 05:26:46Z mike $"
+ *
+ * Character entity support code for Mini-XML, a small XML-like
+ * file parsing library.
+ *
+ * Copyright 2003-2010 by Michael R Sweet.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Michael R Sweet and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "COPYING"
+ * which should have been included with this file.  If this file is
+ * missing or damaged, see the license at:
+ *
+ *     http://www.minixml.org/
+ *
+ * Contents:
+ *
+ *   mxmlEntityAddCallback()    - Add a callback to convert entities to
+ *                                Unicode.
+ *   mxmlEntityGetName()        - Get the name that corresponds to the
+ *                                character value.
+ *   mxmlEntityGetValue()       - Get the character corresponding to a named
+ *                                entity.
+ *   mxmlEntityRemoveCallback() - Remove a callback.
+ *   _mxml_entity_cb()          - Lookup standard (X)HTML entities.
+ */
+
+/*
+ * Include necessary headers...
+ */
+
+#include "mxml-private.h"
+
+
+/*
+ * 'mxmlEntityAddCallback()' - Add a callback to convert entities to Unicode.
+ */
+
+int                                    /* O - 0 on success, -1 on failure */
+mxmlEntityAddCallback(
+    mxml_entity_cb_t cb)               /* I - Callback function to add */
+{
+  _mxml_global_t *global = _mxml_global();
+                                       /* Global data */
+
+
+  if (global->num_entity_cbs < (int)(sizeof(global->entity_cbs) / sizeof(global->entity_cbs[0])))
+  {
+    global->entity_cbs[global->num_entity_cbs] = cb;
+    global->num_entity_cbs ++;
+
+    return (0);
+  }
+  else
+  {
+    mxml_error("Unable to add entity callback!");
+
+    return (-1);
+  }
+}
+
+
+/*
+ * 'mxmlEntityGetName()' - Get the name that corresponds to the character value.
+ *
+ * If val does not need to be represented by a named entity, NULL is returned.
+ */
+
+const char *                           /* O - Entity name or NULL */
+mxmlEntityGetName(int val)             /* I - Character value */
+{
+  switch (val)
+  {
+    case '&' :
+        return ("amp");
+
+    case '<' :
+        return ("lt");
+
+    case '>' :
+        return ("gt");
+
+    case '\"' :
+        return ("quot");
+
+    default :
+        return (NULL);
+  }
+}
+
+
+/*
+ * 'mxmlEntityGetValue()' - Get the character corresponding to a named entity.
+ *
+ * The entity name can also be a numeric constant. -1 is returned if the
+ * name is not known.
+ */
+
+int                                    /* O - Character value or -1 on error */
+mxmlEntityGetValue(const char *name)   /* I - Entity name */
+{
+  int          i;                      /* Looping var */
+  int          ch;                     /* Character value */
+  _mxml_global_t *global = _mxml_global();
+                                       /* Global data */
+
+
+  for (i = 0; i < global->num_entity_cbs; i ++)
+    if ((ch = (global->entity_cbs[i])(name)) >= 0)
+      return (ch);
+
+  return (-1);
+}
+
+
+/*
+ * 'mxmlEntityRemoveCallback()' - Remove a callback.
+ */
+
+void
+mxmlEntityRemoveCallback(
+    mxml_entity_cb_t cb)               /* I - Callback function to remove */
+{
+  int          i;                      /* Looping var */
+  _mxml_global_t *global = _mxml_global();
+                                       /* Global data */
+
+
+  for (i = 0; i < global->num_entity_cbs; i ++)
+    if (cb == global->entity_cbs[i])
+    {
+     /*
+      * Remove the callback...
+      */
+
+      global->num_entity_cbs --;
+
+      if (i < global->num_entity_cbs)
+        memmove(global->entity_cbs + i, global->entity_cbs + i + 1,
+               (global->num_entity_cbs - i) * sizeof(global->entity_cbs[0]));
+
+      return;
+    }
+}
+
+
+/*
+ * '_mxml_entity_cb()' - Lookup standard (X)HTML entities.
+ */
+
+int                                    /* O - Unicode value or -1 */
+_mxml_entity_cb(const char *name)      /* I - Entity name */
+{
+  int  diff,                           /* Difference between names */
+       current,                        /* Current entity in search */
+       first,                          /* First entity in search */
+       last;                           /* Last entity in search */
+  static const struct
+  {
+    const char *name;                  /* Entity name */
+    int                val;                    /* Character value */
+  }    entities[] =
+  {
+    { "AElig",         198 },
+    { "Aacute",                193 },
+    { "Acirc",         194 },
+    { "Agrave",                192 },
+    { "Alpha",         913 },
+    { "Aring",         197 },
+    { "Atilde",                195 },
+    { "Auml",          196 },
+    { "Beta",          914 },
+    { "Ccedil",                199 },
+    { "Chi",           935 },
+    { "Dagger",                8225 },
+    { "Delta",         916 },
+    { "Dstrok",                208 },
+    { "ETH",           208 },
+    { "Eacute",                201 },
+    { "Ecirc",         202 },
+    { "Egrave",                200 },
+    { "Epsilon",       917 },
+    { "Eta",           919 },
+    { "Euml",          203 },
+    { "Gamma",         915 },
+    { "Iacute",                205 },
+    { "Icirc",         206 },
+    { "Igrave",                204 },
+    { "Iota",          921 },
+    { "Iuml",          207 },
+    { "Kappa",         922 },
+    { "Lambda",                923 },
+    { "Mu",            924 },
+    { "Ntilde",                209 },
+    { "Nu",            925 },
+    { "OElig",         338 },
+    { "Oacute",                211 },
+    { "Ocirc",         212 },
+    { "Ograve",                210 },
+    { "Omega",         937 },
+    { "Omicron",       927 },
+    { "Oslash",                216 },
+    { "Otilde",                213 },
+    { "Ouml",          214 },
+    { "Phi",           934 },
+    { "Pi",            928 },
+    { "Prime",         8243 },
+    { "Psi",           936 },
+    { "Rho",           929 },
+    { "Scaron",                352 },
+    { "Sigma",         931 },
+    { "THORN",         222 },
+    { "Tau",           932 },
+    { "Theta",         920 },
+    { "Uacute",                218 },
+    { "Ucirc",         219 },
+    { "Ugrave",                217 },
+    { "Upsilon",       933 },
+    { "Uuml",          220 },
+    { "Xi",            926 },
+    { "Yacute",                221 },
+    { "Yuml",          376 },
+    { "Zeta",          918 },
+    { "aacute",                225 },
+    { "acirc",         226 },
+    { "acute",         180 },
+    { "aelig",         230 },
+    { "agrave",                224 },
+    { "alefsym",       8501 },
+    { "alpha",         945 },
+    { "amp",           '&' },
+    { "and",           8743 },
+    { "ang",           8736 },
+    { "apos",           '\'' },
+    { "aring",         229 },
+    { "asymp",         8776 },
+    { "atilde",                227 },
+    { "auml",          228 },
+    { "bdquo",         8222 },
+    { "beta",          946 },
+    { "brkbar",                166 },
+    { "brvbar",                166 },
+    { "bull",          8226 },
+    { "cap",           8745 },
+    { "ccedil",                231 },
+    { "cedil",         184 },
+    { "cent",          162 },
+    { "chi",           967 },
+    { "circ",          710 },
+    { "clubs",         9827 },
+    { "cong",          8773 },
+    { "copy",          169 },
+    { "crarr",         8629 },
+    { "cup",           8746 },
+    { "curren",                164 },
+    { "dArr",          8659 },
+    { "dagger",                8224 },
+    { "darr",          8595 },
+    { "deg",           176 },
+    { "delta",         948 },
+    { "diams",         9830 },
+    { "die",           168 },
+    { "divide",                247 },
+    { "eacute",                233 },
+    { "ecirc",         234 },
+    { "egrave",                232 },
+    { "empty",         8709 },
+    { "emsp",          8195 },
+    { "ensp",          8194 },
+    { "epsilon",       949 },
+    { "equiv",         8801 },
+    { "eta",           951 },
+    { "eth",           240 },
+    { "euml",          235 },
+    { "euro",          8364 },
+    { "exist",         8707 },
+    { "fnof",          402 },
+    { "forall",                8704 },
+    { "frac12",                189 },
+    { "frac14",                188 },
+    { "frac34",                190 },
+    { "frasl",         8260 },
+    { "gamma",         947 },
+    { "ge",            8805 },
+    { "gt",            '>' },
+    { "hArr",          8660 },
+    { "harr",          8596 },
+    { "hearts",                9829 },
+    { "hellip",                8230 },
+    { "hibar",         175 },
+    { "iacute",                237 },
+    { "icirc",         238 },
+    { "iexcl",         161 },
+    { "igrave",                236 },
+    { "image",         8465 },
+    { "infin",         8734 },
+    { "int",           8747 },
+    { "iota",          953 },
+    { "iquest",                191 },
+    { "isin",          8712 },
+    { "iuml",          239 },
+    { "kappa",         954 },
+    { "lArr",          8656 },
+    { "lambda",                955 },
+    { "lang",          9001 },
+    { "laquo",         171 },
+    { "larr",          8592 },
+    { "lceil",         8968 },
+    { "ldquo",         8220 },
+    { "le",            8804 },
+    { "lfloor",                8970 },
+    { "lowast",                8727 },
+    { "loz",           9674 },
+    { "lrm",           8206 },
+    { "lsaquo",                8249 },
+    { "lsquo",         8216 },
+    { "lt",            '<' },
+    { "macr",          175 },
+    { "mdash",         8212 },
+    { "micro",         181 },
+    { "middot",                183 },
+    { "minus",         8722 },
+    { "mu",            956 },
+    { "nabla",         8711 },
+    { "nbsp",          160 },
+    { "ndash",         8211 },
+    { "ne",            8800 },
+    { "ni",            8715 },
+    { "not",           172 },
+    { "notin",         8713 },
+    { "nsub",          8836 },
+    { "ntilde",                241 },
+    { "nu",            957 },
+    { "oacute",                243 },
+    { "ocirc",         244 },
+    { "oelig",         339 },
+    { "ograve",                242 },
+    { "oline",         8254 },
+    { "omega",         969 },
+    { "omicron",       959 },
+    { "oplus",         8853 },
+    { "or",            8744 },
+    { "ordf",          170 },
+    { "ordm",          186 },
+    { "oslash",                248 },
+    { "otilde",                245 },
+    { "otimes",                8855 },
+    { "ouml",          246 },
+    { "para",          182 },
+    { "part",          8706 },
+    { "permil",                8240 },
+    { "perp",          8869 },
+    { "phi",           966 },
+    { "pi",            960 },
+    { "piv",           982 },
+    { "plusmn",                177 },
+    { "pound",         163 },
+    { "prime",         8242 },
+    { "prod",          8719 },
+    { "prop",          8733 },
+    { "psi",           968 },
+    { "quot",          '\"' },
+    { "rArr",          8658 },
+    { "radic",         8730 },
+    { "rang",          9002 },
+    { "raquo",         187 },
+    { "rarr",          8594 },
+    { "rceil",         8969 },
+    { "rdquo",         8221 },
+    { "real",          8476 },
+    { "reg",           174 },
+    { "rfloor",                8971 },
+    { "rho",           961 },
+    { "rlm",           8207 },
+    { "rsaquo",                8250 },
+    { "rsquo",         8217 },
+    { "sbquo",         8218 },
+    { "scaron",                353 },
+    { "sdot",          8901 },
+    { "sect",          167 },
+    { "shy",           173 },
+    { "sigma",         963 },
+    { "sigmaf",                962 },
+    { "sim",           8764 },
+    { "spades",                9824 },
+    { "sub",           8834 },
+    { "sube",          8838 },
+    { "sum",           8721 },
+    { "sup",           8835 },
+    { "sup1",          185 },
+    { "sup2",          178 },
+    { "sup3",          179 },
+    { "supe",          8839 },
+    { "szlig",         223 },
+    { "tau",           964 },
+    { "there4",                8756 },
+    { "theta",         952 },
+    { "thetasym",      977 },
+    { "thinsp",                8201 },
+    { "thorn",         254 },
+    { "tilde",         732 },
+    { "times",         215 },
+    { "trade",         8482 },
+    { "uArr",          8657 },
+    { "uacute",                250 },
+    { "uarr",          8593 },
+    { "ucirc",         251 },
+    { "ugrave",                249 },
+    { "uml",           168 },
+    { "upsih",         978 },
+    { "upsilon",       965 },
+    { "uuml",          252 },
+    { "weierp",                8472 },
+    { "xi",            958 },
+    { "yacute",                253 },
+    { "yen",           165 },
+    { "yuml",          255 },
+    { "zeta",          950 },
+    { "zwj",           8205 },
+    { "zwnj",          8204 }
+  };
+
+
+ /*
+  * Do a binary search for the named entity...
+  */
+
+  first = 0;
+  last  = (int)(sizeof(entities) / sizeof(entities[0]) - 1);
+
+  while ((last - first) > 1)
+  {
+    current = (first + last) / 2;
+
+    if ((diff = strcmp(name, entities[current].name)) == 0)
+      return (entities[current].val);
+    else if (diff < 0)
+      last = current;
+    else
+      first = current;
+  }
+
+ /*
+  * If we get here, there is a small chance that there is still
+  * a match; check first and last...
+  */
+
+  if (!strcmp(name, entities[first].name))
+    return (entities[first].val);
+  else if (!strcmp(name, entities[last].name))
+    return (entities[last].val);
+  else
+    return (-1);
+}
+
+
+/*
+ * End of "$Id: mxml-entity.c 408 2010-09-19 05:26:46Z mike $".
+ */
diff --git a/daemon/mxml/mxml-file.c b/daemon/mxml/mxml-file.c
new file mode 100644 (file)
index 0000000..9927040
--- /dev/null
@@ -0,0 +1,3080 @@
+/*
+ * "$Id: mxml-file.c 438 2011-03-24 05:47:51Z mike $"
+ *
+ * File loading code for Mini-XML, a small XML-like file parsing library.
+ *
+ * Copyright 2003-2011 by Michael R Sweet.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Michael R Sweet and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "COPYING"
+ * which should have been included with this file.  If this file is
+ * missing or damaged, see the license at:
+ *
+ *     http://www.minixml.org/
+ *
+ * Contents:
+ *
+ *   mxmlLoadFd()            - Load a file descriptor into an XML node tree.
+ *   mxmlLoadFile()          - Load a file into an XML node tree.
+ *   mxmlLoadString()        - Load a string into an XML node tree.
+ *   mxmlSaveAllocString()   - Save an XML tree to an allocated string.
+ *   mxmlSaveFd()            - Save an XML tree to a file descriptor.
+ *   mxmlSaveFile()          - Save an XML tree to a file.
+ *   mxmlSaveString()        - Save an XML node tree to a string.
+ *   mxmlSAXLoadFd()         - Load a file descriptor into an XML node tree
+ *                             using a SAX callback.
+ *   mxmlSAXLoadFile()       - Load a file into an XML node tree
+ *                             using a SAX callback.
+ *   mxmlSAXLoadString()     - Load a string into an XML node tree
+ *                             using a SAX callback.
+ *   mxmlSetCustomHandlers() - Set the handling functions for custom data.
+ *   mxmlSetErrorCallback()  - Set the error message callback.
+ *   mxmlSetWrapMargin()     - Set the wrap margin when saving XML data.
+ *   mxml_add_char()         - Add a character to a buffer, expanding as needed.
+ *   mxml_fd_getc()          - Read a character from a file descriptor.
+ *   mxml_fd_putc()          - Write a character to a file descriptor.
+ *   mxml_fd_read()          - Read a buffer of data from a file descriptor.
+ *   mxml_fd_write()         - Write a buffer of data to a file descriptor.
+ *   mxml_file_getc()        - Get a character from a file.
+ *   mxml_file_putc()        - Write a character to a file.
+ *   mxml_get_entity()       - Get the character corresponding to an entity...
+ *   mxml_load_data()        - Load data into an XML node tree.
+ *   mxml_parse_element()    - Parse an element for any attributes...
+ *   mxml_string_getc()      - Get a character from a string.
+ *   mxml_string_putc()      - Write a character to a string.
+ *   mxml_write_name()       - Write a name string.
+ *   mxml_write_node()       - Save an XML node to a file.
+ *   mxml_write_string()     - Write a string, escaping & and < as needed.
+ *   mxml_write_ws()         - Do whitespace callback...
+ */
+
+/*
+ * Include necessary headers...
+ */
+
+#ifndef WIN32
+#  include <unistd.h>
+#endif /* !WIN32 */
+#include "mxml-private.h"
+
+
+/*
+ * Character encoding...
+ */
+
+#define ENCODE_UTF8    0               /* UTF-8 */
+#define ENCODE_UTF16BE 1               /* UTF-16 Big-Endian */
+#define ENCODE_UTF16LE 2               /* UTF-16 Little-Endian */
+
+
+/*
+ * Macro to test for a bad XML character...
+ */
+
+#define mxml_bad_char(ch) ((ch) < ' ' && (ch) != '\n' && (ch) != '\r' && (ch) != '\t')
+
+
+/*
+ * Types and structures...
+ */
+
+typedef int (*_mxml_getc_cb_t)(void *, int *);
+typedef int (*_mxml_putc_cb_t)(int, void *);
+
+typedef struct _mxml_fdbuf_s           /**** File descriptor buffer ****/
+{
+  int          fd;                     /* File descriptor */
+  unsigned char        *current,               /* Current position in buffer */
+               *end,                   /* End of buffer */
+               buffer[8192];           /* Character buffer */
+} _mxml_fdbuf_t;
+
+
+/*
+ * Local functions...
+ */
+
+static int             mxml_add_char(int ch, char **ptr, char **buffer,
+                                     int *bufsize);
+static int             mxml_fd_getc(void *p, int *encoding);
+static int             mxml_fd_putc(int ch, void *p);
+static int             mxml_fd_read(_mxml_fdbuf_t *buf);
+static int             mxml_fd_write(_mxml_fdbuf_t *buf);
+static int             mxml_file_getc(void *p, int *encoding);
+static int             mxml_file_putc(int ch, void *p);
+static int             mxml_get_entity(mxml_node_t *parent, void *p,
+                                       int *encoding,
+                                       _mxml_getc_cb_t getc_cb);
+static inline int      mxml_isspace(int ch)
+                       {
+                         return (ch == ' ' || ch == '\t' || ch == '\r' ||
+                                 ch == '\n');
+                       }
+static mxml_node_t     *mxml_load_data(mxml_node_t *top, void *p,
+                                       mxml_load_cb_t cb,
+                                       _mxml_getc_cb_t getc_cb,
+                                        mxml_sax_cb_t sax_cb, void *sax_data);
+static int             mxml_parse_element(mxml_node_t *node, void *p,
+                                          int *encoding,
+                                          _mxml_getc_cb_t getc_cb);
+static int             mxml_string_getc(void *p, int *encoding);
+static int             mxml_string_putc(int ch, void *p);
+static int             mxml_write_name(const char *s, void *p,
+                                       _mxml_putc_cb_t putc_cb);
+static int             mxml_write_node(mxml_node_t *node, void *p,
+                                       mxml_save_cb_t cb, int col,
+                                       _mxml_putc_cb_t putc_cb,
+                                       _mxml_global_t *global);
+static int             mxml_write_string(const char *s, void *p,
+                                         _mxml_putc_cb_t putc_cb);
+static int             mxml_write_ws(mxml_node_t *node, void *p, 
+                                     mxml_save_cb_t cb, int ws,
+                                     int col, _mxml_putc_cb_t putc_cb);
+
+
+/*
+ * 'mxmlLoadFd()' - Load a file descriptor into an XML node tree.
+ *
+ * The nodes in the specified file are added to the specified top node.
+ * If no top node is provided, the XML file MUST be well-formed with a
+ * single parent node like <?xml> for the entire file. The callback
+ * function returns the value type that should be used for child nodes.
+ * If MXML_NO_CALLBACK is specified then all child nodes will be either
+ * MXML_ELEMENT or MXML_TEXT nodes.
+ *
+ * The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK,
+ * MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading
+ * child nodes of the specified type.
+ */
+
+mxml_node_t *                          /* O - First node or NULL if the file could not be read. */
+mxmlLoadFd(mxml_node_t    *top,                /* I - Top node */
+           int            fd,          /* I - File descriptor to read from */
+           mxml_load_cb_t cb)          /* I - Callback function or MXML_NO_CALLBACK */
+{
+  _mxml_fdbuf_t        buf;                    /* File descriptor buffer */
+
+
+ /*
+  * Initialize the file descriptor buffer...
+  */
+
+  buf.fd      = fd;
+  buf.current = buf.buffer;
+  buf.end     = buf.buffer;
+
+ /*
+  * Read the XML data...
+  */
+
+  return (mxml_load_data(top, &buf, cb, mxml_fd_getc, MXML_NO_CALLBACK, NULL));
+}
+
+
+/*
+ * 'mxmlLoadFile()' - Load a file into an XML node tree.
+ *
+ * The nodes in the specified file are added to the specified top node.
+ * If no top node is provided, the XML file MUST be well-formed with a
+ * single parent node like <?xml> for the entire file. The callback
+ * function returns the value type that should be used for child nodes.
+ * If MXML_NO_CALLBACK is specified then all child nodes will be either
+ * MXML_ELEMENT or MXML_TEXT nodes.
+ *
+ * The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK,
+ * MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading
+ * child nodes of the specified type.
+ */
+
+mxml_node_t *                          /* O - First node or NULL if the file could not be read. */
+mxmlLoadFile(mxml_node_t    *top,      /* I - Top node */
+             FILE           *fp,       /* I - File to read from */
+             mxml_load_cb_t cb)                /* I - Callback function or MXML_NO_CALLBACK */
+{
+ /*
+  * Read the XML data...
+  */
+
+  return (mxml_load_data(top, fp, cb, mxml_file_getc, MXML_NO_CALLBACK, NULL));
+}
+
+
+/*
+ * 'mxmlLoadString()' - Load a string into an XML node tree.
+ *
+ * The nodes in the specified string are added to the specified top node.
+ * If no top node is provided, the XML string MUST be well-formed with a
+ * single parent node like <?xml> for the entire string. The callback
+ * function returns the value type that should be used for child nodes.
+ * If MXML_NO_CALLBACK is specified then all child nodes will be either
+ * MXML_ELEMENT or MXML_TEXT nodes.
+ *
+ * The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK,
+ * MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading
+ * child nodes of the specified type.
+ */
+
+mxml_node_t *                          /* O - First node or NULL if the string has errors. */
+mxmlLoadString(mxml_node_t    *top,    /* I - Top node */
+               const char     *s,      /* I - String to load */
+               mxml_load_cb_t cb)      /* I - Callback function or&nbs