Remove special hacks to avoid zero bytecodes
[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 0171:
642             data = do_drex(data, ins);
643             if (!data)
644                 return false;
645             break;
646
647         case 0172:
648         {
649             uint8_t ximm = *data++;
650             c = *r++;
651             ins->oprs[c >> 3].basereg = ximm >> 4;
652             ins->oprs[c >> 3].segment |= SEG_RMREG;
653             ins->oprs[c & 7].offset = ximm & 15;
654         }
655         break;
656
657         case 0173:
658         {
659             uint8_t ximm = *data++;
660             c = *r++;
661
662             if ((c ^ ximm) & 15)
663                 return false;
664
665             ins->oprs[c >> 4].basereg = ximm >> 4;
666             ins->oprs[c >> 4].segment |= SEG_RMREG;
667         }
668         break;
669
670         case4(0200):
671         case4(0204):
672         case4(0210):
673         case4(0214):
674         case4(0220):
675         case4(0224):
676         case4(0230):
677         case4(0234):
678         {
679             int modrm = *data++;
680             if (((modrm >> 3) & 07) != (c & 07))
681                 return false;   /* spare field doesn't match up */
682             data = do_ea(data, modrm, asize, segsize,
683                          &ins->oprs[(c >> 3) & 07], ins);
684             if (!data)
685                 return false;
686             break;
687         }
688
689         case4(0260):
690         {
691             int vexm   = *r++;
692             int vexwlp = *r++;
693             ins->rex |= REX_V;
694             if ((prefix->rex & (REX_V|REX_D|REX_P)) != REX_V)
695                 return false;
696
697             if ((vexm & 0x1f) != prefix->vex_m)
698                 return false;
699
700             switch (vexwlp & 030) {
701             case 000:
702                 if (prefix->rex & REX_W)
703                     return false;
704                 break;
705             case 010:
706                 if (!(prefix->rex & REX_W))
707                     return false;
708                 break;
709             default:
710                 break;          /* XXX: Need to do anything special here? */
711             }
712
713             if ((vexwlp & 007) != prefix->vex_lp)
714                 return false;
715
716             opx->segment |= SEG_RMREG;
717             opx->basereg = prefix->vex_v;
718             break;
719         }
720
721         case 0270:
722         {
723             int vexm   = *r++;
724             int vexwlp = *r++;
725             ins->rex |= REX_V;
726             if ((prefix->rex & (REX_V|REX_D|REX_P)) != REX_V)
727                 return false;
728
729             if ((vexm & 0x1f) != prefix->vex_m)
730                 return false;
731
732             switch (vexwlp & 030) {
733             case 000:
734                 if (ins->rex & REX_W)
735                     return false;
736                 break;
737             case 010:
738                 if (!(ins->rex & REX_W))
739                     return false;
740                 break;
741             default:
742                 break;          /* Need to do anything special here? */
743             }
744
745             if ((vexwlp & 007) != prefix->vex_lp)
746                 return false;
747
748             if (prefix->vex_v != 0)
749                 return false;
750
751             break;
752         }
753
754         case 0310:
755             if (asize != 16)
756                 return false;
757             else
758                 a_used = true;
759             break;
760
761         case 0311:
762             if (asize == 16)
763                 return false;
764             else
765                 a_used = true;
766             break;
767
768         case 0312:
769             if (asize != segsize)
770                 return false;
771             else
772                 a_used = true;
773             break;
774
775         case 0313:
776             if (asize != 64)
777                 return false;
778             else
779                 a_used = true;
780             break;
781
782         case 0314:
783             if (prefix->rex & REX_B)
784                 return false;
785             break;
786
787         case 0315:
788             if (prefix->rex & REX_X)
789                 return false;
790             break;
791
792         case 0316:
793             if (prefix->rex & REX_R)
794                 return false;
795             break;
796
797         case 0317:
798             if (prefix->rex & REX_W)
799                 return false;
800             break;
801
802         case 0320:
803             if (osize != 16)
804                 return false;
805             else
806                 o_used = true;
807             break;
808
809         case 0321:
810             if (osize != 32)
811                 return false;
812             else
813                 o_used = true;
814             break;
815
816         case 0322:
817             if (osize != (segsize == 16) ? 16 : 32)
818                 return false;
819             else
820                 o_used = true;
821             break;
822
823         case 0323:
824             ins->rex |= REX_W;  /* 64-bit only instruction */
825             osize = 64;
826             o_used = true;
827             break;
828
829         case 0324:
830             if (!(ins->rex & (REX_P|REX_W)) || osize != 64)
831                 return false;
832             o_used = true;
833             break;
834
835         case 0330:
836         {
837             int t = *r++, d = *data++;
838             if (d < t || d > t + 15)
839                 return false;
840             else
841                 ins->condition = d - t;
842             break;
843         }
844
845         case 0331:
846             if (prefix->rep)
847                 return false;
848             break;
849
850         case 0332:
851             if (prefix->rep != 0xF2)
852                 return false;
853             drep = 0;
854             break;
855
856         case 0333:
857             if (prefix->rep != 0xF3)
858                 return false;
859             drep = 0;
860             break;
861
862         case 0334:
863             if (lock) {
864                 ins->rex |= REX_R;
865                 lock = 0;
866             }
867             break;
868
869         case 0335:
870             if (drep == P_REP)
871                 drep = P_REPE;
872             break;
873
874         case 0340:
875             return false;
876
877         case 0364:
878             if (prefix->osp)
879                 return false;
880             break;
881
882         case 0365:
883             if (prefix->asp)
884                 return false;
885             break;
886
887         case 0366:
888             if (!prefix->osp)
889                 return false;
890             o_used = true;
891             break;
892
893         case 0367:
894             if (!prefix->asp)
895                 return false;
896             a_used = true;
897             break;
898
899         default:
900             return false;       /* Unknown code */
901         }
902     }
903
904     /* REX cannot be combined with DREX or VEX */
905     if ((ins->rex & (REX_D|REX_V)) && (prefix->rex & REX_P))
906         return false;
907
908     /*
909      * Check for unused rep or a/o prefixes.
910      */
911     for (i = 0; i < t->operands; i++) {
912         if (ins->oprs[i].segment != SEG_RMREG)
913             a_used = true;
914     }
915
916     if (lock) {
917         if (ins->prefixes[PPS_LREP])
918             return false;
919         ins->prefixes[PPS_LREP] = P_LOCK;
920     }
921     if (drep) {
922         if (ins->prefixes[PPS_LREP])
923             return false;
924         ins->prefixes[PPS_LREP] = drep;
925     }
926     if (!o_used) {
927         if (osize != ((segsize == 16) ? 16 : 32)) {
928             enum prefixes pfx = 0;
929
930             switch (osize) {
931             case 16:
932                 pfx = P_O16;
933                 break;
934             case 32:
935                 pfx = P_O32;
936                 break;
937             case 64:
938                 pfx = P_O64;
939                 break;
940             }
941
942             if (ins->prefixes[PPS_OSIZE])
943                 return false;
944             ins->prefixes[PPS_OSIZE] = pfx;
945         }
946     }
947     if (!a_used && asize != segsize) {
948         if (ins->prefixes[PPS_ASIZE])
949             return false;
950         ins->prefixes[PPS_ASIZE] = asize == 16 ? P_A16 : P_A32;
951     }
952
953     /* Fix: check for redundant REX prefixes */
954
955     return data - origdata;
956 }
957
958 int32_t disasm(uint8_t *data, char *output, int outbufsize, int segsize,
959             int32_t offset, int autosync, uint32_t prefer)
960 {
961     const struct itemplate * const *p, * const *best_p;
962     const struct disasm_index *ix;
963     uint8_t *dp;
964     int length, best_length = 0;
965     char *segover;
966     int i, slen, colon, n;
967     uint8_t *origdata;
968     int works;
969     insn tmp_ins, ins;
970     uint32_t goodness, best;
971     int best_pref;
972     struct prefix_info prefix;
973     bool end_prefix;
974
975     memset(&ins, 0, sizeof ins);
976
977     /*
978      * Scan for prefixes.
979      */
980     memset(&prefix, 0, sizeof prefix);
981     prefix.asize = segsize;
982     prefix.osize = (segsize == 64) ? 32 : segsize;
983     segover = NULL;
984     origdata = data;
985
986     end_prefix = false;
987     while (!end_prefix) {
988         switch (*data) {
989         case 0xF2:
990         case 0xF3:
991             prefix.rep = *data++;
992             break;
993         case 0xF0:
994             prefix.lock = *data++;
995             break;
996         case 0x2E:
997             segover = "cs", prefix.seg = *data++;
998             break;
999         case 0x36:
1000             segover = "ss", prefix.seg = *data++;
1001             break;
1002         case 0x3E:
1003             segover = "ds", prefix.seg = *data++;
1004             break;
1005         case 0x26:
1006             segover = "es", prefix.seg = *data++;
1007             break;
1008         case 0x64:
1009             segover = "fs", prefix.seg = *data++;
1010             break;
1011         case 0x65:
1012             segover = "gs", prefix.seg = *data++;
1013             break;
1014         case 0x66:
1015             prefix.osize = (segsize == 16) ? 32 : 16;
1016             prefix.osp = *data++;
1017             break;
1018         case 0x67:
1019             prefix.asize = (segsize == 32) ? 16 : 32;
1020             prefix.asp = *data++;
1021             break;
1022         case 0xC4:
1023         case 0xC5:
1024             if (segsize == 64 || (data[1] & 0xc0) == 0xc0) {
1025                 prefix.vex[0] = *data++;
1026                 prefix.vex[1] = *data++;
1027                 if (prefix.vex[0] == 0xc4)
1028                     prefix.vex[2] = *data++;
1029             }
1030             prefix.rex = REX_V;
1031             if (prefix.vex[0] == 0xc4) {
1032                 prefix.rex |= (~prefix.vex[1] >> 5) & 7; /* REX_RXB */
1033                 prefix.rex |= (prefix.vex[2] >> (7-3)) & REX_W;
1034                 prefix.vex_m = prefix.vex[1] & 0x1f;
1035                 prefix.vex_v = (~prefix.vex[2] >> 3) & 15;
1036                 prefix.vex_lp = prefix.vex[2] & 7;
1037             } else {
1038                 prefix.rex |= (~prefix.vex[1] >> (7-2)) & REX_R;
1039                 prefix.vex_m = 1;
1040                 prefix.vex_v = (~prefix.vex[1] >> 3) & 15;
1041                 prefix.vex_lp = prefix.vex[1] & 7;
1042             }
1043             end_prefix = true;
1044             break;
1045         case REX_P + 0x0:
1046         case REX_P + 0x1:
1047         case REX_P + 0x2:
1048         case REX_P + 0x3:
1049         case REX_P + 0x4:
1050         case REX_P + 0x5:
1051         case REX_P + 0x6:
1052         case REX_P + 0x7:
1053         case REX_P + 0x8:
1054         case REX_P + 0x9:
1055         case REX_P + 0xA:
1056         case REX_P + 0xB:
1057         case REX_P + 0xC:
1058         case REX_P + 0xD:
1059         case REX_P + 0xE:
1060         case REX_P + 0xF:
1061             if (segsize == 64) {
1062                 prefix.rex = *data++;
1063                 if (prefix.rex & REX_W)
1064                     prefix.osize = 64;
1065             }
1066             end_prefix = true;
1067             break;
1068         default:
1069             end_prefix = true;
1070             break;
1071         }
1072     }
1073
1074     best = -1;                  /* Worst possible */
1075     best_p = NULL;
1076     best_pref = INT_MAX;
1077
1078     dp = data;
1079     ix = itable + *dp++;
1080     while (ix->n == -1) {
1081         ix = (const struct disasm_index *)ix->p + *dp++;
1082     }
1083
1084     p = (const struct itemplate * const *)ix->p;
1085     for (n = ix->n; n; n--, p++) {
1086         if ((length = matches(*p, data, &prefix, segsize, &tmp_ins))) {
1087             works = true;
1088             /*
1089              * Final check to make sure the types of r/m match up.
1090              * XXX: Need to make sure this is actually correct.
1091              */
1092             for (i = 0; i < (*p)->operands; i++) {
1093                 if (!((*p)->opd[i] & SAME_AS) &&
1094                     (
1095                         /* If it's a mem-only EA but we have a
1096                            register, die. */
1097                         ((tmp_ins.oprs[i].segment & SEG_RMREG) &&
1098                          !(MEMORY & ~(*p)->opd[i])) ||
1099                         /* If it's a reg-only EA but we have a memory
1100                            ref, die. */
1101                         (!(tmp_ins.oprs[i].segment & SEG_RMREG) &&
1102                          !(REG_EA & ~(*p)->opd[i]) &&
1103                          !((*p)->opd[i] & REG_SMASK)) ||
1104                         /* Register type mismatch (eg FS vs REG_DESS):
1105                            die. */
1106                         ((((*p)->opd[i] & (REGISTER | FPUREG)) ||
1107                           (tmp_ins.oprs[i].segment & SEG_RMREG)) &&
1108                          !whichreg((*p)->opd[i],
1109                                    tmp_ins.oprs[i].basereg, tmp_ins.rex))
1110                         )) {
1111                     works = false;
1112                     break;
1113                 }
1114             }
1115
1116             /*
1117              * Note: we always prefer instructions which incorporate
1118              * prefixes in the instructions themselves.  This is to allow
1119              * e.g. PAUSE to be preferred to REP NOP, and deal with
1120              * MMX/SSE instructions where prefixes are used to select
1121              * between MMX and SSE register sets or outright opcode
1122              * selection.
1123              */
1124             if (works) {
1125                 int i, nprefix;
1126                 goodness = ((*p)->flags & IF_PFMASK) ^ prefer;
1127                 nprefix = 0;
1128                 for (i = 0; i < MAXPREFIX; i++)
1129                     if (tmp_ins.prefixes[i])
1130                         nprefix++;
1131                 if (nprefix < best_pref ||
1132                     (nprefix == best_pref && goodness < best)) {
1133                     /* This is the best one found so far */
1134                     best = goodness;
1135                     best_p = p;
1136                     best_pref = nprefix;
1137                     best_length = length;
1138                     ins = tmp_ins;
1139                 }
1140             }
1141         }
1142     }
1143
1144     if (!best_p)
1145         return 0;               /* no instruction was matched */
1146
1147     /* Pick the best match */
1148     p = best_p;
1149     length = best_length;
1150
1151     slen = 0;
1152
1153     /* TODO: snprintf returns the value that the string would have if
1154      *      the buffer were long enough, and not the actual length of
1155      *      the returned string, so each instance of using the return
1156      *      value of snprintf should actually be checked to assure that
1157      *      the return value is "sane."  Maybe a macro wrapper could
1158      *      be used for that purpose.
1159      */
1160     for (i = 0; i < MAXPREFIX; i++)
1161         switch (ins.prefixes[i]) {
1162         case P_LOCK:
1163             slen += snprintf(output + slen, outbufsize - slen, "lock ");
1164             break;
1165         case P_REP:
1166             slen += snprintf(output + slen, outbufsize - slen, "rep ");
1167             break;
1168         case P_REPE:
1169             slen += snprintf(output + slen, outbufsize - slen, "repe ");
1170             break;
1171         case P_REPNE:
1172             slen += snprintf(output + slen, outbufsize - slen, "repne ");
1173             break;
1174         case P_A16:
1175             slen += snprintf(output + slen, outbufsize - slen, "a16 ");
1176             break;
1177         case P_A32:
1178             slen += snprintf(output + slen, outbufsize - slen, "a32 ");
1179             break;
1180         case P_A64:
1181             slen += snprintf(output + slen, outbufsize - slen, "a64 ");
1182             break;
1183         case P_O16:
1184             slen += snprintf(output + slen, outbufsize - slen, "o16 ");
1185             break;
1186         case P_O32:
1187             slen += snprintf(output + slen, outbufsize - slen, "o32 ");
1188             break;
1189         case P_O64:
1190             slen += snprintf(output + slen, outbufsize - slen, "o64 ");
1191             break;
1192         default:
1193             break;
1194         }
1195
1196     for (i = 0; i < (int)elements(ico); i++)
1197         if ((*p)->opcode == ico[i]) {
1198             slen +=
1199                 snprintf(output + slen, outbufsize - slen, "%s%s", icn[i],
1200                          whichcond(ins.condition));
1201             break;
1202         }
1203     if (i >= (int)elements(ico))
1204         slen +=
1205             snprintf(output + slen, outbufsize - slen, "%s",
1206                      insn_names[(*p)->opcode]);
1207     colon = false;
1208     length += data - origdata;  /* fix up for prefixes */
1209     for (i = 0; i < (*p)->operands; i++) {
1210         opflags_t t = (*p)->opd[i];
1211         const operand *o = &ins.oprs[i];
1212         int64_t offs;
1213
1214         if (t & SAME_AS) {
1215             o = &ins.oprs[t & ~SAME_AS];
1216             t = (*p)->opd[t & ~SAME_AS];
1217         }
1218
1219         output[slen++] = (colon ? ':' : i == 0 ? ' ' : ',');
1220
1221         offs = o->offset;
1222         if (o->segment & SEG_RELATIVE) {
1223             offs += offset + length;
1224             /*
1225              * sort out wraparound
1226              */
1227             if (!(o->segment & (SEG_32BIT|SEG_64BIT)))
1228                 offs &= 0xffff;
1229             else if (segsize != 64)
1230                 offs &= 0xffffffff;
1231
1232             /*
1233              * add sync marker, if autosync is on
1234              */
1235             if (autosync)
1236                 add_sync(offs, 0L);
1237         }
1238
1239         if (t & COLON)
1240             colon = true;
1241         else
1242             colon = false;
1243
1244         if ((t & (REGISTER | FPUREG)) ||
1245             (o->segment & SEG_RMREG)) {
1246             enum reg_enum reg;
1247             reg = whichreg(t, o->basereg, ins.rex);
1248             if (t & TO)
1249                 slen += snprintf(output + slen, outbufsize - slen, "to ");
1250             slen += snprintf(output + slen, outbufsize - slen, "%s",
1251                              reg_names[reg - EXPR_REG_START]);
1252         } else if (!(UNITY & ~t)) {
1253             output[slen++] = '1';
1254         } else if (t & IMMEDIATE) {
1255             if (t & BITS8) {
1256                 slen +=
1257                     snprintf(output + slen, outbufsize - slen, "byte ");
1258                 if (o->segment & SEG_SIGNED) {
1259                     if (offs < 0) {
1260                         offs *= -1;
1261                         output[slen++] = '-';
1262                     } else
1263                         output[slen++] = '+';
1264                 }
1265             } else if (t & BITS16) {
1266                 slen +=
1267                     snprintf(output + slen, outbufsize - slen, "word ");
1268             } else if (t & BITS32) {
1269                 slen +=
1270                     snprintf(output + slen, outbufsize - slen, "dword ");
1271             } else if (t & BITS64) {
1272                 slen +=
1273                     snprintf(output + slen, outbufsize - slen, "qword ");
1274             } else if (t & NEAR) {
1275                 slen +=
1276                     snprintf(output + slen, outbufsize - slen, "near ");
1277             } else if (t & SHORT) {
1278                 slen +=
1279                     snprintf(output + slen, outbufsize - slen, "short ");
1280             }
1281             slen +=
1282                 snprintf(output + slen, outbufsize - slen, "0x%"PRIx64"",
1283                          offs);
1284         } else if (!(MEM_OFFS & ~t)) {
1285             slen +=
1286                 snprintf(output + slen, outbufsize - slen,
1287                          "[%s%s%s0x%"PRIx64"]",
1288                          (segover ? segover : ""),
1289                          (segover ? ":" : ""),
1290                          (o->disp_size == 64 ? "qword " :
1291                           o->disp_size == 32 ? "dword " :
1292                           o->disp_size == 16 ? "word " : ""), offs);
1293             segover = NULL;
1294         } else if (!(REGMEM & ~t)) {
1295             int started = false;
1296             if (t & BITS8)
1297                 slen +=
1298                     snprintf(output + slen, outbufsize - slen, "byte ");
1299             if (t & BITS16)
1300                 slen +=
1301                     snprintf(output + slen, outbufsize - slen, "word ");
1302             if (t & BITS32)
1303                 slen +=
1304                     snprintf(output + slen, outbufsize - slen, "dword ");
1305             if (t & BITS64)
1306                 slen +=
1307                     snprintf(output + slen, outbufsize - slen, "qword ");
1308             if (t & BITS80)
1309                 slen +=
1310                     snprintf(output + slen, outbufsize - slen, "tword ");
1311             if (t & BITS128)
1312                 slen +=
1313                     snprintf(output + slen, outbufsize - slen, "oword ");
1314             if (t & FAR)
1315                 slen += snprintf(output + slen, outbufsize - slen, "far ");
1316             if (t & NEAR)
1317                 slen +=
1318                     snprintf(output + slen, outbufsize - slen, "near ");
1319             output[slen++] = '[';
1320             if (o->disp_size)
1321                 slen += snprintf(output + slen, outbufsize - slen, "%s",
1322                                  (o->disp_size == 64 ? "qword " :
1323                                   o->disp_size == 32 ? "dword " :
1324                                   o->disp_size == 16 ? "word " :
1325                                   ""));
1326             if (o->eaflags & EAF_REL)
1327                 slen += snprintf(output + slen, outbufsize - slen, "rel ");
1328             if (segover) {
1329                 slen +=
1330                     snprintf(output + slen, outbufsize - slen, "%s:",
1331                              segover);
1332                 segover = NULL;
1333             }
1334             if (o->basereg != -1) {
1335                 slen += snprintf(output + slen, outbufsize - slen, "%s",
1336                                  reg_names[(o->basereg -
1337                                             EXPR_REG_START)]);
1338                 started = true;
1339             }
1340             if (o->indexreg != -1) {
1341                 if (started)
1342                     output[slen++] = '+';
1343                 slen += snprintf(output + slen, outbufsize - slen, "%s",
1344                                  reg_names[(o->indexreg -
1345                                             EXPR_REG_START)]);
1346                 if (o->scale > 1)
1347                     slen +=
1348                         snprintf(output + slen, outbufsize - slen, "*%d",
1349                                  o->scale);
1350                 started = true;
1351             }
1352
1353
1354             if (o->segment & SEG_DISP8) {
1355                 const char *prefix;
1356                 uint8_t offset = offs;
1357                 if ((int8_t)offset < 0) {
1358                     prefix = "-";
1359                     offset = -offset;
1360                 } else {
1361                     prefix = "+";
1362                 }
1363                 slen +=
1364                     snprintf(output + slen, outbufsize - slen, "%s0x%"PRIx8"",
1365                              prefix, offset);
1366             } else if (o->segment & SEG_DISP16) {
1367                 const char *prefix;
1368                 uint16_t offset = offs;
1369                 if ((int16_t)offset < 0 && started) {
1370                     offset = -offset;
1371                     prefix = "-";
1372                 } else {
1373                     prefix = started ? "+" : "";
1374                 }
1375                 slen +=
1376                     snprintf(output + slen, outbufsize - slen,
1377                              "%s0x%"PRIx16"", prefix, offset);
1378             } else if (o->segment & SEG_DISP32) {
1379                 if (prefix.asize == 64) {
1380                     const char *prefix;
1381                     uint64_t offset = (int64_t)(int32_t)offs;
1382                     if ((int32_t)offs < 0 && started) {
1383                         offset = -offset;
1384                         prefix = "-";
1385                     } else {
1386                         prefix = started ? "+" : "";
1387                     }
1388                     slen +=
1389                         snprintf(output + slen, outbufsize - slen,
1390                                  "%s0x%"PRIx64"", prefix, offset);
1391                 } else {
1392                     const char *prefix;
1393                     uint32_t offset = offs;
1394                     if ((int32_t) offset < 0 && started) {
1395                         offset = -offset;
1396                         prefix = "-";
1397                     } else {
1398                         prefix = started ? "+" : "";
1399                     }
1400                     slen +=
1401                         snprintf(output + slen, outbufsize - slen,
1402                                  "%s0x%"PRIx32"", prefix, offset);
1403                 }
1404             }
1405             output[slen++] = ']';
1406         } else {
1407             slen +=
1408                 snprintf(output + slen, outbufsize - slen, "<operand%d>",
1409                          i);
1410         }
1411     }
1412     output[slen] = '\0';
1413     if (segover) {              /* unused segment override */
1414         char *p = output;
1415         int count = slen + 1;
1416         while (count--)
1417             p[count + 3] = p[count];
1418         strncpy(output, segover, 2);
1419         output[2] = ' ';
1420     }
1421     return length;
1422 }
1423
1424 int32_t eatbyte(uint8_t *data, char *output, int outbufsize)
1425 {
1426     snprintf(output, outbufsize, "db 0x%02X", *data);
1427     return 1;
1428 }