0,0 → 1,251 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Giacomo Guidi <giacomo@gandalf.sssup.it> |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
|
#include <stdio.h> |
#include <unistd.h> |
#include <stdlib.h> |
#include <string.h> |
|
#define READ_BUFFER 2000 |
#define DELTA_BUFFER 100 |
|
struct event_type { |
int type; |
unsigned long long tsc; |
int par[10]; |
}; |
|
struct ctx_time_type { |
int ctx; |
unsigned long long start_time; |
unsigned long long total_time; |
}; |
|
struct ctx_time_type ctx_time[256]; |
struct ctx_time_type int_time; |
unsigned long long last_time; |
int total_ctx = 0; |
int last_ctx = -1; |
|
void analyze_event(struct event_type *e) { |
|
int i; |
|
// Start interrupt |
if (e->type == 0x2b || e->type == 0x03) { |
|
if (int_time.start_time == 0) int_time.start_time = e->tsc; |
|
if (last_ctx != -1) { |
|
if (e->tsc < last_time) { |
printf("Error events sequence\n"); |
exit(2); |
} |
|
ctx_time[last_ctx].total_time += (e->tsc - last_time); |
last_time = e->tsc; |
|
} else { |
|
last_time = e->tsc; |
|
} |
|
} |
|
//End Interrupt |
if (e->type == 0x3b || e->type == 0x13) { |
|
if (int_time.start_time == 0) int_time.start_time = e->tsc; |
|
if (last_time != 0) { |
|
if (e->tsc < last_time) { |
printf("Error events sequence\n"); |
exit(2); |
} |
|
int_time.total_time += (e->tsc - last_time); |
last_time = e->tsc; |
|
} else { |
|
last_time = e->tsc; |
|
} |
|
i = 0; |
while (ctx_time[i].ctx != e->par[0] && i < total_ctx) { |
i++; |
} |
|
if (ctx_time[i].start_time == 0) { |
ctx_time[i].start_time = e->tsc; |
ctx_time[i].total_time = 0; |
ctx_time[i].ctx = e->par[0]; |
last_ctx = i; |
total_ctx++; |
} else { |
last_ctx = i; |
} |
|
} |
|
//Context Switch |
if (e->type == 0x15) { |
|
i = 0; |
while (ctx_time[i].ctx != e->par[0] && i < total_ctx) { |
i++; |
} |
|
if (ctx_time[i].start_time == 0) { |
ctx_time[i].ctx = e->par[0]; |
ctx_time[i].start_time = e->tsc; |
ctx_time[i].total_time = 0; |
|
if (e->tsc < last_time) { |
printf("Error events sequence\n"); |
exit(2); |
} |
|
if (last_ctx != -1) ctx_time[last_ctx].total_time += (e->tsc - last_time); |
|
last_time = e->tsc; |
last_ctx = i; |
total_ctx++; |
|
} else { |
|
if (e->tsc < last_time) { |
printf("Error events sequence\n"); |
exit(2); |
} |
|
if (last_ctx != -1) ctx_time[last_ctx].total_time += (e->tsc - last_time); |
last_time = e->tsc; |
last_ctx = i; |
|
} |
|
} |
|
} |
|
int main(int argc, char *argv[]) |
{ |
|
char buffer[READ_BUFFER+DELTA_BUFFER]; |
void *p, *last; |
int n,i,delta,size; |
struct event_type evt; |
|
unsigned long long ev = 0,start,stop; |
unsigned int total_simulation = 0; |
|
FILE *input_file; |
|
if (argc < 2) { |
printf("%s: Enter the input file name [%s filename]\n",argv[0],argv[0]); |
exit(1); |
} |
|
memset(ctx_time,0,sizeof(ctx_time)); |
memset(&int_time,0,sizeof(int_time)); |
total_ctx = 0; |
|
input_file = fopen(argv[1],"rb"); |
|
last = buffer + READ_BUFFER; |
|
while(!feof(input_file)) { |
|
//move remaining byte |
delta = (unsigned int)(buffer) + READ_BUFFER - (unsigned int)(last); |
if (delta > 0) memcpy(buffer,last,delta); |
|
n = fread(buffer+delta,1,READ_BUFFER+10,input_file); |
|
fseek(input_file,-(delta+10),SEEK_CUR); |
|
p = buffer; |
|
while ((unsigned int)(p) + *(unsigned char *)(p+9) <= (unsigned int)(buffer + READ_BUFFER) && |
(unsigned int)(p) + *(unsigned char *)(p+9) <= (unsigned int)(buffer + n + delta)) { |
|
evt.type = (int)(*(unsigned char *)(p)); |
evt.tsc = (unsigned long long)(*(unsigned int *)(p+1)); |
evt.tsc <<= 32; |
evt.tsc += (unsigned long long)(*(unsigned int *)(p+5)); |
|
size = *(unsigned char *)(p+9); |
|
if (evt.type == 0x20) { |
printf("Start Simulation\n"); |
start = evt.tsc; |
} |
|
if (evt.type == 0x30) { |
printf("Stop Simulation\n"); |
stop = evt.tsc; |
} |
|
size -= 10; |
i = 0; |
while (size > 0) { |
evt.par[i] = (int)(*(unsigned int *)(p+10+i*4)); |
i++; |
size -= 4; |
} |
|
ev++; |
|
analyze_event(&evt); |
|
p += *(unsigned char *)(p+9); |
|
if ((unsigned int)p + 10 > (unsigned int)(buffer + n + delta)) break; |
|
last = p; |
|
} |
|
if ((unsigned int)p + 10 > (unsigned int)(buffer + n + delta)) break; |
|
} |
|
fclose(input_file); |
|
printf("Total Time %d\n",(unsigned int)((stop-start) * 1000 / 699944)); |
|
printf("Total Ctx = %d\n",total_ctx); |
|
printf("Total Interrupt = %d\n",(unsigned int)(int_time.total_time * 1000 / 699944)); |
|
total_simulation = 0; |
for (i=0;i<total_ctx;i++) { |
printf("Total Time Ctx %d => %d\n",ctx_time[i].ctx,(unsigned int)(ctx_time[i].total_time * 1000 / 699944)); |
total_simulation += (unsigned int)(ctx_time[i].total_time * 1000 / 699944); |
} |
|
printf ("Total Simulation %d\n",total_simulation); |
|
return 0; |
|
} |
|