1 ! Copyright (C) 2023 John Benediktsson
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors alien alien.c-types alien.data
4 alien.destructors alien.libraries alien.strings alien.syntax
5 arrays classes.struct combinators destructors kernel layouts
6 math math.parser namespaces sequences specialized-arrays
7 system tools.disassembler.private tools.memory ;
8 IN: tools.disassembler.capstone
11 { [ os windows? ] [ "libcapstone.dll" ] }
12 { [ os macosx? ] [ "libcapstone.dylib" ] }
13 { [ os unix? ] [ "libcapstone.so" ] }
14 } cond cdecl add-library >>
34 { CS_ARCH_ALL 0xFFFF }
38 { CS_MODE_LITTLE_ENDIAN 0 }
43 { CS_MODE_THUMB 0x10 }
44 { CS_MODE_MCLASS 0x20 }
46 { CS_MODE_MICRO 0x20 }
47 { CS_MODE_MIPS3 0x40 }
48 { CS_MODE_MIPS32R6 0x80 }
49 { CS_MODE_MIPS2 0x100 }
52 { CS_MODE_M68K_000 0x02 }
53 { CS_MODE_M68K_010 0x04 }
54 { CS_MODE_M68K_020 0x08 }
55 { CS_MODE_M68K_030 0x10 }
56 { CS_MODE_M68K_040 0x20 }
57 { CS_MODE_M68K_060 0x40 }
58 { CS_MODE_BIG_ENDIAN 0x80000000 }
59 { CS_MODE_MIPS32 0x4 }
60 { CS_MODE_MIPS64 0x8 }
61 { CS_MODE_M680X_6301 0x02 }
62 { CS_MODE_M680X_6309 0x04 }
63 { CS_MODE_M680X_6800 0x08 }
64 { CS_MODE_M680X_6801 0x10 }
65 { CS_MODE_M680X_6805 0x20 }
66 { CS_MODE_M680X_6808 0x40 }
67 { CS_MODE_M680X_6809 0x80 }
68 { CS_MODE_M680X_6811 0x100 }
69 { CS_MODE_M680X_CPU12 0x200 }
70 { CS_MODE_M680X_HCS08 0x400 }
101 FUNCTION: uint cs_version ( int* major, int* minor )
102 FUNCTION: bool cs_support ( int query )
103 FUNCTION: cs_err cs_open ( cs_arch arch, cs_mode mode, csh* handle )
104 FUNCTION: cs_err cs_close ( csh* handle )
105 FUNCTION: cs_err cs_errno ( csh handle )
106 FUNCTION: c-string cs_strerror ( cs_err code )
107 FUNCTION: size_t cs_disasm ( csh handle, uint8_t* code, size_t code_size, uint64_t address, size_t count, cs_insn** insn )
108 FUNCTION: size_t cs_disasm_iter ( csh handle, uint8_t** code, size_t* size, uint64_t* address, size_t count, cs_insn* insn )
109 FUNCTION: cs_insn* cs_malloc ( csh handle )
110 FUNCTION: void cs_free ( cs_insn* insn, size_t count )
111 FUNCTION: c-string cs_reg_name ( csh handle, uint reg_id )
112 FUNCTION: c-string cs_insn_name ( csh handle, uint insn_id )
113 FUNCTION: c-string cs_group_name ( csh handle, uint group_id )
117 : cs-version ( -- major minor )
118 { int int } [ cs_version drop ] with-out-parameters ;
121 CS_ARCH_X86 64-bit? CS_MODE_64 CS_MODE_32 ? 0 csh <ref>
122 [ cs_open CS_ERR_OK assert= ] keep ;
124 : with-csh ( ..a quot: ( ..a csh -- ..b ) -- ..b )
125 '[ <csh> &cs_close @ ] with-destructors ; inline
127 SPECIALIZED-ARRAY: cs_insn
131 : buf/len/start ( from to -- buf len from )
132 [ drop <alien> ] [ swap - ] [ drop ] 2tri ;
134 : make-insn ( cs_insn -- seq )
137 [ [ bytes>> ] [ size>> ] bi head-slice bytes>hex-string ]
138 [ mnemonic>> alien>native-string ]
139 [ op_str>> alien>native-string " " glue ]
142 : make-disassembly ( from len address -- lines )
145 { void* } [ cs_disasm ] with-out-parameters swap
146 [ <direct-cs_insn-array> [ make-insn ] { } map-as ]
152 SINGLETON: capstone-disassembler
154 M: capstone-disassembler disassemble*
155 [ buf/len/start make-disassembly write-disassembly ] with-code-blocks ;
157 capstone-disassembler disassembler-backend set-global