Commit 741e875f authored by Manuel Mohr's avatar Manuel Mohr
Browse files

Write and read FIRM profiling information in little-endian format.

parent 16eeacf0
...@@ -510,8 +510,9 @@ static unsigned int * ...@@ -510,8 +510,9 @@ static unsigned int *
parse_profile(const char *filename, unsigned int num_blocks) parse_profile(const char *filename, unsigned int num_blocks)
{ {
unsigned int *result = NULL; unsigned int *result = NULL;
char buf[8]; char buf[8];
size_t ret; size_t ret;
unsigned int i;
FILE *f = fopen(filename, "rb"); FILE *f = fopen(filename, "rb");
if (!f) { if (!f) {
...@@ -527,9 +528,22 @@ parse_profile(const char *filename, unsigned int num_blocks) ...@@ -527,9 +528,22 @@ parse_profile(const char *filename, unsigned int num_blocks)
} }
result = XMALLOCN(unsigned int, num_blocks); result = XMALLOCN(unsigned int, num_blocks);
if (fread(result, sizeof(unsigned int) * num_blocks, 1, f) < 1) {
/* The profiling output format is defined to be a sequence of integer
* values stored little endian format. */
for (i = 0; i < num_blocks; ++i) {
char bytes[4];
if ((ret = fread(bytes, 4, 1, f)) < 1)
break;
result[i] = (bytes[0] << 0) | (bytes[1] << 8)
| (bytes[2] << 16) | (bytes[3] << 24);
}
if (ret < 1) {
DBG((dbg, LEVEL_4, "Failed to read counters... (size: %u)\n", DBG((dbg, LEVEL_4, "Failed to read counters... (size: %u)\n",
sizeof(unsigned int) * num_blocks)); sizeof(unsigned int) * num_blocks));
xfree(result); xfree(result);
result = NULL; result = NULL;
} }
......
...@@ -19,17 +19,39 @@ typedef struct _profile_counter_t { ...@@ -19,17 +19,39 @@ typedef struct _profile_counter_t {
static profile_counter_t *counters = NULL; static profile_counter_t *counters = NULL;
/**
* Write counter values to profiling output file.
* We define our output format to be a sequence of 32-bit unsigned integer
* values stored in little endian format.
*/
void write_little_endian(unsigned *counter, unsigned len, FILE *f)
{
unsigned i;
for (i = 0; i < len; ++i) {
unsigned v = counter[i];
char bytes[4];
bytes[0] = ((v >> 0) & 0xff);
bytes[1] = ((v >> 8) & 0xff);
bytes[2] = ((v >> 16) & 0xff);
bytes[3] = ((v >> 24) & 0xff);
fwrite(bytes, 4, 1, f);
}
}
static void write_profiles(void) static void write_profiles(void)
{ {
profile_counter_t *counter = counters; profile_counter_t *counter = counters;
while(counter != NULL) { while (counter != NULL) {
profile_counter_t *next = counter->next; profile_counter_t *next = counter->next;
FILE *f = fopen(counter->filename, "wb"); FILE *f = fopen(counter->filename, "wb");
if (f == NULL) { if (f == NULL) {
perror("Warning: couldn't open file for writing profiling data"); perror("Warning: couldn't open file for writing profiling data");
} else { } else {
fputs("firmprof", f); fputs("firmprof", f);
fwrite(counter->counters, counter->len * sizeof(unsigned), 1, f); write_little_endian(counter->counters, counter->len, f);
fclose(f); fclose(f);
} }
free(counter); free(counter);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment