]> gitweb.factorcode.org Git - factor.git/blob - basis/tools/disassembler/udis/udis.factor
Remove Windows CE from core/ basis/ and build-support/
[factor.git] / basis / tools / disassembler / udis / udis.factor
1 ! Copyright (C) 2008, 2010 Slava Pestov, Jorge Acereda Macia.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: tools.disassembler namespaces combinators alien
4 alien.syntax alien.c-types lexer parser kernel sequences layouts
5 math math.order alien.libraries math.parser system make fry
6 arrays libc destructors tools.memory tools.disassembler.utils
7 tools.disassembler.private splitting alien.data classes.struct ;
8 IN: tools.disassembler.udis
9
10 <<
11 "libudis86" {
12     { [ os macosx? ] [ "libudis86.0.dylib" ] }
13     { [ os unix? ] [ "libudis86.so.0" ] }
14     { [ os windows? ] [ "libudis86.dll" ] }
15 } cond cdecl add-library
16 >>
17
18 LIBRARY: libudis86
19
20 STRUCT: ud_operand
21     { type int }
22     { size uchar }
23     { lval ulonglong }
24     { base int }
25     { index int }
26     { offset uchar }
27     { scale uchar } ;
28
29 STRUCT: ud
30     { inp_hook void* }
31     { inp_curr uchar }
32     { inp_fill uchar }
33     { inp_file void* }
34     { inp_ctr uchar }
35     { inp_buff c-string }
36     { inp_buff_end c-string }
37     { inp_end uchar }
38     { translator void* }
39     { insn_offset ulonglong }
40     { insn_hexcode char[32] }
41     { insn_buffer char[64] }
42     { insn_fill uint }
43     { dis_mode uchar }
44     { pc ulonglong }
45     { vendor uchar }
46     { mapen void* }
47     { mnemonic int }
48     { operand ud_operand[3] }
49     { error uchar }
50     { pfx_rex uchar }
51     { pfx_seg uchar }
52     { pfx_opr uchar }
53     { pfx_adr uchar }
54     { pfx_lock uchar }
55     { pfx_rep uchar }
56     { pfx_repe uchar }
57     { pfx_repne uchar }
58     { pfx_insn uchar }
59     { default64 uchar }
60     { opr_mode uchar }
61     { adr_mode uchar }
62     { br_far uchar }
63     { br_near uchar }
64     { implicit_addr uchar }
65     { c1 uchar }
66     { c2 uchar }
67     { c3 uchar }
68     { inp_cache uchar[256] }
69     { inp_sess uchar[64] }
70     { have_modrm uchar }
71     { modrm uchar }
72     { user_opaque_data void* }
73     { itab_entry void* }
74     { le void* } ;
75
76 FUNCTION: void ud_translate_intel ( ud* u ) ;
77 FUNCTION: void ud_translate_att ( ud* u ) ;
78
79 : UD_SYN_INTEL ( -- addr ) &: ud_translate_intel ; inline
80 : UD_SYN_ATT ( -- addr ) &: ud_translate_att ; inline
81
82 CONSTANT: UD_EOI          -1
83 CONSTANT: UD_INP_CACHE_SZ 32
84 CONSTANT: UD_VENDOR_AMD   0
85 CONSTANT: UD_VENDOR_INTEL 1
86
87 FUNCTION: void ud_init ( ud* u ) ;
88 FUNCTION: void ud_set_mode ( ud* u, uchar mode ) ;
89 FUNCTION: void ud_set_pc ( ud* u, ulonglong pc ) ;
90 FUNCTION: void ud_set_input_buffer ( ud* u, c-string offset, size_t size ) ;
91 FUNCTION: void ud_set_vendor ( ud* u, uint vendor ) ;
92 FUNCTION: void ud_set_syntax ( ud* u, void* syntax ) ;
93 FUNCTION: void ud_input_skip ( ud* u, size_t size ) ;
94 FUNCTION: int ud_input_end ( ud* u ) ;
95 FUNCTION: uint ud_decode ( ud* u ) ;
96 FUNCTION: uint ud_disassemble ( ud* u ) ;
97 FUNCTION: c-string ud_insn_asm ( ud* u ) ;
98 FUNCTION: void* ud_insn_ptr ( ud* u ) ;
99 FUNCTION: ulonglong ud_insn_off ( ud* u ) ;
100 FUNCTION: c-string ud_insn_hex ( ud* u ) ;
101 FUNCTION: uint ud_insn_len ( ud* u ) ;
102 FUNCTION: c-string ud_lookup_mnemonic ( int c ) ;
103
104 : <ud> ( -- ud )
105     ud malloc-struct &free
106     dup ud_init
107     dup cell-bits ud_set_mode
108     dup UD_SYN_INTEL ud_set_syntax ;
109
110 : with-ud ( ..a quot: ( ..a ud -- ..b ) -- ..b )
111     [ [ [ <ud> ] dip call ] with-destructors ] with-code-blocks ; inline
112
113 SINGLETON: udis-disassembler
114
115 : buf/len ( from to -- buf len ) [ drop <alien> ] [ swap - ] 2bi ;
116
117 : resolve-call ( str -- str' ) "0x" split1-last [ resolve-xt append ] when* ;
118
119 : format-disassembly ( lines -- lines' )
120     dup [ second length ] [ max ] map-reduce
121     '[
122         [
123             [ first >hex cell 2 * CHAR: 0 pad-head % ": " % ]
124             [ second _ CHAR: \s pad-tail % "  " % ]
125             [ third resolve-call % ]
126             tri
127         ] "" make
128     ] map ;
129
130 : (disassemble) ( ud -- lines )
131     [
132         dup '[
133             _ ud_disassemble 0 =
134             [ f ] [
135                 _
136                 [ ud_insn_off ]
137                 [ ud_insn_hex ]
138                 [ ud_insn_asm ]
139                 tri 3array , t
140             ] if
141         ] loop
142     ] { } make ;
143
144 M: udis-disassembler disassemble* ( from to -- buffer )
145     '[
146         _ _
147         [ drop ud_set_pc ]
148         [ buf/len ud_set_input_buffer ]
149         [ 2drop (disassemble) format-disassembly ]
150         3tri
151     ] with-ud ;
152
153 udis-disassembler disassembler-backend set-global