This source file includes following definitions.
- usage
- dump_error_table_dry
- dump_error_table_vx
- process_dump_dry
- process_dump_vx
- main
1
2
3
4
5 #include <stdio.h>
6 #include <stdint.h>
7 #include <string.h>
8 #include <stdlib.h>
9 #include "dumputil.h"
10
11 void usage()
12 {
13 fprintf(stderr,"extract_error_table [-vxworks] <dumpfile.bin> <base address>\n");
14 exit(1);
15 }
16
17 void dump_error_table_dry(dump_t *dump,unsigned index)
18 {
19 int i;
20 for(i=index; i < dump->words - 2 && dump->pw[i+1]; i+=2) {
21 printf("E%02d %02d %s\n",(short)(dump->pw[i] >> 16),dump->pw[i]&0xFFFF,deref_string_ptr(dump,(i+1)*4));
22 }
23 }
24
25 void dump_error_table_vx(dump_t *dump,unsigned index)
26 {
27 int i;
28 for(i=index; i < dump->words - 2 && dump->pw[i+1]; i+=2) {
29 printf("E%02d %s\n",dump->pw[i+1],deref_string_ptr(dump,i*4));
30 }
31 }
32
33 int process_dump_dry(dump_t *dump)
34 {
35 const char *sig_str="NoError";
36 unsigned mark_offset=0;
37 unsigned mark_addr=0;
38 unsigned i;
39 while(find_cstring(dump,&mark_offset,sig_str)) {
40 mark_addr=offset_to_ptr(dump,mark_offset);
41 i=0;
42 while(find_word_aligned(dump,&i,mark_addr)) {
43 if( dump->pw[i-1] == 0) {
44 printf("error_table 0x%X\n",(i-1)*4+dump->base);
45 dump_error_table_dry(dump,i-1);
46 return 1;
47 }
48 i++;
49 }
50 mark_offset += strlen(sig_str);
51 }
52 if(!mark_offset) {
53 fprintf(stderr,"error: \"%s\" not found\n",sig_str);
54 }
55 else {
56 fprintf(stderr,"error: error table not found\n");
57 }
58 return 0;
59 }
60
61 int process_dump_vx(dump_t *dump)
62 {
63 const char *sig_str="BrtDrv.TimeOutPreBvInteg";
64 unsigned mark_offset=0;
65 unsigned mark_addr=0;
66 unsigned i;
67 while(find_cstring(dump,&mark_offset,sig_str)) {
68 mark_addr=offset_to_ptr(dump,mark_offset);
69 i=0;
70 while(find_word_aligned(dump,&i,mark_addr)) {
71 if( dump->pw[i+1] == 1) {
72 printf("error_table 0x%X\n",i*4+dump->base);
73 dump_error_table_vx(dump,i);
74 return 1;
75 }
76 i++;
77 }
78 mark_offset += strlen(sig_str);
79 }
80 if(!mark_offset) {
81 fprintf(stderr,"error: \"%s\" not found\n",sig_str);
82 }
83 else {
84 fprintf(stderr,"error: error table not found\n");
85 }
86 return 0;
87 }
88
89
90 int main(int argc, char **argv)
91 {
92
93 dump_t dump;
94 int i;
95 const char *dumpname=NULL;
96 const char *base=NULL;
97 int opt_vxworks = 0;
98
99 for(i = 1; i < argc; i++) {
100 if ( strcmp(argv[i],"-vxworks") == 0 ) {
101 opt_vxworks = 1;
102 } else if ( argv[i][0] == '-' ) {
103 fprintf(stderr,"%s unknown option %s\n",argv[0],argv[i]);
104 usage();
105 }
106 else {
107 if (!dumpname) {
108 dumpname=argv[i];
109 } else if(!base) {
110 base=argv[i];
111 } else {
112 fprintf(stderr,"%s unexpected %s\n",argv[0],argv[i]);
113 usage();
114 }
115 }
116 }
117 if(!dumpname || !base) {
118 usage();
119 }
120
121 if(!load_dump(dumpname,base,&dump))
122 return 1;
123
124 int r;
125 if(opt_vxworks) {
126 r=process_dump_vx(&dump);
127 } else {
128 r=process_dump_dry(&dump);
129 }
130 if(!r) {
131 return 1;
132 }
133 return 0;
134 }