Print this page
libdisasm: print push/pop register list in a more human readable form
Instead of just blindly dumping a list of registers, we detect ranges and
print a list of ranges.
libdisasm: print r9 as "fp"
libdisasm: use "push" and "pop" when appropriate
While there is nothing technically wrong with printing the actual
instruction, it is easier on the eyes to just use these common aliases.
libdisasm: remove shouting
There's no need to print everything upper case.

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libdisasm/common/dis_arm.c
          +++ new/usr/src/lib/libdisasm/common/dis_arm.c
↓ open down ↓ 17 lines elided ↑ open up ↑
  18   18   * All instructions come in as uint32_t's.
  19   19   */
  20   20  
  21   21  #include <libdisasm.h>
  22   22  #include <stdint.h>
  23   23  #include <stdio.h>
  24   24  #include <sys/byteorder.h>
  25   25  
  26   26  #include "libdisasm_impl.h"
  27   27  
       28 +extern size_t strlen(const char *);
  28   29  extern size_t strlcat(char *, const char *, size_t);
  29   30  
  30   31  /*
  31   32   * Condition code mask and shift, aka bits 28-31.
  32   33   */
  33   34  #define ARM_CC_MASK     0xf0000000
  34   35  #define ARM_CC_SHIFT    28
  35   36  
  36   37  /*
  37   38   * First level of decoding, aka bits 25-27.
↓ open down ↓ 348 lines elided ↑ open up ↑
 386  387  
 387  388  /*
 388  389   * This is the table of condition codes that instructions might have. Every
 389  390   * instruction starts with a four bit code. The last two codes are special.
 390  391   * 0b1110 is the always condition. Therefore we leave off its mneomic extension
 391  392   * and treat it as the empty string. The condition code 0b1111 takes us to a
 392  393   * separate series of encoded instructions and therefore we go elsewhere with
 393  394   * them.
 394  395   */
 395  396  static const char *arm_cond_names[] = {
 396      -        "EQ",           /* Equal */
 397      -        "NE",           /* Not Equal */
 398      -        "CS/HS",        /* Carry set/unsigned higher or same */
 399      -        "CC/LO",        /* Carry clear/unsigned lower */
 400      -        "MI",           /* Minus/negative */
 401      -        "PL",           /* Plus/positive or zero */
 402      -        "VS",           /* Overflow */
 403      -        "VC",           /* No overflow */
 404      -        "HI",           /* Unsigned higher */
 405      -        "LS",           /* Unsigned lower or same */
 406      -        "GE",           /* Signed greater than or equal */
 407      -        "LT",           /* Signed less than */
 408      -        "GT",           /* Signed greater than */
 409      -        "LE",           /* Signed less than or equal */
      397 +        "eq",           /* Equal */
      398 +        "ne",           /* Not Equal */
      399 +        "cs/hs",        /* Carry set/unsigned higher or same */
      400 +        "cc/lo",        /* Carry clear/unsigned lower */
      401 +        "mi",           /* Minus/negative */
      402 +        "pl",           /* Plus/positive or zero */
      403 +        "vs",           /* Overflow */
      404 +        "vc",           /* No overflow */
      405 +        "hi",           /* Unsigned higher */
      406 +        "ls",           /* Unsigned lower or same */
      407 +        "ge",           /* Signed greater than or equal */
      408 +        "lt",           /* Signed less than */
      409 +        "gt",           /* Signed greater than */
      410 +        "le",           /* Signed less than or equal */
 410  411          "",             /* AL - Always (unconditional) */
 411  412          NULL            /* Not a condition code */
 412  413  };
 413  414  
 414  415  typedef enum arm_cond_code {
 415  416          ARM_COND_EQ,    /* Equal */
 416  417          ARM_COND_NE,    /* Not Equal */
 417  418          ARM_COND_CSHS,  /* Carry set/unsigned higher or same */
 418  419          ARM_COND_CCLO,  /* Carry clear/unsigned lower */
 419  420          ARM_COND_MI,    /* Minus/negative */
↓ open down ↓ 8 lines elided ↑ open up ↑
 428  429          ARM_COND_LE,    /* Signed less than or equal */
 429  430          ARM_COND_AL,    /* AL - Always (unconditional) */
 430  431          ARM_COND_NACC   /* Not a condition code */
 431  432  } arm_cond_code_t;
 432  433  
 433  434  /*
 434  435   * Registers are encoded surprisingly sanely. It's a 4-bit value that indicates
 435  436   * which register in question we're working with.
 436  437   */
 437  438  static const char *arm_reg_names[] = {
 438      -        "R0",
 439      -        "R1",
 440      -        "R2",
 441      -        "R3",
 442      -        "R4",
 443      -        "R5",
 444      -        "R6",
 445      -        "R7",
 446      -        "R8",
 447      -        "R9",
 448      -        "R10",
 449      -        "R11",
 450      -        "IP",   /* Alt for R12 */
 451      -        "SP",   /* Alt for R13 */
 452      -        "LR",   /* Alt for R14 */
 453      -        "PC"    /* Alt for R15 */
      439 +        "r0",
      440 +        "r1",
      441 +        "r2",
      442 +        "r3",
      443 +        "r4",
      444 +        "r5",
      445 +        "r6",
      446 +        "r7",
      447 +        "r8",
      448 +        "fp",   /* Alt for r9 */
      449 +        "r10",
      450 +        "r11",
      451 +        "ip",   /* Alt for r12 */
      452 +        "sp",   /* Alt for r13 */
      453 +        "lr",   /* Alt for r14 */
      454 +        "pc"    /* Alt for r15 */
 454  455  };
 455  456  
 456  457  typedef enum arm_reg {
 457  458          ARM_REG_R0,
 458  459          ARM_REG_R1,
 459  460          ARM_REG_R2,
 460  461          ARM_REG_R3,
 461  462          ARM_REG_R4,
 462  463          ARM_REG_R5,
 463  464          ARM_REG_R6,
↓ open down ↓ 28 lines elided ↑ open up ↑
 492  493          "p13",
 493  494          "p14",
 494  495          "p15"
 495  496  };
 496  497  
 497  498  /*
 498  499   * These are the opcodes for the instructions which are considered data
 499  500   * processing instructions.
 500  501   */
 501  502  static const char *arm_dpi_opnames[] = {
 502      -        "AND",  /* Logical AND */
 503      -        "EOR",  /* Logical Exclusive OR */
 504      -        "SUB",  /* Subtract */
 505      -        "RSB",  /* Reverse Subtract */
 506      -        "ADD",  /* Add */
 507      -        "ADC",  /* Add with Carry */
 508      -        "SBC",  /* Subtract with Carry */
 509      -        "RSC",  /* Reverse Subtract with Carry */
 510      -        "TST",  /* Test */
 511      -        "TEQ",  /* Test Equivalence */
 512      -        "CMP",  /* Compare */
 513      -        "CMN",  /* Compare negated */
 514      -        "ORR",  /* Logical (inclusive) OR */
 515      -        "MOV",  /* Move */
 516      -        "BIC",  /* Bit clear */
 517      -        "MVN"   /* Move not */
      503 +        "and",  /* Logical AND */
      504 +        "eor",  /* Logical Exclusive OR */
      505 +        "sub",  /* Subtract */
      506 +        "rsb",  /* Reverse Subtract */
      507 +        "add",  /* Add */
      508 +        "adc",  /* Add with Carry */
      509 +        "sbc",  /* Subtract with Carry */
      510 +        "rsc",  /* Reverse Subtract with Carry */
      511 +        "tst",  /* Test */
      512 +        "teq",  /* Test Equivalence */
      513 +        "cmp",  /* Compare */
      514 +        "cmn",  /* Compare negated */
      515 +        "orr",  /* Logical (inclusive) OR */
      516 +        "mov",  /* Move */
      517 +        "bic",  /* Bit clear */
      518 +        "mvn"   /* Move not */
 518  519  };
 519  520  
 520  521  typedef enum arm_dpi_opcode {
 521  522          DPI_OP_AND,     /* Logical AND */
 522  523          DPI_OP_EOR,     /* Logical Exclusive OR */
 523  524          DPI_OP_SUB,     /* Subtract */
 524  525          DPI_OP_RSB,     /* Reverse Subtract */
 525  526          DPI_OP_ADD,     /* Add */
 526  527          DPI_OP_ADC,     /* Add with Carry */
 527  528          DPI_OP_SBC,     /* Subtract with Carry */
↓ open down ↓ 2 lines elided ↑ open up ↑
 530  531          DPI_OP_TEQ,     /* Test Equivalence */
 531  532          DPI_OP_CMP,     /* Compare */
 532  533          DPI_OP_CMN,     /* Compare negated */
 533  534          DPI_OP_ORR,     /* Logical (inclusive) OR */
 534  535          DPI_OP_MOV,     /* Move */
 535  536          DPI_OP_BIC,     /* Bit clear */
 536  537          DPI_OP_MVN      /* Move not */
 537  538  } arm_dpi_opcode_t;
 538  539  
 539  540  const char *arm_dpi_shifts[] = {
 540      -        "LSL",  /* Logical shift left */
 541      -        "LSR",  /* Logical shift right */
 542      -        "ASR",  /* Arithmetic shift right */
 543      -        "ROR",  /* Rotate right */
 544      -        "RRX"   /* Rotate right with extend. This is a special case of ROR */
      541 +        "lsl",  /* Logical shift left */
      542 +        "lsr",  /* Logical shift right */
      543 +        "asr",  /* Arithmetic shift right */
      544 +        "ror",  /* Rotate right */
      545 +        "rrx"   /* Rotate right with extend. This is a special case of ror */
 545  546  };
 546  547  
 547  548  typedef enum arm_dpi_shift_code {
 548  549          DPI_S_LSL,      /* Logical shift left */
 549  550          DPI_S_LSR,      /* Logical shift right */
 550  551          DPI_S_ASR,      /* Arithmetic shift right */
 551  552          DPI_S_ROR,      /* Rotate right */
 552      -        DPI_S_RRX,      /* Rotate right with extend. Special case of ROR */
      553 +        DPI_S_RRX,      /* Rotate right with extend. Special case of ror */
 553  554          DPI_S_NONE      /* No shift code */
 554  555  } arm_dpi_shift_code_t;
 555  556  
 556  557  #define ARM_DPI_SHIFTER_IMM32   0x00
 557  558  #define ARM_DPI_SHIFTER_SIMM    0x01
 558  559  #define ARM_DPI_SHIFTER_SREG    0x02
 559  560  
 560  561  typedef struct arm_dpi_shifter_imm {
 561  562          uint8_t dpisi_rot;                      /* Rotation amount */
 562  563          uint8_t dpisi_imm;                      /* Immediate value */
↓ open down ↓ 24 lines elided ↑ open up ↑
 587  588                  arm_dpi_shifter_sreg_t dpii_ri;
 588  589          } dpii_un;
 589  590  } arm_dpi_inst_t;
 590  591  
 591  592  /*
 592  593   * This table contains the names of the load store multiple addressing modes.
 593  594   * The P and U bits are supposed to be combined to index into this. You should
 594  595   * do this by doing P << 1 | U.
 595  596   */
 596  597  static const char *arm_lsm_mode_names[] = {
 597      -        "DA",
 598      -        "IA",
 599      -        "DB",
 600      -        "IB"
      598 +        "da",
      599 +        "ia",
      600 +        "db",
      601 +        "ib"
 601  602  };
 602  603  
 603  604  /*
 604  605   * The MSR field has a four bit field mask. Each bit correspons to a letter.
 605  606   * From high to low, f, s, x, c. At least one must be specified, hence 0 is
 606  607   * NULL. The preferred manual ordering of these is csxf.
 607  608   */
 608  609  static const char *arm_cdsp_msr_field_names[] = {
 609  610          NULL,
 610  611          "c",    /* 0001 */
↓ open down ↓ 11 lines elided ↑ open up ↑
 622  623          "csf",  /* 1101 */
 623  624          "sxf",  /* 1110 */
 624  625          "csxf"  /* 1111 */
 625  626  };
 626  627  
 627  628  /*
 628  629   * Names for specific saturating add and subtraction instructions from the
 629  630   * extended control and dsp instructino section.
 630  631   */
 631  632  static const char *arm_cdsp_sat_opnames[] = {
 632      -        "ADD",
 633      -        "SUB",
 634      -        "DADD",
 635      -        "DSUB"
      633 +        "add",
      634 +        "sub",
      635 +        "dadd",
      636 +        "dsub"
 636  637  };
 637  638  
 638  639  static const char *arm_padd_p_names[] = {
 639  640          NULL,   /* 000 */
 640      -        "S",    /* 001 */
 641      -        "Q",    /* 010 */
 642      -        "SH",   /* 011 */
      641 +        "s",    /* 001 */
      642 +        "q",    /* 010 */
      643 +        "sh",   /* 011 */
 643  644          NULL,   /* 100 */
 644      -        "U",    /* 101 */
 645      -        "UQ",   /* 110 */
 646      -        "UH",   /* 111 */
      645 +        "u",    /* 101 */
      646 +        "uq",   /* 110 */
      647 +        "uh",   /* 111 */
 647  648  };
 648  649  
 649  650  static const char *arm_padd_i_names[] = {
 650      -        "ADD16",        /* 000 */
 651      -        "ADDSUBX",      /* 001 */
 652      -        "SUBADDX",      /* 010 */
 653      -        "SUB16",        /* 011 */
 654      -        "ADD8",         /* 100 */
      651 +        "add16",        /* 000 */
      652 +        "addsubx",      /* 001 */
      653 +        "subaddx",      /* 010 */
      654 +        "sub16",        /* 011 */
      655 +        "add8",         /* 100 */
 655  656          NULL,           /* 101 */
 656  657          NULL,           /* 110 */
 657      -        "SUB8",         /* 111 */
      658 +        "sub8",         /* 111 */
 658  659  };
 659  660  
 660  661  static const char *arm_extend_rot_names[] = {
 661  662          "",             /* 0b00, ROR #0 */
 662      -        ", ROR #8",     /* 0b01 */
 663      -        ", ROR #16",    /* 0b10 */
 664      -        ", ROR #24"     /* 0b11 */
      663 +        ", ror #8",     /* 0b01 */
      664 +        ", ror #16",    /* 0b10 */
      665 +        ", ror #24"     /* 0b11 */
 665  666  };
 666  667  
 667  668  /*
 668  669   * There are sixteen data processing instructions (dpi). They come in a few
 669  670   * different forms which are based on whether immediate values are used and
 670  671   * whether or not some special purpose shifting is done. We use this one entry
 671  672   * point to cover all the different types.
 672  673   *
 673  674   * From the ARM arch manual:
 674  675   *
↓ open down ↓ 96 lines elided ↑ open up ↑
 771  772  
 772  773          /*
 773  774           * Print everything before the shifter based on the instruction
 774  775           */
 775  776          switch (dpi_inst.dpii_op) {
 776  777          case DPI_OP_MOV:
 777  778          case DPI_OP_MVN:
 778  779                  len = snprintf(buf, buflen, "%s%s%s %s",
 779  780                      arm_dpi_opnames[dpi_inst.dpii_op],
 780  781                      arm_cond_names[dpi_inst.dpii_cond],
 781      -                    dpi_inst.dpii_sbit != 0 ? "S" : "",
      782 +                    dpi_inst.dpii_sbit != 0 ? "s" : "",
 782  783                      arm_reg_names[dpi_inst.dpii_rd]);
 783  784                  break;
 784  785          case DPI_OP_CMP:
 785  786          case DPI_OP_CMN:
 786  787          case DPI_OP_TST:
 787  788          case DPI_OP_TEQ:
 788  789                  len = snprintf(buf, buflen, "%s%s %s",
 789  790                      arm_dpi_opnames[dpi_inst.dpii_op],
 790  791                      arm_cond_names[dpi_inst.dpii_cond],
 791  792                      arm_reg_names[dpi_inst.dpii_rn]);
 792  793                  break;
 793  794          default:
 794  795                  len = snprintf(buf, buflen,
 795  796                      "%s%s%s %s, %s", arm_dpi_opnames[dpi_inst.dpii_op],
 796  797                      arm_cond_names[dpi_inst.dpii_cond],
 797      -                    dpi_inst.dpii_sbit != 0 ? "S" : "",
      798 +                    dpi_inst.dpii_sbit != 0 ? "s" : "",
 798  799                      arm_reg_names[dpi_inst.dpii_rd],
 799  800                      arm_reg_names[dpi_inst.dpii_rn]);
 800  801                  break;
 801  802          }
 802  803  
 803  804          if (len >= buflen)
 804  805                  return (-1);
 805  806          buflen -= len;
 806  807          buf += len;
 807  808  
