5 #include <linux/ctype.h>
6 #include <bedbug/bedbug.h>
7 #include <bedbug/ppc.h>
8 #include <bedbug/regs.h>
9 #include <bedbug/tables.h>
11 #define Elf32_Word unsigned long
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.
18 /* #define USE_SOURCE_CODE 1 */
20 #ifdef USE_SOURCE_CODE
21 extern int line_info_from_addr __P ((Elf32_Word, char *, char *, int *));
22 extern struct symreflist *symByAddr;
23 extern char *symbol_name_from_addr __P ((Elf32_Word, int, int *));
24 #endif /* USE_SOURCE_CODE */
26 int print_operands __P ((struct ppc_ctx *));
27 int get_operand_value __P ((struct opcode *, unsigned long,
28 enum OP_FIELD, unsigned long *));
29 struct opcode *find_opcode __P ((unsigned long));
30 struct opcode *find_opcode_by_name __P ((char *));
31 char *spr_name __P ((int));
32 int spr_value __P ((char *));
33 char *tbr_name __P ((int));
34 int tbr_value __P ((char *));
35 int parse_operand __P ((unsigned long, struct opcode *,
36 struct operand *, char *, int *));
37 int get_word __P ((char **, char *));
38 long read_number __P ((char *));
39 int downstring __P ((char *));
42 /*======================================================================
43 * Entry point for the PPC disassembler.
46 * memaddr The address to start disassembling from.
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.
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.
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.
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
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.
75 * Returns TRUE if the area was successfully disassembled or FALSE if
76 * a problem was encountered with accessing the memory.
79 int disppc (unsigned char *memaddr, unsigned char *virtual, int num_instr,
80 int (*pfunc) (const char *), unsigned long flags)
85 #ifdef USE_SOURCE_CODE
88 char funcname[128] = { 0 };
89 char filename[256] = { 0 };
90 char last_funcname[128] = { 0 };
93 char *cursym = (char *) 0;
94 #endif /* USE_SOURCE_CODE */
95 /*------------------------------------------------------------*/
98 ctx.virtual = virtual;
100 /* Figure out the output radix before we go any further */
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");
112 /* Unsigned hex output */
113 strcpy (ctx.radix_fmt, "0x%x");
116 if (ctx.virtual == 0) {
117 ctx.virtual = memaddr;
119 #ifdef USE_SOURCE_CODE
120 if (ctx.flags & F_SYMBOL) {
121 if (symByAddr == 0) /* no symbols loaded */
122 ctx.flags &= ~F_SYMBOL;
128 #endif /* USE_SOURCE_CODE */
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 */
137 for (i = 0; i < num_instr; ++i, memaddr += 4, ctx.virtual += 4) {
138 #ifdef USE_SOURCE_CODE
139 if (ctx.flags & F_LINENO) {
140 if ((line_info_from_addr ((Elf32_Word) ctx.virtual, filename,
141 funcname, &line_no) == TRUE) &&
142 ((line_no != last_line_no) ||
143 (strcmp (last_funcname, funcname) != 0))) {
144 print_source_line (filename, funcname, line_no, pfunc);
146 last_line_no = line_no;
147 strcpy (last_funcname, funcname);
149 #endif /* USE_SOURCE_CODE */
151 sprintf (ctx.data, "%08lx: ", (unsigned long) ctx.virtual);
154 #ifdef USE_SOURCE_CODE
155 if (ctx.flags & F_SYMBOL) {
157 symbol_name_from_addr ((Elf32_Word) ctx.virtual,
164 symbol_name_from_addr ((Elf32_Word) ctx.virtual,
165 FALSE, &symoffset)) != 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);
180 #endif /* USE_SOURCE_CODE */
182 ctx.instr = INSTRUCTION (memaddr);
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),
194 strcat (ctx.data, " ");
198 if ((ctx.op = find_opcode (ctx.instr)) == 0) {
200 sprintf (&ctx.data[ctx.datalen], " .long 0x%08lx",
207 if (((ctx.flags & F_SIMPLE) == 0) ||
208 (ctx.op->hfunc == 0) || ((*ctx.op->hfunc) (&ctx) == FALSE)) {
209 sprintf (&ctx.data[ctx.datalen], "%-7s ", ctx.op->name);
211 print_operands (&ctx);
222 /*======================================================================
223 * Called by the disassembler to print the operands for an instruction.
226 * ctx A pointer to the disassembler context record.
231 int print_operands (struct ppc_ctx *ctx)
235 unsigned long operand;
238 #ifdef USE_SOURCE_CODE
241 #endif /* USE_SOURCE_CODE */
242 /*------------------------------------------------------------*/
244 /* Walk through the operands and list each in order */
245 for (field = 0; ctx->op->fields[field] != 0; ++field) {
246 if (ctx->op->fields[field] > n_operands) {
247 continue; /* bad operand ?! */
250 opr = &operands[ctx->op->fields[field] - 1];
252 if (opr->hint & OH_SILENT) {
256 if ((field > 0) && !open_parens) {
257 strcat (ctx->data, ",");
261 operand = (ctx->instr >> opr->shift) & ((1 << opr->bits) - 1);
263 if (opr->hint & OH_ADDR) {
264 if ((operand & (1 << (opr->bits - 1))) != 0) {
265 operand = operand - (1 << opr->bits);
268 if (ctx->op->hint & H_RELATIVE)
269 operand = (operand << 2) + (unsigned long) ctx->virtual;
271 operand = (operand << 2);
274 sprintf (&ctx->data[ctx->datalen], "0x%lx", operand);
275 ctx->datalen = strlen (ctx->data);
277 #ifdef USE_SOURCE_CODE
278 if ((ctx->flags & F_SYMBOL) &&
280 symbol_name_from_addr (operand, 0, &offset)) != 0)) {
281 sprintf (&ctx->data[ctx->datalen], " <%s", symname);
283 strcat (ctx->data, "+");
284 ctx->datalen = strlen (ctx->data);
285 sprintf (&ctx->data[ctx->datalen], ctx->radix_fmt,
288 strcat (ctx->data, ">");
290 #endif /* USE_SOURCE_CODE */
293 else if (opr->hint & OH_REG) {
294 if ((operand == 0) &&
295 (opr->field == O_rA) && (ctx->op->hint & H_RA0_IS_0)) {
296 strcat (ctx->data, "0");
298 sprintf (&ctx->data[ctx->datalen], "r%d", (short) operand);
302 strcat (ctx->data, ")");
307 else if (opr->hint & OH_SPR) {
308 strcat (ctx->data, spr_name (operand));
311 else if (opr->hint & OH_TBR) {
312 strcat (ctx->data, tbr_name (operand));
315 else if (opr->hint & OH_LITERAL) {
316 switch (opr->field) {
318 strcat (ctx->data, "cr2");
328 sprintf (&ctx->data[ctx->datalen], ctx->radix_fmt,
329 (unsigned short) operand);
332 strcat (ctx->data, ")");
336 else if (opr->hint & OH_OFFSET) {
337 strcat (ctx->data, "(");
342 ctx->datalen = strlen (ctx->data);
346 } /* print_operands */
350 /*======================================================================
351 * Called to get the value of an arbitrary operand with in an instruction.
354 * op The pointer to the opcode structure to which
355 * the operands belong.
357 * instr The instruction (32 bits) containing the opcode
358 * and the operands to print. By the time that
359 * this routine is called the operand has already
360 * been added to the output.
362 * field The field (operand) to get the value of.
364 * value The address of an unsigned long to be filled in
365 * with the value of the operand if it is found. This
366 * will only be filled in if the function returns
367 * TRUE. This may be passed as 0 if the value is
370 * Returns TRUE if the operand was found or FALSE if it was not.
373 int get_operand_value (struct opcode *op, unsigned long instr,
374 enum OP_FIELD field, unsigned long *value)
379 /*------------------------------------------------------------*/
381 if (field > n_operands) {
382 return FALSE; /* bad operand ?! */
385 /* Walk through the operands and list each in order */
386 for (i = 0; op->fields[i] != 0; ++i) {
387 if (op->fields[i] != field) {
391 opr = &operands[op->fields[i] - 1];
394 *value = (instr >> opr->shift) & ((1 << opr->bits) - 1);
400 } /* operand_value */
404 /*======================================================================
405 * Called by the disassembler to match an opcode value to an opcode structure.
408 * instr The instruction (32 bits) to match. This value
409 * may contain operand values as well as the opcode
410 * since they will be masked out anyway for this
413 * Returns the address of an opcode struct (from the opcode table) if the
414 * operand successfully matched an entry, or 0 if no match was found.
417 struct opcode *find_opcode (unsigned long instr)
421 int bottom = n_opcodes - 1;
424 /*------------------------------------------------------------*/
426 while (top <= bottom) {
427 idx = (top + bottom) >> 1;
430 if ((instr & ptr->mask) < ptr->opcode) {
432 } else if ((instr & ptr->mask) > ptr->opcode) {
439 return (struct opcode *) 0;
444 /*======================================================================
445 * Called by the assembler to match an opcode name to an opcode structure.
448 * name The text name of the opcode, e.g. "b", "mtspr", etc.
450 * The opcodes are sorted numerically by their instruction binary code
451 * so a search for the name cannot use the binary search used by the
452 * other find routine.
454 * Returns the address of an opcode struct (from the opcode table) if the
455 * name successfully matched an entry, or 0 if no match was found.
458 struct opcode *find_opcode_by_name (char *name)
462 /*------------------------------------------------------------*/
466 for (idx = 0; idx < n_opcodes; ++idx) {
467 if (!strcmp (name, opcodes[idx].name))
468 return &opcodes[idx];
471 return (struct opcode *) 0;
472 } /* find_opcode_by_name */
476 /*======================================================================
477 * Convert the 'spr' operand from its numeric value to its symbolic name.
480 * value The value of the 'spr' operand. This value should
481 * be unmodified from its encoding in the instruction.
482 * the split-field computations will be performed
483 * here before the switch.
485 * Returns the address of a character array containing the name of the
486 * special purpose register defined by the 'value' parameter, or the
487 * address of a character array containing "???" if no match was found.
490 char *spr_name (int value)
493 static char other[10];
496 /*------------------------------------------------------------*/
498 /* spr is a 10 bit field whose interpretation has the high and low
499 five-bit fields reversed from their encoding in the operand */
501 spr = ((value >> 5) & 0x1f) | ((value & 0x1f) << 5);
503 for (i = 0; i < n_sprs; ++i) {
504 if (spr == spr_map[i].spr_val)
505 return spr_map[i].spr_name;
508 sprintf (other, "%d", spr);
514 /*======================================================================
515 * Convert the 'spr' operand from its symbolic name to its numeric value
518 * name The symbolic name of the 'spr' operand. The
519 * split-field encoding will be done by this routine.
520 * NOTE: name can be a number.
522 * Returns the numeric value for the spr appropriate for encoding a machine
523 * instruction. Returns 0 if unable to find the SPR.
526 int spr_value (char *name)
528 struct spr_info *sprp;
532 /*------------------------------------------------------------*/
537 if (isdigit ((int) name[0])) {
538 i = htonl (read_number (name));
539 spr = ((i >> 5) & 0x1f) | ((i & 0x1f) << 5);
545 for (i = 0; i < n_sprs; ++i) {
548 if (strcmp (name, sprp->spr_name) == 0) {
549 /* spr is a 10 bit field whose interpretation has the high and low
550 five-bit fields reversed from their encoding in the operand */
551 i = htonl (sprp->spr_val);
552 spr = ((i >> 5) & 0x1f) | ((i & 0x1f) << 5);
563 /*======================================================================
564 * Convert the 'tbr' operand from its numeric value to its symbolic name.
567 * value The value of the 'tbr' operand. This value should
568 * be unmodified from its encoding in the instruction.
569 * the split-field computations will be performed
570 * here before the switch.
572 * Returns the address of a character array containing the name of the
573 * time base register defined by the 'value' parameter, or the address
574 * of a character array containing "???" if no match was found.
577 char *tbr_name (int value)
581 /*------------------------------------------------------------*/
583 /* tbr is a 10 bit field whose interpretation has the high and low
584 five-bit fields reversed from their encoding in the operand */
586 tbr = ((value >> 5) & 0x1f) | ((value & 0x1f) << 5);
600 /*======================================================================
601 * Convert the 'tbr' operand from its symbolic name to its numeric value.
604 * name The symbolic name of the 'tbr' operand. The
605 * split-field encoding will be done by this routine.
607 * Returns the numeric value for the spr appropriate for encoding a machine
608 * instruction. Returns 0 if unable to find the TBR.
611 int tbr_value (char *name)
616 /*------------------------------------------------------------*/
623 if (isdigit ((int) name[0])) {
624 val = read_number (name);
626 if (val != 268 && val != 269)
628 } else if (strcmp (name, "tbl") == 0)
630 else if (strcmp (name, "tbu") == 0)
635 /* tbr is a 10 bit field whose interpretation has the high and low
636 five-bit fields reversed from their encoding in the operand */
639 tbr = ((val >> 5) & 0x1f) | ((val & 0x1f) << 5);
645 /*======================================================================
646 * The next several functions (handle_xxx) are the routines that handle
647 * disassembling the opcodes with simplified mnemonics.
650 * ctx A pointer to the disassembler context record.
652 * Returns TRUE if the simpler form was printed or FALSE if it was not.
655 int handle_bc (struct ppc_ctx *ctx)
659 static struct opcode blt = { B_OPCODE (16, 0, 0), B_MASK, {O_BD, 0},
662 static struct opcode bne =
663 { B_OPCODE (16, 0, 0), B_MASK, {O_cr2, O_BD, 0},
666 static struct opcode bdnz = { B_OPCODE (16, 0, 0), B_MASK, {O_BD, 0},
667 0, "bdnz", H_RELATIVE
670 /*------------------------------------------------------------*/
672 if (get_operand_value (ctx->op, ctx->instr, O_BO, &bo) == FALSE)
675 if (get_operand_value (ctx->op, ctx->instr, O_BI, &bi) == FALSE)
678 if ((bo == 12) && (bi == 0)) {
680 sprintf (&ctx->data[ctx->datalen], "%-7s ", ctx->op->name);
682 print_operands (ctx);
684 } else if ((bo == 4) && (bi == 10)) {
686 sprintf (&ctx->data[ctx->datalen], "%-7s ", ctx->op->name);
688 print_operands (ctx);
690 } else if ((bo == 16) && (bi == 0)) {
692 sprintf (&ctx->data[ctx->datalen], "%-7s ", ctx->op->name);
694 print_operands (ctx);
703 /*======================================================================
704 * Outputs source line information for the disassembler. This should
705 * be modified in the future to lookup the actual line of source code
706 * from the file, but for now this will do.
709 * filename The address of a character array containing the
710 * absolute path and file name of the source file.
712 * funcname The address of a character array containing the
713 * name of the function (not C++ demangled (yet))
714 * to which this code belongs.
716 * line_no An integer specifying the source line number that
717 * generated this code.
719 * pfunc The address of a function to call to print the output.
722 * Returns TRUE if it was able to output the line info, or false if it was
726 int print_source_line (char *filename, char *funcname,
727 int line_no, int (*pfunc) (const char *))
731 /*------------------------------------------------------------*/
733 (*pfunc) (""); /* output a newline */
734 sprintf (out_buf, "%s %s(): line %d", filename, funcname, line_no);
738 } /* print_source_line */
742 /*======================================================================
743 * Entry point for the PPC assembler.
746 * asm_buf An array of characters containing the assembly opcode
747 * and operands to convert to a POWERPC machine
750 * Returns the machine instruction or zero.
753 unsigned long asmppc (unsigned long memaddr, char *asm_buf, int *err)
756 struct operand *oper[MAX_OPERANDS];
762 int w_operands = 0; /* wanted # of operands */
763 int n_operands = 0; /* # of operands read */
766 /*------------------------------------------------------------*/
771 if (get_word (&ptr, scratch) == 0)
774 /* Lookup the opcode structure based on the opcode name */
775 if ((opc = find_opcode_by_name (scratch)) == (struct opcode *) 0) {
777 *err = E_ASM_BAD_OPCODE;
782 printf ("asmppc: Opcode = \"%s\"\n", opc->name);
785 for (i = 0; i < 8; ++i) {
786 if (opc->fields[i] == 0)
792 printf ("asmppc: Expecting %d operands\n", w_operands);
797 /* read each operand */
798 while (n_operands < w_operands) {
800 oper[n_operands] = &operands[opc->fields[n_operands] - 1];
802 if (oper[n_operands]->hint & OH_SILENT) {
803 /* Skip silent operands, they are covered in opc->opcode */
806 printf ("asmppc: Operand %d \"%s\" SILENT\n", n_operands,
807 oper[n_operands]->name);
814 if (get_word (&ptr, scratch) == 0)
818 printf ("asmppc: Operand %d \"%s\" : \"%s\"\n", n_operands,
819 oper[n_operands]->name, scratch);
822 if ((param = parse_operand (memaddr, opc, oper[n_operands],
823 scratch, err)) == -1)
830 if (n_operands < w_operands) {
832 *err = E_ASM_NUM_OPERANDS;
837 printf ("asmppc: Instruction = 0x%08lx\n", instr);
845 /*======================================================================
846 * Called by the assembler to interpret a single operand
849 * ctx A pointer to the disassembler context record.
851 * Returns 0 if the operand is ok, or -1 if it is bad.
854 int parse_operand (unsigned long memaddr, struct opcode *opc,
855 struct operand *oper, char *txt, int *err)
861 /*------------------------------------------------------------*/
863 mask = (1 << oper->bits) - 1;
865 if (oper->hint & OH_ADDR) {
866 data = read_number (txt);
868 if (opc->hint & H_RELATIVE)
869 data = data - memaddr;
878 data |= 1 << (oper->bits - 1);
881 else if (oper->hint & OH_REG) {
882 if (txt[0] == 'r' || txt[0] == 'R')
884 else if (txt[0] == '%' && (txt[1] == 'r' || txt[1] == 'R'))
887 data = read_number (txt);
890 *err = E_ASM_BAD_REGISTER;
897 else if (oper->hint & OH_SPR) {
898 if ((data = spr_value (txt)) == 0) {
900 *err = E_ASM_BAD_SPR;
905 else if (oper->hint & OH_TBR) {
906 if ((data = tbr_value (txt)) == 0) {
908 *err = E_ASM_BAD_TBR;
914 data = htonl (read_number (txt));
917 return (data & mask) << oper->shift;
918 } /* parse_operand */
921 char *asm_error_str (int err)
924 case E_ASM_BAD_OPCODE:
926 case E_ASM_NUM_OPERANDS:
927 return "Bad number of operands";
928 case E_ASM_BAD_REGISTER:
929 return "Bad register number";
931 return "Bad SPR name or number";
933 return "Bad TBR name or number";
937 } /* asm_error_str */
941 /*======================================================================
942 * Copy a word from one buffer to another, ignores leading white spaces.
945 * src The address of a character pointer to the
947 * dest A pointer to a character buffer to write the word
950 * Returns the number of non-white space characters copied, or zero.
953 int get_word (char **src, char *dest)
958 /*------------------------------------------------------------*/
960 /* Eat white spaces */
961 while (*ptr && isblank (*ptr))
969 /* Find the text of the word */
970 while (*ptr && !isblank (*ptr) && (*ptr != ','))
971 dest[nchars++] = *ptr++;
972 ptr = (*ptr == ',') ? ptr + 1 : ptr;
981 /*======================================================================
982 * Convert a numeric string to a number, be aware of base notations.
985 * txt The numeric string.
987 * Returns the converted numeric value.
990 long read_number (char *txt)
995 /*------------------------------------------------------------*/
997 if (txt == 0 || *txt == 0)
1005 if (txt[0] == '0' && (txt[1] == 'x' || txt[1] == 'X')) /* hex */
1006 val = simple_strtoul (&txt[2], NULL, 16);
1008 val = simple_strtoul (txt, NULL, 10);
1017 int downstring (char *s)
1033 /*======================================================================
1034 * Examines the instruction at the current address and determines the
1035 * next address to be executed. This will take into account branches
1036 * of different types so that a "step" and "next" operations can be
1040 * nextaddr The address (to be filled in) of the next
1041 * instruction to execute. This will only be a valid
1042 * address if TRUE is returned.
1044 * step_over A flag indicating how to compute addresses for
1045 * branch statements:
1046 * TRUE = Step over the branch (next)
1047 * FALSE = step into the branch (step)
1049 * Returns TRUE if it was able to compute the address. Returns FALSE if
1050 * it has a problem reading the current instruction or one of the registers.
1053 int find_next_address (unsigned char *nextaddr, int step_over,
1054 struct pt_regs *regs)
1056 unsigned long pc; /* SRR0 register from PPC */
1057 unsigned long ctr; /* CTR register from PPC */
1058 unsigned long cr; /* CR register from PPC */
1059 unsigned long lr; /* LR register from PPC */
1060 unsigned long instr; /* instruction at SRR0 */
1061 unsigned long next; /* computed instruction for 'next' */
1062 unsigned long step; /* computed instruction for 'step' */
1063 unsigned long addr = 0; /* target address operand */
1064 unsigned long aa = 0; /* AA operand */
1065 unsigned long lk = 0; /* LK operand */
1066 unsigned long bo = 0; /* BO operand */
1067 unsigned long bi = 0; /* BI operand */
1068 struct opcode *op = 0; /* opcode structure for 'instr' */
1071 int conditional = 0;
1074 /*------------------------------------------------------------*/
1076 if (nextaddr == 0 || regs == 0) {
1077 printf ("find_next_address: bad args");
1081 pc = regs->nip & 0xfffffffc;
1082 instr = INSTRUCTION (pc);
1084 if ((op = find_opcode (instr)) == (struct opcode *) 0) {
1085 printf ("find_next_address: can't parse opcode 0x%lx", instr);
1093 switch (op->opcode) {
1094 case B_OPCODE (16, 0, 0): /* bc */
1095 case B_OPCODE (16, 0, 1): /* bcl */
1096 case B_OPCODE (16, 1, 0): /* bca */
1097 case B_OPCODE (16, 1, 1): /* bcla */
1098 if (!get_operand_value (op, instr, O_BD, &addr) ||
1099 !get_operand_value (op, instr, O_BO, &bo) ||
1100 !get_operand_value (op, instr, O_BI, &bi) ||
1101 !get_operand_value (op, instr, O_AA, &aa) ||
1102 !get_operand_value (op, instr, O_LK, &lk))
1105 if ((addr & (1 << 13)) != 0)
1106 addr = addr - (1 << 14);
1112 case I_OPCODE (18, 0, 0): /* b */
1113 case I_OPCODE (18, 0, 1): /* bl */
1114 case I_OPCODE (18, 1, 0): /* ba */
1115 case I_OPCODE (18, 1, 1): /* bla */
1116 if (!get_operand_value (op, instr, O_LI, &addr) ||
1117 !get_operand_value (op, instr, O_AA, &aa) ||
1118 !get_operand_value (op, instr, O_LK, &lk))
1121 if ((addr & (1 << 23)) != 0)
1122 addr = addr - (1 << 24);
1128 case XL_OPCODE (19, 528, 0): /* bcctr */
1129 case XL_OPCODE (19, 528, 1): /* bcctrl */
1130 if (!get_operand_value (op, instr, O_BO, &bo) ||
1131 !get_operand_value (op, instr, O_BI, &bi) ||
1132 !get_operand_value (op, instr, O_LK, &lk))
1141 case XL_OPCODE (19, 16, 0): /* bclr */
1142 case XL_OPCODE (19, 16, 1): /* bclrl */
1143 if (!get_operand_value (op, instr, O_BO, &bo) ||
1144 !get_operand_value (op, instr, O_BI, &bi) ||
1145 !get_operand_value (op, instr, O_LK, &lk))
1161 switch ((bo & 0x1e) >> 1) {
1166 cond_ok = !(cr & (1 << (31 - bi)));
1173 cond_ok = !(cr & (1 << (31 - bi)));
1178 cond_ok = !(cr & (1 << (31 - bi)));
1185 cond_ok = cr & (1 << (31 - bi));
1192 cond_ok = cr & (1 << (31 - bi));
1197 cond_ok = cr & (1 << (31 - bi));
1202 ctr_ok = cond_ok = 1;
1207 ctr_ok = cond_ok = 1;
1210 case 10: /* 1z1zz */
1211 ctr_ok = cond_ok = 1;
1216 if (branch && (!conditional || (ctr_ok && cond_ok))) {
1227 step = next = pc + 4;
1230 if (step_over == TRUE)
1231 *(unsigned long *) nextaddr = next;
1233 *(unsigned long *) nextaddr = step;
1236 } /* find_next_address */
1240 * Copyright (c) 2000 William L. Pitts and W. Gerald Hicks
1241 * All rights reserved.
1243 * Redistribution and use in source and binary forms are freely
1244 * permitted provided that the above copyright notice and this
1245 * paragraph and the following disclaimer are duplicated in all
1248 * This software is provided "AS IS" and without any express or
1249 * implied warranties, including, without limitation, the implied
1250 * warranties of merchantability and fitness for a particular