123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397(**************************************************************************)(* Copyright (c) 2005, Regents of the University of California *)(* All rights reserved. *)(* *)(* Author: Adam Chlipala *)(* you can redistribute it and/or modify it under the terms of the GNU *)(* Redistribution and use in source and binary forms, with or without *)(* modification, are permitted provided that the following conditions *)(* are met: *)(* *)(* - Redistributions of source code must retain the above copyright *)(* notice, this list of conditions and the following disclaimer. *)(* - Redistributions in binary form must reproduce the above copyright *)(* notice, this list of conditions and the following disclaimer in *)(* the documentation and/or other materials provided with the *)(* distribution. *)(* - Neither the name of the University of California, Berkeley nor *)(* the names of its contributors may be used to endorse or promote *)(* products derived from this software without specific prior *)(* written permission. *)(* *)(* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *)(* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *)(* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *)(* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *)(* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *)(* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *)(* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *)(* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *)(* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *)(* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *)(* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *)(* POSSIBILITY OF SUCH DAMAGE. *)(* *)(* *)(* Modified for BINSEC *)(* *)(**************************************************************************)openFormatopenX86TypesopenX86Utillethigh_bit=Int64.shift_leftInt64.one31let_higher_bit=Int64.shift_leftInt64.one32letpp_int16ppfn=assert(nlsr16=0);fprintfppf"0x%x"nletpp_int64ppfn=ifInt64.logandnhigh_bit=Int64.zerothenfprintfppf"0x%Lx"nelseletmask=Int64.lognot(Int64.shift_leftInt64.minus_one32)infprintfppf"0x%Lx"(Int64.logandmaskn)letpp_reg_xmmppfr=fprintfppf"%s"(xmm_reg_to_stringr)letpp_reg8ppfr=fprintfppf"%s"(reg8_to_stringr)letpp_reg16ppfr=fprintfppf"%s"(reg16_to_stringr)letpp_reg32ppfr=fprintfppf"%s"(reg32_to_stringr)letpp_reg32_16ppfr=fprintfppf"%s"(reg32_to_string_16r)letpp_reg32_8ppfr=fprintfppf"%s"(reg32_to_string_8r)letpp_segment_regppfr=fprintfppf"%s"(segment_reg_to_stringr)let_pp_float_regppfr=fprintfppf"%s"(float_reg_to_stringr)let_pp_mmx_regppfr=fprintfppf"%s"(mmx_reg_to_stringr)let_pp_control_regppfr=fprintfppf"%s"(control_reg_to_stringr)let_pp_debug_regppfr=fprintfppf"%s"(debug_reg_to_stringr)let_pp_test_regppfr=fprintfppf"%s"(test_reg_to_stringr)letpp_ccppfr=fprintfppf"%s"(cc_to_stringr)let_pp_sseppfr=fprintfppf"%s"(sse_to_stringr)letpp_scaleppfr=fprintfppf"%s"(scale_to_stringr)letpp_addrppfn=fprintfppf"0x%Lx"nletpp_addressppfaddr=match(addr.addrDisp=Int64.zero,addr.addrBase,addr.addrIndex)with|true,None,None->fprintfppf"[0]"|true,Somer,None->fprintfppf"[%a]"pp_reg32r|true,Somer1,Some(Scale1,r2)->fprintfppf"[%a + %a]"pp_reg32r1pp_reg32r2|true,Somer1,Some(sc,r2)->fprintfppf"[%a + %a * %a]"pp_reg32r1pp_scalescpp_reg32r2|true,None,Some(Scale1,r)->fprintfppf"[%a]"pp_reg32r|true,None,Some(sc,r)->fprintfppf"[%a * %a]"pp_scalescpp_reg32r|false,None,None->fprintfppf"[%a]"pp_addraddr.addrDisp|false,Somer,None->fprintfppf"[%a + %a]"pp_reg32rpp_int64addr.addrDisp|false,Somer1,Some(Scale1,r2)->fprintfppf"[%a + %a + %a]"pp_reg32r1pp_reg32r2pp_int64addr.addrDisp|false,Somer1,Some(sc,r2)->fprintfppf"[%a * %a + %a + %a]"pp_reg32r2pp_scalescpp_reg32r1pp_int64addr.addrDisp|false,None,Some(Scale1,r)->fprintfppf"[%a + %a]"pp_reg32rpp_int64addr.addrDisp|false,None,Some(sc,r)->fprintfppf"[%a * %a + %a]"pp_scalescpp_reg32rpp_int64addr.addrDispletpp_genoppp_regppf=function|Immn->pp_int64ppfn|Regr->pp_regppfr|Addressaddr->pp_addressppfaddrletpp_genop_xmm=pp_genoppp_reg_xmmletpp_genop32=pp_genoppp_reg32letpp_genop32_16=pp_genoppp_reg32_16letpp_genop32_8=pp_genoppp_reg32_8letpp_genop16=pp_genoppp_reg16letpp_genop8=pp_genoppp_reg8letpp_genop_addrpp_regppf=function|Immn->pp_addrppfn|Regr->pp_regppfr|Addressaddr->pp_addressppfaddrletpp_genop_addr32=pp_genop_addrpp_reg32let_pp_genop_addr8=pp_genop_addrpp_reg8letpp_arith_opppfaop=fprintfppf"%s"(arith_op_to_stringaop)letpp_shift_opppfsop=fprintfppf"%s"(shift_op_to_stringsop)letpp_rotate_opppfrop=fprintfppf"%s"(rotate_op_to_stringrop)letpp_shiftd_opppfsop=fprintfppf"%s"(shiftd_op_to_stringsop)letpp_repppf=function|NoRep->fprintfppf""|Rep->fprintfppf"rep@ "|RepE->fprintfppf"repe@ "|RepNE->fprintfppf"repne@ "letpp_genop32=function|`M32->pp_genop32|`M16->pp_genop32_16|`M8->pp_genop32_8letpp_ext0ppf=function|8->fprintfppf"b"|16->fprintfppf"w"|32->fprintfppf"d"|64->fprintfppf"q"|_->assertfalseletpp_ext1ppf=function|8->fprintfppf"bw"|16->fprintfppf"wd"|32->fprintfppf"dq"|64->fprintfppf"qdq"|_->assertfalseletpp_ext2ppf=function|8->fprintfppf"wb"|16->fprintfppf"dw"|_->assertfalseletpp_instrppfinstr=matchinstrwith|Arith(mode,aop,dst,src)->letpp_genop=pp_genop32modeinfprintfppf"@[%a@ %a,@ %a@]"pp_arith_opaoppp_genopdstpp_genopsrc|Callimm->fprintfppf"@[call@ %a@]"pp_addrimm|DCalldst->fprintfppf"@[dcall@ %a@]"pp_genop_addr32dst|Cmp(mode,dst,src)->letpp_genop=pp_genop32modeinfprintfppf"@[cmp@ %a,@ %a@]"pp_genopdstpp_genopsrc|Cmps_->fprintfppf"@[cmp@ (esi),@ (edi)@]"|Xadd(mode,dst,src)->letpp_genop=pp_genop32modeinfprintfppf"@[xadd@ %a,@ %a@]"pp_genopdstpp_genopsrc|Aas->fprintfppf"@[aas@]"|Aamimm->fprintfppf"@[%02x@]"imm|Aadimm->fprintfppf"@[%02x@]"imm|CmpXchg(mode,dst,src)->letpp_genop=pp_genop32modeinfprintfppf"@[cmpxchg@ %a,@ %a@]"pp_genopdstpp_genopsrc|Test(mode,dst,src)->letpp_genop=pp_genop32modeinfprintfppf"@[test@ %a,@ %a@]"pp_genopdstpp_genopsrc|Inc(mode,gop)->fprintfppf"@[inc@ %a@]"(pp_genop32mode)gop|Jcc(cc,imm)->fprintfppf"@[j%a@ %a@]"pp_ccccpp_addrimm|Jcxz(_,imm)->fprintfppf"@[jcxz@ %a@ %a@]"pp_addrimmpp_reg32ECX|Jmpimm->fprintfppf"@[jmp@ %a@]"pp_addrimm|DJmpgop->fprintfppf"@[djmp@ %a@]"(pp_genop32`M32)gop|Jmpf(seg_selector,imm)->fprintfppf"@[jmp@ %a:%a@]"pp_int16seg_selectorpp_addrimm|Lea(_,dst,src)->fprintfppf"@[lea@ %a,@ %a@]"pp_reg32dstpp_addresssrc|LoadFarPointer(mode,sreg,reg,address)->letpp_regppfr=pp_genop32modeppf(Regr)infprintfppf"@[l%a@ %a,@ %a@]"pp_segment_regsregpp_regregpp_addressaddress|Enter(_,alloc,level)->fprintfppf"@[enter %d, %d@]"alloclevel|Leave_->fprintfppf"@[leave@]"|CMovcc(mode,cc,dst,src)->letpp_genop=pp_genop32modeinfprintfppf"@[cmov%a@ %a,@ %a@]"pp_ccccpp_genopdstpp_genopsrc|Movaps(_,dst,src)->fprintfppf"@[mov@ %a,@ %a@]"pp_genop_xmmdstpp_genop_xmmsrc|MovQ_->fprintfppf"@[movq .. @]"|MovdQA_|MovdQU_|Movd(_,_,_,_)|Movlpd(_,_,_)|Movhpd(_,_,_)|Movlps(_,_,_)|Movhps(_,_,_)|Movlhps(_,_,_)|Movhlps(_,_,_)|Movddup(_,_,_)|Movsldup(_,_,_)|Movshdup(_,_,_)->fprintfppf"@[movXmm ... @]"|Movups(_,_)->fprintfppf"@[movups ....@]"|Movupd(_,_)->fprintfppf"@[movupd ....@]"|Movntq(_,_,_,_)->fprintfppf"@[movntq ....@]"|CmpXchg8b(_,_,_)->fprintfppf"@[cmpxchg8b ...@]"|Pshufw(_,_,_,_,_)->fprintfppf"@[pshufw ...@]"|Pshuflw(_,_,_,_,_)->fprintfppf"@[pshuflw ...@]"|Pshufhw(_,_,_,_,_)->fprintfppf"@[pshufhw ...@]"|Pshufd(_,_,_,_,_)->fprintfppf"@[pshufd ...@]"|Xlat_->fprintfppf"@[Xlat ...@]"|Loopnz(_,_,_)|Loopz(_,_,_)|Loop(_,_,_)->fprintfppf"@[loop@]"|Psrl(_,_,_,_,ext)->fprintfppf"@[psrl%a ...@]"pp_ext0ext|Psll(_,_,_,_,ext)->fprintfppf"@[psll%a ...@]"pp_ext0ext|Psra(_,_,_,_,ext)->fprintfppf"@[psra%a ...@]"pp_ext0ext|Psrldq(_,_)->fprintfppf"@[psrldq ...@]"|Pslldq(_,_)->fprintfppf"@[pslldq ...@]"|Palignr(_xmm,_,dst,src,imm)->fprintfppf"@[palignr %a,%a,0x%x@]"pp_genop_xmmdstpp_genop_xmmsrcimm|Pcmpeqb(_,_,_,_)->fprintfppf"@[pcmpeqb ...@]"|Pcmpeqw(_,_,_,_)->fprintfppf"@[pcmpeqw ...@]"|Pcmpeqd(_,_,_,_)->fprintfppf"@[pcmpeqd ...@]"|Pcmpgtb(_,_,_,_)->fprintfppf"@[pcmpgtb ...@]"|Pcmpgtw(_,_,_,_)->fprintfppf"@[pcmpgtw ...@]"|Pcmpgtd(_,_,_,_)->fprintfppf"@[pcmpgtd ...@]"|PmovMSKB(_,_,_,_)->fprintfppf"@[pmovmskb ...@]"|Pminu(_,_,_,_,e)->fprintfppf"@[pminu%a ...@]"pp_ext0e|Pmins(_,_,_,_,e)->fprintfppf"@[pmins%a ...@]"pp_ext0e|Pxor(_,_,_,_)->fprintfppf"@[pxor ...@]"|Por(_,_,_,_)->fprintfppf"@[por ...@]"|Pand(_,_,_,_)->fprintfppf"@[pand ...@]"|Pandn(_,_,_,_)->fprintfppf"@[pandn ...@]"|Padd(_,_,_,_,_)->fprintfppf"@[padd ...@]"|Padds(_,_,_,_,_)->fprintfppf"@[padds ...@]"|Paddus(_,_,_,_,_)->fprintfppf"@[paddus ...@]"|Psub(_,_,_,_,_)->fprintfppf"@[psub ...@]"|Psubs(_,_,_,_,_)->fprintfppf"@[psubs ...@]"|Psubus(_,_,_,_,_)->fprintfppf"@[psubus ...@]"|Pavgu(_,_,_,_,e)->fprintfppf"@[pavgu%a ...@]"pp_ext0e|Pmulhw(_,_,_,_)->fprintfppf"@[pmulhw ...@]"|Pmulhrw(_,_,_,_)->fprintfppf"@[pmulhrw ...@]"|Pmullw(_,_,_,_)->fprintfppf"@[pmullw ...@]"|Pmuludq(_,_,_,_)->fprintfppf"@[pmuludq ...@]"|Ptest(_,_,_,_)->fprintfppf"@[ptest ...@]"|Pmaxu(_,_,_,_,e)->fprintfppf"@[pmaxu%a ...@]"pp_ext0e|Pmaxs(_,_,_,_,e)->fprintfppf"@[pmaxs%a ...@]"pp_ext0e|Punpckl(_,_,_,_,ext)->fprintfppf"@[punpckl%a ...@]"pp_ext1ext|Punpckh(_,_,_,_,ext)->fprintfppf"@[punpckh%a ...@]"pp_ext1ext|Packus(_,_,_,_,ext)->fprintfppf"@[packus%a ...@]"pp_ext2ext|Packss(_,_,_,_,ext)->fprintfppf"@[packss%a ...@]"pp_ext2ext|Pmaddwd_->fprintfppf"@[pmaddwd ...@]"|Pmaddusbsw_->fprintfppf"@[pmaddusbsw ...@]"|Pclmulqdq_->fprintfppf"@[pclmulqdq ...@]"|Bswap(_,dst)->fprintfppf"@[bswap@ %a@]"pp_reg32dst|Bsr(mode,dst,src)->fprintfppf"@[bsr@ %a, %a@]"pp_reg32dst(pp_genop32mode)src|Bsf(mode,dst,src)->fprintfppf"@[bsf@ %a, %a@]"pp_reg32dst(pp_genop32mode)src|Mov(mode,dst,src)->letpp_genop=pp_genop32modeinfprintfppf"@[mov@ %a, %a@]"pp_genopdstpp_genopsrc|MovSegRight(dst,src)->fprintfppf"@[mov@ %a, %a@]"pp_genop16dstpp_segment_regsrc|MovSegLeft(dst,src)->fprintfppf"@[mov@ %a, %a@]"pp_segment_regdstpp_genop16src|Movsx(_,dst,src)->fprintfppf"@[movsx@ %a, %a@]"pp_reg32dstpp_genop8src|Movsx16(_,dst,src)->fprintfppf"@[movsx@ %a, %a@]"pp_reg32dstpp_genop16src|Movzx16(`M32,dst,src)->fprintfppf"@[movzx %a, %a@]"pp_reg32dstpp_genop16src|Movzx16(`M16,dst,src)->fprintfppf"@[movzx %a, %a@]"pp_reg32_16dstpp_genop16src|Movzx(`M32,dst,src)->fprintfppf"@[movzx %a, %a@]"pp_reg32dstpp_genop8src|Movzx(`M16,dst,src)->fprintfppf"@[movzx %a, %a@]"pp_reg32dstpp_genop8src|Movs(rep,`M8)->fprintfppf"@[%amovsb [edi] [esi]@]"pp_reprep|Movs(rep,_)->fprintfppf"@[%amovs [edi] [esi]@]"pp_reprep|Lods(rep,`M32)->fprintfppf"@[%alods %s [esi]@]"pp_reprep(reg32_to_stringEAX)|Lods(rep,`M16)->fprintfppf"@[%alods %s [esi]@]"pp_reprep(reg16_to_stringAX)|CBW_->fprintfppf"@[cbw@]"|CWD_->fprintfppf"@[cwd@]"|PushA_->fprintfppf"@[pushal@]"|PopA_->fprintfppf"@[popa@]"|Pushfd_->fprintfppf"@[pushfd@]"|Popfd_->fprintfppf"@[popfd@]"|Lods(rep,`M8)->fprintfppf"@[%alodsb al [esi]@]"pp_reprep|Stos(rep,`M32)|Stos(rep,`M16)->fprintfppf"@[%astos@]"pp_reprep|Stos(rep,`M8)->fprintfppf"@[%astosb@]"pp_reprep|Scas(rep,`M32)|Scas(rep,`M16)->fprintfppf"@[%ascas@]"pp_reprep|Scas(rep,`M8)->fprintfppf"@[%ascasb@]"pp_reprep|PopSreg->fprintfppf"@[pop %a@]"pp_segment_regreg|Pop(mode,gop)->fprintfppf"@[pop %a@]"(pp_genop32mode)gop|Push(mode,gop)->fprintfppf"@[push %a@]"(pp_genop32mode)gop|PushSreg->fprintfppf"@[push %a@]"pp_segment_regreg|Ret->fprintfppf"@[ret@]"|Reti_->fprintfppf"@[reti@]"|Retf->fprintfppf"@[retf@]"|Retfi_->fprintfppf"@[retfi@]"|Shift(mode,sop,dst,offset)->fprintfppf"@[%a@ %a,@ %a@]"pp_shift_opsop(pp_genop32mode)dstpp_genop8offset|Rotate(mode,rop,dst,offset)->fprintfppf"@[%a@ %a,@ %a@]"pp_rotate_oprop(pp_genop32mode)dstpp_genop8offset|Shiftd(mode,sop,dst,src,offset)->letpp_genop=pp_genop32modeinfprintfppf"@[%a@ %a,@ %a,@ %a@]"pp_shiftd_opsoppp_genopdstpp_genopsrcpp_genop8offset|SetCc(cc,dst)->fprintfppf"@[set%a@ %a@]"pp_ccccpp_genop8dst|Nop->fprintfppf"@[nop@]"|Not(mode,src)->fprintfppf"@[not@ %a@]"(pp_genop32mode)src|Neg(mode,src)->fprintfppf"@[neg@ %a@]"(pp_genop32mode)src|Halt->fprintfppf"@[hlt@]"|Cmc->fprintfppf"@[cmc@]"|Clc->fprintfppf"@[clc@]"|Stc->fprintfppf"@[stc@]"|Cld->fprintfppf"@[cld@]"|Std->fprintfppf"@[std@]"|Bt{mode;dst;src}->letpp_genop=pp_genop32modeinfprintfppf"@[bt@ %a,@ %a@]"pp_genopdstpp_genopsrc|Bts{mode;dst;src}->letpp_genop=pp_genop32modeinfprintfppf"@[bts@ %a,@ %a@]"pp_genopdstpp_genopsrc|Btr{mode;dst;src}->letpp_genop=pp_genop32modeinfprintfppf"@[btr@ %a,@ %a@]"pp_genopdstpp_genopsrc|Btc{mode;src;dst}->letpp_genop=pp_genop32modeinfprintfppf"@[btc@ %a,@ %a@]"pp_genopdstpp_genopsrc|Xchg(`M32,_,_)->fprintfppf"@[xchg32@]"|Xchg(`M16,_,_)->fprintfppf"@[xchg16@]"|Xchg(`M8,_,_)->fprintfppf"@[xchg8@]"|Mul(mode,src)->fprintfppf"@[mul@ edx@ eax@ %a@]"(pp_genop32mode)src|IMul(mode,None,_,src)->fprintfppf"@[imul@ edx@ eax@ %a@]"(pp_genop32mode)src|Div(mode,src)->fprintfppf"@[div@ edx@ eax@ %a@]"(pp_genop32mode)src|IDiv(mode,src)->fprintfppf"@[idiv@ edx@ eax@ %a@]"(pp_genop32mode)src|IMul(mode,Somedst,src,imm)->letpp_genop=pp_genop32modeinfprintfppf"@[imul@ %a@ %a@ %a@]"pp_genopdstpp_genopsrcpp_genopimm|Dec(mode,gop)->fprintfppf"@[dec@ %a@]"(pp_genop32mode)gop|Lsl(mode,dst,src)->letpp_genop=pp_genop32modeinfprintfppf"@[Lsl@ %a, %a@]"pp_genopdstpp_genopsrc|Fld->fprintfppf"@[fld ... unhandled ...@]"|Fxch_->fprintfppf"@[fxch sti@]"|Lahf->fprintfppf"@[lahf@]"|Sahf->fprintfppf"@[sahf@]"|Salc->fprintfppf"@[salc@]"|Wait->fprintfppf"@[wait@]"|Emms->fprintfppf"@[emms@]"|Prefetchsuffix->fprintfppf"@[prefetch%s@]"suffix|Popcnt(mode,dst,src)->letpp_genop=pp_genop32modeinfprintfppf"@[popcnt@ %a,@ %a@]"pp_genopdstpp_genopsrc|Lzcnt(mode,dst,src)->letpp_genop=pp_genop32modeinfprintfppf"@[lzcnt@ %a,@ %a@]"pp_genopdstpp_genopsrc|Lgdt(mode,dst)->letpp_genop=pp_genop32modeinfprintfppf"@[lgdt@ %a@]"pp_genopdst|Lidt(mode,dst)->letpp_genop=pp_genop32modeinfprintfppf"@[lidt@ %a@]"pp_genopdst|Ltrsrc->fprintfppf"@[ltr@ %a@]"pp_genop16src|Iret_->fprintfppf"@[iret@]"|OutPortImmimm8->fprintfppf"@[outb@ %x,@ al@]"imm8|OutPortDx->fprintfppf"@[outb@ dx,@ al@]"|Undecoded->fprintfppf"@[binsec_undecoded@]"|Unsupporteddescr->fprintfppf"@[binsec_unsupported %s@]"descrletpp_bytesnbytesppfi=(* At most one word is read *)assert(nbytes>0&&nbytes<=4);leti=Z.of_intiinletbytesize=8inletrecauxppfj=ifj<nbytesthenletbyte=Z.to_int(Z.extracti(j*bytesize)bytesize)inFormat.fprintfppf"%02x %a"byteaux(j+1)inauxppf0letpp_byte=pp_bytes1letpp_word=pp_bytes4