]> gitweb.factorcode.org Git - factor.git/blob - basis/tools/disassembler/capstone/capstone.factor
2d6adf01167496e781753298eadc73431a0e4009
[factor.git] / basis / tools / disassembler / capstone / capstone.factor
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
9
10 << "libcapstone" {
11     { [ os windows? ] [ "libcapstone.dll" ] }
12     { [ os macosx? ] [ "libcapstone.dylib" ] }
13     { [ os unix? ] [ "libcapstone.so" ] }
14 } cond cdecl add-library >>
15
16 LIBRARY: libcapstone
17
18 TYPEDEF: size_t csh
19
20 ENUM: cs_arch
21     CS_ARCH_ARM
22     CS_ARCH_ARM64
23     CS_ARCH_MIPS
24     CS_ARCH_X86
25     CS_ARCH_PPC
26     CS_ARCH_SPARC
27     CS_ARCH_SYSZ
28     CS_ARCH_XCORE
29     CS_ARCH_M68K
30     CS_ARCH_TMS320C64X
31     CS_ARCH_M680X
32     CS_ARCH_EVM
33     CS_ARCH_MAX
34     { CS_ARCH_ALL 0xFFFF }
35 ;
36
37 ENUM: cs_mode
38     { CS_MODE_LITTLE_ENDIAN 0 }
39     { CS_MODE_ARM 0 }
40     { CS_MODE_16 0x2 }
41     { CS_MODE_32 0x4 }
42     { CS_MODE_64 0x8 }
43     { CS_MODE_THUMB 0x10 }
44     { CS_MODE_MCLASS 0x20 }
45     { CS_MODE_V8 0x40 }
46     { CS_MODE_MICRO 0x20 }
47     { CS_MODE_MIPS3 0x40 }
48     { CS_MODE_MIPS32R6 0x80 }
49     { CS_MODE_MIPS2 0x100 }
50     { CS_MODE_V9 0x10 }
51     { CS_MODE_QPX 0x10 }
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 }
71 ;
72
73 STRUCT: cs_insn
74     { id uint }
75     { address uint64_t }
76     { size uint16_t }
77     { bytes uint8_t[16] }
78     { mnemonic char[32] }
79     { op_str char[160] }
80     { detail void* }
81 ;
82
83 ENUM: cs_err
84     CS_ERR_OK
85     CS_ERR_MEM
86     CS_ERR_ARCH
87     CS_ERR_HANDLE
88     CS_ERR_CSH
89     CS_ERR_MODE
90     CS_ERR_OPTION
91     CS_ERR_DETAIL
92     CS_ERR_MEMSETUP
93     CS_ERR_VERSION
94     CS_ERR_DIET
95     CS_ERR_SKIPDATA
96     CS_ERR_X86_ATT
97     CS_ERR_X86_INTEL
98     CS_ERR_X86_MASM
99 ;
100
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 )
114
115 DESTRUCTOR: cs_close
116
117 : cs-version ( -- major minor )
118     { int int } [ cs_version drop ] with-out-parameters ;
119
120 : <csh> ( -- csh )
121     CS_ARCH_X86 64-bit? CS_MODE_64 CS_MODE_32 ? 0 csh <ref>
122     [ cs_open CS_ERR_OK assert= ] keep ;
123
124 : with-csh ( ..a quot: ( ..a csh -- ..b ) -- ..b )
125     '[ <csh> &cs_close @ ] with-destructors ; inline
126
127 SPECIALIZED-ARRAY: cs_insn
128
129 <PRIVATE
130
131 : buf/len/start ( from to -- buf len from )
132     [ drop <alien> ] [ swap - ] [ drop ] 2tri ;
133
134 : make-insn ( cs_insn -- seq )
135     {
136         [ address>> ]
137         [ [ bytes>> ] [ size>> ] bi head-slice bytes>hex-string ]
138         [ mnemonic>> alien>native-string ]
139         [ op_str>> alien>native-string " " glue ]
140     } cleave 3array ;
141
142 : make-disassembly ( from len address -- lines )
143     '[
144         csh deref _ _ _ 0
145         { void* } [ cs_disasm ] with-out-parameters swap
146         [ <direct-cs_insn-array> [ make-insn ] { } map-as ]
147         [ cs_free ] 2bi
148     ] with-csh ;
149
150 PRIVATE>
151
152 SINGLETON: capstone-disassembler
153
154 M: capstone-disassembler disassemble*
155     [ buf/len/start make-disassembly write-disassembly ] with-code-blocks ;
156
157 capstone-disassembler disassembler-backend set-global