blob: 42ecf61eff691db87b388b2edf96d0a7cb33c619 [file] [log] [blame]
wdenk7666a902002-09-05 16:50:46 +00001/* $Id$ */
2
3#include <common.h>
4
wdenk7666a902002-09-05 16:50:46 +00005#include <linux/ctype.h>
6#include <bedbug/bedbug.h>
7#include <bedbug/ppc.h>
8#include <bedbug/regs.h>
9#include <bedbug/tables.h>
10
11#define Elf32_Word unsigned long
12
13/* USE_SOURCE_CODE enables some symbolic debugging functions of this
14 code. This is only useful if the program will have access to the
15 source code for the binary being examined.
16*/
17
18/* #define USE_SOURCE_CODE 1 */
19
20#ifdef USE_SOURCE_CODE
21extern int line_info_from_addr __P ((Elf32_Word, char *, char *, int *));
22extern struct symreflist *symByAddr;
23extern char *symbol_name_from_addr __P ((Elf32_Word, int, int *));
24#endif /* USE_SOURCE_CODE */
25
26int print_operands __P ((struct ppc_ctx *));
27int get_operand_value __P ((struct opcode *, unsigned long,
wdenk8bde7f72003-06-27 21:31:46 +000028 enum OP_FIELD, unsigned long *));
wdenk7666a902002-09-05 16:50:46 +000029struct opcode *find_opcode __P ((unsigned long));
30struct opcode *find_opcode_by_name __P ((char *));
31char *spr_name __P ((int));
32int spr_value __P ((char *));
33char *tbr_name __P ((int));
34int tbr_value __P ((char *));
35int parse_operand __P ((unsigned long, struct opcode *,
wdenk8bde7f72003-06-27 21:31:46 +000036 struct operand *, char *, int *));
wdenk7666a902002-09-05 16:50:46 +000037int get_word __P ((char **, char *));
38long read_number __P ((char *));
39int downstring __P ((char *));
40
41
42/*======================================================================
43 * Entry point for the PPC disassembler.
44 *
45 * Arguments:
46 * memaddr The address to start disassembling from.
47 *
48 * virtual If this value is non-zero, then this will be
49 * used as the base address for the output and
50 * symbol lookups. If this value is zero then
51 * memaddr is used as the absolute address.
52 *
53 * num_instr The number of instructions to disassemble. Since
54 * each instruction is 32 bits long, this can be
55 * computed if you know the total size of the region.
56 *
57 * pfunc The address of a function that is called to print
58 * each line of output. The function should take a
59 * single character pointer as its parameters a la puts.
60 *
61 * flags Sets options for the output. This is a
62 * bitwise-inclusive-OR of the following
63 * values. Note that only one of the radix
64 * options may be set.
65 *
66 * F_RADOCTAL - output radix is unsigned base 8.
67 * F_RADUDECIMAL - output radix is unsigned base 10.
68 * F_RADSDECIMAL - output radix is signed base 10.
69 * F_RADHEX - output radix is unsigned base 16.
70 * F_SIMPLE - use simplified mnemonics.
71 * F_SYMBOL - lookup symbols for addresses.
72 * F_INSTR - output raw instruction.
73 * F_LINENO - show line # info if available.
74 *
York Sun472d5462013-04-01 11:29:11 -070075 * Returns true if the area was successfully disassembled or false if
wdenk7666a902002-09-05 16:50:46 +000076 * a problem was encountered with accessing the memory.
77 */
78
79int disppc (unsigned char *memaddr, unsigned char *virtual, int num_instr,
80 int (*pfunc) (const char *), unsigned long flags)
81{
82 int i;
83 struct ppc_ctx ctx;
84
85#ifdef USE_SOURCE_CODE
86 int line_no = 0;
87 int last_line_no = 0;
88 char funcname[128] = { 0 };
89 char filename[256] = { 0 };
90 char last_funcname[128] = { 0 };
91 int symoffset;
92 char *symname;
93 char *cursym = (char *) 0;
94#endif /* USE_SOURCE_CODE */
95 /*------------------------------------------------------------*/
96
97 ctx.flags = flags;
98 ctx.virtual = virtual;
99
100 /* Figure out the output radix before we go any further */
101
102 if (ctx.flags & F_RADOCTAL) {
103 /* Unsigned octal output */
104 strcpy (ctx.radix_fmt, "O%o");
105 } else if (ctx.flags & F_RADUDECIMAL) {
106 /* Unsigned decimal output */
107 strcpy (ctx.radix_fmt, "%u");
108 } else if (ctx.flags & F_RADSDECIMAL) {
109 /* Signed decimal output */
110 strcpy (ctx.radix_fmt, "%d");
111 } else {
112 /* Unsigned hex output */
113 strcpy (ctx.radix_fmt, "0x%x");
114 }
115
116 if (ctx.virtual == 0) {
117 ctx.virtual = memaddr;
118 }
119#ifdef USE_SOURCE_CODE
120 if (ctx.flags & F_SYMBOL) {
121 if (symByAddr == 0) /* no symbols loaded */
122 ctx.flags &= ~F_SYMBOL;
123 else {
124 cursym = (char *) 0;
125 symoffset = 0;
126 }
127 }
128#endif /* USE_SOURCE_CODE */
129
130 /* format each line as "XXXXXXXX: <symbol> IIIIIIII disassembly" where,
131 XXXXXXXX is the memory address in hex,
132 <symbol> is the symbolic location if F_SYMBOL is set.
133 IIIIIIII is the raw machine code in hex if F_INSTR is set,
134 and disassembly is the disassembled machine code with numbers
135 formatted according to the 'radix' parameter */
136
137 for (i = 0; i < num_instr; ++i, memaddr += 4, ctx.virtual += 4) {
138#ifdef USE_SOURCE_CODE
139 if (ctx.flags & F_LINENO) {
York Sun472d5462013-04-01 11:29:11 -0700140 if ((line_info_from_addr ((Elf32_Word) ctx.virtual,
141 filename, funcname, &line_no) == true) &&
wdenk7666a902002-09-05 16:50:46 +0000142 ((line_no != last_line_no) ||
143 (strcmp (last_funcname, funcname) != 0))) {
144 print_source_line (filename, funcname, line_no, pfunc);
145 }
146 last_line_no = line_no;
147 strcpy (last_funcname, funcname);
148 }
149#endif /* USE_SOURCE_CODE */
150
151 sprintf (ctx.data, "%08lx: ", (unsigned long) ctx.virtual);
152 ctx.datalen = 10;
153
154#ifdef USE_SOURCE_CODE
155 if (ctx.flags & F_SYMBOL) {
156 if ((symname =
York Sun472d5462013-04-01 11:29:11 -0700157 symbol_name_from_addr((Elf32_Word) ctx.virtual,
158 true, 0)) != 0) {
wdenk7666a902002-09-05 16:50:46 +0000159 cursym = symname;
160 symoffset = 0;
161 } else {
162 if ((cursym == 0) &&
163 ((symname =
York Sun472d5462013-04-01 11:29:11 -0700164 symbol_name_from_addr((Elf32_Word) ctx.virtual,
165 false, &symoffset)) != 0)) {
wdenk7666a902002-09-05 16:50:46 +0000166 cursym = symname;
167 } else {
168 symoffset += 4;
169 }
170 }
171
172 if (cursym != 0) {
173 sprintf (&ctx.data[ctx.datalen], "<%s+", cursym);
174 ctx.datalen = strlen (ctx.data);
175 sprintf (&ctx.data[ctx.datalen], ctx.radix_fmt, symoffset);
176 strcat (ctx.data, ">");
177 ctx.datalen = strlen (ctx.data);
178 }
179 }
180#endif /* USE_SOURCE_CODE */
181
182 ctx.instr = INSTRUCTION (memaddr);
183
184 if (ctx.flags & F_INSTR) {
185 /* Find the opcode structure for this opcode. If one is not found
186 then it must be an illegal instruction */
187 sprintf (&ctx.data[ctx.datalen],
188 " %02lx %02lx %02lx %02lx ",
189 ((ctx.instr >> 24) & 0xff),
190 ((ctx.instr >> 16) & 0xff), ((ctx.instr >> 8) & 0xff),
191 (ctx.instr & 0xff));
192 ctx.datalen += 18;
193 } else {
194 strcat (ctx.data, " ");
195 ctx.datalen += 3;
196 }
197
198 if ((ctx.op = find_opcode (ctx.instr)) == 0) {
199 /* Illegal Opcode */
200 sprintf (&ctx.data[ctx.datalen], " .long 0x%08lx",
201 ctx.instr);
202 ctx.datalen += 24;
203 (*pfunc) (ctx.data);
204 continue;
205 }
206
207 if (((ctx.flags & F_SIMPLE) == 0) ||
York Sun472d5462013-04-01 11:29:11 -0700208 (ctx.op->hfunc == 0) ||
209 ((*ctx.op->hfunc) (&ctx) == false)) {
wdenk7666a902002-09-05 16:50:46 +0000210 sprintf (&ctx.data[ctx.datalen], "%-7s ", ctx.op->name);
211 ctx.datalen += 8;
212 print_operands (&ctx);
213 }
214
215 (*pfunc) (ctx.data);
216 }
217
York Sun472d5462013-04-01 11:29:11 -0700218 return true;
wdenk7666a902002-09-05 16:50:46 +0000219} /* disppc */
220
221
222
223/*======================================================================
224 * Called by the disassembler to print the operands for an instruction.
225 *
226 * Arguments:
227 * ctx A pointer to the disassembler context record.
228 *
229 * always returns 0.
230 */
231
232int print_operands (struct ppc_ctx *ctx)
233{
234 int open_parens = 0;
235 int field;
236 unsigned long operand;
237 struct operand *opr;
238
239#ifdef USE_SOURCE_CODE
240 char *symname;
241 int offset;
242#endif /* USE_SOURCE_CODE */
243 /*------------------------------------------------------------*/
244
245 /* Walk through the operands and list each in order */
246 for (field = 0; ctx->op->fields[field] != 0; ++field) {
247 if (ctx->op->fields[field] > n_operands) {
248 continue; /* bad operand ?! */
249 }
250
251 opr = &operands[ctx->op->fields[field] - 1];
252
253 if (opr->hint & OH_SILENT) {
254 continue;
255 }
256
257 if ((field > 0) && !open_parens) {
258 strcat (ctx->data, ",");
259 ctx->datalen++;
260 }
261
262 operand = (ctx->instr >> opr->shift) & ((1 << opr->bits) - 1);
263
264 if (opr->hint & OH_ADDR) {
265 if ((operand & (1 << (opr->bits - 1))) != 0) {
266 operand = operand - (1 << opr->bits);
267 }
268
269 if (ctx->op->hint & H_RELATIVE)
270 operand = (operand << 2) + (unsigned long) ctx->virtual;
271 else
272 operand = (operand << 2);
273
274
275 sprintf (&ctx->data[ctx->datalen], "0x%lx", operand);
276 ctx->datalen = strlen (ctx->data);
277
278#ifdef USE_SOURCE_CODE
279 if ((ctx->flags & F_SYMBOL) &&
280 ((symname =
281 symbol_name_from_addr (operand, 0, &offset)) != 0)) {
282 sprintf (&ctx->data[ctx->datalen], " <%s", symname);
283 if (offset != 0) {
284 strcat (ctx->data, "+");
285 ctx->datalen = strlen (ctx->data);
286 sprintf (&ctx->data[ctx->datalen], ctx->radix_fmt,
287 offset);
288 }
289 strcat (ctx->data, ">");
290 }
291#endif /* USE_SOURCE_CODE */
292 }
293
294 else if (opr->hint & OH_REG) {
295 if ((operand == 0) &&
296 (opr->field == O_rA) && (ctx->op->hint & H_RA0_IS_0)) {
297 strcat (ctx->data, "0");
298 } else {
299 sprintf (&ctx->data[ctx->datalen], "r%d", (short) operand);
300 }
301
302 if (open_parens) {
303 strcat (ctx->data, ")");
304 open_parens--;
305 }
306 }
307
308 else if (opr->hint & OH_SPR) {
309 strcat (ctx->data, spr_name (operand));
310 }
311
312 else if (opr->hint & OH_TBR) {
313 strcat (ctx->data, tbr_name (operand));
314 }
315
316 else if (opr->hint & OH_LITERAL) {
317 switch (opr->field) {
318 case O_cr2:
319 strcat (ctx->data, "cr2");
320 ctx->datalen += 3;
321 break;
322
323 default:
324 break;
325 }
326 }
327
328 else {
329 sprintf (&ctx->data[ctx->datalen], ctx->radix_fmt,
330 (unsigned short) operand);
331
332 if (open_parens) {
333 strcat (ctx->data, ")");
334 open_parens--;
335 }
336
337 else if (opr->hint & OH_OFFSET) {
338 strcat (ctx->data, "(");
339 open_parens++;
340 }
341 }
342
343 ctx->datalen = strlen (ctx->data);
344 }
345
346 return 0;
347} /* print_operands */
348
349
350
351/*======================================================================
352 * Called to get the value of an arbitrary operand with in an instruction.
353 *
354 * Arguments:
355 * op The pointer to the opcode structure to which
356 * the operands belong.
357 *
358 * instr The instruction (32 bits) containing the opcode
359 * and the operands to print. By the time that
360 * this routine is called the operand has already
361 * been added to the output.
362 *
363 * field The field (operand) to get the value of.
364 *
365 * value The address of an unsigned long to be filled in
366 * with the value of the operand if it is found. This
367 * will only be filled in if the function returns
York Sun472d5462013-04-01 11:29:11 -0700368 * true. This may be passed as 0 if the value is
wdenk7666a902002-09-05 16:50:46 +0000369 * not required.
370 *
York Sun472d5462013-04-01 11:29:11 -0700371 * Returns true if the operand was found or false if it was not.
wdenk7666a902002-09-05 16:50:46 +0000372 */
373
374int get_operand_value (struct opcode *op, unsigned long instr,
375 enum OP_FIELD field, unsigned long *value)
376{
377 int i;
378 struct operand *opr;
379
380 /*------------------------------------------------------------*/
381
382 if (field > n_operands) {
York Sun472d5462013-04-01 11:29:11 -0700383 return false; /* bad operand ?! */
wdenk7666a902002-09-05 16:50:46 +0000384 }
385
386 /* Walk through the operands and list each in order */
387 for (i = 0; op->fields[i] != 0; ++i) {
388 if (op->fields[i] != field) {
389 continue;
390 }
391
392 opr = &operands[op->fields[i] - 1];
393
394 if (value) {
395 *value = (instr >> opr->shift) & ((1 << opr->bits) - 1);
396 }
York Sun472d5462013-04-01 11:29:11 -0700397 return true;
wdenk7666a902002-09-05 16:50:46 +0000398 }
399
York Sun472d5462013-04-01 11:29:11 -0700400 return false;
wdenk7666a902002-09-05 16:50:46 +0000401} /* operand_value */
402
403
404
405/*======================================================================
406 * Called by the disassembler to match an opcode value to an opcode structure.
407 *
408 * Arguments:
409 * instr The instruction (32 bits) to match. This value
410 * may contain operand values as well as the opcode
411 * since they will be masked out anyway for this
412 * search.
413 *
414 * Returns the address of an opcode struct (from the opcode table) if the
415 * operand successfully matched an entry, or 0 if no match was found.
416 */
417
418struct opcode *find_opcode (unsigned long instr)
419{
420 struct opcode *ptr;
421 int top = 0;
422 int bottom = n_opcodes - 1;
423 int idx;
424
425 /*------------------------------------------------------------*/
426
427 while (top <= bottom) {
428 idx = (top + bottom) >> 1;
429 ptr = &opcodes[idx];
430
431 if ((instr & ptr->mask) < ptr->opcode) {
432 bottom = idx - 1;
433 } else if ((instr & ptr->mask) > ptr->opcode) {
434 top = idx + 1;
435 } else {
436 return ptr;
437 }
438 }
439
440 return (struct opcode *) 0;
441} /* find_opcode */
442
443
444
445/*======================================================================
446 * Called by the assembler to match an opcode name to an opcode structure.
447 *
448 * Arguments:
449 * name The text name of the opcode, e.g. "b", "mtspr", etc.
450 *
451 * The opcodes are sorted numerically by their instruction binary code
452 * so a search for the name cannot use the binary search used by the
453 * other find routine.
454 *
455 * Returns the address of an opcode struct (from the opcode table) if the
456 * name successfully matched an entry, or 0 if no match was found.
457 */
458
459struct opcode *find_opcode_by_name (char *name)
460{
461 int idx;
462
463 /*------------------------------------------------------------*/
464
465 downstring (name);
466
467 for (idx = 0; idx < n_opcodes; ++idx) {
468 if (!strcmp (name, opcodes[idx].name))
469 return &opcodes[idx];
470 }
471
472 return (struct opcode *) 0;
473} /* find_opcode_by_name */
474
475
476
477/*======================================================================
478 * Convert the 'spr' operand from its numeric value to its symbolic name.
479 *
480 * Arguments:
481 * value The value of the 'spr' operand. This value should
482 * be unmodified from its encoding in the instruction.
483 * the split-field computations will be performed
484 * here before the switch.
485 *
486 * Returns the address of a character array containing the name of the
487 * special purpose register defined by the 'value' parameter, or the
488 * address of a character array containing "???" if no match was found.
489 */
490
491char *spr_name (int value)
492{
493 unsigned short spr;
494 static char other[10];
495 int i;
496
497 /*------------------------------------------------------------*/
498
499 /* spr is a 10 bit field whose interpretation has the high and low
500 five-bit fields reversed from their encoding in the operand */
501
502 spr = ((value >> 5) & 0x1f) | ((value & 0x1f) << 5);
503
504 for (i = 0; i < n_sprs; ++i) {
505 if (spr == spr_map[i].spr_val)
506 return spr_map[i].spr_name;
507 }
508
509 sprintf (other, "%d", spr);
510 return other;
511} /* spr_name */
512
513
514
515/*======================================================================
516 * Convert the 'spr' operand from its symbolic name to its numeric value
517 *
518 * Arguments:
519 * name The symbolic name of the 'spr' operand. The
520 * split-field encoding will be done by this routine.
521 * NOTE: name can be a number.
522 *
523 * Returns the numeric value for the spr appropriate for encoding a machine
524 * instruction. Returns 0 if unable to find the SPR.
525 */
526
527int spr_value (char *name)
528{
529 struct spr_info *sprp;
530 int spr;
531 int i;
532
533 /*------------------------------------------------------------*/
534
535 if (!name || !*name)
536 return 0;
537
538 if (isdigit ((int) name[0])) {
539 i = htonl (read_number (name));
540 spr = ((i >> 5) & 0x1f) | ((i & 0x1f) << 5);
541 return spr;
542 }
543
544 downstring (name);
545
546 for (i = 0; i < n_sprs; ++i) {
547 sprp = &spr_map[i];
548
549 if (strcmp (name, sprp->spr_name) == 0) {
550 /* spr is a 10 bit field whose interpretation has the high and low
551 five-bit fields reversed from their encoding in the operand */
552 i = htonl (sprp->spr_val);
553 spr = ((i >> 5) & 0x1f) | ((i & 0x1f) << 5);
554
555 return spr;
556 }
557 }
558
559 return 0;
560} /* spr_value */
561
562
563
564/*======================================================================
565 * Convert the 'tbr' operand from its numeric value to its symbolic name.
566 *
567 * Arguments:
568 * value The value of the 'tbr' operand. This value should
569 * be unmodified from its encoding in the instruction.
570 * the split-field computations will be performed
571 * here before the switch.
572 *
573 * Returns the address of a character array containing the name of the
574 * time base register defined by the 'value' parameter, or the address
575 * of a character array containing "???" if no match was found.
576 */
577
578char *tbr_name (int value)
579{
580 unsigned short tbr;
581
582 /*------------------------------------------------------------*/
583
584 /* tbr is a 10 bit field whose interpretation has the high and low
585 five-bit fields reversed from their encoding in the operand */
586
587 tbr = ((value >> 5) & 0x1f) | ((value & 0x1f) << 5);
588
589 if (tbr == 268)
590 return "TBL";
591
592 else if (tbr == 269)
593 return "TBU";
594
595
596 return "???";
597} /* tbr_name */
598
599
600
601/*======================================================================
602 * Convert the 'tbr' operand from its symbolic name to its numeric value.
603 *
604 * Arguments:
605 * name The symbolic name of the 'tbr' operand. The
606 * split-field encoding will be done by this routine.
607 *
608 * Returns the numeric value for the spr appropriate for encoding a machine
609 * instruction. Returns 0 if unable to find the TBR.
610 */
611
612int tbr_value (char *name)
613{
614 int tbr;
615 int val;
616
617 /*------------------------------------------------------------*/
618
619 if (!name || !*name)
620 return 0;
621
622 downstring (name);
623
624 if (isdigit ((int) name[0])) {
625 val = read_number (name);
626
627 if (val != 268 && val != 269)
628 return 0;
629 } else if (strcmp (name, "tbl") == 0)
630 val = 268;
631 else if (strcmp (name, "tbu") == 0)
632 val = 269;
633 else
634 return 0;
635
636 /* tbr is a 10 bit field whose interpretation has the high and low
637 five-bit fields reversed from their encoding in the operand */
638
639 val = htonl (val);
640 tbr = ((val >> 5) & 0x1f) | ((val & 0x1f) << 5);
641 return tbr;
642} /* tbr_name */
643
644
645
646/*======================================================================
647 * The next several functions (handle_xxx) are the routines that handle
648 * disassembling the opcodes with simplified mnemonics.
649 *
650 * Arguments:
651 * ctx A pointer to the disassembler context record.
652 *
York Sun472d5462013-04-01 11:29:11 -0700653 * Returns true if the simpler form was printed or false if it was not.
wdenk7666a902002-09-05 16:50:46 +0000654 */
655
656int handle_bc (struct ppc_ctx *ctx)
657{
658 unsigned long bo;
659 unsigned long bi;
660 static struct opcode blt = { B_OPCODE (16, 0, 0), B_MASK, {O_BD, 0},
661 0, "blt", H_RELATIVE
662 };
663 static struct opcode bne =
664 { B_OPCODE (16, 0, 0), B_MASK, {O_cr2, O_BD, 0},
665 0, "bne", H_RELATIVE
666 };
667 static struct opcode bdnz = { B_OPCODE (16, 0, 0), B_MASK, {O_BD, 0},
668 0, "bdnz", H_RELATIVE
669 };
670
671 /*------------------------------------------------------------*/
672
York Sun472d5462013-04-01 11:29:11 -0700673 if (get_operand_value(ctx->op, ctx->instr, O_BO, &bo) == false)
674 return false;
wdenk7666a902002-09-05 16:50:46 +0000675
York Sun472d5462013-04-01 11:29:11 -0700676 if (get_operand_value(ctx->op, ctx->instr, O_BI, &bi) == false)
677 return false;
wdenk7666a902002-09-05 16:50:46 +0000678
679 if ((bo == 12) && (bi == 0)) {
680 ctx->op = &blt;
681 sprintf (&ctx->data[ctx->datalen], "%-7s ", ctx->op->name);
682 ctx->datalen += 8;
683 print_operands (ctx);
York Sun472d5462013-04-01 11:29:11 -0700684 return true;
wdenk7666a902002-09-05 16:50:46 +0000685 } else if ((bo == 4) && (bi == 10)) {
686 ctx->op = &bne;
687 sprintf (&ctx->data[ctx->datalen], "%-7s ", ctx->op->name);
688 ctx->datalen += 8;
689 print_operands (ctx);
York Sun472d5462013-04-01 11:29:11 -0700690 return true;
wdenk7666a902002-09-05 16:50:46 +0000691 } else if ((bo == 16) && (bi == 0)) {
692 ctx->op = &bdnz;
693 sprintf (&ctx->data[ctx->datalen], "%-7s ", ctx->op->name);
694 ctx->datalen += 8;
695 print_operands (ctx);
York Sun472d5462013-04-01 11:29:11 -0700696 return true;
wdenk7666a902002-09-05 16:50:46 +0000697 }
698
York Sun472d5462013-04-01 11:29:11 -0700699 return false;
wdenk7666a902002-09-05 16:50:46 +0000700} /* handle_blt */
701
702
703
704/*======================================================================
705 * Outputs source line information for the disassembler. This should
706 * be modified in the future to lookup the actual line of source code
707 * from the file, but for now this will do.
708 *
709 * Arguments:
710 * filename The address of a character array containing the
711 * absolute path and file name of the source file.
712 *
713 * funcname The address of a character array containing the
714 * name of the function (not C++ demangled (yet))
715 * to which this code belongs.
716 *
717 * line_no An integer specifying the source line number that
718 * generated this code.
719 *
720 * pfunc The address of a function to call to print the output.
721 *
722 *
York Sun472d5462013-04-01 11:29:11 -0700723 * Returns true if it was able to output the line info, or false if it was
wdenk7666a902002-09-05 16:50:46 +0000724 * not.
725 */
726
727int print_source_line (char *filename, char *funcname,
728 int line_no, int (*pfunc) (const char *))
729{
730 char out_buf[256];
731
732 /*------------------------------------------------------------*/
733
734 (*pfunc) (""); /* output a newline */
735 sprintf (out_buf, "%s %s(): line %d", filename, funcname, line_no);
736 (*pfunc) (out_buf);
737
York Sun472d5462013-04-01 11:29:11 -0700738 return true;
wdenk7666a902002-09-05 16:50:46 +0000739} /* print_source_line */
740
741
742
743/*======================================================================
744 * Entry point for the PPC assembler.
745 *
746 * Arguments:
747 * asm_buf An array of characters containing the assembly opcode
748 * and operands to convert to a POWERPC machine
749 * instruction.
750 *
751 * Returns the machine instruction or zero.
752 */
753
754unsigned long asmppc (unsigned long memaddr, char *asm_buf, int *err)
755{
756 struct opcode *opc;
757 struct operand *oper[MAX_OPERANDS];
758 unsigned long instr;
759 unsigned long param;
760 char *ptr = asm_buf;
761 char scratch[20];
762 int i;
763 int w_operands = 0; /* wanted # of operands */
764 int n_operands = 0; /* # of operands read */
765 int asm_debug = 0;
766
767 /*------------------------------------------------------------*/
768
769 if (err)
770 *err = 0;
771
772 if (get_word (&ptr, scratch) == 0)
773 return 0;
774
775 /* Lookup the opcode structure based on the opcode name */
776 if ((opc = find_opcode_by_name (scratch)) == (struct opcode *) 0) {
777 if (err)
778 *err = E_ASM_BAD_OPCODE;
779 return 0;
780 }
781
782 if (asm_debug) {
783 printf ("asmppc: Opcode = \"%s\"\n", opc->name);
784 }
785
786 for (i = 0; i < 8; ++i) {
787 if (opc->fields[i] == 0)
788 break;
789 ++w_operands;
790 }
791
792 if (asm_debug) {
793 printf ("asmppc: Expecting %d operands\n", w_operands);
794 }
795
796 instr = opc->opcode;
797
798 /* read each operand */
799 while (n_operands < w_operands) {
800
801 oper[n_operands] = &operands[opc->fields[n_operands] - 1];
802
803 if (oper[n_operands]->hint & OH_SILENT) {
804 /* Skip silent operands, they are covered in opc->opcode */
805
806 if (asm_debug) {
807 printf ("asmppc: Operand %d \"%s\" SILENT\n", n_operands,
808 oper[n_operands]->name);
809 }
810
811 ++n_operands;
812 continue;
813 }
814
815 if (get_word (&ptr, scratch) == 0)
816 break;
817
818 if (asm_debug) {
819 printf ("asmppc: Operand %d \"%s\" : \"%s\"\n", n_operands,
820 oper[n_operands]->name, scratch);
821 }
822
823 if ((param = parse_operand (memaddr, opc, oper[n_operands],
824 scratch, err)) == -1)
825 return 0;
826
827 instr |= param;
828 ++n_operands;
829 }
830
831 if (n_operands < w_operands) {
832 if (err)
833 *err = E_ASM_NUM_OPERANDS;
834 return 0;
835 }
836
837 if (asm_debug) {
838 printf ("asmppc: Instruction = 0x%08lx\n", instr);
839 }
840
841 return instr;
842} /* asmppc */
843
844
845
846/*======================================================================
847 * Called by the assembler to interpret a single operand
848 *
849 * Arguments:
850 * ctx A pointer to the disassembler context record.
851 *
852 * Returns 0 if the operand is ok, or -1 if it is bad.
853 */
854
855int parse_operand (unsigned long memaddr, struct opcode *opc,
856 struct operand *oper, char *txt, int *err)
857{
858 long data;
859 long mask;
860 int is_neg = 0;
861
862 /*------------------------------------------------------------*/
863
864 mask = (1 << oper->bits) - 1;
865
866 if (oper->hint & OH_ADDR) {
867 data = read_number (txt);
868
869 if (opc->hint & H_RELATIVE)
870 data = data - memaddr;
871
872 if (data < 0)
873 is_neg = 1;
874
875 data >>= 2;
876 data &= (mask >> 1);
877
878 if (is_neg)
879 data |= 1 << (oper->bits - 1);
880 }
881
882 else if (oper->hint & OH_REG) {
883 if (txt[0] == 'r' || txt[0] == 'R')
884 txt++;
885 else if (txt[0] == '%' && (txt[1] == 'r' || txt[1] == 'R'))
886 txt += 2;
887
888 data = read_number (txt);
889 if (data > 31) {
890 if (err)
891 *err = E_ASM_BAD_REGISTER;
892 return -1;
893 }
894
895 data = htonl (data);
896 }
897
898 else if (oper->hint & OH_SPR) {
899 if ((data = spr_value (txt)) == 0) {
900 if (err)
901 *err = E_ASM_BAD_SPR;
902 return -1;
903 }
904 }
905
906 else if (oper->hint & OH_TBR) {
907 if ((data = tbr_value (txt)) == 0) {
908 if (err)
909 *err = E_ASM_BAD_TBR;
910 return -1;
911 }
912 }
913
914 else {
915 data = htonl (read_number (txt));
916 }
917
918 return (data & mask) << oper->shift;
919} /* parse_operand */
920
921
922char *asm_error_str (int err)
923{
924 switch (err) {
925 case E_ASM_BAD_OPCODE:
926 return "Bad opcode";
927 case E_ASM_NUM_OPERANDS:
928 return "Bad number of operands";
929 case E_ASM_BAD_REGISTER:
930 return "Bad register number";
931 case E_ASM_BAD_SPR:
932 return "Bad SPR name or number";
933 case E_ASM_BAD_TBR:
934 return "Bad TBR name or number";
935 }
936
937 return "";
938} /* asm_error_str */
939
940
941
942/*======================================================================
943 * Copy a word from one buffer to another, ignores leading white spaces.
944 *
945 * Arguments:
946 * src The address of a character pointer to the
947 * source buffer.
948 * dest A pointer to a character buffer to write the word
949 * into.
950 *
951 * Returns the number of non-white space characters copied, or zero.
952 */
953
954int get_word (char **src, char *dest)
955{
956 char *ptr = *src;
957 int nchars = 0;
958
959 /*------------------------------------------------------------*/
960
961 /* Eat white spaces */
962 while (*ptr && isblank (*ptr))
963 ptr++;
964
965 if (*ptr == 0) {
966 *src = ptr;
967 return 0;
968 }
969
970 /* Find the text of the word */
971 while (*ptr && !isblank (*ptr) && (*ptr != ','))
972 dest[nchars++] = *ptr++;
973 ptr = (*ptr == ',') ? ptr + 1 : ptr;
974 dest[nchars] = 0;
975
976 *src = ptr;
977 return nchars;
978} /* get_word */
979
980
981
982/*======================================================================
983 * Convert a numeric string to a number, be aware of base notations.
984 *
985 * Arguments:
986 * txt The numeric string.
987 *
988 * Returns the converted numeric value.
989 */
990
991long read_number (char *txt)
992{
993 long val;
994 int is_neg = 0;
995
996 /*------------------------------------------------------------*/
997
998 if (txt == 0 || *txt == 0)
999 return 0;
1000
1001 if (*txt == '-') {
1002 is_neg = 1;
1003 ++txt;
1004 }
1005
1006 if (txt[0] == '0' && (txt[1] == 'x' || txt[1] == 'X')) /* hex */
1007 val = simple_strtoul (&txt[2], NULL, 16);
1008 else /* decimal */
1009 val = simple_strtoul (txt, NULL, 10);
1010
1011 if (is_neg)
1012 val = -val;
1013
1014 return val;
1015} /* read_number */
1016
1017
1018int downstring (char *s)
1019{
1020 if (!s || !*s)
1021 return 0;
1022
1023 while (*s) {
1024 if (isupper (*s))
1025 *s = tolower (*s);
1026 s++;
1027 }
1028
1029 return 0;
1030} /* downstring */
1031
1032
1033
1034/*======================================================================
1035 * Examines the instruction at the current address and determines the
1036 * next address to be executed. This will take into account branches
1037 * of different types so that a "step" and "next" operations can be
1038 * supported.
1039 *
1040 * Arguments:
1041 * nextaddr The address (to be filled in) of the next
1042 * instruction to execute. This will only be a valid
York Sun472d5462013-04-01 11:29:11 -07001043 * address if true is returned.
wdenk7666a902002-09-05 16:50:46 +00001044 *
1045 * step_over A flag indicating how to compute addresses for
1046 * branch statements:
York Sun472d5462013-04-01 11:29:11 -07001047 * true = Step over the branch (next)
1048 * false = step into the branch (step)
wdenk7666a902002-09-05 16:50:46 +00001049 *
York Sun472d5462013-04-01 11:29:11 -07001050 * Returns true if it was able to compute the address. Returns false if
wdenk7666a902002-09-05 16:50:46 +00001051 * it has a problem reading the current instruction or one of the registers.
1052 */
1053
1054int find_next_address (unsigned char *nextaddr, int step_over,
1055 struct pt_regs *regs)
1056{
1057 unsigned long pc; /* SRR0 register from PPC */
1058 unsigned long ctr; /* CTR register from PPC */
1059 unsigned long cr; /* CR register from PPC */
1060 unsigned long lr; /* LR register from PPC */
1061 unsigned long instr; /* instruction at SRR0 */
1062 unsigned long next; /* computed instruction for 'next' */
1063 unsigned long step; /* computed instruction for 'step' */
1064 unsigned long addr = 0; /* target address operand */
1065 unsigned long aa = 0; /* AA operand */
1066 unsigned long lk = 0; /* LK operand */
1067 unsigned long bo = 0; /* BO operand */
1068 unsigned long bi = 0; /* BI operand */
1069 struct opcode *op = 0; /* opcode structure for 'instr' */
1070 int ctr_ok = 0;
1071 int cond_ok = 0;
1072 int conditional = 0;
1073 int branch = 0;
1074
1075 /*------------------------------------------------------------*/
1076
1077 if (nextaddr == 0 || regs == 0) {
1078 printf ("find_next_address: bad args");
York Sun472d5462013-04-01 11:29:11 -07001079 return false;
wdenk7666a902002-09-05 16:50:46 +00001080 }
1081
1082 pc = regs->nip & 0xfffffffc;
1083 instr = INSTRUCTION (pc);
1084
1085 if ((op = find_opcode (instr)) == (struct opcode *) 0) {
1086 printf ("find_next_address: can't parse opcode 0x%lx", instr);
York Sun472d5462013-04-01 11:29:11 -07001087 return false;
wdenk7666a902002-09-05 16:50:46 +00001088 }
1089
1090 ctr = regs->ctr;
1091 cr = regs->ccr;
1092 lr = regs->link;
1093
1094 switch (op->opcode) {
1095 case B_OPCODE (16, 0, 0): /* bc */
1096 case B_OPCODE (16, 0, 1): /* bcl */
1097 case B_OPCODE (16, 1, 0): /* bca */
1098 case B_OPCODE (16, 1, 1): /* bcla */
1099 if (!get_operand_value (op, instr, O_BD, &addr) ||
1100 !get_operand_value (op, instr, O_BO, &bo) ||
1101 !get_operand_value (op, instr, O_BI, &bi) ||
1102 !get_operand_value (op, instr, O_AA, &aa) ||
1103 !get_operand_value (op, instr, O_LK, &lk))
York Sun472d5462013-04-01 11:29:11 -07001104 return false;
wdenk7666a902002-09-05 16:50:46 +00001105
1106 if ((addr & (1 << 13)) != 0)
1107 addr = addr - (1 << 14);
1108 addr <<= 2;
1109 conditional = 1;
1110 branch = 1;
1111 break;
1112
1113 case I_OPCODE (18, 0, 0): /* b */
1114 case I_OPCODE (18, 0, 1): /* bl */
1115 case I_OPCODE (18, 1, 0): /* ba */
1116 case I_OPCODE (18, 1, 1): /* bla */
1117 if (!get_operand_value (op, instr, O_LI, &addr) ||
1118 !get_operand_value (op, instr, O_AA, &aa) ||
1119 !get_operand_value (op, instr, O_LK, &lk))
York Sun472d5462013-04-01 11:29:11 -07001120 return false;
wdenk7666a902002-09-05 16:50:46 +00001121
1122 if ((addr & (1 << 23)) != 0)
1123 addr = addr - (1 << 24);
1124 addr <<= 2;
1125 conditional = 0;
1126 branch = 1;
1127 break;
1128
1129 case XL_OPCODE (19, 528, 0): /* bcctr */
1130 case XL_OPCODE (19, 528, 1): /* bcctrl */
1131 if (!get_operand_value (op, instr, O_BO, &bo) ||
1132 !get_operand_value (op, instr, O_BI, &bi) ||
1133 !get_operand_value (op, instr, O_LK, &lk))
York Sun472d5462013-04-01 11:29:11 -07001134 return false;
wdenk7666a902002-09-05 16:50:46 +00001135
1136 addr = ctr;
1137 aa = 1;
1138 conditional = 1;
1139 branch = 1;
1140 break;
1141
1142 case XL_OPCODE (19, 16, 0): /* bclr */
1143 case XL_OPCODE (19, 16, 1): /* bclrl */
1144 if (!get_operand_value (op, instr, O_BO, &bo) ||
1145 !get_operand_value (op, instr, O_BI, &bi) ||
1146 !get_operand_value (op, instr, O_LK, &lk))
York Sun472d5462013-04-01 11:29:11 -07001147 return false;
wdenk7666a902002-09-05 16:50:46 +00001148
1149 addr = lr;
1150 aa = 1;
1151 conditional = 1;
1152 branch = 1;
1153 break;
1154
1155 default:
1156 conditional = 0;
1157 branch = 0;
1158 break;
1159 }
1160
1161 if (conditional) {
1162 switch ((bo & 0x1e) >> 1) {
1163 case 0: /* 0000y */
1164 if (--ctr != 0)
1165 ctr_ok = 1;
1166
1167 cond_ok = !(cr & (1 << (31 - bi)));
1168 break;
1169
1170 case 1: /* 0001y */
1171 if (--ctr == 0)
1172 ctr_ok = 1;
1173
1174 cond_ok = !(cr & (1 << (31 - bi)));
1175 break;
1176
1177 case 2: /* 001zy */
1178 ctr_ok = 1;
1179 cond_ok = !(cr & (1 << (31 - bi)));
1180 break;
1181
1182 case 4: /* 0100y */
1183 if (--ctr != 0)
1184 ctr_ok = 1;
1185
1186 cond_ok = cr & (1 << (31 - bi));
1187 break;
1188
1189 case 5: /* 0101y */
1190 if (--ctr == 0)
1191 ctr_ok = 1;
1192
1193 cond_ok = cr & (1 << (31 - bi));
1194 break;
1195
1196 case 6: /* 011zy */
1197 ctr_ok = 1;
1198 cond_ok = cr & (1 << (31 - bi));
1199 break;
1200
1201 case 8: /* 1z00y */
1202 if (--ctr != 0)
1203 ctr_ok = cond_ok = 1;
1204 break;
1205
1206 case 9: /* 1z01y */
1207 if (--ctr == 0)
1208 ctr_ok = cond_ok = 1;
1209 break;
1210
1211 case 10: /* 1z1zz */
1212 ctr_ok = cond_ok = 1;
1213 break;
1214 }
1215 }
1216
1217 if (branch && (!conditional || (ctr_ok && cond_ok))) {
1218 if (aa)
1219 step = addr;
1220 else
1221 step = addr + pc;
1222
1223 if (lk)
1224 next = pc + 4;
1225 else
1226 next = step;
1227 } else {
1228 step = next = pc + 4;
1229 }
1230
York Sun472d5462013-04-01 11:29:11 -07001231 if (step_over == true)
wdenk7666a902002-09-05 16:50:46 +00001232 *(unsigned long *) nextaddr = next;
1233 else
1234 *(unsigned long *) nextaddr = step;
1235
York Sun472d5462013-04-01 11:29:11 -07001236 return true;
wdenk7666a902002-09-05 16:50:46 +00001237} /* find_next_address */
1238
1239
1240/*
1241 * Copyright (c) 2000 William L. Pitts and W. Gerald Hicks
1242 * All rights reserved.
1243 *
1244 * Redistribution and use in source and binary forms are freely
1245 * permitted provided that the above copyright notice and this
1246 * paragraph and the following disclaimer are duplicated in all
1247 * such forms.
1248 *
1249 * This software is provided "AS IS" and without any express or
1250 * implied warranties, including, without limitation, the implied
1251 * warranties of merchantability and fitness for a particular
1252 * purpose.
1253 */