1 /*-
2 * Copyright (c) 1980, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8 #ifndef lint
9 static char sccsid[] = "@(#)printinst.c 8.1 (Berkeley) 06/06/93";
10 #endif /* not lint */
11
12 /*
13 * decode and print the instructions
14 */
15
16 #include "defs.h"
17 #include "machine.h"
18 #include "process.h"
19 #include "pxops.h"
20 #include "optab.h"
21 #include "object.h"
22 #include "process/process.rep"
23 #include "process/pxinfo.h"
24
25 LOCAL ADDRESS printop(), docase();
26
27 /*
28 * print instructions within the given address range
29 */
30
printinst(lowaddr,highaddr)31 printinst(lowaddr, highaddr)
32 ADDRESS lowaddr;
33 ADDRESS highaddr;
34 {
35 register ADDRESS addr;
36
37 for (addr = lowaddr; addr <= highaddr; ) {
38 addr = printop(addr);
39 }
40 }
41
42 /*
43 * print the opcode at the given address, return the address
44 * of the next instruction
45 */
46
printop(addr)47 LOCAL ADDRESS printop(addr)
48 register ADDRESS addr;
49 {
50 int i;
51 PXOP op;
52 OPTAB *o;
53 char subop;
54 short arg;
55 long longarg;
56 union {
57 short i;
58 struct { char c1, c2; } opword;
59 } u;
60
61 iread(&u.i, addr, sizeof(u.i));
62 op = (PXOP) u.opword.c1;
63 subop = u.opword.c2;
64 o = &optab[op];
65 printf("%5d %s", addr, o->opname);
66 addr += sizeof(u);
67 for (i = 0; o->argtype[i] != 0; i++) {
68 if (i == 0) {
69 putchar('\t');
70 } else {
71 putchar(',');
72 }
73 switch(o->argtype[i]) {
74 case ADDR4:
75 case LWORD:
76 #ifdef tahoe
77 addr = (ADDRESS)(((int)addr + 3) & ~3);
78 #endif
79 iread(&longarg, addr, sizeof(longarg));
80 printf("%d", longarg);
81 addr += sizeof(long);
82 break;
83
84 case SUBOP:
85 printf("%d", subop);
86 break;
87
88 case ADDR2:
89 case DISP:
90 case PSUBOP:
91 case VLEN:
92 case HWORD:
93 if (i != 0 || subop == 0) {
94 iread(&arg, addr, sizeof(arg));
95 addr += sizeof(short);
96 } else {
97 arg = subop;
98 }
99 printf("%d", arg);
100 break;
101
102 case STRING: {
103 char c;
104
105 putchar('\'');
106 while (subop > 0) {
107 iread(&c, addr, sizeof(c));
108 if (c == '\0') {
109 break;
110 }
111 putchar(c);
112 subop--;
113 addr++;
114 }
115 addr++;
116 putchar('\'');
117 #ifdef tahoe
118 addr = (ADDRESS)(((int)addr + 3) & ~3);
119 #else
120 if ((addr&1) != 0) {
121 addr++;
122 }
123 #endif
124 break;
125 }
126
127 default:
128 panic("bad argtype %d", o->argtype[i]);
129 /*NOTREACHED*/
130 }
131 }
132 switch(op) {
133 case O_CON:
134 addr += arg;
135 #ifdef tahoe
136 addr = (ADDRESS)(((int)addr + 3) & ~3);
137 #endif
138 break;
139
140 case O_CASE1OP:
141 addr = docase(addr, 1, subop);
142 break;
143
144 case O_CASE2OP:
145 addr = docase(addr, 2, subop);
146 break;
147
148 case O_CASE4OP:
149 addr = docase(addr, 4, subop);
150 break;
151 }
152 putchar('\n');
153 return(addr);
154 }
155
156 /*
157 * print out the destinations and cases
158 */
159
docase(addr,size,n)160 LOCAL ADDRESS docase(addr, size, n)
161 ADDRESS addr;
162 int size;
163 int n;
164 {
165 register int i;
166 char c;
167 short arg;
168 long longarg;
169
170 iread(&arg, addr, sizeof(arg));
171 printf("\n\t%5d", arg);
172 addr += 2;
173 for (i = 1; i < n; i++) {
174 iread(&arg, addr, sizeof(arg));
175 printf(", %5d", arg);
176 addr += 2;
177 }
178 printf("\n\t");
179 for (i = 0; i < n; i++) {
180 switch(size) {
181 case 1:
182 iread(&c, addr, sizeof(c));
183 printf("%5d", c);
184 break;
185
186 case 2:
187 iread(&arg, addr, sizeof(arg));
188 printf("%5d", arg);
189 break;
190
191 case 4:
192 #ifdef tahoe
193 addr = (ADDRESS)(((int)addr + 3) & ~3);
194 #endif
195 iread(&longarg, addr, sizeof(longarg));
196 printf("%5d", longarg);
197 break;
198 }
199 addr += size;
200 if (i < n - 1) {
201 printf(", ");
202 }
203 }
204 #ifdef tahoe
205 addr = (ADDRESS)(((int)addr + 3) & ~3);
206 #else
207 if ((addr&01) == 01) {
208 addr++;
209 }
210 #endif
211 return(addr);
212 }
213