Mercurial > ecos
diff packages/kernel/current/host/instr/dump_instr.c @ 182:f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
| author | jlarmour |
|---|---|
| date | Wed, 12 Sep 2001 00:59:17 +0000 |
| parents | |
| children | 022f1e506033 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/kernel/current/host/instr/dump_instr.c @@ -0,0 +1,105 @@ + +#include <pkgconf/kernel.h> +#include <cyg/kernel/ktypes.h> // base kernel types +#include <cyg/kernel/instrmnt.h> + +#include <stdio.h> +#include <stdlib.h> + +// ------------------------------------------------------------------------- +// Instrumentation record. + +struct Instrument_Record +{ + CYG_WORD16 type; // record type + CYG_WORD16 thread; // current thread id + CYG_WORD timestamp; // 32 bit timestamp + CYG_WORD arg1; // first arg + CYG_WORD arg2; // second arg +}; + +// ------------------------------------------------------------------------- + +#ifdef CYGDBG_KERNEL_INSTRUMENT_MSGS +#include <cyg/kernel/instrument_desc.h> +#define NELEM(x) (sizeof(x)/sizeof*(x)) +externC char * cyg_instrument_msg(CYG_WORD16 type) { + + struct instrument_desc_s *record; + struct instrument_desc_s *end_record; + CYG_WORD cl, event; + + record = instrument_desc; + end_record = &instrument_desc[NELEM(instrument_desc)]; + cl = type & 0xff00; + event = type & 0x00ff; + + while ((record != end_record) && (record->num != cl)) { + record++; + } + + if (record->num == cl) { + record++; + while ((record != end_record) && (record->num != event) && + (record->num < 0xff)) { + record++; + } + + if (record->num == event) { + return (record->msg); + } + } + return("Unknown event"); +} +#endif // CYGDBG_KERNEL_INSTRUMENT_MSGS + +void usage(char *myname) +{ + fprintf(stderr,"Usage: %s <filename>\n",myname); + fprintf(stderr,"where filename is that of the instrumentation data"); +} + +int main(int argc, char * argv[]) +{ + + FILE * file; + char * filename; + struct Instrument_Record record; + int cnt=0; + + if (argc != 1) { + usage(argv[0]); + exit(1); + } + + filename = argv[1]; + + file = fopen(filename, "r"); + if (!file) { + fprintf(stderr,"Error opening file %s: ",filename); + perror(""); + exit(1); + } + + while (!feof(file)) { + fread(&record,sizeof(record),1,file); + if (record.type == 0) { + break; + } + +#ifdef CYGDBG_KERNEL_INSTRUMENT_MSGS + printf("%4d Record type (0x%04x): %-20s thread %2d, ", + cnt++,record.type,cyg_instrument_msg(record.type), + record.thread); +#else + printf("%4d Record type 0x%04x, thread %2d, ", + cnt++,record.type, record.thread); +#endif + printf("time %5d, arg1 0x%08x, arg2 0x%08x\n", + record.timestamp, record.arg1, + record.arg2); + } + + fclose(file); + return (0); +}
