(linenum→info "unix/slp.c:2238")

qemu/0.9.1/i386-dis.c

    1: /* Print i386 instructions for GDB, the GNU debugger.
    2:    Copyright 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
    3:    2001
    4:    Free Software Foundation, Inc.
    5: 
    6: This file is part of GDB.
    7: 
    8: This program is free software; you can redistribute it and/or modify
    9: it under the terms of the GNU General Public License as published by
   10: the Free Software Foundation; either version 2 of the License, or
   11: (at your option) any later version.
   12: 
   13: This program is distributed in the hope that it will be useful,
   14: but WITHOUT ANY WARRANTY; without even the implied warranty of
   15: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   16: GNU General Public License for more details.
   17: 
   18: You should have received a copy of the GNU General Public License
   19: along with this program; if not, write to the Free Software
   20: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
   21: 
   22: /*
   23:  * 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
   24:  * July 1988
   25:  *  modified by John Hassey (hassey@dg-rtp.dg.com)
   26:  *  x86-64 support added by Jan Hubicka (jh@suse.cz)
   27:  */
   28: 
   29: /*
   30:  * The main tables describing the instructions is essentially a copy
   31:  * of the "Opcode Map" chapter (Appendix A) of the Intel 80386
   32:  * Programmers Manual.  Usually, there is a capital letter, followed
   33:  * by a small letter.  The capital letter tell the addressing mode,
   34:  * and the small letter tells about the operand size.  Refer to
   35:  * the Intel manual for details.
   36:  */
   37: 
   38: #include <stdlib.h>
   39: #include "dis-asm.h"
   40: 
   41: #define MAXLEN 20
   42: 
   43: #include <setjmp.h>
   44: 
   45: #ifndef UNIXWARE_COMPAT
   46: /* Set non-zero for broken, compatible instructions.  Set to zero for
   47:    non-broken opcodes.  */
   48: #define UNIXWARE_COMPAT 1
   49: #endif
   50: 
   51: static int fetch_data PARAMS ((struct disassemble_info *, bfd_byte *));
   52: static void ckprefix PARAMS ((void));
   53: static const char *prefix_name PARAMS ((int, int));
   54: static int print_insn PARAMS ((bfd_vma, disassemble_info *));
   55: static void dofloat PARAMS ((int));
   56: static void OP_ST PARAMS ((int, int));
   57: static void OP_STi  PARAMS ((int, int));
   58: static int putop PARAMS ((const char *, int));
   59: static void oappend PARAMS ((const char *));
   60: static void append_seg PARAMS ((void));
   61: static void OP_indirE PARAMS ((int, int));
   62: static void print_operand_value PARAMS ((char *, int, bfd_vma));
   63: static void OP_E PARAMS ((int, int));
   64: static void OP_G PARAMS ((int, int));
   65: static bfd_vma get64 PARAMS ((void));
   66: static bfd_signed_vma get32 PARAMS ((void));
   67: static bfd_signed_vma get32s PARAMS ((void));
   68: static int get16 PARAMS ((void));
   69: static void set_op PARAMS ((bfd_vma, int));
   70: static void OP_REG PARAMS ((int, int));
   71: static void OP_IMREG PARAMS ((int, int));
   72: static void OP_I PARAMS ((int, int));
   73: static void OP_I64 PARAMS ((int, int));
   74: static void OP_sI PARAMS ((int, int));
   75: static void OP_J PARAMS ((int, int));
   76: static void OP_SEG PARAMS ((int, int));
   77: static void OP_DIR PARAMS ((int, int));
   78: static void OP_OFF PARAMS ((int, int));
   79: static void OP_OFF64 PARAMS ((int, int));
   80: static void ptr_reg PARAMS ((int, int));
   81: static void OP_ESreg PARAMS ((int, int));
   82: static void OP_DSreg PARAMS ((int, int));
   83: static void OP_C PARAMS ((int, int));
   84: static void OP_D PARAMS ((int, int));
   85: static void OP_T PARAMS ((int, int));
   86: static void OP_Rd PARAMS ((int, int));
   87: static void OP_MMX PARAMS ((int, int));
   88: static void OP_XMM PARAMS ((int, int));
   89: static void OP_EM PARAMS ((int, int));
   90: static void OP_EX PARAMS ((int, int));
   91: static void OP_MS PARAMS ((int, int));
   92: static void OP_XS PARAMS ((int, int));
   93: static void OP_3DNowSuffix PARAMS ((int, int));
   94: static void OP_SIMD_Suffix PARAMS ((int, int));
   95: static void SIMD_Fixup PARAMS ((int, int));
   96: static void BadOp PARAMS ((void));
   97: 
   98: struct dis_private {
   99:   /* Points to first byte not fetched.  */
  100:   bfd_byte *max_fetched;
  101:   bfd_byte the_buffer[MAXLEN];
  102:   bfd_vma insn_start;
  103:   int orig_sizeflag;
  104:   jmp_buf bailout;
  105: };
  106: 
  107: /* The opcode for the fwait instruction, which we treat as a prefix
  108:    when we can.  */
  109: #define FWAIT_OPCODE (0x9b)
  110: 
  111: /* Set to 1 for 64bit mode disassembly.  */
  112: static int mode_64bit;
  113: 
  114: /* Flags for the prefixes for the current instruction.  See below.  */
  115: static int prefixes;
  116: 
  117: /* REX prefix the current instruction.  See below.  */
  118: static int rex;
  119: /* Bits of REX we've already used.  */
  120: static int rex_used;
  121: #define REX_MODE64      8
  122: #define REX_EXTX        4
  123: #define REX_EXTY        2
  124: #define REX_EXTZ        1
  125: /* Mark parts used in the REX prefix.  When we are testing for
  126:    empty prefix (for 8bit register REX extension), just mask it
  127:    out.  Otherwise test for REX bit is excuse for existence of REX
  128:    only in case value is nonzero.  */
  129: #define USED_REX(value)                                 \
  130:   {                                                     \
  131:     if (value)                                          \
  132:       rex_used |= (rex & value) ? (value) | 0x40 : 0;   \
  133:     else                                                \
  134:       rex_used |= 0x40;                                 \
  135:   }
  136: 
  137: /* Flags for prefixes which we somehow handled when printing the
  138:    current instruction.  */
  139: static int used_prefixes;
  140: 
  141: /* Flags stored in PREFIXES.  */
  142: #define PREFIX_REPZ 1
  143: #define PREFIX_REPNZ 2
  144: #define PREFIX_LOCK 4
  145: #define PREFIX_CS 8
  146: #define PREFIX_SS 0x10
  147: #define PREFIX_DS 0x20
  148: #define PREFIX_ES 0x40
  149: #define PREFIX_FS 0x80
  150: #define PREFIX_GS 0x100
  151: #define PREFIX_DATA 0x200
  152: #define PREFIX_ADDR 0x400
  153: #define PREFIX_FWAIT 0x800
  154: 
  155: /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
  156:    to ADDR (exclusive) are valid.  Returns 1 for success, longjmps
  157:    on error.  */
  158: #define FETCH_DATA(info, addr) \
  159:   ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
  160:    ? 1 : fetch_data ((info), (addr)))
  161: 
  162: static int
  163: fetch_data (info, addr)
  164:      struct disassemble_info *info;
  165:      bfd_byte *addr;
  166: {
  167:   int status;
  168:   struct dis_private *priv = (struct dis_private *) info->private_data;
  169:   bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
  170: 
  171:   status = (*info->read_memory_func) (start,
  172:                                       priv->max_fetched,
  173:                                       addr - priv->max_fetched,
  174:                                       info);
  175:   if (status != 0)
  176:     {
  177:       /* If we did manage to read at least one byte, then
  178:          print_insn_i386 will do something sensible.  Otherwise, print
  179:          an error.  We do that here because this is where we know
  180:          STATUS.  */
  181:       if (priv->max_fetched == priv->the_buffer)
  182:         (*info->memory_error_func) (status, start, info);
  183:       longjmp (priv->bailout, 1);
  184:     }
  185:   else
  186:     priv->max_fetched = addr;
  187:   return 1;
  188: }
  189: 
  190: #define XX NULL, 0
  191: 
  192: #define Eb OP_E, b_mode
  193: #define Ev OP_E, v_mode
  194: #define Ed OP_E, d_mode
  195: #define indirEb OP_indirE, b_mode
  196: #define indirEv OP_indirE, v_mode
  197: #define Ew OP_E, w_mode
  198: #define Ma OP_E, v_mode
  199: #define M OP_E, 0               /* lea, lgdt, etc. */
  200: #define Mp OP_E, 0              /* 32 or 48 bit memory operand for LDS, LES etc */
  201: #define Gb OP_G, b_mode
  202: #define Gv OP_G, v_mode
  203: #define Gd OP_G, d_mode
  204: #define Gw OP_G, w_mode
  205: #define Rd OP_Rd, d_mode
  206: #define Rm OP_Rd, m_mode
  207: #define Ib OP_I, b_mode
  208: #define sIb OP_sI, b_mode       /* sign extened byte */
  209: #define Iv OP_I, v_mode
  210: #define Iq OP_I, q_mode
  211: #define Iv64 OP_I64, v_mode
  212: #define Iw OP_I, w_mode
  213: #define Jb OP_J, b_mode
  214: #define Jv OP_J, v_mode
  215: #define Cm OP_C, m_mode
  216: #define Dm OP_D, m_mode
  217: #define Td OP_T, d_mode
  218: 
  219: #define RMeAX OP_REG, eAX_reg
  220: #define RMeBX OP_REG, eBX_reg
  221: #define RMeCX OP_REG, eCX_reg
  222: #define RMeDX OP_REG, eDX_reg
  223: #define RMeSP OP_REG, eSP_reg
  224: #define RMeBP OP_REG, eBP_reg
  225: #define RMeSI OP_REG, eSI_reg
  226: #define RMeDI OP_REG, eDI_reg
  227: #define RMrAX OP_REG, rAX_reg
  228: #define RMrBX OP_REG, rBX_reg
  229: #define RMrCX OP_REG, rCX_reg
  230: #define RMrDX OP_REG, rDX_reg
  231: #define RMrSP OP_REG, rSP_reg
  232: #define RMrBP OP_REG, rBP_reg
  233: #define RMrSI OP_REG, rSI_reg
  234: #define RMrDI OP_REG, rDI_reg
  235: #define RMAL OP_REG, al_reg
  236: #define RMAL OP_REG, al_reg
  237: #define RMCL OP_REG, cl_reg
  238: #define RMDL OP_REG, dl_reg
  239: #define RMBL OP_REG, bl_reg
  240: #define RMAH OP_REG, ah_reg
  241: #define RMCH OP_REG, ch_reg
  242: #define RMDH OP_REG, dh_reg
  243: #define RMBH OP_REG, bh_reg
  244: #define RMAX OP_REG, ax_reg
  245: #define RMDX OP_REG, dx_reg
  246: 
  247: #define eAX OP_IMREG, eAX_reg
  248: #define eBX OP_IMREG, eBX_reg
  249: #define eCX OP_IMREG, eCX_reg
  250: #define eDX OP_IMREG, eDX_reg
  251: #define eSP OP_IMREG, eSP_reg
  252: #define eBP OP_IMREG, eBP_reg
  253: #define eSI OP_IMREG, eSI_reg
  254: #define eDI OP_IMREG, eDI_reg
  255: #define AL OP_IMREG, al_reg
  256: #define AL OP_IMREG, al_reg
  257: #define CL OP_IMREG, cl_reg
  258: #define DL OP_IMREG, dl_reg
  259: #define BL OP_IMREG, bl_reg
  260: #define AH OP_IMREG, ah_reg
  261: #define CH OP_IMREG, ch_reg
  262: #define DH OP_IMREG, dh_reg
  263: #define BH OP_IMREG, bh_reg
  264: #define AX OP_IMREG, ax_reg
  265: #define DX OP_IMREG, dx_reg
  266: #define indirDX OP_IMREG, indir_dx_reg
  267: 
  268: #define Sw OP_SEG, w_mode
  269: #define Ap OP_DIR, 0
  270: #define Ob OP_OFF, b_mode
  271: #define Ob64 OP_OFF64, b_mode
  272: #define Ov OP_OFF, v_mode
  273: #define Ov64 OP_OFF64, v_mode
  274: #define Xb OP_DSreg, eSI_reg
  275: #define Xv OP_DSreg, eSI_reg
  276: #define Yb OP_ESreg, eDI_reg
  277: #define Yv OP_ESreg, eDI_reg
  278: #define DSBX OP_DSreg, eBX_reg
  279: 
  280: #define es OP_REG, es_reg
  281: #define ss OP_REG, ss_reg
  282: #define cs OP_REG, cs_reg
  283: #define ds OP_REG, ds_reg
  284: #define fs OP_REG, fs_reg
  285: #define gs OP_REG, gs_reg
  286: 
  287: #define MX OP_MMX, 0
  288: #define XM OP_XMM, 0
  289: #define EM OP_EM, v_mode
  290: #define EX OP_EX, v_mode
  291: #define MS OP_MS, v_mode
  292: #define XS OP_XS, v_mode
  293: #define None OP_E, 0
  294: #define OPSUF OP_3DNowSuffix, 0
  295: #define OPSIMD OP_SIMD_Suffix, 0
  296: 
  297: #define cond_jump_flag NULL, cond_jump_mode
  298: #define loop_jcxz_flag NULL, loop_jcxz_mode
  299: 
  300: /* bits in sizeflag */
  301: #define SUFFIX_ALWAYS 4
  302: #define AFLAG 2
  303: #define DFLAG 1
  304: 
  305: #define b_mode 1  /* byte operand */
  306: #define v_mode 2  /* operand size depends on prefixes */
  307: #define w_mode 3  /* word operand */
  308: #define d_mode 4  /* double word operand  */
  309: #define q_mode 5  /* quad word operand */
  310: #define x_mode 6
  311: #define m_mode 7  /* d_mode in 32bit, q_mode in 64bit mode.  */
  312: #define cond_jump_mode 8
  313: #define loop_jcxz_mode 9
  314: 
  315: #define es_reg 100
  316: #define cs_reg 101
  317: #define ss_reg 102
  318: #define ds_reg 103
  319: #define fs_reg 104
  320: #define gs_reg 105
  321: 
  322: #define eAX_reg 108
  323: #define eCX_reg 109
  324: #define eDX_reg 110
  325: #define eBX_reg 111
  326: #define eSP_reg 112
  327: #define eBP_reg 113
  328: #define eSI_reg 114
  329: #define eDI_reg 115
  330: 
  331: #define al_reg 116
  332: #define cl_reg 117
  333: #define dl_reg 118
  334: #define bl_reg 119
  335: #define ah_reg 120
  336: #define ch_reg 121
  337: #define dh_reg 122
  338: #define bh_reg 123
  339: 
  340: #define ax_reg 124
  341: #define cx_reg 125
  342: #define dx_reg 126
  343: #define bx_reg 127
  344: #define sp_reg 128
  345: #define bp_reg 129
  346: #define si_reg 130
  347: #define di_reg 131
  348: 
  349: #define rAX_reg 132
  350: #define rCX_reg 133
  351: #define rDX_reg 134
  352: #define rBX_reg 135
  353: #define rSP_reg 136
  354: #define rBP_reg 137
  355: #define rSI_reg 138
  356: #define rDI_reg 139
  357: 
  358: #define indir_dx_reg 150
  359: 
  360: #define FLOATCODE 1
  361: #define USE_GROUPS 2
  362: #define USE_PREFIX_USER_TABLE 3
  363: #define X86_64_SPECIAL 4
  364: 
  365: #define FLOAT     NULL, NULL, FLOATCODE, NULL, 0, NULL, 0
  366: 
  367: #define GRP1b     NULL, NULL, USE_GROUPS, NULL,  0, NULL, 0
  368: #define GRP1S     NULL, NULL, USE_GROUPS, NULL,  1, NULL, 0
  369: #define GRP1Ss    NULL, NULL, USE_GROUPS, NULL,  2, NULL, 0
  370: #define GRP2b     NULL, NULL, USE_GROUPS, NULL,  3, NULL, 0
  371: #define GRP2S     NULL, NULL, USE_GROUPS, NULL,  4, NULL, 0
  372: #define GRP2b_one NULL, NULL, USE_GROUPS, NULL,  5, NULL, 0
  373: #define GRP2S_one NULL, NULL, USE_GROUPS, NULL,  6, NULL, 0
  374: #define GRP2b_cl  NULL, NULL, USE_GROUPS, NULL,  7, NULL, 0
  375: #define GRP2S_cl  NULL, NULL, USE_GROUPS, NULL,  8, NULL, 0
  376: #define GRP3b     NULL, NULL, USE_GROUPS, NULL,  9, NULL, 0
  377: #define GRP3S     NULL, NULL, USE_GROUPS, NULL, 10, NULL, 0
  378: #define GRP4      NULL, NULL, USE_GROUPS, NULL, 11, NULL, 0
  379: #define GRP5      NULL, NULL, USE_GROUPS, NULL, 12, NULL, 0
  380: #define GRP6      NULL, NULL, USE_GROUPS, NULL, 13, NULL, 0
  381: #define GRP7      NULL, NULL, USE_GROUPS, NULL, 14, NULL, 0
  382: #define GRP8      NULL, NULL, USE_GROUPS, NULL, 15, NULL, 0
  383: #define GRP9      NULL, NULL, USE_GROUPS, NULL, 16, NULL, 0
  384: #define GRP10     NULL, NULL, USE_GROUPS, NULL, 17, NULL, 0
  385: #define GRP11     NULL, NULL, USE_GROUPS, NULL, 18, NULL, 0
  386: #define GRP12     NULL, NULL, USE_GROUPS, NULL, 19, NULL, 0
  387: #define GRP13     NULL, NULL, USE_GROUPS, NULL, 20, NULL, 0
  388: #define GRP14     NULL, NULL, USE_GROUPS, NULL, 21, NULL, 0
  389: #define GRPAMD    NULL, NULL, USE_GROUPS, NULL, 22, NULL, 0
  390: 
  391: #define PREGRP0   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  0, NULL, 0
  392: #define PREGRP1   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  1, NULL, 0
  393: #define PREGRP2   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  2, NULL, 0
  394: #define PREGRP3   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  3, NULL, 0
  395: #define PREGRP4   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  4, NULL, 0
  396: #define PREGRP5   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  5, NULL, 0
  397: #define PREGRP6   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  6, NULL, 0
  398: #define PREGRP7   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  7, NULL, 0
  399: #define PREGRP8   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  8, NULL, 0
  400: #define PREGRP9   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  9, NULL, 0
  401: #define PREGRP10  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 10, NULL, 0
  402: #define PREGRP11  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 11, NULL, 0
  403: #define PREGRP12  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 12, NULL, 0
  404: #define PREGRP13  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 13, NULL, 0
  405: #define PREGRP14  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 14, NULL, 0
  406: #define PREGRP15  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 15, NULL, 0
  407: #define PREGRP16  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 16, NULL, 0
  408: #define PREGRP17  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 17, NULL, 0
  409: #define PREGRP18  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 18, NULL, 0
  410: #define PREGRP19  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 19, NULL, 0
  411: #define PREGRP20  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 20, NULL, 0
  412: #define PREGRP21  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 21, NULL, 0
  413: #define PREGRP22  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 22, NULL, 0
  414: #define PREGRP23  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 23, NULL, 0
  415: #define PREGRP24  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 24, NULL, 0
  416: #define PREGRP25  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 25, NULL, 0
  417: #define PREGRP26  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 26, NULL, 0
  418: 
  419: #define X86_64_0  NULL, NULL, X86_64_SPECIAL, NULL,  0, NULL, 0
  420: 
  421: typedef void (*op_rtn) PARAMS ((int bytemode, int sizeflag));
  422: 
  423: struct dis386 {
  424:   const char *name;
  425:   op_rtn op1;
  426:   int bytemode1;
  427:   op_rtn op2;
  428:   int bytemode2;
  429:   op_rtn op3;
  430:   int bytemode3;
  431: };
  432: 
  433: /* Upper case letters in the instruction names here are macros.
  434:    'A' => print 'b' if no register operands or suffix_always is true
  435:    'B' => print 'b' if suffix_always is true
  436:    'E' => print 'e' if 32-bit form of jcxz
  437:    'F' =>