Lines Matching refs:insn
198 static int consumeByte(struct InternalInstruction* insn, uint8_t* byte) { in consumeByte() argument
199 int ret = insn->reader(insn->readerArg, byte, insn->readerCursor); in consumeByte()
202 ++(insn->readerCursor); in consumeByte()
214 static int lookAtByte(struct InternalInstruction* insn, uint8_t* byte) { in lookAtByte() argument
215 return insn->reader(insn->readerArg, byte, insn->readerCursor); in lookAtByte()
218 static void unconsumeByte(struct InternalInstruction* insn) { in unconsumeByte() argument
219 insn->readerCursor--; in unconsumeByte()
223 static int name(struct InternalInstruction* insn, type* ptr) { \
228 int ret = insn->reader(insn->readerArg, \
230 insn->readerCursor + offset); \
236 insn->readerCursor += sizeof(type); \
265 static void dbgprintf(struct InternalInstruction* insn, in CONSUME_FUNC()
271 if (!insn->dlog) in CONSUME_FUNC()
278 insn->dlog(insn->dlogArg, buffer); in CONSUME_FUNC()
292 static void setPrefixPresent(struct InternalInstruction* insn, in setPrefixPresent() argument
296 insn->prefixPresent[prefix] = 1; in setPrefixPresent()
297 insn->prefixLocations[prefix] = location; in setPrefixPresent()
309 static bool isPrefixAtLocation(struct InternalInstruction* insn, in isPrefixAtLocation() argument
313 return insn->prefixPresent[prefix] == 1 && in isPrefixAtLocation()
314 insn->prefixLocations[prefix] == location; in isPrefixAtLocation()
326 static int readPrefixes(struct InternalInstruction* insn) { in readPrefixes() argument
336 dbgprintf(insn, "readPrefixes()"); in readPrefixes()
339 prefixLocation = insn->readerCursor; in readPrefixes()
342 if (consumeByte(insn, &byte)) in readPrefixes()
349 if (insn->readerCursor - 1 == insn->startLocation && byte == 0xf0) in readPrefixes()
352 if (insn->readerCursor - 1 == insn->startLocation in readPrefixes()
354 && !lookAtByte(insn, &nextByte)) in readPrefixes()
366 insn->xAcquireRelease = true; in readPrefixes()
376 insn->xAcquireRelease = true; in readPrefixes()
377 if (insn->mode == MODE_64BIT && (nextByte & 0xf0) == 0x40) { in readPrefixes()
378 if (consumeByte(insn, &nextByte)) in readPrefixes()
380 if (lookAtByte(insn, &nextByte)) in readPrefixes()
382 unconsumeByte(insn); in readPrefixes()
393 dbgprintf(insn, "Redundant Group 1 prefix"); in readPrefixes()
395 setPrefixPresent(insn, byte, prefixLocation); in readPrefixes()
405 insn->segmentOverride = SEG_OVERRIDE_CS; in readPrefixes()
408 insn->segmentOverride = SEG_OVERRIDE_SS; in readPrefixes()
411 insn->segmentOverride = SEG_OVERRIDE_DS; in readPrefixes()
414 insn->segmentOverride = SEG_OVERRIDE_ES; in readPrefixes()
417 insn->segmentOverride = SEG_OVERRIDE_FS; in readPrefixes()
420 insn->segmentOverride = SEG_OVERRIDE_GS; in readPrefixes()
427 dbgprintf(insn, "Redundant Group 2 prefix"); in readPrefixes()
429 setPrefixPresent(insn, byte, prefixLocation); in readPrefixes()
433 dbgprintf(insn, "Redundant Group 3 prefix"); in readPrefixes()
436 setPrefixPresent(insn, byte, prefixLocation); in readPrefixes()
440 dbgprintf(insn, "Redundant Group 4 prefix"); in readPrefixes()
443 setPrefixPresent(insn, byte, prefixLocation); in readPrefixes()
451 dbgprintf(insn, "Found prefix 0x%hhx", byte); in readPrefixes()
454 insn->vectorExtensionType = TYPE_NO_VEX_XOP; in readPrefixes()
459 if (consumeByte(insn, &byte1)) { in readPrefixes()
460 dbgprintf(insn, "Couldn't read second byte of EVEX prefix"); in readPrefixes()
464 if (lookAtByte(insn, &byte2)) { in readPrefixes()
465 dbgprintf(insn, "Couldn't read third byte of EVEX prefix"); in readPrefixes()
469 if ((insn->mode == MODE_64BIT || (byte1 & 0xc0) == 0xc0) && in readPrefixes()
471 insn->vectorExtensionType = TYPE_EVEX; in readPrefixes()
473 unconsumeByte(insn); /* unconsume byte1 */ in readPrefixes()
474 unconsumeByte(insn); /* unconsume byte */ in readPrefixes()
475 insn->necessaryPrefixLocation = insn->readerCursor - 2; in readPrefixes()
478 if (insn->vectorExtensionType == TYPE_EVEX) { in readPrefixes()
479 insn->vectorExtensionPrefix[0] = byte; in readPrefixes()
480 insn->vectorExtensionPrefix[1] = byte1; in readPrefixes()
481 if (consumeByte(insn, &insn->vectorExtensionPrefix[2])) { in readPrefixes()
482 dbgprintf(insn, "Couldn't read third byte of EVEX prefix"); in readPrefixes()
485 if (consumeByte(insn, &insn->vectorExtensionPrefix[3])) { in readPrefixes()
486 dbgprintf(insn, "Couldn't read fourth byte of EVEX prefix"); in readPrefixes()
491 if (insn->mode == MODE_64BIT) { in readPrefixes()
492 insn->rexPrefix = 0x40 in readPrefixes()
493 | (wFromEVEX3of4(insn->vectorExtensionPrefix[2]) << 3) in readPrefixes()
494 | (rFromEVEX2of4(insn->vectorExtensionPrefix[1]) << 2) in readPrefixes()
495 | (xFromEVEX2of4(insn->vectorExtensionPrefix[1]) << 1) in readPrefixes()
496 | (bFromEVEX2of4(insn->vectorExtensionPrefix[1]) << 0); in readPrefixes()
499 dbgprintf(insn, "Found EVEX prefix 0x%hhx 0x%hhx 0x%hhx 0x%hhx", in readPrefixes()
500 insn->vectorExtensionPrefix[0], insn->vectorExtensionPrefix[1], in readPrefixes()
501 insn->vectorExtensionPrefix[2], insn->vectorExtensionPrefix[3]); in readPrefixes()
506 if (lookAtByte(insn, &byte1)) { in readPrefixes()
507 dbgprintf(insn, "Couldn't read second byte of VEX"); in readPrefixes()
511 if (insn->mode == MODE_64BIT || (byte1 & 0xc0) == 0xc0) { in readPrefixes()
512 insn->vectorExtensionType = TYPE_VEX_3B; in readPrefixes()
513 insn->necessaryPrefixLocation = insn->readerCursor - 1; in readPrefixes()
515 unconsumeByte(insn); in readPrefixes()
516 insn->necessaryPrefixLocation = insn->readerCursor - 1; in readPrefixes()
519 if (insn->vectorExtensionType == TYPE_VEX_3B) { in readPrefixes()
520 insn->vectorExtensionPrefix[0] = byte; in readPrefixes()
521 consumeByte(insn, &insn->vectorExtensionPrefix[1]); in readPrefixes()
522 consumeByte(insn, &insn->vectorExtensionPrefix[2]); in readPrefixes()
526 if (insn->mode == MODE_64BIT) { in readPrefixes()
527 insn->rexPrefix = 0x40 in readPrefixes()
528 | (wFromVEX3of3(insn->vectorExtensionPrefix[2]) << 3) in readPrefixes()
529 | (rFromVEX2of3(insn->vectorExtensionPrefix[1]) << 2) in readPrefixes()
530 | (xFromVEX2of3(insn->vectorExtensionPrefix[1]) << 1) in readPrefixes()
531 | (bFromVEX2of3(insn->vectorExtensionPrefix[1]) << 0); in readPrefixes()
534 dbgprintf(insn, "Found VEX prefix 0x%hhx 0x%hhx 0x%hhx", in readPrefixes()
535 insn->vectorExtensionPrefix[0], insn->vectorExtensionPrefix[1], in readPrefixes()
536 insn->vectorExtensionPrefix[2]); in readPrefixes()
541 if (lookAtByte(insn, &byte1)) { in readPrefixes()
542 dbgprintf(insn, "Couldn't read second byte of VEX"); in readPrefixes()
546 if (insn->mode == MODE_64BIT || (byte1 & 0xc0) == 0xc0) { in readPrefixes()
547 insn->vectorExtensionType = TYPE_VEX_2B; in readPrefixes()
549 unconsumeByte(insn); in readPrefixes()
552 if (insn->vectorExtensionType == TYPE_VEX_2B) { in readPrefixes()
553 insn->vectorExtensionPrefix[0] = byte; in readPrefixes()
554 consumeByte(insn, &insn->vectorExtensionPrefix[1]); in readPrefixes()
556 if (insn->mode == MODE_64BIT) { in readPrefixes()
557 insn->rexPrefix = 0x40 in readPrefixes()
558 | (rFromVEX2of2(insn->vectorExtensionPrefix[1]) << 2); in readPrefixes()
561 switch (ppFromVEX2of2(insn->vectorExtensionPrefix[1])) { in readPrefixes()
569 dbgprintf(insn, "Found VEX prefix 0x%hhx 0x%hhx", in readPrefixes()
570 insn->vectorExtensionPrefix[0], in readPrefixes()
571 insn->vectorExtensionPrefix[1]); in readPrefixes()
576 if (lookAtByte(insn, &byte1)) { in readPrefixes()
577 dbgprintf(insn, "Couldn't read second byte of XOP"); in readPrefixes()
582 insn->vectorExtensionType = TYPE_XOP; in readPrefixes()
583 insn->necessaryPrefixLocation = insn->readerCursor - 1; in readPrefixes()
585 unconsumeByte(insn); in readPrefixes()
586 insn->necessaryPrefixLocation = insn->readerCursor - 1; in readPrefixes()
589 if (insn->vectorExtensionType == TYPE_XOP) { in readPrefixes()
590 insn->vectorExtensionPrefix[0] = byte; in readPrefixes()
591 consumeByte(insn, &insn->vectorExtensionPrefix[1]); in readPrefixes()
592 consumeByte(insn, &insn->vectorExtensionPrefix[2]); in readPrefixes()
596 if (insn->mode == MODE_64BIT) { in readPrefixes()
597 insn->rexPrefix = 0x40 in readPrefixes()
598 | (wFromXOP3of3(insn->vectorExtensionPrefix[2]) << 3) in readPrefixes()
599 | (rFromXOP2of3(insn->vectorExtensionPrefix[1]) << 2) in readPrefixes()
600 | (xFromXOP2of3(insn->vectorExtensionPrefix[1]) << 1) in readPrefixes()
601 | (bFromXOP2of3(insn->vectorExtensionPrefix[1]) << 0); in readPrefixes()
604 switch (ppFromXOP3of3(insn->vectorExtensionPrefix[2])) { in readPrefixes()
612 dbgprintf(insn, "Found XOP prefix 0x%hhx 0x%hhx 0x%hhx", in readPrefixes()
613 insn->vectorExtensionPrefix[0], insn->vectorExtensionPrefix[1], in readPrefixes()
614 insn->vectorExtensionPrefix[2]); in readPrefixes()
617 if (insn->mode == MODE_64BIT) { in readPrefixes()
621 if (lookAtByte(insn, &opcodeByte) || ((opcodeByte & 0xf0) == 0x40)) { in readPrefixes()
622 dbgprintf(insn, "Redundant REX prefix"); in readPrefixes()
626 insn->rexPrefix = byte; in readPrefixes()
627 insn->necessaryPrefixLocation = insn->readerCursor - 2; in readPrefixes()
629 dbgprintf(insn, "Found REX prefix 0x%hhx", byte); in readPrefixes()
631 unconsumeByte(insn); in readPrefixes()
632 insn->necessaryPrefixLocation = insn->readerCursor - 1; in readPrefixes()
635 unconsumeByte(insn); in readPrefixes()
636 insn->necessaryPrefixLocation = insn->readerCursor - 1; in readPrefixes()
640 if (insn->mode == MODE_16BIT) { in readPrefixes()
641 insn->registerSize = (hasOpSize ? 4 : 2); in readPrefixes()
642 insn->addressSize = (hasAdSize ? 4 : 2); in readPrefixes()
643 insn->displacementSize = (hasAdSize ? 4 : 2); in readPrefixes()
644 insn->immediateSize = (hasOpSize ? 4 : 2); in readPrefixes()
645 } else if (insn->mode == MODE_32BIT) { in readPrefixes()
646 insn->registerSize = (hasOpSize ? 2 : 4); in readPrefixes()
647 insn->addressSize = (hasAdSize ? 2 : 4); in readPrefixes()
648 insn->displacementSize = (hasAdSize ? 2 : 4); in readPrefixes()
649 insn->immediateSize = (hasOpSize ? 2 : 4); in readPrefixes()
650 } else if (insn->mode == MODE_64BIT) { in readPrefixes()
651 if (insn->rexPrefix && wFromREX(insn->rexPrefix)) { in readPrefixes()
652 insn->registerSize = 8; in readPrefixes()
653 insn->addressSize = (hasAdSize ? 4 : 8); in readPrefixes()
654 insn->displacementSize = 4; in readPrefixes()
655 insn->immediateSize = 4; in readPrefixes()
656 } else if (insn->rexPrefix) { in readPrefixes()
657 insn->registerSize = (hasOpSize ? 2 : 4); in readPrefixes()
658 insn->addressSize = (hasAdSize ? 4 : 8); in readPrefixes()
659 insn->displacementSize = (hasOpSize ? 2 : 4); in readPrefixes()
660 insn->immediateSize = (hasOpSize ? 2 : 4); in readPrefixes()
662 insn->registerSize = (hasOpSize ? 2 : 4); in readPrefixes()
663 insn->addressSize = (hasAdSize ? 4 : 8); in readPrefixes()
664 insn->displacementSize = (hasOpSize ? 2 : 4); in readPrefixes()
665 insn->immediateSize = (hasOpSize ? 2 : 4); in readPrefixes()
679 static int readOpcode(struct InternalInstruction* insn) { in readOpcode() argument
684 dbgprintf(insn, "readOpcode()"); in readOpcode()
686 insn->opcodeType = ONEBYTE; in readOpcode()
688 if (insn->vectorExtensionType == TYPE_EVEX) { in readOpcode()
689 switch (mmFromEVEX2of4(insn->vectorExtensionPrefix[1])) { in readOpcode()
691 dbgprintf(insn, "Unhandled mm field for instruction (0x%hhx)", in readOpcode()
692 mmFromEVEX2of4(insn->vectorExtensionPrefix[1])); in readOpcode()
695 insn->opcodeType = TWOBYTE; in readOpcode()
696 return consumeByte(insn, &insn->opcode); in readOpcode()
698 insn->opcodeType = THREEBYTE_38; in readOpcode()
699 return consumeByte(insn, &insn->opcode); in readOpcode()
701 insn->opcodeType = THREEBYTE_3A; in readOpcode()
702 return consumeByte(insn, &insn->opcode); in readOpcode()
704 } else if (insn->vectorExtensionType == TYPE_VEX_3B) { in readOpcode()
705 switch (mmmmmFromVEX2of3(insn->vectorExtensionPrefix[1])) { in readOpcode()
707 dbgprintf(insn, "Unhandled m-mmmm field for instruction (0x%hhx)", in readOpcode()
708 mmmmmFromVEX2of3(insn->vectorExtensionPrefix[1])); in readOpcode()
711 insn->opcodeType = TWOBYTE; in readOpcode()
712 return consumeByte(insn, &insn->opcode); in readOpcode()
714 insn->opcodeType = THREEBYTE_38; in readOpcode()
715 return consumeByte(insn, &insn->opcode); in readOpcode()
717 insn->opcodeType = THREEBYTE_3A; in readOpcode()
718 return consumeByte(insn, &insn->opcode); in readOpcode()
720 } else if (insn->vectorExtensionType == TYPE_VEX_2B) { in readOpcode()
721 insn->opcodeType = TWOBYTE; in readOpcode()
722 return consumeByte(insn, &insn->opcode); in readOpcode()
723 } else if (insn->vectorExtensionType == TYPE_XOP) { in readOpcode()
724 switch (mmmmmFromXOP2of3(insn->vectorExtensionPrefix[1])) { in readOpcode()
726 dbgprintf(insn, "Unhandled m-mmmm field for instruction (0x%hhx)", in readOpcode()
727 mmmmmFromVEX2of3(insn->vectorExtensionPrefix[1])); in readOpcode()
730 insn->opcodeType = XOP8_MAP; in readOpcode()
731 return consumeByte(insn, &insn->opcode); in readOpcode()
733 insn->opcodeType = XOP9_MAP; in readOpcode()
734 return consumeByte(insn, &insn->opcode); in readOpcode()
736 insn->opcodeType = XOPA_MAP; in readOpcode()
737 return consumeByte(insn, &insn->opcode); in readOpcode()
741 if (consumeByte(insn, ¤t)) in readOpcode()
745 dbgprintf(insn, "Found a two-byte escape prefix (0x%hhx)", current); in readOpcode()
747 if (consumeByte(insn, ¤t)) in readOpcode()
751 dbgprintf(insn, "Found a three-byte escape prefix (0x%hhx)", current); in readOpcode()
753 if (consumeByte(insn, ¤t)) in readOpcode()
756 insn->opcodeType = THREEBYTE_38; in readOpcode()
758 dbgprintf(insn, "Found a three-byte escape prefix (0x%hhx)", current); in readOpcode()
760 if (consumeByte(insn, ¤t)) in readOpcode()
763 insn->opcodeType = THREEBYTE_3A; in readOpcode()
765 dbgprintf(insn, "Didn't find a three-byte escape prefix"); in readOpcode()
767 insn->opcodeType = TWOBYTE; in readOpcode()
776 insn->opcode = current; in readOpcode()
781 static int readModRM(struct InternalInstruction* insn);
796 struct InternalInstruction* insn, in getIDWithAttrMask() argument
802 hasModRMExtension = modRMRequired(insn->opcodeType, in getIDWithAttrMask()
804 insn->opcode); in getIDWithAttrMask()
807 if (readModRM(insn)) in getIDWithAttrMask()
810 *instructionID = decode(insn->opcodeType, in getIDWithAttrMask()
812 insn->opcode, in getIDWithAttrMask()
813 insn->modRM); in getIDWithAttrMask()
815 *instructionID = decode(insn->opcodeType, in getIDWithAttrMask()
817 insn->opcode, in getIDWithAttrMask()
876 static int getID(struct InternalInstruction* insn, const void *miiArg) { in getID() argument
880 dbgprintf(insn, "getID()"); in getID()
884 if (insn->mode == MODE_64BIT) in getID()
887 if (insn->vectorExtensionType != TYPE_NO_VEX_XOP) { in getID()
888 attrMask |= (insn->vectorExtensionType == TYPE_EVEX) ? ATTR_EVEX : ATTR_VEX; in getID()
890 if (insn->vectorExtensionType == TYPE_EVEX) { in getID()
891 switch (ppFromEVEX3of4(insn->vectorExtensionPrefix[2])) { in getID()
903 if (zFromEVEX4of4(insn->vectorExtensionPrefix[3])) in getID()
905 if (bFromEVEX4of4(insn->vectorExtensionPrefix[3])) in getID()
907 if (aaaFromEVEX4of4(insn->vectorExtensionPrefix[3])) in getID()
909 if (lFromEVEX4of4(insn->vectorExtensionPrefix[3])) in getID()
911 if (l2FromEVEX4of4(insn->vectorExtensionPrefix[3])) in getID()
913 } else if (insn->vectorExtensionType == TYPE_VEX_3B) { in getID()
914 switch (ppFromVEX3of3(insn->vectorExtensionPrefix[2])) { in getID()
926 if (lFromVEX3of3(insn->vectorExtensionPrefix[2])) in getID()
928 } else if (insn->vectorExtensionType == TYPE_VEX_2B) { in getID()
929 switch (ppFromVEX2of2(insn->vectorExtensionPrefix[1])) { in getID()
941 if (lFromVEX2of2(insn->vectorExtensionPrefix[1])) in getID()
943 } else if (insn->vectorExtensionType == TYPE_XOP) { in getID()
944 switch (ppFromXOP3of3(insn->vectorExtensionPrefix[2])) { in getID()
956 if (lFromXOP3of3(insn->vectorExtensionPrefix[2])) in getID()
962 if (insn->mode != MODE_16BIT && isPrefixAtLocation(insn, 0x66, insn->necessaryPrefixLocation)) in getID()
964 else if (isPrefixAtLocation(insn, 0x67, insn->necessaryPrefixLocation)) in getID()
966 else if (isPrefixAtLocation(insn, 0xf3, insn->necessaryPrefixLocation)) in getID()
968 else if (isPrefixAtLocation(insn, 0xf2, insn->necessaryPrefixLocation)) in getID()
972 if (insn->rexPrefix & 0x08) in getID()
979 if (insn->mode == MODE_16BIT && insn->opcodeType == ONEBYTE && in getID()
980 insn->opcode == 0xE3) in getID()
988 if (insn->mode == MODE_64BIT && in getID()
989 isPrefixAtLocation(insn, 0x66, insn->necessaryPrefixLocation)) { in getID()
990 switch (insn->opcode) { in getID()
994 if (insn->opcodeType == ONEBYTE) { in getID()
996 insn->immediateSize = 4; in getID()
997 insn->displacementSize = 4; in getID()
1015 if (insn->opcodeType == TWOBYTE) { in getID()
1017 insn->immediateSize = 4; in getID()
1018 insn->displacementSize = 4; in getID()
1024 if (getIDWithAttrMask(&instructionID, insn, attrMask)) in getID()
1029 if (insn->mode != MODE_64BIT && in getID()
1030 insn->vectorExtensionType != TYPE_NO_VEX_XOP) { in getID()
1035 if ((insn->vectorExtensionType == TYPE_EVEX && in getID()
1036 wFromEVEX3of4(insn->vectorExtensionPrefix[2])) || in getID()
1037 (insn->vectorExtensionType == TYPE_VEX_3B && in getID()
1038 wFromVEX3of3(insn->vectorExtensionPrefix[2])) || in getID()
1039 (insn->vectorExtensionType == TYPE_XOP && in getID()
1040 wFromXOP3of3(insn->vectorExtensionPrefix[2]))) { in getID()
1044 insn, attrMask | ATTR_REXW)) { in getID()
1045 insn->instructionID = instructionID; in getID()
1046 insn->spec = specifierForUID(instructionID); in getID()
1053 insn->instructionID = instructionIDWithREXW; in getID()
1054 insn->spec = specifierForUID(instructionIDWithREXW); in getID()
1067 if (insn->opcodeType == ONEBYTE && ((insn->opcode & 0xFC) == 0xA0)) { in getID()
1069 if (insn->prefixPresent[0x67]) in getID()
1071 if (insn->prefixPresent[0x66]) in getID()
1075 if (insn->mode == MODE_16BIT) in getID()
1078 if (getIDWithAttrMask(&instructionID, insn, attrMask)) in getID()
1081 insn->instructionID = instructionID; in getID()
1082 insn->spec = specifierForUID(instructionID); in getID()
1086 if ((insn->mode == MODE_16BIT || insn->prefixPresent[0x66]) && in getID()
1103 insn, in getID()
1110 insn->instructionID = instructionID; in getID()
1111 insn->spec = spec; in getID()
1119 (insn->mode == MODE_16BIT) ^ insn->prefixPresent[0x66]) { in getID()
1120 insn->instructionID = instructionIDWithOpsize; in getID()
1121 insn->spec = specifierForUID(instructionIDWithOpsize); in getID()
1123 insn->instructionID = instructionID; in getID()
1124 insn->spec = spec; in getID()
1129 if (insn->opcodeType == ONEBYTE && insn->opcode == 0x90 && in getID()
1130 insn->rexPrefix & 0x01) { in getID()
1143 insn->opcode = 0x91; in getID()
1146 insn, in getID()
1148 insn->opcode = 0x90; in getID()
1150 insn->instructionID = instructionID; in getID()
1151 insn->spec = spec; in getID()
1158 insn->opcode = 0x90; in getID()
1160 insn->instructionID = instructionIDWithNewOpcode; in getID()
1161 insn->spec = specWithNewOpcode; in getID()
1166 insn->instructionID = instructionID; in getID()
1167 insn->spec = specifierForUID(insn->instructionID); in getID()
1179 static int readSIB(struct InternalInstruction* insn) { in readSIB() argument
1184 dbgprintf(insn, "readSIB()"); in readSIB()
1186 if (insn->consumedSIB) in readSIB()
1189 insn->consumedSIB = true; in readSIB()
1191 switch (insn->addressSize) { in readSIB()
1193 dbgprintf(insn, "SIB-based addressing doesn't work in 16-bit mode"); in readSIB()
1205 if (consumeByte(insn, &insn->sib)) in readSIB()
1208 index = indexFromSIB(insn->sib) | (xFromREX(insn->rexPrefix) << 3); in readSIB()
1223 if (insn->vectorExtensionType == TYPE_EVEX) in readSIB()
1224 index |= v2FromEVEX4of4(insn->vectorExtensionPrefix[3]) << 4; in readSIB()
1227 insn->sibIndex = SIB_INDEX_NONE; in readSIB()
1229 insn->sibIndex = (SIBIndex)(sibIndexBase + index); in readSIB()
1232 insn->sibScale = 1 << scaleFromSIB(insn->sib); in readSIB()
1234 base = baseFromSIB(insn->sib) | (bFromREX(insn->rexPrefix) << 3); in readSIB()
1239 switch (modFromModRM(insn->modRM)) { in readSIB()
1241 insn->eaDisplacement = EA_DISP_32; in readSIB()
1242 insn->sibBase = SIB_BASE_NONE; in readSIB()
1245 insn->eaDisplacement = EA_DISP_8; in readSIB()
1246 insn->sibBase = (SIBBase)(sibBaseBase + base); in readSIB()
1249 insn->eaDisplacement = EA_DISP_32; in readSIB()
1250 insn->sibBase = (SIBBase)(sibBaseBase + base); in readSIB()
1258 insn->sibBase = (SIBBase)(sibBaseBase + base); in readSIB()
1272 static int readDisplacement(struct InternalInstruction* insn) { in readDisplacement() argument
1277 dbgprintf(insn, "readDisplacement()"); in readDisplacement()
1279 if (insn->consumedDisplacement) in readDisplacement()
1282 insn->consumedDisplacement = true; in readDisplacement()
1283 insn->displacementOffset = insn->readerCursor - insn->startLocation; in readDisplacement()
1285 switch (insn->eaDisplacement) { in readDisplacement()
1287 insn->consumedDisplacement = false; in readDisplacement()
1290 if (consumeInt8(insn, &d8)) in readDisplacement()
1292 insn->displacement = d8; in readDisplacement()
1295 if (consumeInt16(insn, &d16)) in readDisplacement()
1297 insn->displacement = d16; in readDisplacement()
1300 if (consumeInt32(insn, &d32)) in readDisplacement()
1302 insn->displacement = d32; in readDisplacement()
1306 insn->consumedDisplacement = true; in readDisplacement()
1317 static int readModRM(struct InternalInstruction* insn) { in readModRM() argument
1320 dbgprintf(insn, "readModRM()"); in readModRM()
1322 if (insn->consumedModRM) in readModRM()
1325 if (consumeByte(insn, &insn->modRM)) in readModRM()
1327 insn->consumedModRM = true; in readModRM()
1329 mod = modFromModRM(insn->modRM); in readModRM()
1330 rm = rmFromModRM(insn->modRM); in readModRM()
1331 reg = regFromModRM(insn->modRM); in readModRM()
1338 switch (insn->registerSize) { in readModRM()
1340 insn->regBase = MODRM_REG_AX; in readModRM()
1341 insn->eaRegBase = EA_REG_AX; in readModRM()
1344 insn->regBase = MODRM_REG_EAX; in readModRM()
1345 insn->eaRegBase = EA_REG_EAX; in readModRM()
1348 insn->regBase = MODRM_REG_RAX; in readModRM()
1349 insn->eaRegBase = EA_REG_RAX; in readModRM()
1353 reg |= rFromREX(insn->rexPrefix) << 3; in readModRM()
1354 rm |= bFromREX(insn->rexPrefix) << 3; in readModRM()
1355 if (insn->vectorExtensionType == TYPE_EVEX) { in readModRM()
1356 reg |= r2FromEVEX2of4(insn->vectorExtensionPrefix[1]) << 4; in readModRM()
1357 rm |= xFromEVEX2of4(insn->vectorExtensionPrefix[1]) << 4; in readModRM()
1360 insn->reg = (Reg)(insn->regBase + reg); in readModRM()
1362 switch (insn->addressSize) { in readModRM()
1364 insn->eaBaseBase = EA_BASE_BX_SI; in readModRM()
1369 insn->eaBase = EA_BASE_NONE; in readModRM()
1370 insn->eaDisplacement = EA_DISP_16; in readModRM()
1371 if (readDisplacement(insn)) in readModRM()
1374 insn->eaBase = (EABase)(insn->eaBaseBase + rm); in readModRM()
1375 insn->eaDisplacement = EA_DISP_NONE; in readModRM()
1379 insn->eaBase = (EABase)(insn->eaBaseBase + rm); in readModRM()
1380 insn->eaDisplacement = EA_DISP_8; in readModRM()
1381 insn->displacementSize = 1; in readModRM()
1382 if (readDisplacement(insn)) in readModRM()
1386 insn->eaBase = (EABase)(insn->eaBaseBase + rm); in readModRM()
1387 insn->eaDisplacement = EA_DISP_16; in readModRM()
1388 if (readDisplacement(insn)) in readModRM()
1392 insn->eaBase = (EABase)(insn->eaRegBase + rm); in readModRM()
1393 if (readDisplacement(insn)) in readModRM()
1400 insn->eaBaseBase = (insn->addressSize == 4 ? EA_BASE_EAX : EA_BASE_RAX); in readModRM()
1404 insn->eaDisplacement = EA_DISP_NONE; /* readSIB may override this */ in readModRM()
1410 insn->eaBase = (insn->addressSize == 4 ? in readModRM()
1412 if (readSIB(insn) || readDisplacement(insn)) in readModRM()
1416 insn->eaBase = EA_BASE_NONE; in readModRM()
1417 insn->eaDisplacement = EA_DISP_32; in readModRM()
1418 if (readDisplacement(insn)) in readModRM()
1422 insn->eaBase = (EABase)(insn->eaBaseBase + rm); in readModRM()
1427 insn->displacementSize = 1; in readModRM()
1430 insn->eaDisplacement = (mod == 0x1 ? EA_DISP_8 : EA_DISP_32); in readModRM()
1433 insn->eaBase = EA_BASE_sib; in readModRM()
1434 if (readSIB(insn) || readDisplacement(insn)) in readModRM()
1438 insn->eaBase = (EABase)(insn->eaBaseBase + rm); in readModRM()
1439 if (readDisplacement(insn)) in readModRM()
1445 insn->eaDisplacement = EA_DISP_NONE; in readModRM()
1446 insn->eaBase = (EABase)(insn->eaRegBase + rm); in readModRM()
1456 static uint8_t name(struct InternalInstruction *insn, \
1469 if (insn->rexPrefix && \
1526 GENERIC_FIXUP_FUNC(fixupRegValue, insn->regBase, MODRM_REG)
1527 GENERIC_FIXUP_FUNC(fixupRMValue, insn->eaRegBase, EA_REG)
1538 static int fixupReg(struct InternalInstruction *insn, in fixupReg() argument
1542 dbgprintf(insn, "fixupReg()"); in fixupReg()
1549 insn->vvvv = (Reg)fixupRegValue(insn, in fixupReg()
1551 insn->vvvv, in fixupReg()
1557 insn->reg = (Reg)fixupRegValue(insn, in fixupReg()
1559 insn->reg - insn->regBase, in fixupReg()
1565 if (insn->eaBase >= insn->eaRegBase) { in fixupReg()
1566 insn->eaBase = (EABase)fixupRMValue(insn, in fixupReg()
1568 insn->eaBase - insn->eaRegBase, in fixupReg()
1590 static int readOpcodeRegister(struct InternalInstruction* insn, uint8_t size) { in readOpcodeRegister() argument
1591 dbgprintf(insn, "readOpcodeRegister()"); in readOpcodeRegister()
1594 size = insn->registerSize; in readOpcodeRegister()
1598 insn->opcodeRegister = (Reg)(MODRM_REG_AL + ((bFromREX(insn->rexPrefix) << 3) in readOpcodeRegister()
1599 | (insn->opcode & 7))); in readOpcodeRegister()
1600 if (insn->rexPrefix && in readOpcodeRegister()
1601 insn->opcodeRegister >= MODRM_REG_AL + 0x4 && in readOpcodeRegister()
1602 insn->opcodeRegister < MODRM_REG_AL + 0x8) { in readOpcodeRegister()
1603 insn->opcodeRegister = (Reg)(MODRM_REG_SPL in readOpcodeRegister()
1604 + (insn->opcodeRegister - MODRM_REG_AL - 4)); in readOpcodeRegister()
1609 insn->opcodeRegister = (Reg)(MODRM_REG_AX in readOpcodeRegister()
1610 + ((bFromREX(insn->rexPrefix) << 3) in readOpcodeRegister()
1611 | (insn->opcode & 7))); in readOpcodeRegister()
1614 insn->opcodeRegister = (Reg)(MODRM_REG_EAX in readOpcodeRegister()
1615 + ((bFromREX(insn->rexPrefix) << 3) in readOpcodeRegister()
1616 | (insn->opcode & 7))); in readOpcodeRegister()
1619 insn->opcodeRegister = (Reg)(MODRM_REG_RAX in readOpcodeRegister()
1620 + ((bFromREX(insn->rexPrefix) << 3) in readOpcodeRegister()
1621 | (insn->opcode & 7))); in readOpcodeRegister()
1637 static int readImmediate(struct InternalInstruction* insn, uint8_t size) { in readImmediate() argument
1643 dbgprintf(insn, "readImmediate()"); in readImmediate()
1645 if (insn->numImmediatesConsumed == 2) { in readImmediate()
1651 size = insn->immediateSize; in readImmediate()
1653 insn->immediateSize = size; in readImmediate()
1654 insn->immediateOffset = insn->readerCursor - insn->startLocation; in readImmediate()
1658 if (consumeByte(insn, &imm8)) in readImmediate()
1660 insn->immediates[insn->numImmediatesConsumed] = imm8; in readImmediate()
1663 if (consumeUInt16(insn, &imm16)) in readImmediate()
1665 insn->immediates[insn->numImmediatesConsumed] = imm16; in readImmediate()
1668 if (consumeUInt32(insn, &imm32)) in readImmediate()
1670 insn->immediates[insn->numImmediatesConsumed] = imm32; in readImmediate()
1673 if (consumeUInt64(insn, &imm64)) in readImmediate()
1675 insn->immediates[insn->numImmediatesConsumed] = imm64; in readImmediate()
1679 insn->numImmediatesConsumed++; in readImmediate()
1691 static int readVVVV(struct InternalInstruction* insn) { in readVVVV() argument
1692 dbgprintf(insn, "readVVVV()"); in readVVVV()
1695 if (insn->vectorExtensionType == TYPE_EVEX) in readVVVV()
1696 vvvv = (v2FromEVEX4of4(insn->vectorExtensionPrefix[3]) << 4 | in readVVVV()
1697 vvvvFromEVEX3of4(insn->vectorExtensionPrefix[2])); in readVVVV()
1698 else if (insn->vectorExtensionType == TYPE_VEX_3B) in readVVVV()
1699 vvvv = vvvvFromVEX3of3(insn->vectorExtensionPrefix[2]); in readVVVV()
1700 else if (insn->vectorExtensionType == TYPE_VEX_2B) in readVVVV()
1701 vvvv = vvvvFromVEX2of2(insn->vectorExtensionPrefix[1]); in readVVVV()
1702 else if (insn->vectorExtensionType == TYPE_XOP) in readVVVV()
1703 vvvv = vvvvFromXOP3of3(insn->vectorExtensionPrefix[2]); in readVVVV()
1707 if (insn->mode != MODE_64BIT) in readVVVV()
1710 insn->vvvv = static_cast<Reg>(vvvv); in readVVVV()
1721 static int readMaskRegister(struct InternalInstruction* insn) { in readMaskRegister() argument
1722 dbgprintf(insn, "readMaskRegister()"); in readMaskRegister()
1724 if (insn->vectorExtensionType != TYPE_EVEX) in readMaskRegister()
1727 insn->writemask = in readMaskRegister()
1728 static_cast<Reg>(aaaFromEVEX4of4(insn->vectorExtensionPrefix[3])); in readMaskRegister()
1739 static int readOperands(struct InternalInstruction* insn) { in readOperands() argument
1743 dbgprintf(insn, "readOperands()"); in readOperands()
1747 hasVVVV = !readVVVV(insn); in readOperands()
1748 needVVVV = hasVVVV && (insn->vvvv != 0); in readOperands()
1750 for (const auto &Op : x86OperandSets[insn->spec->operands]) { in readOperands()
1758 if (readModRM(insn)) in readOperands()
1760 if (fixupReg(insn, &Op)) in readOperands()
1763 if (Op.encoding != ENCODING_REG && insn->eaDisplacement == EA_DISP_8) in readOperands()
1764 insn->displacement *= 1 << (Op.encoding - ENCODING_RM); in readOperands()
1772 dbgprintf(insn, "We currently don't hande code-offset encodings"); in readOperands()
1778 insn->immediates[insn->numImmediatesConsumed] = in readOperands()
1779 insn->immediates[insn->numImmediatesConsumed - 1] & 0xf; in readOperands()
1780 ++insn->numImmediatesConsumed; in readOperands()
1783 if (readImmediate(insn, 1)) in readOperands()
1790 if (readImmediate(insn, 2)) in readOperands()
1794 if (readImmediate(insn, 4)) in readOperands()
1798 if (readImmediate(insn, 8)) in readOperands()
1802 if (readImmediate(insn, insn->immediateSize)) in readOperands()
1806 if (readImmediate(insn, insn->addressSize)) in readOperands()
1810 if (readOpcodeRegister(insn, 1)) in readOperands()
1814 if (readOpcodeRegister(insn, 2)) in readOperands()
1818 if (readOpcodeRegister(insn, 4)) in readOperands()
1822 if (readOpcodeRegister(insn, 8)) in readOperands()
1826 if (readOpcodeRegister(insn, 0)) in readOperands()
1835 if (fixupReg(insn, &Op)) in readOperands()
1839 if (readMaskRegister(insn)) in readOperands()
1845 dbgprintf(insn, "Encountered an operand with an unknown encoding."); in readOperands()
1877 struct InternalInstruction *insn, byteReader_t reader, in decodeInstruction() argument
1880 memset(insn, 0, sizeof(struct InternalInstruction)); in decodeInstruction()
1882 insn->reader = reader; in decodeInstruction()
1883 insn->readerArg = readerArg; in decodeInstruction()
1884 insn->dlog = logger; in decodeInstruction()
1885 insn->dlogArg = loggerArg; in decodeInstruction()
1886 insn->startLocation = startLoc; in decodeInstruction()
1887 insn->readerCursor = startLoc; in decodeInstruction()
1888 insn->mode = mode; in decodeInstruction()
1889 insn->numImmediatesConsumed = 0; in decodeInstruction()
1891 if (readPrefixes(insn) || in decodeInstruction()
1892 readOpcode(insn) || in decodeInstruction()
1893 getID(insn, miiArg) || in decodeInstruction()
1894 insn->instructionID == 0 || in decodeInstruction()
1895 readOperands(insn)) in decodeInstruction()
1898 insn->operands = x86OperandSets[insn->spec->operands]; in decodeInstruction()
1900 insn->length = insn->readerCursor - insn->startLocation; in decodeInstruction()
1902 dbgprintf(insn, "Read from 0x%llx to 0x%llx: length %zu", in decodeInstruction()
1903 startLoc, insn->readerCursor, insn->length); in decodeInstruction()
1905 if (insn->length > 15) in decodeInstruction()
1906 dbgprintf(insn, "Instruction exceeds 15-byte limit"); in decodeInstruction()