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