~ubuntu-branches/ubuntu/saucy/bochs/saucy-proposed

« back to all changes in this revision

Viewing changes to disasm/dis_decode.cc

  • Committer: Bazaar Package Importer
  • Author(s): David Futcher
  • Date: 2009-04-30 07:46:11 UTC
  • mfrom: (1.1.11 upstream) (4.1.7 squeeze)
  • Revision ID: james.westby@ubuntu.com-20090430074611-6dih80a5mk2uvxhk
Tags: 2.3.7+20090416-1ubuntu1
* Merge from debian unstable (LP: #370427), remaining changes:
  - debian/patches/12_no-ssp.patch: Build bios with -fno-stack-protector
  - Add Replaces/Conflicts for bochsbios-qemu (<< 2.3.6-2)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/////////////////////////////////////////////////////////////////////////
2
 
// $Id: dis_decode.cc,v 1.46 2008/04/27 19:47:12 sshwarts Exp $
 
2
// $Id: dis_decode.cc,v 1.49 2009/01/27 21:01:21 sshwarts Exp $
3
3
/////////////////////////////////////////////////////////////////////////
4
4
 
5
5
#include <stdio.h>
106
106
        continue;
107
107
 
108
108
      case 0x26:     // ES:
109
 
        if (! is_64) insn.seg_override = ES_REG;
110
 
        rex_prefix = 0;
111
 
        continue;
112
 
 
113
109
      case 0x2e:     // CS:
114
 
        if (! is_64) insn.seg_override = CS_REG;
115
 
        rex_prefix = 0;
116
 
        continue;
117
 
 
118
110
      case 0x36:     // SS:
119
 
        if (! is_64) insn.seg_override = SS_REG;
120
 
        rex_prefix = 0;
121
 
        continue;
122
 
 
123
111
      case 0x3e:     // DS:
124
 
        if (! is_64) insn.seg_override = DS_REG;
 
112
        if (! is_64) insn.seg_override = (insn.b1 >> 3) & 3;
125
113
        rex_prefix = 0;
126
114
        continue;
127
115
 
128
116
      case 0x64:     // FS:
129
 
        insn.seg_override = FS_REG;
130
 
        rex_prefix = 0;
131
 
        continue;
132
 
 
133
117
      case 0x65:     // GS:
134
 
        insn.seg_override = GS_REG;
 
118
        insn.seg_override = insn.b1 & 0xf;
135
119
        rex_prefix = 0;
136
120
        continue;
137
121
 
152
136
        continue;
153
137
 
154
138
      case 0xf2:     // repne
155
 
        sse_prefix = SSE_PREFIX_F2;
156
 
        rex_prefix = 0;
157
 
        continue;
158
 
 
159
139
      case 0xf3:     // rep
 
140
        sse_prefix = insn.b1 & 0xf;
 
141
        rex_prefix = 0;
 
142
        continue;
 
143
 
160
144
        sse_prefix = SSE_PREFIX_F3;
161
145
        rex_prefix = 0;
162
146
        continue;
218
202
  {
219
203
    switch(attr) {
220
204
       case _GROUPN:
221
 
         entry = &(OPCODE_TABLE(entry)[insn.nnn]);
 
205
         entry = &(OPCODE_TABLE(entry)[insn.nnn & 7]);
222
206
         break;
223
207
 
224
208
       case _GRPSSE:
233
217
         break;
234
218
 
235
219
       case _GRPRM:
236
 
         entry = &(OPCODE_TABLE(entry)[insn.rm]);
 
220
         entry = &(OPCODE_TABLE(entry)[insn.rm & 7]);
237
221
         break;
238
222
 
239
223
       case _GRPFP:
240
224
         if(insn.mod != 3)
241
225
         {
242
 
             entry = &(OPCODE_TABLE(entry)[insn.nnn]);
 
226
             entry = &(OPCODE_TABLE(entry)[insn.nnn & 7]);
243
227
         } else {
244
228
             int index = (insn.b1-0xD8)*64 + (insn.modrm & 0x3f);
245
229
             entry = &(BxDisasmOpcodeInfoFP[index]);
282
266
      dis_sprintf("%s ", OPCODE(prefix)->IntelOpcode);
283
267
    }
284
268
 
 
269
    if (insn.b1 == 0x90 && !insn.rex_b && prefix_byte == 0xF3)
 
270
      continue;
 
271
 
285
272
    if (prefix_byte == 0xF3 || prefix_byte == 0xF2) {
286
273
      if (attr != _GRPSSE) {
287
274
        const BxDisasmOpcodeTable_t *prefix = &(opcode_table[prefix_byte]);
305
292
    opcode = &Ia_jecxz_Jb;
306
293
 
307
294
  // fix nop opcode
308
 
  if (insn.b1 == 0x90 && !insn.rex_b) {
309
 
    opcode = &Ia_nop;
 
295
  if (insn.b1 == 0x90) {
 
296
    if (sse_prefix == SSE_PREFIX_F3)
 
297
      opcode = &Ia_pause;
 
298
    else if (!insn.rex_b)
 
299
      opcode = &Ia_nop;
310
300
  }
311
301
 
312
302
  // print instruction disassembly