summaryrefslogtreecommitdiffstats
path: root/tester/covoar/CoverageReaderRTEMS.cc
diff options
context:
space:
mode:
authorChris Johns <chrisj@rtems.org>2014-05-09 21:50:37 +1000
committerChris Johns <chrisj@rtems.org>2014-06-18 16:48:08 +1200
commit100f517ab37265acdf067e36b6860020ec8b2184 (patch)
tree2316c8b888e11dcbcfbfc66a0c1e31991ea20656 /tester/covoar/CoverageReaderRTEMS.cc
parent4.11: Add ntp patch. (diff)
downloadrtems-tools-100f517ab37265acdf067e36b6860020ec8b2184.tar.bz2
covoar: Merger the covoar source from rtems-testing.git.
Use waf to build covoar.
Diffstat (limited to 'tester/covoar/CoverageReaderRTEMS.cc')
-rw-r--r--tester/covoar/CoverageReaderRTEMS.cc108
1 files changed, 108 insertions, 0 deletions
diff --git a/tester/covoar/CoverageReaderRTEMS.cc b/tester/covoar/CoverageReaderRTEMS.cc
new file mode 100644
index 0000000..8439c41
--- /dev/null
+++ b/tester/covoar/CoverageReaderRTEMS.cc
@@ -0,0 +1,108 @@
+/*! @file CoverageReaderRTEMS.cc
+ * @brief CoverageReaderRTEMS Implementation
+ *
+ * This file contains the implementation of the functions supporting
+ * reading the RTEMS coverage data files.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+
+#include "CoverageReaderRTEMS.h"
+#include "CoverageMap.h"
+#include "ExecutableInfo.h"
+#include "rtemscov_header.h"
+
+namespace Coverage {
+
+ CoverageReaderRTEMS::CoverageReaderRTEMS()
+ {
+ }
+
+ CoverageReaderRTEMS::~CoverageReaderRTEMS()
+ {
+ }
+
+ void CoverageReaderRTEMS::processFile(
+ const char* const file,
+ ExecutableInfo* const executableInformation
+ )
+ {
+ CoverageMapBase* aCoverageMap = NULL;
+ uintptr_t baseAddress;
+ uint8_t cover;
+ FILE* coverageFile;
+ rtems_coverage_map_header_t header;
+ uintptr_t i;
+ uintptr_t length;
+ int status;
+
+ //
+ // Open the coverage file and read the header.
+ //
+ coverageFile = fopen( file, "r" );
+ if (!coverageFile) {
+ fprintf(
+ stderr,
+ "ERROR: CoverageReaderRTEMS::processFile - Unable to open %s\n",
+ file
+ );
+ exit( -1 );
+ }
+
+ status = fread( &header, sizeof(header), 1, coverageFile );
+ if (status != 1) {
+ fprintf(
+ stderr,
+ "ERROR: CoverageReaderRTEMS::processFile - "
+ "Unable to read header from %s\n",
+ file
+ );
+ exit( -1 );
+ }
+
+ baseAddress = header.start;
+ length = header.end - header.start;
+
+ #if 0
+ fprintf(
+ stderr,
+ "%s: 0x%08x 0x%08x 0x%08lx/%ld\n",
+ file,
+ header.start,
+ header.end,
+ (unsigned long) length,
+ (unsigned long) length
+ );
+ #endif
+
+ //
+ // Read and process each line of the coverage file.
+ //
+ for (i=0; i<length; i++) {
+ status = fread( &cover, sizeof(uint8_t), 1, coverageFile );
+ if (status != 1) {
+ fprintf(
+ stderr,
+ "CoverageReaderRTEMS::ProcessFile - breaking after 0x%08x in %s\n",
+ (unsigned int) i,
+ file
+ );
+ break;
+ }
+
+ //
+ // Obtain the coverage map containing the address and
+ // mark the address as executed.
+ //
+ if (cover) {
+ aCoverageMap = executableInformation->getCoverageMap( baseAddress + i );
+ if (aCoverageMap)
+ aCoverageMap->setWasExecuted( baseAddress + i );
+ }
+ }
+
+ fclose( coverageFile );
+ }
+}