Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 1365 → Rev 1364

/demos/trunk/newtrace/utils/isolation.c
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;
 
}
 
/demos/trunk/newtrace/utils/list.c
28,7 → 28,7
 
char buffer[READ_BUFFER+DELTA_BUFFER];
void *p, *last;
int n,delta,size;
int n,i,delta,size;
 
unsigned long long ev = 0;
 
54,21 → 54,32
 
p = buffer;
 
while ((unsigned int)(p) + 16 <= (unsigned int)(buffer + READ_BUFFER) &&
(unsigned int)(p) + 16 <= (unsigned int)(buffer + n + delta)) {
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)) {
 
printf("%08d Type = %02x ",(unsigned int)ev,*(unsigned short int *)(p));
printf("%08d Type = %02x ",(unsigned int)ev,*(unsigned char *)(p));
printf("TSC = %08x:%08x",*(unsigned int *)(p+4),*(unsigned int *)(p+9));
printf("TSC = %08x:%08x",*(unsigned int *)(p+1),*(unsigned int *)(p+5));
 
size = 16;
size = *(unsigned char *)(p+9);
 
printf(" Par1 = %d",*(unsigned short int *)(p+2));
printf(" Par2 = %d\n",*(unsigned int *)(p+12));
if (*(unsigned char *)(p) == 0x6e) {
exit(2);
}
 
size -= 10;
i = 0;
while (size > 0) {
printf(" Par%d = %d",i,*(unsigned int *)(p+10+i*4));
i++;
size -= 4;
}
 
printf("\n");
 
ev++;
p += 16;
p += *(unsigned char *)(p+9);
 
if ((unsigned int)(p) + 10 > (unsigned int)(buffer + n + delta)) break;
 
/demos/trunk/newtrace/utils/makefile
10,9 → 10,9
 
all:
@echo Targets: util_dos util_linux clean
@echo Note: udpdump and list are available only under linux
@echo Note: udpdump is available only under linux
 
util_linux: udpdump list
util_linux: udpdump list isolation
 
udpdump: udpdump.c
gcc -Wimplicit-function-declaration -Wall -ggdb\
22,7 → 22,11
gcc -Wimplicit-function-declaration -Wall -ggdb\
-I$(BASE)/include/trace -I$(BASE)/oslib list.c -o list
 
isolation: isolation.c
gcc -Wimplicit-function-declaration -Wall -ggdb\
-I$(BASE)/include/trace -I$(BASE)/oslib isolation.c -o isolation
 
clean:
rm -rf *.o udpdump list
rm -rf *.o udpdump list isolation