Add support for register-number immediates with fixed 4-bit values
[platform/upstream/nasm.git] / disasm.c
1 /* disasm.c   where all the _work_ gets done in the Netwide Disassembler
2  *
3  * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
4  * Julian Hall. All rights reserved. The software is
5  * redistributable under the license given in the file "LICENSE"
6  * distributed in the NASM archive.
7  *
8  * initial version 27/iii/95 by Simon Tatham
9  */
10
11 #include "compiler.h"
12
13 #include <stdio.h>
14 #include <string.h>
15 #include <limits.h>
16 #include <inttypes.h>
17
18 #include "nasm.h"
19 #include "disasm.h"
20 #include "sync.h"
21 #include "insns.h"
22
23 #include "names.c"
24
25 /*
26  * Flags that go into the `segment' field of `insn' structures
27  * during disassembly.
28  */
29 #define SEG_RELATIVE      1
30 #define SEG_32BIT         2
31 #define SEG_RMREG         4
32 #define SEG_DISP8         8
33 #define SEG_DISP16       16
34 #define SEG_DISP32       32
35 #define SEG_NODISP       64
36 #define SEG_SIGNED      128
37 #define SEG_64BIT       256
38
39 #include "regdis.c"
40
41 /*
42  * Prefix information
43  */
44 struct prefix_info {
45     uint8_t osize;              /* Operand size */
46     uint8_t asize;              /* Address size */
47     uint8_t osp;                /* Operand size prefix present */
48     uint8_t asp;                /* Address size prefix present */
49     uint8_t rep;                /* Rep prefix present */
50     uint8_t seg;                /* Segment override prefix present */
51     uint8_t lock;               /* Lock prefix present */
52     uint8_t vex[3];             /* VEX prefix present */
53     uint8_t vex_m;              /* VEX.M field */
54     uint8_t vex_v;
55     uint8_t vex_lp;             /* VEX.LP fields */
56     uint32_t rex;               /* REX prefix present */
57 };
58
59 #define getu8(x) (*(uint8_t *)(x))
60 #if X86_MEMORY
61 /* Littleendian CPU which can handle unaligned references */
62 #define getu16(x) (*(uint16_t *)(x))
63 #define getu32(x) (*(uint32_t *)(x))
64 #define getu64(x) (*(uint64_t *)(x))
65 #else
66 static uint16_t getu16(uint8_t *data)
67 {
68     return (uint16_t)data[0] + ((uint16_t)data[1] << 8);
69 }
70 static uint32_t getu32(uint8_t *data)
71 {
72     return (uint32_t)getu16(data) + ((uint32_t)getu16(data+2) << 16);
73 }
74 static uint64_t getu64(uint8_t *data)
75 {
76     return (uint64_t)getu32(data) + ((uint64_t)getu32(data+4) << 32);
77 }
78 #endif
79
80 #define gets8(x) ((int8_t)getu8(x))
81 #define gets16(x) ((int16_t)getu16(x))
82 #define gets32(x) ((int32_t)getu32(x))
83 #define gets64(x) ((int64_t)getu64(x))
84
85 /* Important: regval must already have been adjusted for rex extensions */
86 static enum reg_enum whichreg(int32_t regflags, int regval, int rex)
87 {
88     if (!(regflags & (REGISTER|REGMEM)))
89         return 0;               /* Registers not permissible?! */
90
91     regflags |= REGISTER;
92
93     if (!(REG_AL & ~regflags))
94         return R_AL;
95     if (!(REG_AX & ~regflags))
96         return R_AX;
97     if (!(REG_EAX & ~regflags))
98         return R_EAX;
99     if (!(REG_RAX & ~regflags))
100         return R_RAX;
101     if (!(REG_DL & ~regflags))
102         return R_DL;
103     if (!(REG_DX & ~regflags))
104         return R_DX;
105     if (!(REG_EDX & ~regflags))
106         return R_EDX;
107     if (!(REG_RDX & ~regflags))
108         return R_RDX;
109     if (!(REG_CL & ~regflags))
110         return R_CL;
111     if (!(REG_CX & ~regflags))
112         return R_CX;
113     if (!(REG_ECX & ~regflags))
114         return R_ECX;
115     if (!(REG_RCX & ~regflags))
116         return R_RCX;
117     if (!(FPU0 & ~regflags))
118         return R_ST0;
119     if (!(REG_CS & ~regflags))
120         return (regval == 1) ? R_CS : 0;
121     if (!(REG_DESS & ~regflags))
122         return (regval == 0 || regval == 2
123                 || regval == 3 ? rd_sreg[regval] : 0);
124     if (!(REG_FSGS & ~regflags))
125         return (regval == 4 || regval == 5 ? rd_sreg[regval] : 0);
126     if (!(REG_SEG67 & ~regflags))
127         return (regval == 6 || regval == 7 ? rd_sreg[regval] : 0);
128
129     /* All the entries below look up regval in an 16-entry array */
130     if (regval < 0 || regval > 15)
131         return 0;
132
133     if (!(REG8 & ~regflags)) {
134         if (rex & REX_P)
135             return rd_reg8_rex[regval];
136         else
137             return rd_reg8[regval];
138     }
139     if (!(REG16 & ~regflags))
140         return rd_reg16[regval];
141     if (!(REG32 & ~regflags))
142         return rd_reg32[regval];
143     if (!(REG64 & ~regflags))
144         return rd_reg64[regval];
145     if (!(REG_SREG & ~regflags))
146         return rd_sreg[regval & 7]; /* Ignore REX */
147     if (!(REG_CREG & ~regflags))
148         return rd_creg[regval];
149     if (!(REG_DREG & ~regflags))
150         return rd_dreg[regval];
151     if (!(REG_TREG & ~regflags)) {
152         if (rex & REX_P)
153             return 0;           /* TR registers are ill-defined with rex */
154         return rd_treg[regval];
155     }
156     if (!(FPUREG & ~regflags))
157         return rd_fpureg[regval & 7]; /* Ignore REX */
158     if (!(MMXREG & ~regflags))
159         return rd_mmxreg[regval & 7]; /* Ignore REX */
160     if (!(XMMREG & ~regflags))
161         return rd_xmmreg[regval];
162     if (!(YMMREG & ~regflags))
163         return rd_ymmreg[regval];
164
165     return 0;
166 }
167
168 static const char *whichcond(int condval)
169 {
170     static int conds[] = {
171         C_O, C_NO, C_C, C_NC, C_Z, C_NZ, C_NA, C_A,
172         C_S, C_NS, C_PE, C_PO, C_L, C_NL, C_NG, C_G
173     };
174     return conditions[conds[condval]];
175 }
176
177 /*
178  * Process a DREX suffix
179  */
180 static uint8_t *do_drex(uint8_t *data, insn *ins)
181 {
182     uint8_t drex = *data++;
183     operand *dst = &ins->oprs[ins->drexdst];
184
185     if ((drex & 8) != ((ins->rex & REX_OC) ? 8 : 0))
186         return NULL;    /* OC0 mismatch */
187     ins->rex = (ins->rex & ~7) | (drex & 7);
188
189     dst->segment = SEG_RMREG;
190     dst->basereg = drex >> 4;
191     return data;
192 }
193
194
195 /*
196  * Process an effective address (ModRM) specification.
197  */
198 static uint8_t *do_ea(uint8_t *data, int modrm, int asize,
199                       int segsize, operand * op, insn *ins)
200 {
201     int mod, rm, scale, index, base;
202     int rex;
203     uint8_t sib = 0;
204
205     mod = (modrm >> 6) & 03;
206     rm = modrm & 07;
207
208     if (mod != 3 && rm == 4 && asize != 16)
209         sib = *data++;
210
211     if (ins->rex & REX_D) {
212         data = do_drex(data, ins);
213         if (!data)
214             return NULL;
215     }
216     rex = ins->rex;
217
218     if (mod == 3) {             /* pure register version */
219         op->basereg = rm+(rex & REX_B ? 8 : 0);
220         op->segment |= SEG_RMREG;
221         return data;
222     }
223
224     op->disp_size = 0;
225     op->eaflags = 0;
226
227     if (asize == 16) {
228         /*
229          * <mod> specifies the displacement size (none, byte or
230          * word), and <rm> specifies the register combination.
231          * Exception: mod=0,rm=6 does not specify [BP] as one might
232          * expect, but instead specifies [disp16].
233          */
234         op->indexreg = op->basereg = -1;
235         op->scale = 1;          /* always, in 16 bits */
236         switch (rm) {
237         case 0:
238             op->basereg = R_BX;
239             op->indexreg = R_SI;
240             break;
241         case 1:
242             op->basereg = R_BX;
243             op->indexreg = R_DI;
244             break;
245         case 2:
246             op->basereg = R_BP;
247             op->indexreg = R_SI;
248             break;
249         case 3:
250             op->basereg = R_BP;
251             op->indexreg = R_DI;
252             break;
253         case 4:
254             op->basereg = R_SI;
255             break;
256         case 5:
257             op->basereg = R_DI;
258             break;
259         case 6:
260             op->basereg = R_BP;
261             break;
262         case 7:
263             op->basereg = R_BX;
264             break;
265         }
266         if (rm == 6 && mod == 0) {      /* special case */
267             op->basereg = -1;
268             if (segsize != 16)
269                 op->disp_size = 16;
270             mod = 2;            /* fake disp16 */
271         }
272         switch (mod) {
273         case 0:
274             op->segment |= SEG_NODISP;
275             break;
276         case 1:
277             op->segment |= SEG_DISP8;
278             op->offset = (int8_t)*data++;
279             break;
280         case 2:
281             op->segment |= SEG_DISP16;
282             op->offset = *data++;
283             op->offset |= ((unsigned)*data++) << 8;
284             break;
285         }
286         return data;
287     } else {
288         /*
289          * Once again, <mod> specifies displacement size (this time
290          * none, byte or *dword*), while <rm> specifies the base
291          * register. Again, [EBP] is missing, replaced by a pure
292          * disp32 (this time that's mod=0,rm=*5*) in 32-bit mode,
293          * and RIP-relative addressing in 64-bit mode.
294          *
295          * However, rm=4
296          * indicates not a single base register, but instead the
297          * presence of a SIB byte...
298          */
299         int a64 = asize == 64;
300
301         op->indexreg = -1;
302
303         if (a64)
304             op->basereg = rd_reg64[rm | ((rex & REX_B) ? 8 : 0)];
305         else
306             op->basereg = rd_reg32[rm | ((rex & REX_B) ? 8 : 0)];
307
308         if (rm == 5 && mod == 0) {
309             if (segsize == 64) {
310                 op->eaflags |= EAF_REL;
311                 op->segment |= SEG_RELATIVE;
312                 mod = 2;        /* fake disp32 */
313             }
314
315             if (asize != 64)
316                 op->disp_size = asize;
317
318             op->basereg = -1;
319             mod = 2;            /* fake disp32 */
320         }
321
322         if (rm == 4) {          /* process SIB */
323             scale = (sib >> 6) & 03;
324             index = (sib >> 3) & 07;
325             base = sib & 07;
326
327             op->scale = 1 << scale;
328
329             if (index == 4)
330                 op->indexreg = -1; /* ESP/RSP/R12 cannot be an index */
331             else if (a64)
332                 op->indexreg = rd_reg64[index | ((rex & REX_X) ? 8 : 0)];
333             else
334                 op->indexreg = rd_reg32[index | ((rex & REX_X) ? 8 : 0)];
335
336             if (base == 5 && mod == 0) {
337                 op->basereg = -1;
338                 mod = 2;        /* Fake disp32 */
339             } else if (a64)
340                 op->basereg = rd_reg64[base | ((rex & REX_B) ? 8 : 0)];
341             else
342                 op->basereg = rd_reg32[base | ((rex & REX_B) ? 8 : 0)];
343
344             if (segsize == 16)
345                 op->disp_size = 32;
346         }
347
348         switch (mod) {
349         case 0:
350             op->segment |= SEG_NODISP;
351             break;
352         case 1:
353             op->segment |= SEG_DISP8;
354             op->offset = gets8(data);
355             data++;
356             break;
357         case 2:
358             op->segment |= SEG_DISP32;
359             op->offset = gets32(data);
360             data += 4;
361             break;
362         }
363         return data;
364     }
365 }
366
367 /*
368  * Determine whether the instruction template in t corresponds to the data
369  * stream in data. Return the number of bytes matched if so.
370  */
371 #define case4(x) case (x): case (x)+1: case (x)+2: case (x)+3
372
373 static int matches(const struct itemplate *t, uint8_t *data,
374                    const struct prefix_info *prefix, int segsize, insn *ins)
375 {
376     uint8_t *r = (uint8_t *)(t->code);
377     uint8_t *origdata = data;
378     bool a_used = false, o_used = false;
379     enum prefixes drep = 0;
380     uint8_t lock = prefix->lock;
381     int osize = prefix->osize;
382     int asize = prefix->asize;
383     int i, c;
384     struct operand *opx;
385     int s_field_for = -1;       /* No 144/154 series code encountered */
386
387     for (i = 0; i < MAX_OPERANDS; i++) {
388         ins->oprs[i].segment = ins->oprs[i].disp_size =
389             (segsize == 64 ? SEG_64BIT : segsize == 32 ? SEG_32BIT : 0);
390     }
391     ins->condition = -1;
392     ins->rex = prefix->rex;
393     memset(ins->prefixes, 0, sizeof ins->prefixes);
394
395     if (t->flags & (segsize == 64 ? IF_NOLONG : IF_LONG))
396         return false;
397
398     if (prefix->rep == 0xF2)
399         drep = P_REPNE;
400     else if (prefix->rep == 0xF3)
401         drep = P_REP;
402
403     while ((c = *r++) != 0) {
404         opx = &ins->oprs[c & 3];
405
406         switch (c) {
407         case 01:
408         case 02:
409         case 03:
410             while (c--)
411                 if (*r++ != *data++)
412                     return false;
413             break;
414
415         case 04:
416             switch (*data++) {
417             case 0x07:
418                 ins->oprs[0].basereg = 0;
419                 break;
420             case 0x17:
421                 ins->oprs[0].basereg = 2;
422                 break;
423             case 0x1F:
424                 ins->oprs[0].basereg = 3;
425                 break;
426             default:
427                 return false;
428             }
429             break;
430
431         case 05:
432             switch (*data++) {
433             case 0xA1:
434                 ins->oprs[0].basereg = 4;
435                 break;
436             case 0xA9:
437                 ins->oprs[0].basereg = 5;
438                 break;
439             default:
440                 return false;
441             }
442             break;
443
444         case 06:
445             switch (*data++) {
446             case 0x06:
447                 ins->oprs[0].basereg = 0;
448                 break;
449             case 0x0E:
450                 ins->oprs[0].basereg = 1;
451                 break;
452             case 0x16:
453                 ins->oprs[0].basereg = 2;
454                 break;
455             case 0x1E:
456                 ins->oprs[0].basereg = 3;
457                 break;
458             default:
459                 return false;
460             }
461             break;
462
463         case 07:
464             switch (*data++) {
465             case 0xA0:
466                 ins->oprs[0].basereg = 4;
467                 break;
468             case 0xA8:
469                 ins->oprs[0].basereg = 5;
470                 break;
471             default:
472                 return false;
473             }
474             break;
475
476         case4(010):
477         {
478             int t = *r++, d = *data++;
479             if (d < t || d > t + 7)
480                 return false;
481             else {
482                 opx->basereg = (d-t)+
483                     (ins->rex & REX_B ? 8 : 0);
484                 opx->segment |= SEG_RMREG;
485             }
486             break;
487         }
488
489         case4(014):
490             opx->offset = (int8_t)*data++;
491             opx->segment |= SEG_SIGNED;
492             break;
493
494         case4(020):
495             opx->offset = *data++;
496             break;
497
498         case4(024):
499             opx->offset = *data++;
500             break;
501
502         case4(030):
503             opx->offset = getu16(data);
504             data += 2;
505             break;
506
507         case4(034):
508             if (osize == 32) {
509                 opx->offset = getu32(data);
510                 data += 4;
511             } else {
512                 opx->offset = getu16(data);
513                 data += 2;
514             }
515             if (segsize != asize)
516                 opx->disp_size = asize;
517             break;
518
519         case4(040):
520             opx->offset = getu32(data);
521             data += 4;
522             break;
523
524         case4(044):
525             switch (asize) {
526             case 16:
527                 opx->offset = getu16(data);
528                 data += 2;
529                 if (segsize != 16)
530                     opx->disp_size = 16;
531                 break;
532             case 32:
533                 opx->offset = getu32(data);
534                 data += 4;
535                 if (segsize == 16)
536                     opx->disp_size = 32;
537                 break;
538             case 64:
539                 opx->offset = getu64(data);
540                 opx->disp_size = 64;
541                 data += 8;
542                 break;
543             }
544             break;
545
546         case4(050):
547             opx->offset = gets8(data++);
548             opx->segment |= SEG_RELATIVE;
549             break;
550
551         case4(054):
552             opx->offset = getu64(data);
553             data += 8;
554             break;
555
556         case4(060):
557             opx->offset = gets16(data);
558             data += 2;
559             opx->segment |= SEG_RELATIVE;
560             opx->segment &= ~SEG_32BIT;
561             break;
562
563         case4(064):
564             opx->segment |= SEG_RELATIVE;
565             if (osize == 16) {
566                 opx->offset = gets16(data);
567                 data += 2;
568                 opx->segment &= ~(SEG_32BIT|SEG_64BIT);
569             } else if (osize == 32) {
570                 opx->offset = gets32(data);
571                 data += 4;
572                 opx->segment &= ~SEG_64BIT;
573                 opx->segment |= SEG_32BIT;
574             }
575             if (segsize != osize) {
576                 opx->type =
577                     (opx->type & ~SIZE_MASK)
578                     | ((osize == 16) ? BITS16 : BITS32);
579             }
580             break;
581
582         case4(070):
583             opx->offset = gets32(data);
584             data += 4;
585             opx->segment |= SEG_32BIT | SEG_RELATIVE;
586             break;
587
588         case4(0100):
589         case4(0110):
590         case4(0120):
591         case4(0130):
592         {
593             int modrm = *data++;
594             opx->segment |= SEG_RMREG;
595             data = do_ea(data, modrm, asize, segsize,
596                          &ins->oprs[(c >> 3) & 3], ins);
597             if (!data)
598                 return false;
599             opx->basereg = ((modrm >> 3)&7)+
600                 (ins->rex & REX_R ? 8 : 0);
601             break;
602         }
603
604         case4(0140):
605             if (s_field_for == (c & 3)) {
606                 opx->offset = gets8(data);
607                 data++;
608             } else {
609                 opx->offset = getu16(data);
610                 data += 2;
611             }
612             break;
613
614         case4(0144):
615         case4(0154):
616             s_field_for = (*data & 0x02) ? c & 3 : -1;
617             if ((*data++ & ~0x02) != *r++)
618                 return false;
619             break;
620
621         case4(0150):
622             if (s_field_for == (c & 3)) {
623                 opx->offset = gets8(data);
624                 data++;
625             } else {
626                 opx->offset = getu32(data);
627                 data += 4;
628             }
629             break;
630
631         case4(0160):
632             ins->rex |= REX_D;
633             ins->drexdst = c & 3;
634             break;
635
636         case4(0164):
637             ins->rex |= REX_D|REX_OC;
638             ins->drexdst = c & 3;
639             break;
640
641         case 0170:
642             if (*data++)
643                 return false;
644             break;
645
646         case 0171:
647             data = do_drex(data, ins);
648             if (!data)
649                 return false;
650             break;
651
652         case 0172:
653         {
654             uint8_t ximm = *data++;
655             c = *r++;
656             ins->oprs[c >> 3].basereg = ximm >> 4;
657             ins->oprs[c >> 3].segment |= SEG_RMREG;
658             ins->oprs[c & 7].offset = ximm & 15;
659         }
660         break;
661
662         case 0173:
663         {
664             uint8_t ximm = *data++;
665             c = *r++;
666
667             if ((c ^ ximm) & 15)
668                 return false;
669
670             ins->oprs[c >> 4].basereg = ximm >> 4;
671             ins->oprs[c >> 4].segment |= SEG_RMREG;
672         }
673         break;
674
675         case4(0200):
676         case4(0204):
677         case4(0210):
678         case4(0214):
679         case4(0220):
680         case4(0224):
681         case4(0230):
682         case4(0234):
683         {
684             int modrm = *data++;
685             if (((modrm >> 3) & 07) != (c & 07))
686                 return false;   /* spare field doesn't match up */
687             data = do_ea(data, modrm, asize, segsize,
688                          &ins->oprs[(c >> 3) & 07], ins);
689             if (!data)
690                 return false;
691             break;
692         }
693
694         case4(0260):
695         {
696             int vexm   = *r++;
697             int vexwlp = *r++;
698             ins->rex |= REX_V;
699             if ((prefix->rex & (REX_V|REX_D|REX_P)) != REX_V)
700                 return false;
701
702             if ((vexm & 0x1f) != prefix->vex_m)
703                 return false;
704
705             switch (vexwlp & 030) {
706             case 000:
707                 if (prefix->rex & REX_W)
708                     return false;
709                 break;
710             case 010:
711                 if (!(prefix->rex & REX_W))
712                     return false;
713                 break;
714             default:
715                 break;          /* XXX: Need to do anything special here? */
716             }
717
718             if ((vexwlp & 007) != prefix->vex_lp)
719                 return false;
720
721             opx->segment |= SEG_RMREG;
722             opx->basereg = prefix->vex_v;
723             break;
724         }
725
726         case 0270:
727         {
728             int vexm   = *r++;
729             int vexwlp = *r++;
730             ins->rex |= REX_V;
731             if ((prefix->rex & (REX_V|REX_D|REX_P)) != REX_V)
732                 return false;
733
734             if ((vexm & 0x1f) != prefix->vex_m)
735                 return false;
736
737             switch (vexwlp & 030) {
738             case 000:
739                 if (ins->rex & REX_W)
740                     return false;
741                 break;
742             case 010:
743                 if (!(ins->rex & REX_W))
744                     return false;
745                 break;
746             default:
747                 break;          /* Need to do anything special here? */
748             }
749
750             if ((vexwlp & 007) != prefix->vex_lp)
751                 return false;
752
753             if (prefix->vex_v != 0)
754                 return false;
755
756             break;
757         }
758
759         case 0310:
760             if (asize != 16)
761                 return false;
762             else
763                 a_used = true;
764             break;
765
766         case 0311:
767             if (asize == 16)
768                 return false;
769             else
770                 a_used = true;
771             break;
772
773         case 0312:
774             if (asize != segsize)
775                 return false;
776             else
777                 a_used = true;
778             break;
779
780         case 0313:
781             if (asize != 64)
782                 return false;
783             else
784                 a_used = true;
785             break;
786
787         case 0314:
788             if (prefix->rex & REX_B)
789                 return false;
790             break;
791
792         case 0315:
793             if (prefix->rex & REX_X)
794                 return false;
795             break;
796
797         case 0316:
798             if (prefix->rex & REX_R)
799                 return false;
800             break;
801
802         case 0317:
803             if (prefix->rex & REX_W)
804                 return false;
805             break;
806
807         case 0320:
808             if (osize != 16)
809                 return false;
810             else
811                 o_used = true;
812             break;
813
814         case 0321:
815             if (osize != 32)
816                 return false;
817             else
818                 o_used = true;
819             break;
820
821         case 0322:
822             if (osize != (segsize == 16) ? 16 : 32)
823                 return false;
824             else
825                 o_used = true;
826             break;
827
828         case 0323:
829             ins->rex |= REX_W;  /* 64-bit only instruction */
830             osize = 64;
831             o_used = true;
832             break;
833
834         case 0324:
835             if (!(ins->rex & (REX_P|REX_W)) || osize != 64)
836                 return false;
837             o_used = true;
838             break;
839
840         case 0330:
841         {
842             int t = *r++, d = *data++;
843             if (d < t || d > t + 15)
844                 return false;
845             else
846                 ins->condition = d - t;
847             break;
848         }
849
850         case 0331:
851             if (prefix->rep)
852                 return false;
853             break;
854
855         case 0332:
856             if (prefix->rep != 0xF2)
857                 return false;
858             drep = 0;
859             break;
860
861         case 0333:
862             if (prefix->rep != 0xF3)
863                 return false;
864             drep = 0;
865             break;
866
867         case 0334:
868             if (lock) {
869                 ins->rex |= REX_R;
870                 lock = 0;
871             }
872             break;
873
874         case 0335:
875             if (drep == P_REP)
876                 drep = P_REPE;
877             break;
878
879         case 0340:
880             return false;
881
882         case 0364:
883             if (prefix->osp)
884                 return false;
885             break;
886
887         case 0365:
888             if (prefix->asp)
889                 return false;
890             break;
891
892         case 0366:
893             if (!prefix->osp)
894                 return false;
895             o_used = true;
896             break;
897
898         case 0367:
899             if (!prefix->asp)
900                 return false;
901             a_used = true;
902             break;
903
904         default:
905             return false;       /* Unknown code */
906         }
907     }
908
909     /* REX cannot be combined with DREX or VEX */
910     if ((ins->rex & (REX_D|REX_V)) && (prefix->rex & REX_P))
911         return false;
912
913     /*
914      * Check for unused rep or a/o prefixes.
915      */
916     for (i = 0; i < t->operands; i++) {
917         if (ins->oprs[i].segment != SEG_RMREG)
918             a_used = true;
919     }
920
921     if (lock) {
922         if (ins->prefixes[PPS_LREP])
923             return false;
924         ins->prefixes[PPS_LREP] = P_LOCK;
925     }
926     if (drep) {
927         if (ins->prefixes[PPS_LREP])
928             return false;
929         ins->prefixes[PPS_LREP] = drep;
930     }
931     if (!o_used) {
932         if (osize != ((segsize == 16) ? 16 : 32)) {
933             enum prefixes pfx = 0;
934
935             switch (osize) {
936             case 16:
937                 pfx = P_O16;
938                 break;
939             case 32:
940                 pfx = P_O32;
941                 break;
942             case 64:
943                 pfx = P_O64;
944                 break;
945             }
946
947             if (ins->prefixes[PPS_OSIZE])
948                 return false;
949             ins->prefixes[PPS_OSIZE] = pfx;
950         }
951     }
952     if (!a_used && asize != segsize) {
953         if (ins->prefixes[PPS_ASIZE])
954             return false;
955         ins->prefixes[PPS_ASIZE] = asize == 16 ? P_A16 : P_A32;
956     }
957
958     /* Fix: check for redundant REX prefixes */
959
960     return data - origdata;
961 }
962
963 int32_t disasm(uint8_t *data, char *output, int outbufsize, int segsize,
964             int32_t offset, int autosync, uint32_t prefer)
965 {
966     const struct itemplate * const *p, * const *best_p;
967     const struct disasm_index *ix;
968     uint8_t *dp;
969     int length, best_length = 0;
970     char *segover;
971     int i, slen, colon, n;
972     uint8_t *origdata;
973     int works;
974     insn tmp_ins, ins;
975     uint32_t goodness, best;
976     int best_pref;
977     struct prefix_info prefix;
978     bool end_prefix;
979
980     memset(&ins, 0, sizeof ins);
981
982     /*
983      * Scan for prefixes.
984      */
985     memset(&prefix, 0, sizeof prefix);
986     prefix.asize = segsize;
987     prefix.osize = (segsize == 64) ? 32 : segsize;
988     segover = NULL;
989     origdata = data;
990
991     end_prefix = false;
992     while (!end_prefix) {
993         switch (*data) {
994         case 0xF2:
995         case 0xF3:
996             prefix.rep = *data++;
997             break;
998         case 0xF0:
999             prefix.lock = *data++;
1000             break;
1001         case 0x2E:
1002             segover = "cs", prefix.seg = *data++;
1003             break;
1004         case 0x36:
1005             segover = "ss", prefix.seg = *data++;
1006             break;
1007         case 0x3E:
1008             segover = "ds", prefix.seg = *data++;
1009             break;
1010         case 0x26:
1011             segover = "es", prefix.seg = *data++;
1012             break;
1013         case 0x64:
1014             segover = "fs", prefix.seg = *data++;
1015             break;
1016         case 0x65:
1017             segover = "gs", prefix.seg = *data++;
1018             break;
1019         case 0x66:
1020             prefix.osize = (segsize == 16) ? 32 : 16;
1021             prefix.osp = *data++;
1022             break;
1023         case 0x67:
1024             prefix.asize = (segsize == 32) ? 16 : 32;
1025             prefix.asp = *data++;
1026             break;
1027         case 0xC4:
1028         case 0xC5:
1029             if (segsize == 64 || (data[1] & 0xc0) == 0xc0) {
1030                 prefix.vex[0] = *data++;
1031                 prefix.vex[1] = *data++;
1032                 if (prefix.vex[0] == 0xc4)
1033                     prefix.vex[2] = *data++;
1034             }
1035             prefix.rex = REX_V;
1036             if (prefix.vex[0] == 0xc4) {
1037                 prefix.rex |= (~prefix.vex[1] >> 5) & 7; /* REX_RXB */
1038                 prefix.rex |= (prefix.vex[2] >> (7-3)) & REX_W;
1039                 prefix.vex_m = prefix.vex[1] & 0x1f;
1040                 prefix.vex_v = (~prefix.vex[2] >> 3) & 15;
1041                 prefix.vex_lp = prefix.vex[2] & 7;
1042             } else {
1043                 prefix.rex |= (~prefix.vex[1] >> (7-2)) & REX_R;
1044                 prefix.vex_m = 1;
1045                 prefix.vex_v = (~prefix.vex[1] >> 3) & 15;
1046                 prefix.vex_lp = prefix.vex[1] & 7;
1047             }
1048             end_prefix = true;
1049             break;
1050         case REX_P + 0x0:
1051         case REX_P + 0x1:
1052         case REX_P + 0x2:
1053         case REX_P + 0x3:
1054         case REX_P + 0x4:
1055         case REX_P + 0x5:
1056         case REX_P + 0x6:
1057         case REX_P + 0x7:
1058         case REX_P + 0x8:
1059         case REX_P + 0x9:
1060         case REX_P + 0xA:
1061         case REX_P + 0xB:
1062         case REX_P + 0xC:
1063         case REX_P + 0xD:
1064         case REX_P + 0xE:
1065         case REX_P + 0xF:
1066             if (segsize == 64) {
1067                 prefix.rex = *data++;
1068                 if (prefix.rex & REX_W)
1069                     prefix.osize = 64;
1070             }
1071             end_prefix = true;
1072             break;
1073         default:
1074             end_prefix = true;
1075             break;
1076         }
1077     }
1078
1079     best = -1;                  /* Worst possible */
1080     best_p = NULL;
1081     best_pref = INT_MAX;
1082
1083     dp = data;
1084     ix = itable + *dp++;
1085     while (ix->n == -1) {
1086         ix = (const struct disasm_index *)ix->p + *dp++;
1087     }
1088
1089     p = (const struct itemplate * const *)ix->p;
1090     for (n = ix->n; n; n--, p++) {
1091         if ((length = matches(*p, data, &prefix, segsize, &tmp_ins))) {
1092             works = true;
1093             /*
1094              * Final check to make sure the types of r/m match up.
1095              * XXX: Need to make sure this is actually correct.
1096              */
1097             for (i = 0; i < (*p)->operands; i++) {
1098                 if (!((*p)->opd[i] & SAME_AS) &&
1099                     (
1100                         /* If it's a mem-only EA but we have a
1101                            register, die. */
1102                         ((tmp_ins.oprs[i].segment & SEG_RMREG) &&
1103                          !(MEMORY & ~(*p)->opd[i])) ||
1104                         /* If it's a reg-only EA but we have a memory
1105                            ref, die. */
1106                         (!(tmp_ins.oprs[i].segment & SEG_RMREG) &&
1107                          !(REG_EA & ~(*p)->opd[i]) &&
1108                          !((*p)->opd[i] & REG_SMASK)) ||
1109                         /* Register type mismatch (eg FS vs REG_DESS):
1110                            die. */
1111                         ((((*p)->opd[i] & (REGISTER | FPUREG)) ||
1112                           (tmp_ins.oprs[i].segment & SEG_RMREG)) &&
1113                          !whichreg((*p)->opd[i],
1114                                    tmp_ins.oprs[i].basereg, tmp_ins.rex))
1115                         )) {
1116                     works = false;
1117                     break;
1118                 }
1119             }
1120
1121             /*
1122              * Note: we always prefer instructions which incorporate
1123              * prefixes in the instructions themselves.  This is to allow
1124              * e.g. PAUSE to be preferred to REP NOP, and deal with
1125              * MMX/SSE instructions where prefixes are used to select
1126              * between MMX and SSE register sets or outright opcode
1127              * selection.
1128              */
1129             if (works) {
1130                 int i, nprefix;
1131                 goodness = ((*p)->flags & IF_PFMASK) ^ prefer;
1132                 nprefix = 0;
1133                 for (i = 0; i < MAXPREFIX; i++)
1134                     if (tmp_ins.prefixes[i])
1135                         nprefix++;
1136                 if (nprefix < best_pref ||
1137                     (nprefix == best_pref && goodness < best)) {
1138                     /* This is the best one found so far */
1139                     best = goodness;
1140                     best_p = p;
1141                     best_pref = nprefix;
1142                     best_length = length;
1143                     ins = tmp_ins;
1144                 }
1145             }
1146         }
1147     }
1148
1149     if (!best_p)
1150         return 0;               /* no instruction was matched */
1151
1152     /* Pick the best match */
1153     p = best_p;
1154     length = best_length;
1155
1156     slen = 0;
1157
1158     /* TODO: snprintf returns the value that the string would have if
1159      *      the buffer were long enough, and not the actual length of
1160      *      the returned string, so each instance of using the return
1161      *      value of snprintf should actually be checked to assure that
1162      *      the return value is "sane."  Maybe a macro wrapper could
1163      *      be used for that purpose.
1164      */
1165     for (i = 0; i < MAXPREFIX; i++)
1166         switch (ins.prefixes[i]) {
1167         case P_LOCK:
1168             slen += snprintf(output + slen, outbufsize - slen, "lock ");
1169             break;
1170         case P_REP:
1171             slen += snprintf(output + slen, outbufsize - slen, "rep ");
1172             break;
1173         case P_REPE:
1174             slen += snprintf(output + slen, outbufsize - slen, "repe ");
1175             break;
1176         case P_REPNE:
1177             slen += snprintf(output + slen, outbufsize - slen, "repne ");
1178             break;
1179         case P_A16:
1180             slen += snprintf(output + slen, outbufsize - slen, "a16 ");
1181             break;
1182         case P_A32:
1183             slen += snprintf(output + slen, outbufsize - slen, "a32 ");
1184             break;
1185         case P_A64:
1186             slen += snprintf(output + slen, outbufsize - slen, "a64 ");
1187             break;
1188         case P_O16:
1189             slen += snprintf(output + slen, outbufsize - slen, "o16 ");
1190             break;
1191         case P_O32:
1192             slen += snprintf(output + slen, outbufsize - slen, "o32 ");
1193             break;
1194         case P_O64:
1195             slen += snprintf(output + slen, outbufsize - slen, "o64 ");
1196             break;
1197         default:
1198             break;
1199         }
1200
1201     for (i = 0; i < (int)elements(ico); i++)
1202         if ((*p)->opcode == ico[i]) {
1203             slen +=
1204                 snprintf(output + slen, outbufsize - slen, "%s%s", icn[i],
1205                          whichcond(ins.condition));
1206             break;
1207         }
1208     if (i >= (int)elements(ico))
1209         slen +=
1210             snprintf(output + slen, outbufsize - slen, "%s",
1211                      insn_names[(*p)->opcode]);
1212     colon = false;
1213     length += data - origdata;  /* fix up for prefixes */
1214     for (i = 0; i < (*p)->operands; i++) {
1215         opflags_t t = (*p)->opd[i];
1216         const operand *o = &ins.oprs[i];
1217         int64_t offs;
1218
1219         if (t & SAME_AS) {
1220             o = &ins.oprs[t & ~SAME_AS];
1221             t = (*p)->opd[t & ~SAME_AS];
1222         }
1223
1224         output[slen++] = (colon ? ':' : i == 0 ? ' ' : ',');
1225
1226         offs = o->offset;
1227         if (o->segment & SEG_RELATIVE) {
1228             offs += offset + length;
1229             /*
1230              * sort out wraparound
1231              */
1232             if (!(o->segment & (SEG_32BIT|SEG_64BIT)))
1233                 offs &= 0xffff;
1234             else if (segsize != 64)
1235                 offs &= 0xffffffff;
1236
1237             /*
1238              * add sync marker, if autosync is on
1239              */
1240             if (autosync)
1241                 add_sync(offs, 0L);
1242         }
1243
1244         if (t & COLON)
1245             colon = true;
1246         else
1247             colon = false;
1248
1249         if ((t & (REGISTER | FPUREG)) ||
1250             (o->segment & SEG_RMREG)) {
1251             enum reg_enum reg;
1252             reg = whichreg(t, o->basereg, ins.rex);
1253             if (t & TO)
1254                 slen += snprintf(output + slen, outbufsize - slen, "to ");
1255             slen += snprintf(output + slen, outbufsize - slen, "%s",
1256                              reg_names[reg - EXPR_REG_START]);
1257         } else if (!(UNITY & ~t)) {
1258             output[slen++] = '1';
1259         } else if (t & IMMEDIATE) {
1260             if (t & BITS8) {
1261                 slen +=
1262                     snprintf(output + slen, outbufsize - slen, "byte ");
1263                 if (o->segment & SEG_SIGNED) {
1264                     if (offs < 0) {
1265                         offs *= -1;
1266                         output[slen++] = '-';
1267                     } else
1268                         output[slen++] = '+';
1269                 }
1270             } else if (t & BITS16) {
1271                 slen +=
1272                     snprintf(output + slen, outbufsize - slen, "word ");
1273             } else if (t & BITS32) {
1274                 slen +=
1275                     snprintf(output + slen, outbufsize - slen, "dword ");
1276             } else if (t & BITS64) {
1277                 slen +=
1278                     snprintf(output + slen, outbufsize - slen, "qword ");
1279             } else if (t & NEAR) {
1280                 slen +=
1281                     snprintf(output + slen, outbufsize - slen, "near ");
1282             } else if (t & SHORT) {
1283                 slen +=
1284                     snprintf(output + slen, outbufsize - slen, "short ");
1285             }
1286             slen +=
1287                 snprintf(output + slen, outbufsize - slen, "0x%"PRIx64"",
1288                          offs);
1289         } else if (!(MEM_OFFS & ~t)) {
1290             slen +=
1291                 snprintf(output + slen, outbufsize - slen,
1292                          "[%s%s%s0x%"PRIx64"]",
1293                          (segover ? segover : ""),
1294                          (segover ? ":" : ""),
1295                          (o->disp_size == 64 ? "qword " :
1296                           o->disp_size == 32 ? "dword " :
1297                           o->disp_size == 16 ? "word " : ""), offs);
1298             segover = NULL;
1299         } else if (!(REGMEM & ~t)) {
1300             int started = false;
1301             if (t & BITS8)
1302                 slen +=
1303                     snprintf(output + slen, outbufsize - slen, "byte ");
1304             if (t & BITS16)
1305                 slen +=
1306                     snprintf(output + slen, outbufsize - slen, "word ");
1307             if (t & BITS32)
1308                 slen +=
1309                     snprintf(output + slen, outbufsize - slen, "dword ");
1310             if (t & BITS64)
1311                 slen +=
1312                     snprintf(output + slen, outbufsize - slen, "qword ");
1313             if (t & BITS80)
1314                 slen +=
1315                     snprintf(output + slen, outbufsize - slen, "tword ");
1316             if (t & BITS128)
1317                 slen +=
1318                     snprintf(output + slen, outbufsize - slen, "oword ");
1319             if (t & FAR)
1320                 slen += snprintf(output + slen, outbufsize - slen, "far ");
1321             if (t & NEAR)
1322                 slen +=
1323                     snprintf(output + slen, outbufsize - slen, "near ");
1324             output[slen++] = '[';
1325             if (o->disp_size)
1326                 slen += snprintf(output + slen, outbufsize - slen, "%s",
1327                                  (o->disp_size == 64 ? "qword " :
1328                                   o->disp_size == 32 ? "dword " :
1329                                   o->disp_size == 16 ? "word " :
1330                                   ""));
1331             if (o->eaflags & EAF_REL)
1332                 slen += snprintf(output + slen, outbufsize - slen, "rel ");
1333             if (segover) {
1334                 slen +=
1335                     snprintf(output + slen, outbufsize - slen, "%s:",
1336                              segover);
1337                 segover = NULL;
1338             }
1339             if (o->basereg != -1) {
1340                 slen += snprintf(output + slen, outbufsize - slen, "%s",
1341                                  reg_names[(o->basereg -
1342                                             EXPR_REG_START)]);
1343                 started = true;
1344             }
1345             if (o->indexreg != -1) {
1346                 if (started)
1347                     output[slen++] = '+';
1348                 slen += snprintf(output + slen, outbufsize - slen, "%s",
1349                                  reg_names[(o->indexreg -
1350                                             EXPR_REG_START)]);
1351                 if (o->scale > 1)
1352                     slen +=
1353                         snprintf(output + slen, outbufsize - slen, "*%d",
1354                                  o->scale);
1355                 started = true;
1356             }
1357
1358
1359             if (o->segment & SEG_DISP8) {
1360                 const char *prefix;
1361                 uint8_t offset = offs;
1362                 if ((int8_t)offset < 0) {
1363                     prefix = "-";
1364                     offset = -offset;
1365                 } else {
1366                     prefix = "+";
1367                 }
1368                 slen +=
1369                     snprintf(output + slen, outbufsize - slen, "%s0x%"PRIx8"",
1370                              prefix, offset);
1371             } else if (o->segment & SEG_DISP16) {
1372                 const char *prefix;
1373                 uint16_t offset = offs;
1374                 if ((int16_t)offset < 0 && started) {
1375                     offset = -offset;
1376                     prefix = "-";
1377                 } else {
1378                     prefix = started ? "+" : "";
1379                 }
1380                 slen +=
1381                     snprintf(output + slen, outbufsize - slen,
1382                              "%s0x%"PRIx16"", prefix, offset);
1383             } else if (o->segment & SEG_DISP32) {
1384                 if (prefix.asize == 64) {
1385                     const char *prefix;
1386                     uint64_t offset = (int64_t)(int32_t)offs;
1387                     if ((int32_t)offs < 0 && started) {
1388                         offset = -offset;
1389                         prefix = "-";
1390                     } else {
1391                         prefix = started ? "+" : "";
1392                     }
1393                     slen +=
1394                         snprintf(output + slen, outbufsize - slen,
1395                                  "%s0x%"PRIx64"", prefix, offset);
1396                 } else {
1397                     const char *prefix;
1398                     uint32_t offset = offs;
1399                     if ((int32_t) offset < 0 && started) {
1400                         offset = -offset;
1401                         prefix = "-";
1402                     } else {
1403                         prefix = started ? "+" : "";
1404                     }
1405                     slen +=
1406                         snprintf(output + slen, outbufsize - slen,
1407                                  "%s0x%"PRIx32"", prefix, offset);
1408                 }
1409             }
1410             output[slen++] = ']';
1411         } else {
1412             slen +=
1413                 snprintf(output + slen, outbufsize - slen, "<operand%d>",
1414                          i);
1415         }
1416     }
1417     output[slen] = '\0';
1418     if (segover) {              /* unused segment override */
1419         char *p = output;
1420         int count = slen + 1;
1421         while (count--)
1422             p[count + 3] = p[count];
1423         strncpy(output, segover, 2);
1424         output[2] = ' ';
1425     }
1426     return length;
1427 }
1428
1429 int32_t eatbyte(uint8_t *data, char *output, int outbufsize)
1430 {
1431     snprintf(output, outbufsize, "db 0x%02X", *data);
1432     return 1;
1433 }