disasm_format.c revision 1.1.6.2 1 1.1.6.2 simonb /* $NetBSD: disasm_format.c,v 1.1.6.2 2006/04/22 11:37:35 simonb Exp $ */
2 1.1.6.2 simonb
3 1.1.6.2 simonb /*-
4 1.1.6.2 simonb * Copyright (c) 2000-2003 Marcel Moolenaar
5 1.1.6.2 simonb * All rights reserved.
6 1.1.6.2 simonb *
7 1.1.6.2 simonb * Redistribution and use in source and binary forms, with or without
8 1.1.6.2 simonb * modification, are permitted provided that the following conditions
9 1.1.6.2 simonb * are met:
10 1.1.6.2 simonb *
11 1.1.6.2 simonb * 1. Redistributions of source code must retain the above copyright
12 1.1.6.2 simonb * notice, this list of conditions and the following disclaimer.
13 1.1.6.2 simonb * 2. Redistributions in binary form must reproduce the above copyright
14 1.1.6.2 simonb * notice, this list of conditions and the following disclaimer in the
15 1.1.6.2 simonb * documentation and/or other materials provided with the distribution.
16 1.1.6.2 simonb *
17 1.1.6.2 simonb * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 1.1.6.2 simonb * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 1.1.6.2 simonb * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 1.1.6.2 simonb * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 1.1.6.2 simonb * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 1.1.6.2 simonb * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 1.1.6.2 simonb * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 1.1.6.2 simonb * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 1.1.6.2 simonb * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 1.1.6.2 simonb * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 1.1.6.2 simonb */
28 1.1.6.2 simonb
29 1.1.6.2 simonb #include "opt_ddb.h"
30 1.1.6.2 simonb
31 1.1.6.2 simonb #include <sys/cdefs.h>
32 1.1.6.2 simonb /* __FBSDID("$FreeBSD: src/sys/ia64/disasm/disasm_format.c,v 1.2 2005/01/06 22:18:22 imp Exp $"); */
33 1.1.6.2 simonb
34 1.1.6.2 simonb #include <sys/param.h>
35 1.1.6.2 simonb #include <sys/systm.h>
36 1.1.6.2 simonb
37 1.1.6.2 simonb #ifdef DDB
38 1.1.6.2 simonb
39 1.1.6.2 simonb #include <ia64/disasm/disasm_int.h>
40 1.1.6.2 simonb #include <ia64/disasm/disasm.h>
41 1.1.6.2 simonb
42 1.1.6.2 simonb /*
43 1.1.6.2 simonb * Mnemonics (keep in sync with enum asm_op).
44 1.1.6.2 simonb */
45 1.1.6.2 simonb static const char *asm_mnemonics[] = {
46 1.1.6.2 simonb "",
47 1.1.6.2 simonb "add", "addl", "addp4", "adds", "alloc", "and", "andcm",
48 1.1.6.2 simonb "br", "break", "brl", "brp", "bsw",
49 1.1.6.2 simonb "chk", "clrrrb", "cmp", "cmp4", "cmp8xchg16", "cmpxchg1", "cmpxchg2",
50 1.1.6.2 simonb "cmpxchg4", "cmpxchg8", "cover", "czx1", "czx2",
51 1.1.6.2 simonb "dep",
52 1.1.6.2 simonb "epc", "extr",
53 1.1.6.2 simonb "famax", "famin", "fand", "fandcm", "fc", "fchkf", "fclass", "fclrf",
54 1.1.6.2 simonb "fcmp", "fcvt", "fetchadd4", "fetchadd8", "flushrs", "fma", "fmax",
55 1.1.6.2 simonb "fmerge", "fmin", "fmix", "fms", "fnma", "for", "fpack", "fpamax",
56 1.1.6.2 simonb "fpamin", "fpcmp", "fpcvt", "fpma", "fpmax", "fpmerge", "fpmin",
57 1.1.6.2 simonb "fpms", "fpnma", "fprcpa", "fprsqrta", "frcpa", "frsqrta", "fselect",
58 1.1.6.2 simonb "fsetc", "fswap", "fsxt", "fwb", "fxor",
59 1.1.6.2 simonb "getf",
60 1.1.6.2 simonb "invala", "itc", "itr",
61 1.1.6.2 simonb "ld1", "ld16", "ld2", "ld4", "ld8", "ldf", "ldf8", "ldfd", "ldfe",
62 1.1.6.2 simonb "ldfp8", "ldfpd", "ldfps", "ldfs", "lfetch", "loadrs",
63 1.1.6.2 simonb "mf", "mix1", "mix2", "mix4", "mov", "movl", "mux1", "mux2",
64 1.1.6.2 simonb "nop",
65 1.1.6.2 simonb "or",
66 1.1.6.2 simonb "pack2", "pack4", "padd1", "padd2", "padd4", "pavg1", "pavg2",
67 1.1.6.2 simonb "pavgsub1", "pavgsub2", "pcmp1", "pcmp2", "pcmp4", "pmax1", "pmax2",
68 1.1.6.2 simonb "pmin1", "pmin2", "pmpy2", "pmpyshr2", "popcnt", "probe", "psad1",
69 1.1.6.2 simonb "pshl2", "pshl4", "pshladd2", "pshr2", "pshr4", "pshradd2", "psub1",
70 1.1.6.2 simonb "psub2", "psub4", "ptc", "ptr",
71 1.1.6.2 simonb "rfi", "rsm", "rum",
72 1.1.6.2 simonb "setf", "shl", "shladd", "shladdp4", "shr", "shrp", "srlz", "ssm",
73 1.1.6.2 simonb "st1", "st16", "st2", "st4", "st8", "stf", "stf8", "stfd", "stfe",
74 1.1.6.2 simonb "stfs", "sub", "sum", "sxt1", "sxt2", "sxt4", "sync",
75 1.1.6.2 simonb "tak", "tbit", "thash", "tnat", "tpa", "ttag",
76 1.1.6.2 simonb "unpack1", "unpack2", "unpack4",
77 1.1.6.2 simonb "xchg1", "xchg2", "xchg4", "xchg8", "xma", "xor",
78 1.1.6.2 simonb "zxt1", "zxt2", "zxt4"
79 1.1.6.2 simonb };
80 1.1.6.2 simonb
81 1.1.6.2 simonb /*
82 1.1.6.2 simonb * Completers (keep in sync with enum asm_cmpltr_type).
83 1.1.6.2 simonb */
84 1.1.6.2 simonb static const char *asm_completers[] = {
85 1.1.6.2 simonb "",
86 1.1.6.2 simonb ".0", ".1",
87 1.1.6.2 simonb ".a", ".acq", ".and",
88 1.1.6.2 simonb ".b", ".bias",
89 1.1.6.2 simonb ".c.clr", ".c.clr.acq", ".c.nc", ".call", ".cexit", ".cloop", ".clr",
90 1.1.6.2 simonb ".ctop",
91 1.1.6.2 simonb ".d", ".dc.dc", ".dc.nt", ".dpnt", ".dptk",
92 1.1.6.2 simonb ".e", ".eq", ".excl", ".exit", ".exp",
93 1.1.6.2 simonb ".f", ".fault", ".few", ".fill", ".fx", ".fxu",
94 1.1.6.2 simonb ".g", ".ga", ".ge", ".gt",
95 1.1.6.2 simonb ".h", ".hu",
96 1.1.6.2 simonb ".i", ".ia", ".imp",
97 1.1.6.2 simonb ".l", ".le", ".loop", ".lr", ".lt", ".ltu",
98 1.1.6.2 simonb ".m", ".many",
99 1.1.6.2 simonb ".nc", ".ne", ".neq", ".nl", ".nle", ".nlt", ".nm", ".nr", ".ns",
100 1.1.6.2 simonb ".nt.dc", ".nt.nt", ".nt.tk", ".nt1", ".nt2", ".nta", ".nz",
101 1.1.6.2 simonb ".or", ".or.andcm", ".ord",
102 1.1.6.2 simonb ".pr",
103 1.1.6.2 simonb ".r", ".raz", ".rel", ".ret", ".rw",
104 1.1.6.2 simonb ".s", ".s0", ".s1", ".s2", ".s3", ".sa", ".se", ".sig", ".spill",
105 1.1.6.2 simonb ".spnt", ".sptk", ".sss",
106 1.1.6.2 simonb ".tk.dc", ".tk.nt", ".tk.tk", ".trunc",
107 1.1.6.2 simonb ".u", ".unc", ".unord", ".uss", ".uus", ".uuu",
108 1.1.6.2 simonb ".w", ".wexit", ".wtop",
109 1.1.6.2 simonb ".x", ".xf",
110 1.1.6.2 simonb ".z"
111 1.1.6.2 simonb };
112 1.1.6.2 simonb
113 1.1.6.2 simonb void
114 1.1.6.2 simonb asm_completer(const struct asm_cmpltr *c, char *buf)
115 1.1.6.2 simonb {
116 1.1.6.2 simonb strcpy(buf, asm_completers[c->c_type]);
117 1.1.6.2 simonb }
118 1.1.6.2 simonb
119 1.1.6.2 simonb void
120 1.1.6.2 simonb asm_mnemonic(enum asm_op op, char *buf)
121 1.1.6.2 simonb {
122 1.1.6.2 simonb strcpy(buf, asm_mnemonics[(op < ASM_OP_INTERNAL_OPCODES) ? op : 0]);
123 1.1.6.2 simonb }
124 1.1.6.2 simonb
125 1.1.6.2 simonb void
126 1.1.6.2 simonb asm_operand(const struct asm_oper *o, char *buf, uint64_t ip)
127 1.1.6.2 simonb {
128 1.1.6.2 simonb const char *n;
129 1.1.6.2 simonb
130 1.1.6.2 simonb n = "";
131 1.1.6.2 simonb switch (o->o_type) {
132 1.1.6.2 simonb case ASM_OPER_AREG:
133 1.1.6.2 simonb switch ((int)o->o_value) {
134 1.1.6.2 simonb case AR_K0: n = "k0"; break;
135 1.1.6.2 simonb case AR_K1: n = "k1"; break;
136 1.1.6.2 simonb case AR_K2: n = "k2"; break;
137 1.1.6.2 simonb case AR_K3: n = "k3"; break;
138 1.1.6.2 simonb case AR_K4: n = "k4"; break;
139 1.1.6.2 simonb case AR_K5: n = "k5"; break;
140 1.1.6.2 simonb case AR_K6: n = "k6"; break;
141 1.1.6.2 simonb case AR_K7: n = "k7"; break;
142 1.1.6.2 simonb case AR_RSC: n = "rsc"; break;
143 1.1.6.2 simonb case AR_BSP: n = "bsp"; break;
144 1.1.6.2 simonb case AR_BSPSTORE: n = "bspstore"; break;
145 1.1.6.2 simonb case AR_RNAT: n = "rnat"; break;
146 1.1.6.2 simonb case AR_FCR: n = "fcr"; break;
147 1.1.6.2 simonb case AR_EFLAG: n = "eflag"; break;
148 1.1.6.2 simonb case AR_CSD: n = "csd"; break;
149 1.1.6.2 simonb case AR_SSD: n = "ssd"; break;
150 1.1.6.2 simonb case AR_CFLG: n = "cflg"; break;
151 1.1.6.2 simonb case AR_FSR: n = "fsr"; break;
152 1.1.6.2 simonb case AR_FIR: n = "fir"; break;
153 1.1.6.2 simonb case AR_FDR: n = "fdr"; break;
154 1.1.6.2 simonb case AR_CCV: n = "ccv"; break;
155 1.1.6.2 simonb case AR_UNAT: n = "unat"; break;
156 1.1.6.2 simonb case AR_FPSR: n = "fpsr"; break;
157 1.1.6.2 simonb case AR_ITC: n = "itc"; break;
158 1.1.6.2 simonb case AR_PFS: n = "pfs"; break;
159 1.1.6.2 simonb case AR_LC: n = "lc"; break;
160 1.1.6.2 simonb case AR_EC: n = "ec"; break;
161 1.1.6.2 simonb default:
162 1.1.6.2 simonb sprintf(buf, "ar%d", (int)o->o_value);
163 1.1.6.2 simonb return;
164 1.1.6.2 simonb }
165 1.1.6.2 simonb sprintf(buf, "ar.%s", n);
166 1.1.6.2 simonb return;
167 1.1.6.2 simonb case ASM_OPER_BREG:
168 1.1.6.2 simonb if (o->o_value != 0)
169 1.1.6.2 simonb sprintf(buf, "b%d", (int)o->o_value);
170 1.1.6.2 simonb else
171 1.1.6.2 simonb strcpy(buf, "rp");
172 1.1.6.2 simonb return;
173 1.1.6.2 simonb case ASM_OPER_CPUID:
174 1.1.6.2 simonb n = "cpuid";
175 1.1.6.2 simonb break;
176 1.1.6.2 simonb case ASM_OPER_CREG:
177 1.1.6.2 simonb switch ((int)o->o_value) {
178 1.1.6.2 simonb case CR_DCR: n = "dcr"; break;
179 1.1.6.2 simonb case CR_ITM: n = "itm"; break;
180 1.1.6.2 simonb case CR_IVA: n = "iva"; break;
181 1.1.6.2 simonb case CR_PTA: n = "pta"; break;
182 1.1.6.2 simonb case CR_IPSR: n = "ipsr"; break;
183 1.1.6.2 simonb case CR_ISR: n = "isr"; break;
184 1.1.6.2 simonb case CR_IIP: n = "iip"; break;
185 1.1.6.2 simonb case CR_IFA: n = "ifa"; break;
186 1.1.6.2 simonb case CR_ITIR: n = "itir"; break;
187 1.1.6.2 simonb case CR_IIPA: n = "iipa"; break;
188 1.1.6.2 simonb case CR_IFS: n = "ifs"; break;
189 1.1.6.2 simonb case CR_IIM: n = "iim"; break;
190 1.1.6.2 simonb case CR_IHA: n = "iha"; break;
191 1.1.6.2 simonb case CR_LID: n = "lid"; break;
192 1.1.6.2 simonb case CR_IVR: n = "ivr"; break;
193 1.1.6.2 simonb case CR_TPR: n = "tpr"; break;
194 1.1.6.2 simonb case CR_EOI: n = "eoi"; break;
195 1.1.6.2 simonb case CR_IRR0: n = "irr0"; break;
196 1.1.6.2 simonb case CR_IRR1: n = "irr1"; break;
197 1.1.6.2 simonb case CR_IRR2: n = "irr2"; break;
198 1.1.6.2 simonb case CR_IRR3: n = "irr3"; break;
199 1.1.6.2 simonb case CR_ITV: n = "itv"; break;
200 1.1.6.2 simonb case CR_PMV: n = "pmv"; break;
201 1.1.6.2 simonb case CR_CMCV: n = "cmcv"; break;
202 1.1.6.2 simonb case CR_LRR0: n = "lrr0"; break;
203 1.1.6.2 simonb case CR_LRR1: n = "lrr1"; break;
204 1.1.6.2 simonb default:
205 1.1.6.2 simonb sprintf(buf, "cr%d", (int)o->o_value);
206 1.1.6.2 simonb return;
207 1.1.6.2 simonb }
208 1.1.6.2 simonb sprintf(buf, "cr.%s", n);
209 1.1.6.2 simonb return;
210 1.1.6.2 simonb case ASM_OPER_DBR:
211 1.1.6.2 simonb n = "dbr";
212 1.1.6.2 simonb break;
213 1.1.6.2 simonb case ASM_OPER_DISP:
214 1.1.6.2 simonb sprintf(buf, "%lx", ip + o->o_value);
215 1.1.6.2 simonb return;
216 1.1.6.2 simonb case ASM_OPER_DTR:
217 1.1.6.2 simonb n = "dtr";
218 1.1.6.2 simonb break;
219 1.1.6.2 simonb case ASM_OPER_FREG:
220 1.1.6.2 simonb sprintf(buf, "f%d", (int)o->o_value);
221 1.1.6.2 simonb return;
222 1.1.6.2 simonb case ASM_OPER_GREG:
223 1.1.6.2 simonb break;
224 1.1.6.2 simonb case ASM_OPER_IBR:
225 1.1.6.2 simonb n = "ibr";
226 1.1.6.2 simonb break;
227 1.1.6.2 simonb case ASM_OPER_IMM:
228 1.1.6.2 simonb sprintf(buf, "0x%lx", o->o_value);
229 1.1.6.2 simonb return;
230 1.1.6.2 simonb case ASM_OPER_IP:
231 1.1.6.2 simonb strcpy(buf, "ip");
232 1.1.6.2 simonb return;
233 1.1.6.2 simonb case ASM_OPER_ITR:
234 1.1.6.2 simonb n = "itr";
235 1.1.6.2 simonb break;
236 1.1.6.2 simonb case ASM_OPER_MEM:
237 1.1.6.2 simonb n = "";
238 1.1.6.2 simonb break;
239 1.1.6.2 simonb case ASM_OPER_MSR:
240 1.1.6.2 simonb n = "msr";
241 1.1.6.2 simonb break;
242 1.1.6.2 simonb case ASM_OPER_PKR:
243 1.1.6.2 simonb n = "pkr";
244 1.1.6.2 simonb break;
245 1.1.6.2 simonb case ASM_OPER_PMC:
246 1.1.6.2 simonb n = "pmc";
247 1.1.6.2 simonb break;
248 1.1.6.2 simonb case ASM_OPER_PMD:
249 1.1.6.2 simonb n = "pmd";
250 1.1.6.2 simonb break;
251 1.1.6.2 simonb case ASM_OPER_PR:
252 1.1.6.2 simonb strcpy(buf, "pr");
253 1.1.6.2 simonb return;
254 1.1.6.2 simonb case ASM_OPER_PR_ROT:
255 1.1.6.2 simonb strcpy(buf, "pr.rot");
256 1.1.6.2 simonb return;
257 1.1.6.2 simonb case ASM_OPER_PREG:
258 1.1.6.2 simonb sprintf(buf, "p%d", (int)o->o_value);
259 1.1.6.2 simonb return;
260 1.1.6.2 simonb case ASM_OPER_PSR:
261 1.1.6.2 simonb strcpy(buf, "psr");
262 1.1.6.2 simonb return;
263 1.1.6.2 simonb case ASM_OPER_PSR_L:
264 1.1.6.2 simonb strcpy(buf, "psr.l");
265 1.1.6.2 simonb return;
266 1.1.6.2 simonb case ASM_OPER_PSR_UM:
267 1.1.6.2 simonb strcpy(buf, "psr.um");
268 1.1.6.2 simonb return;
269 1.1.6.2 simonb case ASM_OPER_RR:
270 1.1.6.2 simonb n = "rr";
271 1.1.6.2 simonb break;
272 1.1.6.2 simonb case ASM_OPER_NONE:
273 1.1.6.2 simonb KASSERT(0);
274 1.1.6.2 simonb break;
275 1.1.6.2 simonb }
276 1.1.6.2 simonb if (n[0] != '\0')
277 1.1.6.2 simonb buf += sprintf(buf, "%s[", n);
278 1.1.6.2 simonb switch ((int)o->o_value) {
279 1.1.6.2 simonb case 1: strcpy(buf, "gp"); buf += 2; break;
280 1.1.6.2 simonb case 12: strcpy(buf, "sp"); buf += 2; break;
281 1.1.6.2 simonb case 13: strcpy(buf, "tp"); buf += 2; break;
282 1.1.6.2 simonb default: buf += sprintf(buf, "r%d", (int)o->o_value); break;
283 1.1.6.2 simonb }
284 1.1.6.2 simonb if (n[0] != '\0')
285 1.1.6.2 simonb strcpy(buf, "]");
286 1.1.6.2 simonb }
287 1.1.6.2 simonb
288 1.1.6.2 simonb void
289 1.1.6.2 simonb asm_print_bundle(const struct asm_bundle *b, uint64_t ip)
290 1.1.6.2 simonb {
291 1.1.6.2 simonb asm_print_inst(b, 0, ip);
292 1.1.6.2 simonb asm_print_inst(b, 1, ip);
293 1.1.6.2 simonb asm_print_inst(b, 2, ip);
294 1.1.6.2 simonb }
295 1.1.6.2 simonb
296 1.1.6.2 simonb void
297 1.1.6.2 simonb asm_print_inst(const struct asm_bundle *b, int slot, uint64_t ip)
298 1.1.6.2 simonb {
299 1.1.6.2 simonb char buf[32];
300 1.1.6.2 simonb const struct asm_inst *i;
301 1.1.6.2 simonb const char *tmpl;
302 1.1.6.2 simonb int n, w;
303 1.1.6.2 simonb
304 1.1.6.2 simonb tmpl = b->b_templ + slot;
305 1.1.6.2 simonb if (*tmpl == ';' || (slot == 2 && b->b_templ[1] == ';'))
306 1.1.6.2 simonb tmpl++;
307 1.1.6.2 simonb i = b->b_inst + slot;
308 1.1.6.2 simonb if (*tmpl == 'L' || i->i_op == ASM_OP_NONE)
309 1.1.6.2 simonb return;
310 1.1.6.2 simonb
311 1.1.6.2 simonb /* Address + slot. */
312 1.1.6.2 simonb printf("%lx[%c] ", ip + slot, *tmpl);
313 1.1.6.2 simonb
314 1.1.6.2 simonb /* Predicate. */
315 1.1.6.2 simonb if (i->i_oper[0].o_value != 0) {
316 1.1.6.2 simonb asm_operand(i->i_oper+0, buf, ip);
317 1.1.6.2 simonb printf("(%s)", buf);
318 1.1.6.2 simonb w = strlen(buf);
319 1.1.6.2 simonb } else
320 1.1.6.2 simonb w = 0;
321 1.1.6.2 simonb while (w++ < 8)
322 1.1.6.2 simonb printf(" ");
323 1.1.6.2 simonb
324 1.1.6.2 simonb /* Mnemonic & completers. */
325 1.1.6.2 simonb asm_mnemonic(i->i_op, buf);
326 1.1.6.2 simonb printf(buf);
327 1.1.6.2 simonb w = strlen(buf);
328 1.1.6.2 simonb n = 0;
329 1.1.6.2 simonb while (n < i->i_ncmpltrs) {
330 1.1.6.2 simonb asm_completer(i->i_cmpltr + n, buf);
331 1.1.6.2 simonb printf(buf);
332 1.1.6.2 simonb w += strlen(buf);
333 1.1.6.2 simonb n++;
334 1.1.6.2 simonb }
335 1.1.6.2 simonb while (w++ < 15)
336 1.1.6.2 simonb printf(" ");
337 1.1.6.2 simonb printf(" ");
338 1.1.6.2 simonb
339 1.1.6.2 simonb /* Operands. */
340 1.1.6.2 simonb n = 1;
341 1.1.6.2 simonb while (n < 7 && i->i_oper[n].o_type != ASM_OPER_NONE) {
342 1.1.6.2 simonb if (n > 1) {
343 1.1.6.2 simonb if (n == i->i_srcidx)
344 1.1.6.2 simonb printf(" = ");
345 1.1.6.2 simonb else
346 1.1.6.2 simonb printf(", ");
347 1.1.6.2 simonb }
348 1.1.6.2 simonb asm_operand(i->i_oper + n, buf, ip);
349 1.1.6.2 simonb printf(buf);
350 1.1.6.2 simonb n++;
351 1.1.6.2 simonb }
352 1.1.6.2 simonb printf("\n");
353 1.1.6.2 simonb }
354 1.1.6.2 simonb
355 1.1.6.2 simonb #endif
356