Pristine Ack-5.5
[Ack-5.5.git] / doc / em / int / emdmp.c
1 /* $Id: emdmp.c,v 1.3 1994/06/24 10:03:31 ceriel Exp $ */
2 /*
3  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
4  * See the copyright notice in the ACK home directory, in the file "Copyright".
5  *
6  */
7
8 /* Author: E.G. Keizer */
9
10 /* Print a readable version of the data in the post mortem dump */
11 /* dmpc [-s] [-dn,m] [file] */
12
13 #include <local.h>
14 #include <stdio.h>
15 #include <ctype.h>
16
17 int dflag = 0 ;
18 long l_low,l_high;
19
20 int sflag;
21
22 int wsize,asize;
23 long tsize,dsize;
24 long ignmask,uerrorproc,cause;
25 long pc,sp,lb,hp,pd,pb;
26
27 char *cstr[] = {
28         "Array bound error",
29         "Range bound error",
30         "Set error",
31         "Integer overflow",
32         "Float overflow",
33         "Float underflow",
34         "Divide by 0",
35         "Divide by 0.0",
36         "Integer undefined",
37         "Float undefined",
38         "Conversion error",
39         "User error 11",
40         "User error 12",
41         "User error 13",
42         "User error 14",
43         "User error 15",
44         "Stack overflow",
45         "Heap overflow",
46         "Illegal instruction",
47         "Illegal size parameter",
48         "Case error",
49         "Memory fault",
50         "Illegal pointer",
51         "Illegal pc",
52         "Bad argument of LAE",
53         "Bad monitor call",
54         "Bad line number",
55         "GTO descriptor error"
56 };
57
58 FILE *fcore;
59 char *core = "core" ;
60 int nbyte=0;
61
62 char *pname;
63
64 int readbyte();
65 int read2();
66 long readaddr();
67 long readword();
68 unsigned getbyte();
69 long getword();
70 long getaddr();
71
72 main(argc,argv) char **argv;
73 {
74         register i ;
75         long line,fileaddr;
76         char tok ;
77
78         scanargs(argc,argv); fcore=fopen(core,"r") ;
79         if ( fcore==NULL ) fatal("Can't open %s",core) ;
80
81         if ( read2()!=010255 ) fatal("not a post mortem dump");
82         if ( read2()!=VERSION ) fatal("wrong version dump file");
83         wsize=read2(); asize=read2();
84         if ( wsize>4 ) fatal("cannot handle word size %d",wsize) ;
85         if ( asize>4 ) fatal("cannot handle pointer size %d",asize) ;
86         tsize=readaddr(); dsize=readaddr();
87         ignmask=readaddr(); uerrorproc=readaddr(); cause=readaddr();
88         pc=readaddr(); sp=readaddr(); lb=readaddr(); hp=readaddr();
89         pd=readaddr(); pb=readaddr();
90         if ( sflag==0 ) {
91                 line=getword(0L);
92                 fileaddr=getaddr(4L);
93                 if ( fileaddr ) {
94                         for ( i=0 ; i<40 ; i++ ) {
95                                 tok=getbyte(fileaddr++) ;
96                                 if ( !isprint(tok) ) break ;
97                                 putc(tok,stdout);
98                         }
99                         printf(" ");
100                 }
101                 if ( line ) {
102                         printf("line %ld",line) ;
103                 }
104                 if ( fileaddr || line ) printf(", ");
105                 fseek(fcore,512L,0);
106
107                 if ( cause>27 ) {
108                         printn("cause",cause) ;
109                 } else {
110                         prints("cause",cstr[(int)cause]);
111                 }
112                 printn("pc",pc);printn("sp",sp);printn("lb",lb);
113                 printn("hp",hp);
114                 if ( pd ) printn("pd",pd) ;
115                 if ( pb ) printn("pb",pb) ;
116                 printn("errproc",uerrorproc) ;
117                 printn("ignmask",ignmask) ;
118                 if ( tsize ) printn("Text size",tsize) ;
119                 if ( dsize ) printn("Data size",dsize) ;
120         }
121         if ( dflag==0 ) exit(0);
122         fatal("d-flag not implemeted (yet)");
123         exit(1) ;
124 }
125
126 scanargs(argc,argv) char **argv ; {
127         pname=argv[0];
128         while ( argv++, argc-- > 1 ) {
129                 switch( argv[0][0] ) {
130                 case '-':    switch( argv[0][1] ) {
131                                 case 's':    sflag++ ; break ;
132                                 case 'l':    dflag++ ; break ;
133                                 default : fatal(": [-s] [-ln.m] [file]") ;
134                         } ;
135                         break ;
136                 default :core=argv[0] ;
137                 }
138         }
139 }
140
141 prints(s1,s2) char *s1,*s2; {
142         printf("%-15s %s\n",s1,s2);
143 }
144
145 printn(s1,d) char *s1; long d; {
146         printf("%-15s %15ld\n",s1,d);
147 }
148
149 /* VARARGS1 */
150 fatal(s1,p1,p2,p3,p4,p5) char *s1 ; {
151         fprintf(stderr,"%s: ",pname);
152         fprintf(stderr,s1,p1,p2,p3,p4,p5) ;
153         fprintf(stderr,"\n") ;
154         exit(1) ;
155 }
156
157 int getb() {
158         int i ;
159         i=getc(fcore) ;
160         if ( i==EOF ) fatal("Premature EOF");
161         return i&0377 ;
162 }
163
164 int read2() {
165         int i ;
166         i=getb() ; return getb()*256 + i ;
167 }
168
169 long readaddr() {
170         long res ;
171         register int i ;
172
173         res=0 ;
174         for (i=0 ; i<asize ; i++ ) res |= getb()<<(8*i) ;
175         return res ;
176 }
177
178 long readword() {
179         long res ;
180         register int i ;
181
182         res=0 ;
183         for (i=0 ; i<wsize ; i++ ) res |= getb()<<(8*i) ;
184         return res ;
185 }
186
187 unsigned getbyte(a) long a ; {
188         fseek(fcore,a+512,0) ;
189         return getb() ;
190 }
191
192 long getword(a) long a ; {
193         fseek(fcore,a+512,0) ;
194         return readword() ;
195 }
196
197 long getaddr(a) long a ; {
198         fseek(fcore,a+512,0) ;
199         return readaddr() ;
200 }