↓ open down ↓ 15 lines elided ↑ open up ↑
 823  824                      rawrot, imm);
 824  825                  break;
 825  826          }
 826  827          case ARM_DPI_SHIFTER_SIMM:
 827  828                  if (dpi_inst.dpii_un.dpii_si.dpiss_code == DPI_S_NONE) {
 828  829                          len = snprintf(buf, buflen, ", %s",
 829  830                              arm_reg_names[dpi_inst.dpii_un.dpii_si.dpiss_targ]);
 830  831                          break;
 831  832                  }
 832  833                  if (dpi_inst.dpii_un.dpii_si.dpiss_code == DPI_S_RRX) {
 833      -                        len = snprintf(buf, buflen, ", %s RRX",
      834 +                        len = snprintf(buf, buflen, ", %s rrx",
 834  835                              arm_reg_names[dpi_inst.dpii_un.dpii_si.dpiss_targ]);
 835  836                          break;
 836  837                  }
 837  838                  len = snprintf(buf, buflen, ", %s, %s #%d",
 838  839                      arm_reg_names[dpi_inst.dpii_un.dpii_si.dpiss_targ],
 839  840                      arm_dpi_shifts[dpi_inst.dpii_un.dpii_si.dpiss_code],
 840  841                      dpi_inst.dpii_un.dpii_si.dpiss_imm);
 841  842                  break;
 842  843          case ARM_DPI_SHIFTER_SREG:
 843  844                  len = snprintf(buf, buflen, ", %s, %s %s",
↓ open down ↓ 49 lines elided ↑ open up ↑
 893  894          cc = (in & ARM_CC_MASK) >> ARM_CC_SHIFT;
 894  895          ibit = in & ARM_LS_IBIT_MASK;
 895  896          pbit = in & ARM_LS_PBIT_MASK;
 896  897          ubit = in & ARM_LS_UBIT_MASK;
 897  898          bbit = in & ARM_LS_BBIT_MASK;
 898  899          wbit = in & ARM_LS_WBIT_MASK;
 899  900          lbit = in & ARM_LS_LBIT_MASK;
 900  901          rd = (in & ARM_LS_RD_MASK) >> ARM_LS_RD_SHIFT;
 901  902          rn = (in & ARM_LS_RN_MASK) >> ARM_LS_RN_SHIFT;
 902  903  
 903      -        len = snprintf(buf, buflen, "%s%s%s%s %s, ", lbit != 0 ? "LDR" : "STR",
 904      -            arm_cond_names[cc], bbit != 0 ? "B" : "",
 905      -            (pbit == 0 && wbit != 0) ? "T" : "",
      904 +        len = snprintf(buf, buflen, "%s%s%s%s %s, ", lbit != 0 ? "ldr" : "str",
      905 +            arm_cond_names[cc], bbit != 0 ? "b" : "",
      906 +            (pbit == 0 && wbit != 0) ? "t" : "",
 906  907              arm_reg_names[rd]);
 907  908          if (len >= buflen)
 908  909                  return (-1);
 909  910  
 910  911          /* Figure out the specifics of the encoding for the rest */
 911  912          if (ibit == 0 && pbit != 0) {
 912  913                  /*
 913  914                   * This is the immediate offset mode (A5.2.2). That means that
 914  915                   * we have something of the form [ <Rn>, #+/-<offset_12> ]. All
 915  916                   * of the mode specific bits contribute to offset_12. We also
↓ open down ↓ 65 lines elided ↑ open up ↑
 981  982                                  return (-1);
 982  983                          if (sc != DPI_S_RRX)
 983  984                                  len += snprintf(buf + len, buflen - len,
 984  985                                      " #%d", simm);
 985  986                  }
 986  987          }
 987  988  
 988  989          return (len < buflen ? 0 : -1);
 989  990  }
 990  991  
      992 +static void
      993 +print_range(char **bufp, size_t *buflenp, uint16_t regs, uint16_t precede)
      994 +{
      995 +        char *buf = *bufp;
      996 +        size_t buflen = *buflenp;
      997 +        boolean_t cont = B_FALSE;
      998 +        int minreg = -1;
      999 +        int i;
     1000 +
     1001 +        *buf = '\0';
     1002 +
     1003 +        if (precede && regs)
     1004 +                strlcat(buf, ", ", buflen);
     1005 +
     1006 +        for (i = 0; i < 16; i++) {
     1007 +                boolean_t present = (regs & (1 << i)) != 0;
     1008 +                boolean_t lastreg = (regs & (2 << i)) == 0;
     1009 +
     1010 +                if (!present)
     1011 +                        continue;
     1012 +
     1013 +                if (minreg == -1) {
     1014 +                        if (cont)
     1015 +                                strlcat(buf, ", ", buflen);
     1016 +
     1017 +                        strlcat(buf, arm_reg_names[i], buflen);
     1018 +
     1019 +                        if (!lastreg)
     1020 +                                minreg = i;
     1021 +                } else {
     1022 +                        if (lastreg) {
     1023 +                                strlcat(buf, "-", buflen);
     1024 +                                strlcat(buf, arm_reg_names[i], buflen);
     1025 +                                minreg = -1;
     1026 +                        }
     1027 +                }
     1028 +
     1029 +                cont = B_TRUE;
     1030 +        }
     1031 +
     1032 +        *bufp += strlen(buf);
     1033 +        *buflenp -= strlen(buf);
     1034 +}
     1035 +
     1036 +static size_t
     1037 +print_reg_list(char *buf, size_t buflen, uint16_t regs)
     1038 +{
     1039 +        char *save = buf;
     1040 +
     1041 +        print_range(&buf, &buflen, regs & 0x01ff, 0);
     1042 +        print_range(&buf, &buflen, regs & 0x0200, regs & 0x01ff); /* fp */
     1043 +        print_range(&buf, &buflen, regs & 0x0c00, regs & 0x03ff);
     1044 +        print_range(&buf, &buflen, regs & 0x1000, regs & 0x0fff); /* ip */
     1045 +        print_range(&buf, &buflen, regs & 0x2000, regs & 0x1fff); /* sp */
     1046 +        print_range(&buf, &buflen, regs & 0x4000, regs & 0x3fff); /* lr */
     1047 +        print_range(&buf, &buflen, regs & 0x8000, regs & 0x7fff); /* pc */
     1048 +
     1049 +        return (strlen(save));
     1050 +}
     1051 +
 991 1052  /*
 992 1053   * This handles load and store multiple instructions. The general format is as
 993 1054   * follows:
 994 1055   *
 995 1056   * 31 - 28|27 26 25|24|23|22|21|20|19-16|15-0
 996 1057   * [ cond | 1  0 0 |P |U |S |W |L | Rn | register set
 997 1058   *
 998 1059   * The register set has one bit per register. If a bit is set it indicates that
 999 1060   * register and if it is not set then it indicates that the register is not
1000 1061   * included in this.
↓ open down ↓ 29 lines elided ↑ open up ↑
1030 1091   * Finally the last useful bit is how the registers list is specified. It is a
1031 1092   * comma separated list inside of { }. However, a user may separate a contiguous
1032 1093   * range by the use of a -, eg. R0 - R4. However, it is impossible for us to map
1033 1094   * back directly to what the user did. So for now, we punt on second down and
1034 1095   * instead just list each indidvidual register rather than attempt a joining
1035 1096   * routine.
1036 1097   */
1037 1098  static int
1038 1099  arm_dis_ldstr_multi(uint32_t in, char *buf, size_t buflen)
1039 1100  {
1040      -        int sbit, wbit, lbit, ii, cont;
     1101 +        int sbit, wbit, lbit;
1041 1102          uint16_t regs, addr_mode;
1042 1103          arm_reg_t rn;
1043 1104          arm_cond_code_t cc;
1044 1105          size_t len;
1045 1106  
1046 1107          cc = (in & ARM_CC_MASK) >> ARM_CC_SHIFT;
1047 1108          sbit = in & ARM_LSM_SBIT_MASK;
1048 1109          wbit = in & ARM_LSM_WBIT_MASK;
1049 1110          lbit = in & ARM_LSM_LBIT_MASK;
1050 1111          rn = (in & ARM_LSM_RN_MASK) >> ARM_LSM_RN_SHIFT;
1051 1112          regs = in & ARM_LSM_RLIST_MASK;
1052 1113          addr_mode = (in & ARM_LSM_ADDR_MASK) >> ARM_LSM_ADDR_SHIFT;
1053 1114  
1054      -        len = snprintf(buf, buflen, "%s%s%s %s%s, { ",
1055      -            lbit != 0 ? "LDM" : "STM",
1056      -            arm_cond_names[cc],
1057      -            arm_lsm_mode_names[addr_mode],
1058      -            arm_reg_names[rn],
1059      -            wbit != 0 ? "!" : "");
1060      -
1061      -        cont = 0;
1062      -        for (ii = 0; ii < 16; ii++) {
1063      -                if (!(regs & (1 << ii)))
1064      -                        continue;
     1115 +        if ((lbit == 0 && addr_mode == 2 && rn == ARM_REG_R13 && wbit != 0) ||
     1116 +            (lbit != 0 && addr_mode == 1 && rn == ARM_REG_R13 && wbit != 0))
     1117 +                len = snprintf(buf, buflen, "%s%s { ",
     1118 +                    lbit != 0 ? "pop" : "push",
     1119 +                    arm_cond_names[cc]);
     1120 +        else
     1121 +                len = snprintf(buf, buflen, "%s%s%s %s%s, { ",
     1122 +                    lbit != 0 ? "ldm" : "stm",
     1123 +                    arm_cond_names[cc],
     1124 +                    arm_lsm_mode_names[addr_mode],
     1125 +                    arm_reg_names[rn],
     1126 +                    wbit != 0 ? "!" : "");
1065 1127  
1066      -                len += snprintf(buf + len, buflen - len, "%s%s",
1067      -                    cont > 0 ? ", " : "", arm_reg_names[ii]);
1068      -                if (len >= buflen)
1069      -                        return (-1);
1070      -                cont++;
1071      -        }
     1128 +        len += print_reg_list(buf + len, buflen - len, regs);
1072 1129  
1073 1130          len += snprintf(buf + len, buflen - len, " }%s", sbit != 0 ? "^" : "");
1074 1131          return (len >= buflen ? -1 : 0);
1075 1132  }
1076 1133  
1077 1134  /*
1078      - * Here we need to handle miscillaneous loads and stores. This is used to load
     1135 + * Here we need to handle miscellaneous loads and stores. This is used to load
1079 1136   * and store signed and unsigned half words. To load a signed byte. And to load
1080 1137   * and store double words. There is no specific store routines for signed bytes
1081 1138   * and halfwords as they are supposed to use the SRB and STRH. There are two
1082 1139   * primary encodings this time. The general case looks like:
1083 1140   *
1084 1141   * 31 - 28|27 - 25|24|23|22|21|20|19-16|15-12|11-8 |7|6|5|4|3-0
1085 1142   * [ cond |   0   |P |U |I |W |L | Rn | Rd   |amode|1|S|H|1|amode ]
1086 1143   *
1087 1144   * The I, P, U, and W bits specify the addressing mode.
1088 1145   * The L, S, and H bits describe the type and size.
↓ open down ↓ 32 lines elided ↑ open up ↑
1121 1178          const char *iname, *suffix;
1122 1179          int lbit, sbit, hbit, pbit, ubit, ibit, wbit;
1123 1180          uint8_t imm;
1124 1181          size_t len;
1125 1182  
1126 1183          lbit = in & ARM_ELS_LBIT_MASK;
1127 1184          sbit = in & ARM_ELS_SBIT_MASK;
1128 1185          hbit = in & ARM_ELS_SBIT_MASK;
1129 1186  
1130 1187          if (lbit || (sbit && hbit == 0))
1131      -                iname = "LDR";
     1188 +                iname = "ldr";
1132 1189          else
1133      -                iname = "STR";
     1190 +                iname = "str";
1134 1191  
1135 1192          if (sbit == 0 && hbit)
1136      -                suffix = "H";
     1193 +                suffix = "h";
1137 1194          else if (lbit == 0)
1138      -                suffix = "D";
     1195 +                suffix = "d";
1139 1196          else if (sbit && hbit == 0)
1140      -                suffix = "SB";
     1197 +                suffix = "sb";
1141 1198          else if (sbit && hbit)
1142      -                suffix = "SH";
     1199 +                suffix = "sh";
1143 1200  
1144 1201          cc = (in & ARM_CC_MASK) >> ARM_CC_SHIFT;
1145 1202          rn = (in & ARM_ELS_RN_MASK) >> ARM_ELS_RN_SHIFT;
1146 1203          rd = (in & ARM_ELS_RD_MASK) >> ARM_ELS_RD_SHIFT;
1147 1204  
1148 1205          len = snprintf(buf, buflen, "%s%s%s %s, ", iname, arm_cond_names[cc],
1149 1206              suffix, arm_reg_names[rd]);
1150 1207          if (len >= buflen)
1151 1208                  return (-1);
1152 1209  
↓ open down ↓ 42 lines elided ↑ open up ↑
1195 1252  arm_dis_swap(uint32_t in, char *buf, size_t buflen)
1196 1253  {
1197 1254          arm_cond_code_t cc;
1198 1255          arm_reg_t rn, rd, rm;
1199 1256  
1200 1257          cc = (in & ARM_CC_MASK) >> ARM_CC_SHIFT;
1201 1258          rn = (in & ARM_ELS_RN_MASK) >> ARM_ELS_RN_SHIFT;
1202 1259          rd = (in & ARM_ELS_RD_MASK) >> ARM_ELS_RD_SHIFT;
1203 1260          rm = in & ARM_ELS_RN_MASK;
1204 1261  
1205      -        if (snprintf(buf, buflen, "SWP%s%s %s, %s, [%s]",
     1262 +        if (snprintf(buf, buflen, "swp%s%s %s, %s, [%s]",
1206 1263              arm_cond_names[cc],
1207      -            (in & ARM_ELS_SWAP_BYTE_MASK) ? "B" : "",
     1264 +            (in & ARM_ELS_SWAP_BYTE_MASK) ? "b" : "",
1208 1265              arm_reg_names[rd], arm_reg_names[rm], arm_reg_names[rn]) >=
1209 1266              buflen)
1210 1267                  return (-1);
1211 1268  
1212 1269          return (0);
1213 1270  }
1214 1271  
1215 1272  /*
1216 1273   * Handle LDREX and STREX out of the extra loads/stores extensions.
1217 1274   */
↓ open down ↓ 4 lines elided ↑ open up ↑
1222 1279          arm_reg_t rn, rd, rm;
1223 1280          int lbit;
1224 1281          size_t len;
1225 1282  
1226 1283          cc = (in & ARM_CC_MASK) >> ARM_CC_SHIFT;
1227 1284          rn = (in & ARM_ELS_RN_MASK) >> ARM_ELS_RN_SHIFT;
1228 1285          rd = (in & ARM_ELS_RD_MASK) >> ARM_ELS_RD_SHIFT;
1229 1286          rm = in & ARM_ELS_RN_MASK;
1230 1287          lbit = in & ARM_ELS_LBIT_MASK;
1231 1288  
1232      -        len = snprintf(buf, buflen, "%s%sEX %s, ",
1233      -            lbit != 0 ? "LDR" : "STR",
     1289 +        len = snprintf(buf, buflen, "%s%sex %s, ",
     1290 +            lbit != 0 ? "ldr" : "str",
1234 1291              arm_cond_names[cc], arm_reg_names[rd]);
1235 1292          if (len >= buflen)
1236 1293                  return (-1);
1237 1294  
1238 1295          if (lbit)
1239 1296                  len += snprintf(buf + len, buflen - len, "[%s]",
1240 1297                      arm_reg_names[rn]);
1241 1298          else
1242 1299                  len += snprintf(buf + len, buflen - len, "%s, [%s]",
1243 1300                      arm_reg_names[rm], arm_reg_names[rn]);
↓ open down ↓ 41 lines elided ↑ open up ↑
1285 1342           */
1286 1343          rd = (in & ARM_EMULT_RD_MASK) >> ARM_EMULT_RD_SHIFT;
1287 1344          rn = (in & ARM_EMULT_RN_MASK) >> ARM_EMULT_RN_SHIFT;
1288 1345          rs = (in & ARM_EMULT_RS_MASK) >> ARM_EMULT_RS_SHIFT;
1289 1346          rm = in & ARM_EMULT_RM_MASK;
1290 1347  
1291 1348          cc = (in & ARM_CC_MASK) >> ARM_CC_SHIFT;
1292 1349  
1293 1350          if ((in & ARM_EMULT_MA_MASK) == 0) {
1294 1351                  if (in & ARM_EMULT_ABIT_MASK) {
1295      -                        len = snprintf(buf, buflen, "MLA%s%s %s, %s, %s, %s",
     1352 +                        len = snprintf(buf, buflen, "mla%s%s %s, %s, %s, %s",
1296 1353                              arm_cond_names[cc],
1297      -                            (in & ARM_EMULT_SBIT_MASK) ? "S" : "",
     1354 +                            (in & ARM_EMULT_SBIT_MASK) ? "s" : "",
1298 1355                              arm_reg_names[rd], arm_reg_names[rm],
1299 1356                              arm_reg_names[rs], arm_reg_names[rs]);
1300 1357                  } else {
1301      -                        len = snprintf(buf, buflen, "MUL%s%s %s, %s, %s",
     1358 +                        len = snprintf(buf, buflen, "mul%s%s %s, %s, %s",
1302 1359                              arm_cond_names[cc],
1303      -                            (in & ARM_EMULT_SBIT_MASK) ? "S" : "",
     1360 +                            (in & ARM_EMULT_SBIT_MASK) ? "s" : "",
1304 1361                              arm_reg_names[rd], arm_reg_names[rm],
1305 1362                              arm_reg_names[rs]);
1306 1363  
1307 1364                  }
1308 1365          } else if ((in & ARM_EMULT_UMA_MASK) == ARM_EMULT_UMA_TARG) {
1309      -                len = snprintf(buf, buflen, "UMAAL%s %s, %s, %s, %s",
     1366 +                len = snprintf(buf, buflen, "umaal%s %s, %s, %s, %s",
1310 1367                      arm_cond_names[cc], arm_reg_names[rn], arm_reg_names[rd],
1311 1368                      arm_reg_names[rm], arm_reg_names[rs]);
1312 1369          } else if ((in & ARM_EMULT_MAL_MASK) == ARM_EMULT_MAL_TARG) {
1313 1370                  len = snprintf(buf, buflen, "%s%s%s%s %s, %s, %s, %s",
1314      -                    (in & ARM_EMULT_UNBIT_MASK) ? "S" : "U",
1315      -                    (in & ARM_EMULT_ABIT_MASK) ? "MLAL" : "MULL",
     1371 +                    (in & ARM_EMULT_UNBIT_MASK) ? "s" : "u",
     1372 +                    (in & ARM_EMULT_ABIT_MASK) ? "mlal" : "mull",
1316 1373                      arm_cond_names[cc],
1317      -                    (in & ARM_EMULT_SBIT_MASK) ? "S" : "",
     1374 +                    (in & ARM_EMULT_SBIT_MASK) ? "s" : "",
1318 1375                      arm_reg_names[rn], arm_reg_names[rd], arm_reg_names[rm],
1319 1376                      arm_reg_names[rs]);
1320 1377          } else {
1321 1378                  /* Not a supported instruction in this space */
1322 1379                  return (-1);
1323 1380          }
1324 1381          return (len >= buflen ? -1 : 0);
1325 1382  }
1326 1383  
1327 1384  /*
↓ open down ↓ 6 lines elided ↑ open up ↑
1334 1391          arm_cond_code_t cc;
1335 1392          arm_reg_t rd, rm;
1336 1393          uint8_t field;
1337 1394          int imm;
1338 1395          size_t len;
1339 1396  
1340 1397          cc = (in & ARM_CC_MASK) >> ARM_CC_SHIFT;
1341 1398  
1342 1399          if ((in & ARM_CDSP_MRS_MASK) == ARM_CDSP_MRS_TARG) {
1343 1400                  rd = (in & ARM_CDSP_RD_MASK) >> ARM_CDSP_RD_SHIFT;
1344      -                if (snprintf(buf, buflen, "MRS%s %s, %s", arm_cond_names[cc],
     1401 +                if (snprintf(buf, buflen, "mrs%s %s, %s", arm_cond_names[cc],
1345 1402                      arm_reg_names[rd],
1346      -                    (in & ARM_CDSP_STATUS_RBIT) != 0 ? "SPSR" : "CPSR") >=
     1403 +                    (in & ARM_CDSP_STATUS_RBIT) != 0 ? "spsr" : "cpsr") >=
1347 1404                      buflen)
1348 1405                          return (-1);
1349 1406                  return (0);
1350 1407          }
1351 1408  
1352 1409          field = (in & ARM_CDSP_MSR_F_MASK) >> ARM_CDSP_MSR_F_SHIFT;
1353      -        len = snprintf(buf, buflen, "MSR%s %s_%s, ", arm_cond_names[cc],
1354      -            (in & ARM_CDSP_STATUS_RBIT) != 0 ? "SPSR" : "CPSR",
     1410 +        len = snprintf(buf, buflen, "msr%s %s_%s, ", arm_cond_names[cc],
     1411 +            (in & ARM_CDSP_STATUS_RBIT) != 0 ? "spsr" : "cpsr",
1355 1412              arm_cdsp_msr_field_names[field]);
1356 1413          if (len >= buflen)
1357 1414                  return (-1);
1358 1415  
1359 1416          if (in & ARM_CDSP_MSR_ISIMM_MASK) {
1360 1417                  imm = in & ARM_CDSP_MSR_IMM_MASK;
1361 1418                  imm <<= (in & ARM_CDSP_MSR_RI_MASK) >> ARM_CDSP_MSR_RI_SHIFT;
1362 1419                  len += snprintf(buf + len, buflen - len, "#%d", imm);
1363 1420          } else {
1364 1421                  rm = in & ARM_CDSP_RM_MASK;
↓ open down ↓ 30 lines elided ↑ open up ↑
1395 1452          /*
1396 1453           * This gets the Branch/exchange as well as the Branch and link/exchange
1397 1454           * pieces. These generally also transform the instruction set into
1398 1455           * something we can't actually disassemble. Here the lower mask and
1399 1456           * target is the opposite. eg. the target bits are not what we want.
1400 1457           */
1401 1458          if ((in & ARM_CDSP_BEX_UP_MASK) == ARM_CDSP_BEX_UP_TARG &&
1402 1459              (in & ARM_CDSP_BEX_LOW_MASK) != ARM_CDSP_BEX_NLOW_TARG) {
1403 1460                  rm = in & ARM_CDSP_RM_MASK;
1404 1461                  imm = (in & ARM_CDSP_BEX_TYPE_MASK) >> ARM_CDSP_BEX_TYPE_SHIFT;
1405      -                if (snprintf(buf, buflen, "B%s%s %s",
1406      -                    imm == ARM_CDSP_BEX_TYPE_X ? "X" :
1407      -                    imm == ARM_CDSP_BEX_TYPE_J ? "XJ" : "LX",
     1462 +                if (snprintf(buf, buflen, "b%s%s %s",
     1463 +                    imm == ARM_CDSP_BEX_TYPE_X ? "x" :
     1464 +                    imm == ARM_CDSP_BEX_TYPE_J ? "xj" : "lx",
1408 1465                      arm_cond_names[cc], arm_reg_names[rm]) >= buflen)
1409 1466                          return (-1);
1410 1467                  return (0);
1411 1468          }
1412 1469  
1413 1470          /* Count leading zeros */
1414 1471          if ((in & ARM_CDSP_CLZ_MASK) == ARM_CDSP_CLZ_TARG) {
1415 1472                  rd = (in & ARM_CDSP_RD_MASK) >> ARM_CDSP_RD_SHIFT;
1416 1473                  rm = in & ARM_CDSP_RM_MASK;
1417      -                if (snprintf(buf, buflen, "CLZ%s %s, %s", arm_cond_names[cc],
     1474 +                if (snprintf(buf, buflen, "clz%s %s, %s", arm_cond_names[cc],
1418 1475                      arm_reg_names[rd], arm_reg_names[rm]) >= buflen)
1419 1476                          return (-1);
1420 1477                  return (0);
1421 1478          }
1422 1479  
1423 1480          if ((in & ARM_CDSP_SAT_MASK) == ARM_CDSP_SAT_TARG) {
1424 1481                  rd = (in & ARM_CDSP_RD_MASK) >> ARM_CDSP_RD_SHIFT;
1425 1482                  rn = (in & ARM_CDSP_RN_MASK) >> ARM_CDSP_RN_SHIFT;
1426 1483                  rm = in & ARM_CDSP_RM_MASK;
1427 1484                  imm = (in & ARM_CDSP_SAT_OP_MASK) >> ARM_CDSP_SAT_OP_SHIFT;
1428      -                if (snprintf(buf, buflen, "Q%s%s %s, %s, %s",
     1485 +                if (snprintf(buf, buflen, "q%s%s %s, %s, %s",
1429 1486                      arm_cdsp_sat_opnames[imm], arm_cond_names[cc],
1430 1487                      arm_reg_names[rd], arm_reg_names[rm],
1431 1488                      arm_reg_names[rn]) >= buflen)
1432 1489                          return (-1);
1433 1490                  return (0);
1434 1491          }
1435 1492  
1436 1493          /*
1437 1494           * Breakpoint instructions are a bit different. While they are in the
1438 1495           * conditional instruction namespace, they actually aren't defined to
↓ open down ↓ 1 lines elided ↑ open up ↑
1440 1497           * 16-bit value. The upper 12 bits are stored together and the lower
1441 1498           * four together.
1442 1499           */
1443 1500          if ((in & ARM_CDSP_BKPT_MASK) == ARM_CDSP_BKPT_TARG) {
1444 1501                  if (cc != ARM_COND_NACC)
1445 1502                          return (-1);
1446 1503                  imm = (in & ARM_CDSP_BKPT_UIMM_MASK) >>
1447 1504                      ARM_CDSP_BKPT_UIMM_SHIFT;
1448 1505                  imm <<= 4;
1449 1506                  imm |= (in & ARM_CDSP_BKPT_LIMM_MASK);
1450      -                if (snprintf(buf, buflen, "BKPT %d", imm) >= buflen)
     1507 +                if (snprintf(buf, buflen, "bkpt %d", imm) >= buflen)
1451 1508                          return (1);
1452 1509                  return (0);
1453 1510          }
1454 1511  
1455 1512          /*
1456 1513           * Here we need to handle another set of multiplies. Specifically the
1457 1514           * Signed multiplies. This is SMLA<x><y>, SMLAW<y>, SMULW<y>,
1458 1515           * SMLAL<x><y>, SMUL<x><y>. These instructions all follow the form:
1459 1516           *
1460 1517           * 31 - 28|27-25|24|23|22-21|20|19-16|15-12|11 - 8|7|6|5|4|3-0
↓ open down ↓ 11 lines elided ↑ open up ↑
1472 1529           */
1473 1530          if ((in & ARM_CDSP_SMUL_MASK) == ARM_CDSP_SMUL_TARG) {
1474 1531                  rd = (in & ARM_CDSP_RD_MASK) >> ARM_CDSP_RD_SHIFT;
1475 1532                  rn = (in & ARM_CDSP_RN_MASK) >> ARM_CDSP_RN_SHIFT;
1476 1533                  rs = (in & ARM_CDSP_RS_MASK) >> ARM_CDSP_RS_SHIFT;
1477 1534                  rm = in & ARM_CDSP_RM_MASK;
1478 1535                  op = (in & ARM_CDSP_SMUL_OP_MASK) >> ARM_CDSP_SMUL_OP_SHIFT;
1479 1536  
1480 1537                  switch (op) {
1481 1538                  case 0:
1482      -                        len = snprintf(buf, buflen, "SMLA%s%s%s %s, %s, %s, %s",
1483      -                            (in & ARM_CDSP_SMUL_X_MASK) != 0 ? "T" : "B",
1484      -                            (in & ARM_CDSP_SMUL_Y_MASK) != 0 ? "T" : "B",
     1539 +                        len = snprintf(buf, buflen, "smla%s%s%s %s, %s, %s, %s",
     1540 +                            (in & ARM_CDSP_SMUL_X_MASK) != 0 ? "t" : "b",
     1541 +                            (in & ARM_CDSP_SMUL_Y_MASK) != 0 ? "t" : "b",
1485 1542                              arm_cond_names[cc], arm_reg_names[rd],
1486 1543                              arm_reg_names[rm], arm_reg_names[rs],
1487 1544                              arm_reg_names[rn]);
1488 1545                          break;
1489 1546                  case 1:
1490 1547                          if (in & ARM_CDSP_SMUL_X_MASK) {
1491 1548                                  len = snprintf(buf, buflen,
1492      -                                    "SMULW%s%s %s, %s, %s",
1493      -                                    (in & ARM_CDSP_SMUL_Y_MASK) != 0 ? "T" :
1494      -                                    "B", arm_cond_names[cc], arm_reg_names[rd],
     1549 +                                    "smulw%s%s %s, %s, %s",
     1550 +                                    (in & ARM_CDSP_SMUL_Y_MASK) != 0 ? "t" :
     1551 +                                    "b", arm_cond_names[cc], arm_reg_names[rd],
1495 1552                                      arm_reg_names[rm], arm_reg_names[rs]);
1496 1553                          } else {
1497 1554                                  len = snprintf(buf, buflen,
1498      -                                    "SMLAW%s%s %s, %s, %s %s",
1499      -                                    (in & ARM_CDSP_SMUL_Y_MASK) != 0 ? "T" :
1500      -                                    "B", arm_cond_names[cc], arm_reg_names[rd],
     1555 +                                    "smlaw%s%s %s, %s, %s %s",
     1556 +                                    (in & ARM_CDSP_SMUL_Y_MASK) != 0 ? "t" :
     1557 +                                    "b", arm_cond_names[cc], arm_reg_names[rd],
1501 1558                                      arm_reg_names[rm], arm_reg_names[rs],
1502 1559                                      arm_reg_names[rn]);
1503 1560                          }
1504 1561                          break;
1505 1562                  case 2:
1506 1563                          len = snprintf(buf, buflen,
1507      -                            "SMLAL%s%s%s %s, %s, %s, %s",
1508      -                            (in & ARM_CDSP_SMUL_X_MASK) != 0 ? "T" : "B",
1509      -                            (in & ARM_CDSP_SMUL_Y_MASK) != 0 ? "T" : "B",
     1564 +                            "smlal%s%s%s %s, %s, %s, %s",
     1565 +                            (in & ARM_CDSP_SMUL_X_MASK) != 0 ? "t" : "b",
     1566 +                            (in & ARM_CDSP_SMUL_Y_MASK) != 0 ? "t" : "b",
1510 1567                              arm_cond_names[cc], arm_reg_names[rd],
1511 1568                              arm_reg_names[rn], arm_reg_names[rm],
1512 1569                              arm_reg_names[rs]);
1513 1570                          break;
1514 1571                  case 3:
1515      -                        len = snprintf(buf, buflen, "SMUL%s%s%s %s, %s, %s",
1516      -                            (in & ARM_CDSP_SMUL_X_MASK) != 0 ? "T" : "B",
1517      -                            (in & ARM_CDSP_SMUL_Y_MASK) != 0 ? "T" : "B",
     1572 +                        len = snprintf(buf, buflen, "smul%s%s%s %s, %s, %s",
     1573 +                            (in & ARM_CDSP_SMUL_X_MASK) != 0 ? "t" : "b",
     1574 +                            (in & ARM_CDSP_SMUL_Y_MASK) != 0 ? "t" : "b",
1518 1575                              arm_cond_names[cc], arm_reg_names[rd],
1519 1576                              arm_reg_names[rm], arm_reg_names[rs]);
1520 1577                          break;
1521 1578                  default:
1522 1579                          return (-1);
1523 1580                  }
1524 1581                  return (len >= buflen ? -1 : 0);
1525 1582          }
1526 1583  
1527 1584          /*
↓ open down ↓ 29 lines elided ↑ open up ↑
1557 1614          rn = (in & ARM_COPROC_RN_MASK) >> ARM_COPROC_RN_SHIFT;
1558 1615          rd = (in & ARM_COPROC_RD_MASK) >> ARM_COPROC_RD_SHIFT;
1559 1616          rm = in & ARM_COPROC_RM_MASK;
1560 1617          op = (in & ARM_COPROC_DRT_OP_MASK) >> ARM_COPROC_DRT_OP_SHIFT;
1561 1618  
1562 1619          if (cc == ARM_COND_NACC)
1563 1620                  ccn = "2";
1564 1621          else
1565 1622                  ccn = arm_cond_names[cc];
1566 1623  
1567      -        len = snprintf(buf, buflen, "%s%s %s, #%d, %s, %s, C%s",
1568      -            (in & ARM_COPROC_DRT_DIR_MASK) != 0 ? "MRRC" : "MCRR",
     1624 +        len = snprintf(buf, buflen, "%s%s %s, #%d, %s, %s, c%s",
     1625 +            (in & ARM_COPROC_DRT_DIR_MASK) != 0 ? "mrrc" : "mcrr",
1569 1626              ccn, arm_coproc_names[coproc], op, arm_reg_names[rd],
1570 1627              arm_reg_names[rn], arm_reg_names[rm]);
1571 1628          return (len >= buflen ? -1 : 0);
1572 1629  }
1573 1630  
1574 1631  /*
1575 1632   * This serves as both the entry point for the normal load and stores as well as
1576 1633   * the double register transfers (MCRR and MRCC). If it is a register transfer
1577 1634   * then we quickly send it off.
1578 1635   * LDC:
↓ open down ↓ 44 lines elided ↑ open up ↑
1623 1680          ubit = in & ARM_COPROC_LS_U_MASK;
1624 1681          nbit = in & ARM_COPROC_LS_N_MASK;
1625 1682          wbit = in & ARM_COPROC_LS_W_MASK;
1626 1683          lbit = in & ARM_COPROC_LS_L_MASK;
1627 1684  
1628 1685          if (cc == ARM_COND_NACC)
1629 1686                  ccn = "2";
1630 1687          else
1631 1688                  ccn = arm_cond_names[cc];
1632 1689  
1633      -        len = snprintf(buf, buflen, "%s%s%s %s, C%s, ",
1634      -            lbit != 0 ? "LDC" : "STC", ccn, nbit != 0 ? "L" : "",
     1690 +        len = snprintf(buf, buflen, "%s%s%s %s, c%s, ",
     1691 +            lbit != 0 ? "ldc" : "stc", ccn, nbit != 0 ? "l" : "",
1635 1692              arm_coproc_names[coproc], arm_reg_names[rd]);
1636 1693          if (len >= buflen)
1637 1694                  return (-1);
1638 1695  
1639 1696          if (pbit != 0) {
1640 1697                  imm *= 4;
1641 1698                  len += snprintf(buf + len, buflen - len, "[%s, #%s%d]%s",
1642 1699                      arm_reg_names[rn],
1643 1700                      ubit != 0 ? "" : "-", imm,
1644 1701                      wbit != 0 ? "!" : "");
↓ open down ↓ 33 lines elided ↑ open up ↑
1678 1735  
1679 1736          /*
1680 1737           * This instruction is valid with the undefined condition code. When it
1681 1738           * does that, the instruction is intead CDP2 as opposed to CDP.
1682 1739           */
1683 1740          if (cc == ARM_COND_NACC)
1684 1741                  ccn = "2";
1685 1742          else
1686 1743                  ccn = arm_cond_names[cc];
1687 1744  
1688      -        if (snprintf(buf, buflen, "CDP%s %s, #%d, C%s, C%s, C%s, #%d", ccn,
     1745 +        if (snprintf(buf, buflen, "cdp%s %s, #%d, c%s, c%s, c%s, #%d", ccn,
1689 1746              arm_coproc_names[coproc], op1, arm_reg_names[rd],
1690 1747              arm_reg_names[rn], arm_reg_names[rm], op2) >= buflen)
1691 1748                  return (-1);
1692 1749  
1693 1750          return (0);
1694 1751  }
1695 1752  
1696 1753  /*
1697 1754   * Here we handle coprocesser single register transfers.
1698 1755   *
↓ open down ↓ 20 lines elided ↑ open up ↑
1719 1776          rd = (in & ARM_COPROC_RD_MASK) >> ARM_COPROC_RD_SHIFT;
1720 1777          rm = in & ARM_COPROC_RM_MASK;
1721 1778          op1 = (in & ARM_COPROC_CRT_OP1_MASK) >> ARM_COPROC_CRT_OP1_SHIFT;
1722 1779          op2 = (in & ARM_COPROC_CRT_OP2_MASK) >> ARM_COPROC_CRT_OP2_SHIFT;
1723 1780  
1724 1781          if (cc == ARM_COND_NACC)
1725 1782                  ccn = "2";
1726 1783          else
1727 1784                  ccn = arm_cond_names[cc];
1728 1785  
1729      -        len = snprintf(buf, buflen, "%s%s %s, #%d, %s, C%s, C%s",
1730      -            (in & ARM_COPROC_CRT_DIR_MASK) != 0 ? "MRC" : "MCR", ccn,
     1786 +        len = snprintf(buf, buflen, "%s%s %s, #%d, %s, c%s, c%s",
     1787 +            (in & ARM_COPROC_CRT_DIR_MASK) != 0 ? "mrc" : "mcr", ccn,
1731 1788              arm_coproc_names[coproc], op1, arm_reg_names[rd],
1732 1789              arm_reg_names[rn], arm_reg_names[rm]);
1733 1790          if (len >= buflen)
1734 1791                  return (-1);
1735 1792  
1736 1793          if (op2 != 0)
1737 1794                  if (snprintf(buf + len, buflen - len, ", #%d", op2) >=
1738 1795                      buflen - len)
1739 1796                          return (-1);
1740 1797          return (0);
↓ open down ↓ 33 lines elided ↑ open up ↑
1774 1831           *
1775 1832           */
1776 1833          if ((in & ARM_UNI_CPS_MASK) == ARM_UNI_CPS_TARG) {
1777 1834                  imm = (in & ARM_UNI_CPS_IMOD_MASK) > ARM_UNI_CPS_IMOD_SHIFT;
1778 1835  
1779 1836                  /* Ob01 is not a valid value for the imod */
1780 1837                  if (imm == 1)
1781 1838                          return (-1);
1782 1839  
1783 1840                  if (imm != 0)
1784      -                        len = snprintf(buf, buflen, "CPS%s %s%s%s%s",
1785      -                            imm == 2 ? "IE" : "ID",
     1841 +                        len = snprintf(buf, buflen, "cps%s %s%s%s%s",
     1842 +                            imm == 2 ? "ie" : "id",
1786 1843                              (in & ARM_UNI_CPS_A_MASK) ? "a" : "",
1787 1844                              (in & ARM_UNI_CPS_I_MASK) ? "i" : "",
1788 1845                              (in & ARM_UNI_CPS_F_MASK) ? "f" : "",
1789 1846                              (in & ARM_UNI_CPS_MMOD_MASK) ? " ," : "");
1790 1847                  else
1791      -                        len = snprintf(buf, buflen, "CPS ");
     1848 +                        len = snprintf(buf, buflen, "cps ");
1792 1849                  if (len >= buflen)
1793 1850                          return (-1);
1794 1851  
1795 1852                  if (in & ARM_UNI_CPS_MMOD_MASK)
1796 1853                          if (snprintf(buf + len, buflen - len, "#%d",
1797 1854                              in & ARM_UNI_CPS_MODE_MASK) >= buflen - len)
1798 1855                                  return (-1);
1799 1856                  return (0);
1800 1857          }
1801 1858  
1802 1859          if ((in & ARM_UNI_SE_MASK) == ARM_UNI_SE_TARG) {
1803 1860                  if (snprintf(buf, buflen, "SETEND %s",
1804      -                    (in & ARM_UNI_SE_BE_MASK) ? "BE" : "LE") >= buflen)
     1861 +                    (in & ARM_UNI_SE_BE_MASK) ? "be" : "le") >= buflen)
1805 1862                          return (-1);
1806 1863                  return (0);
1807 1864          }
1808 1865  
1809 1866          /*
1810 1867           * The cache preload is like a load, but it has a much simpler set of
1811 1868           * constraints. The only valid bits that you can transform are the I and
1812 1869           * the U bits. We have to use pre-indexed addressing. This means that we
1813 1870           * only have the U bit and the I bit. See arm_dis_ldstr for a full
1814 1871           * explanation of what's happening here.
1815 1872           */
1816 1873          if ((in & ARM_UNI_PLD_MASK) == ARM_UNI_PLD_TARG) {
1817 1874                  rn = (in & ARM_LS_RN_MASK) >> ARM_LS_RN_SHIFT;
1818 1875                  if ((in & ARM_LS_IBIT_MASK) == 0) {
1819      -                        if (snprintf(buf, buflen, "PLD [%s, #%s%d",
     1876 +                        if (snprintf(buf, buflen, "pld [%s, #%s%d",
1820 1877                              arm_reg_names[rn],
1821 1878                              (in & ARM_LS_UBIT_MASK) != 0 ? "" : "-",
1822 1879                              in & ARM_LS_IMM_MASK) >= buflen)
1823 1880                                  return (-1);
1824 1881                          return (0);
1825 1882                  }
1826 1883  
1827 1884                  rm = in & ARM_LS_REG_RM_MASK;
1828      -                len = snprintf(buf, buflen, "PLD [%s, %s%s", arm_reg_names[rn],
     1885 +                len = snprintf(buf, buflen, "pld [%s, %s%s", arm_reg_names[rn],
1829 1886                      (in & ARM_LS_UBIT_MASK) != 0 ? "" : "-",
1830 1887                      arm_reg_names[rm]);
1831 1888                  if (len >= buflen)
1832 1889                          return (-1);
1833 1890  
1834 1891                  if ((in & ARM_LS_REG_NRM_MASK) != 0) {
1835 1892                          imm = (in & ARM_LS_SCR_SIMM_MASK) >>
1836 1893                              ARM_LS_SCR_SIMM_SHIFT;
1837 1894                          sc = (in & ARM_LS_SCR_SCODE_MASK) >>
1838 1895                              ARM_LS_SCR_SCODE_SHIFT;
↓ open down ↓ 15 lines elided ↑ open up ↑
1854 1911                  if (snprintf(buf + len, buflen - len, "]") >= buflen - len)
1855 1912                          return (-1);
1856 1913                  return (0);
1857 1914          }
1858 1915  
1859 1916          /*
1860 1917           * This is a special case of STM, but it works across chip modes.
1861 1918           */
1862 1919          if ((in & ARM_UNI_SRS_MASK) == ARM_UNI_SRS_TARG) {
1863 1920                  imm = (in & ARM_LSM_ADDR_MASK) >> ARM_LSM_ADDR_SHIFT;
1864      -                if (snprintf(buf, buflen, "SRS%s #%d%s",
     1921 +                if (snprintf(buf, buflen, "srs%s #%d%s",
1865 1922                      arm_lsm_mode_names[imm],
1866 1923                      in & ARM_UNI_SRS_MODE_MASK,
1867 1924                      (in & ARM_UNI_SRS_WBIT_MASK) != 0 ? "!" : "") >= buflen)
1868 1925                          return (-1);
1869 1926                  return (0);
1870 1927          }
1871 1928  
1872 1929          /*
1873 1930           * RFE is a return from exception instruction that is similar to the LDM
1874 1931           * and STM, but a bit different.
1875 1932           */
1876 1933          if ((in & ARM_UNI_RFE_MASK) == ARM_UNI_RFE_TARG) {
1877 1934                  imm = (in & ARM_LSM_ADDR_MASK) >> ARM_LSM_ADDR_SHIFT;
1878 1935                  rn = (in & ARM_LS_RN_MASK) >> ARM_LS_RN_SHIFT;
1879      -                if (snprintf(buf, buflen, "RFE%s %s%s", arm_lsm_mode_names[imm],
     1936 +                if (snprintf(buf, buflen, "rfe%s %s%s", arm_lsm_mode_names[imm],
1880 1937                      arm_reg_names[rn],
1881 1938                      (in & ARM_UNI_RFE_WBIT_MASK) != 0 ? "!" : "") >= buflen)
1882 1939                          return (-1);
1883 1940                  return (0);
1884 1941          }
1885 1942  
1886 1943          if ((in & ARM_UNI_BLX_MASK) == ARM_UNI_BLX_TARG) {
1887      -                if (snprintf(buf, buflen, "BLX %d",
     1944 +                if (snprintf(buf, buflen, "blx %d",
1888 1945                      in & ARM_UNI_BLX_IMM_MASK) >= buflen)
1889 1946                          return (-1);
1890 1947                  return (0);
1891 1948          }
1892 1949  
1893 1950          if ((in & ARM_UNI_CODRT_MASK) == ARM_UNI_CODRT_TARG) {
1894 1951                  return (arm_dis_coproc_lsdrt(in, buf, buflen));
1895 1952          }
1896 1953  
1897 1954          if ((in & ARM_UNI_CORT_MASK) == ARM_UNI_CORT_TARG) {
↓ open down ↓ 24 lines elided ↑ open up ↑
1922 1979          arm_cond_code_t cc;
1923 1980          size_t len;
1924 1981  
1925 1982          cc = (in & ARM_CC_MASK) >> ARM_CC_SHIFT;
1926 1983          addr = in & ARM_BRANCH_IMM_MASK;
1927 1984          if (in & ARM_BRANCH_SIGN_MASK)
1928 1985                  addr |= ARM_BRANCH_NEG_SIGN;
1929 1986          else
1930 1987                  addr &= ARM_BRANCH_POS_SIGN;
1931 1988          addr <<= 2;
1932      -        if ((len = snprintf(buf, buflen, "B%s%s %d",
1933      -            (in & ARM_BRANCH_LBIT_MASK) != 0 ? "L" : "",
     1989 +        if ((len = snprintf(buf, buflen, "b%s%s %d",
     1990 +            (in & ARM_BRANCH_LBIT_MASK) != 0 ? "l" : "",
1934 1991              arm_cond_names[cc], (int)addr)) >= buflen)
1935 1992                  return (-1);
1936 1993  
1937 1994          /* Per the ARM manuals, we have to account for the extra 8 bytes here */
1938 1995          if (dhp->dh_lookup(dhp->dh_data, dhp->dh_addr + (int)addr + 8, NULL, 0,
1939 1996              NULL, NULL) == 0) {
1940 1997                  len += snprintf(buf + len, buflen - len, "\t<");
1941 1998                  if (len >= buflen)
1942 1999                          return (-1);
1943 2000                  dhp->dh_lookup(dhp->dh_data, dhp->dh_addr + (int)addr + 8,
↓ open down ↓ 80 lines elided ↑ open up ↑
2024 2081          rn = (in & ARM_MEDIA_RN_MASK) >> ARM_MEDIA_RN_SHIFT;
2025 2082          rd = (in & ARM_MEDIA_RD_MASK) >> ARM_MEDIA_RD_SHIFT;
2026 2083          rm = in & ARM_MEDIA_RM_MASK;
2027 2084          op = (in & ARM_MEDIA_SZE_OP_MASK) >> ARM_MEDIA_SZE_OP_SHIFT;
2028 2085          rot = (in & ARM_MEDIA_SZE_ROT_MASK) >> ARM_MEDIA_SZE_ROT_SHIFT;
2029 2086          sbit = in & ARM_MEDIA_SZE_S_MASK;
2030 2087          cc = (in & ARM_CC_MASK) >> ARM_CC_SHIFT;
2031 2088  
2032 2089          switch (op) {
2033 2090          case 0x0:
2034      -                opn = rn == ARM_REG_R15 ? "XTAB16" : "XTB16";
     2091 +                opn = rn == ARM_REG_R15 ? "xtab16" : "xtb16";
2035 2092                  break;
2036 2093          case 0x2:
2037      -                opn = rn == ARM_REG_R15 ? "XTAB" : "XTB";
     2094 +                opn = rn == ARM_REG_R15 ? "xtab" : "xtb";
2038 2095                  break;
2039 2096          case 0x3:
2040      -                opn = rn == ARM_REG_R15 ? "XTAH" : "XTH";
     2097 +                opn = rn == ARM_REG_R15 ? "xtah" : "xth";
2041 2098                  break;
2042 2099          default:
2043 2100                  return (-1);
2044 2101                  break;
2045 2102          }
2046 2103  
2047 2104          if (rn == ARM_REG_R15) {
2048 2105                  len = snprintf(buf, buflen, "%s%s%s %s, %s",
2049      -                    sbit != 0 ? "U" : "S",
     2106 +                    sbit != 0 ? "u" : "s",
2050 2107                      opn, arm_cond_names[cc], arm_reg_names[rd],
2051 2108                      arm_reg_names[rn]);
2052 2109          } else {
2053 2110                  len = snprintf(buf, buflen, "%s%s%s %s, %s, %s",
2054      -                    sbit != 0 ? "U" : "S",
     2111 +                    sbit != 0 ? "u" : "s",
2055 2112                      opn, arm_cond_names[cc], arm_reg_names[rd],
2056 2113                      arm_reg_names[rn], arm_reg_names[rm]);
2057 2114          }
2058 2115  
2059 2116          if (len >= buflen)
2060 2117                  return (-1);
2061 2118  
2062 2119          if (snprintf(buf + len, buflen - len, "%s",
2063 2120              arm_extend_rot_names[rot]) >= buflen - len)
2064 2121                  return (-1);
↓ open down ↓ 22 lines elided ↑ open up ↑
2087 2144                  break;
2088 2145          case 0x1:
2089 2146                  if ((in & ARM_MEDIA_HPACK_MASK) == ARM_MEDIA_HPACK_TARG) {
2090 2147                          rn = (in & ARM_MEDIA_RN_MASK) >> ARM_MEDIA_RN_SHIFT;
2091 2148                          rd = (in & ARM_MEDIA_RD_MASK) >> ARM_MEDIA_RD_SHIFT;
2092 2149                          rm = in & ARM_MEDIA_RM_MASK;
2093 2150                          op1 = (in & ARM_MEDIA_HPACK_SHIFT_MASK) >>
2094 2151                              ARM_MEDIA_HPACK_SHIFT_IMM;
2095 2152                          len = snprintf(buf, buflen, "%s%s %s, %s, %s",
2096 2153                              (in & ARM_MEDIA_HPACK_OP_MASK) != 0 ?
2097      -                            "PKHTB" : "PKHBT", arm_cond_names[cc],
     2154 +                            "pkhtb" : "pkhbt", arm_cond_names[cc],
2098 2155                              arm_reg_names[rd], arm_reg_names[rn],
2099 2156                              arm_reg_names[rd]);
2100 2157                          if (len >= buflen)
2101 2158                                  return (-1);
2102 2159  
2103 2160                          if (op1 != 0) {
2104 2161                                  if (in & ARM_MEDIA_HPACK_OP_MASK)
2105 2162                                          len += snprintf(buf + len, buflen - len,
2106      -                                            ", ASR %d", op1);
     2163 +                                            ", asr %d", op1);
2107 2164                                  else
2108 2165                                          len += snprintf(buf + len, buflen - len,
2109      -                                            ", LSL %d", op1);
     2166 +                                            ", lsl %d", op1);
2110 2167                          }
2111 2168                          return (len >= buflen ? -1 : 0);
2112 2169                  }
2113 2170  
2114 2171                  if ((in & ARM_MEDIA_WSAT_MASK) == ARM_MEDIA_WSAT_TARG) {
2115 2172                          rd = (in & ARM_MEDIA_RD_MASK) >> ARM_MEDIA_RD_SHIFT;
2116 2173                          rm = in & ARM_MEDIA_RM_MASK;
2117 2174                          op1 = (in & ARM_MEDIA_SAT_IMM_MASK) >>
2118 2175                              ARM_MEDIA_SAT_IMM_SHIFT;
2119 2176                          op2 = (in & ARM_MEDIA_SAT_SHI_MASK) >>
2120 2177                              ARM_MEDIA_SAT_SHI_SHIFT;
2121 2178                          len = snprintf(buf, buflen, "%s%s %s, #%d, %s",
2122      -                            (in & ARM_MEDIA_SAT_U_MASK) != 0 ? "USAT" : "SSAT",
     2179 +                            (in & ARM_MEDIA_SAT_U_MASK) != 0 ? "usat" : "ssat",
2123 2180                              arm_cond_names[cc], arm_reg_names[rd], op1,
2124 2181                              arm_reg_names[rm]);
2125 2182  
2126 2183                          if (len >= buflen)
2127 2184                                  return (-1);
2128 2185  
2129 2186                          /*
2130 2187                           * The shift is optional in the assembler and encoded as
2131 2188                           * LSL 0. However if we get ASR 0, that means ASR #32.
2132 2189                           * An ARM_MEDIA_SAT_STYPE_MASK of 0 is LSL, 1 is ASR.
2133 2190                           */
2134 2191                          if (op2 != 0 || (in & ARM_MEDIA_SAT_STYPE_MASK) == 1) {
2135 2192                                  if (op2 == 0)
2136 2193                                          op2 = 32;
2137 2194                                  if (snprintf(buf + len, buflen - len,
2138 2195                                      ", %s #%d",
2139 2196                                      (in & ARM_MEDIA_SAT_STYPE_MASK) != 0 ?
2140      -                                    "ASR" : "LSL", op2) >= buflen - len)
     2197 +                                    "asr" : "lsl", op2) >= buflen - len)
2141 2198                                          return (-1);
2142 2199                          }
2143 2200                          return (0);
2144 2201                  }
2145 2202  
2146 2203                  if ((in & ARM_MEDIA_PHSAT_MASK) == ARM_MEDIA_PHSAT_TARG) {
2147 2204                          rd = (in & ARM_MEDIA_RD_MASK) >> ARM_MEDIA_RD_SHIFT;
2148 2205                          rm = in & ARM_MEDIA_RM_MASK;
2149 2206                          op1 = (in & ARM_MEDIA_RN_MASK) >> ARM_MEDIA_RN_SHIFT;
2150 2207                          if (snprintf(buf, buflen, "%s%s %s, #%d, %s",
2151 2208                              (in & ARM_MEDIA_SAT_U_MASK) != 0 ?
2152      -                            "USAT16" : "SSAT16",
     2209 +                            "usat16" : "ssat16",
2153 2210                              arm_cond_names[cc], arm_reg_names[rd], op1,
2154 2211                              arm_reg_names[rm]) >= buflen)
2155 2212                                  return (-1);
2156 2213                          return (0);
2157 2214                  }
2158 2215  
2159 2216                  if ((in & ARM_MEDIA_REV_MASK) == ARM_MEDIA_REV_TARG) {
2160 2217                          rd = (in & ARM_MEDIA_RD_MASK) >> ARM_MEDIA_RD_SHIFT;
2161 2218                          rm = in & ARM_MEDIA_RM_MASK;
2162      -                        if (snprintf(buf, buflen, "REV%s %s, %s",
     2219 +                        if (snprintf(buf, buflen, "rev%s %s, %s",
2163 2220                              arm_cond_names[cc], arm_reg_names[rd],
2164 2221                              arm_reg_names[rd]) >= buflen)
2165 2222                                  return (-1);
2166 2223                          return (0);
2167 2224                  }
2168 2225  
2169 2226                  if ((in & ARM_MEDIA_BRPH_MASK) == ARM_MEDIA_BRPH_TARG) {
2170 2227                          rd = (in & ARM_MEDIA_RD_MASK) >> ARM_MEDIA_RD_SHIFT;
2171 2228                          rm = in & ARM_MEDIA_RM_MASK;
2172      -                        if (snprintf(buf, buflen, "REV16%s %s, %s",
     2229 +                        if (snprintf(buf, buflen, "rev16%s %s, %s",
2173 2230                              arm_cond_names[cc], arm_reg_names[rd],
2174 2231                              arm_reg_names[rd]) >= buflen)
2175 2232                                  return (-1);
2176 2233                          return (0);
2177 2234                  }
2178 2235  
2179 2236                  if ((in & ARM_MEDIA_BRSH_MASK) == ARM_MEDIA_BRSH_TARG) {
2180 2237                          rd = (in & ARM_MEDIA_RD_MASK) >> ARM_MEDIA_RD_SHIFT;
2181 2238                          rm = in & ARM_MEDIA_RM_MASK;
2182      -                        if (snprintf(buf, buflen, "REVSH%s %s, %s",
     2239 +                        if (snprintf(buf, buflen, "revsh%s %s, %s",
2183 2240                              arm_cond_names[cc], arm_reg_names[rd],
2184 2241                              arm_reg_names[rd]) >= buflen)
2185 2242                                  return (-1);
2186 2243                          return (0);
2187 2244                  }
2188 2245  
2189 2246                  if ((in & ARM_MEDIA_SEL_MASK) == ARM_MEDIA_SEL_TARG) {
2190 2247                          rn = (in & ARM_MEDIA_RN_MASK) >> ARM_MEDIA_RN_SHIFT;
2191 2248                          rd = (in & ARM_MEDIA_RD_MASK) >> ARM_MEDIA_RD_SHIFT;
2192 2249                          rm = in & ARM_MEDIA_RM_MASK;
2193      -                        if (snprintf(buf, buflen, "SEL%s %s, %s, %s",
     2250 +                        if (snprintf(buf, buflen, "sel%s %s, %s, %s",
2194 2251                              arm_cond_names[cc], arm_reg_names[rd],
2195 2252                              arm_reg_names[rn], arm_reg_names[rm]) >= buflen)
2196 2253                                  return (-1);
2197 2254                          return (0);
2198 2255                  }
2199 2256  
2200 2257                  if ((in & ARM_MEDIA_SZE_MASK) == ARM_MEDIA_SZE_TARG)
2201 2258                          return (arm_dis_extend(in, buf, buflen));
2202 2259                  /* Unknown instruction */
2203 2260                  return (-1);
↓ open down ↓ 15 lines elided ↑ open up ↑
2219 2276                  rm = in & ARM_MEDIA_RM_MASK;
2220 2277                  op1 = (in & ARM_MEDIA_OP1_MASK) >> ARM_MEDIA_OP1_SHIFT;
2221 2278                  op2 = (in & ARM_MEDIA_OP2_MASK) >> ARM_MEDIA_OP2_SHIFT;
2222 2279                  xbit = in & ARM_MEDIA_MULT_X_MASK;
2223 2280  
2224 2281                  if (op1 == 0x0) {
2225 2282                          if (op2 != 0x0 && op2 != 0x1)
2226 2283                                  return (-1);
2227 2284                          if (rn == ARM_REG_R15) {
2228 2285                                  len = snprintf(buf, buflen, "%s%s%s %s, %s, %s",
2229      -                                    op2 != 0 ? "SMUSD" : "SMUAD",
2230      -                                    xbit != 0 ? "X" : "X",
     2286 +                                    op2 != 0 ? "smusd" : "smuad",
     2287 +                                    xbit != 0 ? "x" : "x",
2231 2288                                      arm_cond_names[cc], arm_reg_names[rd],
2232 2289                                      arm_reg_names[rm], arm_reg_names[rs]);
2233 2290                          } else {
2234 2291                                  len = snprintf(buf, buflen,
2235 2292                                      "%s%s%s %s, %s, %s, %s",
2236      -                                    op2 != 0 ? "SMLSD" : "SMLAD",
2237      -                                    xbit != 0 ? "X" : "",
     2293 +                                    op2 != 0 ? "smlsd" : "smlad",
     2294 +                                    xbit != 0 ? "x" : "",
2238 2295                                      arm_cond_names[cc], arm_reg_names[rd],
2239 2296                                      arm_reg_names[rm], arm_reg_names[rs],
2240 2297                                      arm_reg_names[rn]);
2241 2298  
2242 2299                          }
2243 2300                  } else if (op1 == 0x8) {
2244 2301                          if (op2 != 0x0)
2245 2302                                  return (-1);
2246      -                        len = snprintf(buf, buflen, "SMLALD%s%s %s, %s, %s, %s",
2247      -                            xbit != 0 ? "X" : "",
     2303 +                        len = snprintf(buf, buflen, "smlald%s%s %s, %s, %s, %s",
     2304 +                            xbit != 0 ? "x" : "",
2248 2305                              arm_cond_names[cc], arm_reg_names[rn],
2249 2306                              arm_reg_names[rd], arm_reg_names[rm],
2250 2307                              arm_reg_names[rs]);
2251 2308                  } else
2252 2309                          return (-1);
2253 2310  
2254 2311                  return (len >= buflen ? -1 : 0);
2255 2312                  break;
2256 2313          case 0x3:
2257 2314                  /*
↓ open down ↓ 6 lines elided ↑ open up ↑
2264 2321                  if ((in & ARM_MEDIA_OP2_MASK) != 0)
2265 2322                          return (-1);
2266 2323  
2267 2324                  cc = (in & ARM_CC_MASK) >> ARM_CC_SHIFT;
2268 2325                  rn = (in & ARM_MEDIA_RN_MASK) >> ARM_MEDIA_RN_SHIFT;
2269 2326                  rd = (in & ARM_MEDIA_RD_MASK) >> ARM_MEDIA_RD_SHIFT;
2270 2327                  rs = (in & ARM_MEDIA_RS_MASK) >> ARM_MEDIA_RS_SHIFT;
2271 2328                  rm = in & ARM_MEDIA_RM_MASK;
2272 2329  
2273 2330                  if (rn != ARM_REG_R15)
2274      -                        len = snprintf(buf, buflen, "USADA8%s %s, %s, %s, %s",
     2331 +                        len = snprintf(buf, buflen, "usada8%s %s, %s, %s, %s",
2275 2332                              arm_cond_names[cc], arm_reg_names[rd],
2276 2333                              arm_reg_names[rm], arm_reg_names[rs],
2277 2334                              arm_reg_names[rn]);
2278 2335                  else
2279      -                        len = snprintf(buf, buflen, "USAD8%s %s, %s, %s",
     2336 +                        len = snprintf(buf, buflen, "usad8%s %s, %s, %s",
2280 2337                              arm_cond_names[cc], arm_reg_names[rd],
2281 2338                              arm_reg_names[rm], arm_reg_names[rs]);
2282 2339                  return (len >= buflen ? -1 : 0);
2283 2340                  break;
2284 2341          default:
2285 2342                  return (-1);
2286 2343          }
2287 2344  }
2288 2345  
2289 2346  /*
↓ open down ↓ 152 lines elided ↑ open up ↑
2442 2499                   * register transfers based on bit 4. If it is zero then it is
2443 2500                   * a data processing instruction, otherwise it is a register
2444 2501                   * transfer.
2445 2502                   */
2446 2503                  if (in & ARM_L1_7_SWINTMASK) {
2447 2504                          /*
2448 2505                           * The software interrupt is pretty straightforward. The
2449 2506                           * lower 24 bits are the interrupt number. It's also
2450 2507                           * valid for it to run with a condition code.
2451 2508                           */
2452      -                        if (snprintf(buf, buflen, "SWI%s %d",
     2509 +                        if (snprintf(buf, buflen, "swi%s %d",
2453 2510                              arm_cond_names[cc],
2454 2511                              in & ARM_SWI_IMM_MASK) >= buflen)
2455 2512                                  return (-1);
2456 2513                          return (0);
2457 2514                  } else if (in & ARM_L1_7_COPROCMASK) {
2458 2515                          /* coprocessor register transfers */
2459 2516                          return (arm_dis_coproc_rt(in, buf, buflen));
2460 2517                  } else {
2461 2518                          /* coprocessor data processing */
2462 2519                          return (arm_dis_coproc_dp(in, buf, buflen));
↓ open down ↓ 98 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX