metasm 1.0.3 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +3 -0
- data.tar.gz.sig +0 -0
- data/Gemfile +3 -2
- data/metasm.gemspec +3 -2
- data/metasm.rb +4 -1
- data/metasm/compile_c.rb +2 -2
- data/metasm/cpu/arc/decode.rb +0 -21
- data/metasm/cpu/arc/main.rb +4 -4
- data/metasm/cpu/arm/decode.rb +1 -5
- data/metasm/cpu/arm/main.rb +3 -3
- data/metasm/cpu/arm64/decode.rb +2 -6
- data/metasm/cpu/arm64/main.rb +5 -5
- data/metasm/cpu/bpf/decode.rb +3 -35
- data/metasm/cpu/bpf/main.rb +5 -5
- data/metasm/cpu/bpf/render.rb +1 -12
- data/metasm/cpu/cy16/decode.rb +0 -6
- data/metasm/cpu/cy16/main.rb +3 -3
- data/metasm/cpu/cy16/render.rb +0 -11
- data/metasm/cpu/dalvik/decode.rb +4 -26
- data/metasm/cpu/dalvik/main.rb +20 -2
- data/metasm/cpu/dalvik/opcodes.rb +3 -2
- data/metasm/cpu/{mips/compile_c.rb → ebpf.rb} +5 -2
- data/metasm/cpu/ebpf/debug.rb +61 -0
- data/metasm/cpu/ebpf/decode.rb +142 -0
- data/metasm/cpu/ebpf/main.rb +58 -0
- data/metasm/cpu/ebpf/opcodes.rb +97 -0
- data/metasm/cpu/ebpf/render.rb +36 -0
- data/metasm/cpu/ia32/debug.rb +39 -1
- data/metasm/cpu/ia32/decode.rb +111 -90
- data/metasm/cpu/ia32/decompile.rb +45 -37
- data/metasm/cpu/ia32/main.rb +10 -0
- data/metasm/cpu/ia32/parse.rb +6 -0
- data/metasm/cpu/mcs51/decode.rb +1 -1
- data/metasm/cpu/mcs51/main.rb +11 -0
- data/metasm/cpu/mips/decode.rb +8 -18
- data/metasm/cpu/mips/main.rb +3 -3
- data/metasm/cpu/mips/opcodes.rb +1 -1
- data/metasm/cpu/msp430/decode.rb +2 -6
- data/metasm/cpu/msp430/main.rb +3 -3
- data/metasm/cpu/openrisc.rb +11 -0
- data/metasm/cpu/openrisc/debug.rb +106 -0
- data/metasm/cpu/openrisc/decode.rb +182 -0
- data/metasm/cpu/openrisc/decompile.rb +350 -0
- data/metasm/cpu/openrisc/main.rb +70 -0
- data/metasm/cpu/openrisc/opcodes.rb +109 -0
- data/metasm/cpu/openrisc/render.rb +37 -0
- data/metasm/cpu/ppc/decode.rb +0 -25
- data/metasm/cpu/ppc/main.rb +6 -6
- data/metasm/cpu/ppc/opcodes.rb +3 -4
- data/metasm/cpu/python/decode.rb +0 -20
- data/metasm/cpu/python/main.rb +1 -1
- data/metasm/cpu/sh4/decode.rb +2 -6
- data/metasm/cpu/sh4/main.rb +25 -23
- data/metasm/cpu/st20/decode.rb +0 -7
- data/metasm/cpu/webasm.rb +11 -0
- data/metasm/cpu/webasm/debug.rb +31 -0
- data/metasm/cpu/webasm/decode.rb +321 -0
- data/metasm/cpu/webasm/decompile.rb +386 -0
- data/metasm/cpu/webasm/encode.rb +104 -0
- data/metasm/cpu/webasm/main.rb +81 -0
- data/metasm/cpu/webasm/opcodes.rb +214 -0
- data/metasm/cpu/x86_64/compile_c.rb +13 -9
- data/metasm/cpu/x86_64/parse.rb +1 -1
- data/metasm/cpu/z80/decode.rb +0 -27
- data/metasm/cpu/z80/main.rb +3 -3
- data/metasm/cpu/z80/render.rb +0 -11
- data/metasm/debug.rb +43 -8
- data/metasm/decode.rb +62 -14
- data/metasm/decompile.rb +793 -466
- data/metasm/disassemble.rb +188 -131
- data/metasm/disassemble_api.rb +30 -17
- data/metasm/dynldr.rb +2 -2
- data/metasm/encode.rb +8 -2
- data/metasm/exe_format/autoexe.rb +2 -0
- data/metasm/exe_format/coff.rb +21 -3
- data/metasm/exe_format/coff_decode.rb +12 -0
- data/metasm/exe_format/coff_encode.rb +6 -3
- data/metasm/exe_format/dex.rb +13 -3
- data/metasm/exe_format/elf.rb +12 -2
- data/metasm/exe_format/elf_decode.rb +59 -1
- data/metasm/exe_format/main.rb +2 -0
- data/metasm/exe_format/mz.rb +1 -0
- data/metasm/exe_format/pe.rb +25 -3
- data/metasm/exe_format/wasm.rb +402 -0
- data/metasm/gui/dasm_decomp.rb +171 -95
- data/metasm/gui/dasm_graph.rb +61 -2
- data/metasm/gui/dasm_hex.rb +2 -2
- data/metasm/gui/dasm_main.rb +45 -19
- data/metasm/gui/debug.rb +13 -4
- data/metasm/gui/gtk.rb +12 -4
- data/metasm/main.rb +108 -103
- data/metasm/os/emulator.rb +175 -0
- data/metasm/os/main.rb +11 -6
- data/metasm/parse.rb +23 -12
- data/metasm/parse_c.rb +189 -135
- data/metasm/preprocessor.rb +16 -1
- data/misc/openrisc-parser.rb +79 -0
- data/samples/dasm-plugins/scanxrefs.rb +6 -4
- data/samples/dasm-plugins/selfmodify.rb +8 -8
- data/samples/dbg-plugins/trace_func.rb +1 -1
- data/samples/disassemble-gui.rb +14 -3
- data/samples/emubios.rb +251 -0
- data/samples/emudbg.rb +127 -0
- data/samples/lindebug.rb +79 -78
- data/samples/metasm-shell.rb +8 -8
- data/tests/all.rb +1 -1
- data/tests/expression.rb +2 -0
- data/tests/graph_layout.rb +1 -1
- data/tests/ia32.rb +1 -0
- data/tests/mips.rb +1 -1
- data/tests/preprocessor.rb +18 -0
- metadata +124 -6
- metadata.gz.sig +0 -0
@@ -0,0 +1,37 @@
|
|
1
|
+
# This file is part of Metasm, the Ruby assembly manipulation suite
|
2
|
+
# Copyright (C) 2006-2009 Yoann GUILLOT
|
3
|
+
#
|
4
|
+
# Licence is LGPL, see LICENCE in the top-level directory
|
5
|
+
|
6
|
+
|
7
|
+
require 'metasm/cpu/openrisc/opcodes'
|
8
|
+
require 'metasm/render'
|
9
|
+
|
10
|
+
module Metasm
|
11
|
+
class OpenRisc
|
12
|
+
class Reg
|
13
|
+
include Renderable
|
14
|
+
def render ; ["r#@v"] end
|
15
|
+
end
|
16
|
+
|
17
|
+
class FpReg
|
18
|
+
include Renderable
|
19
|
+
def render ; ["f#@v"] end
|
20
|
+
end
|
21
|
+
|
22
|
+
class Memref
|
23
|
+
include Renderable
|
24
|
+
def render
|
25
|
+
off = @offset
|
26
|
+
off = nil if off == Expression[0]
|
27
|
+
r = []
|
28
|
+
r << { 1 => 'byte ', 2 => 'word ', 4 => 'dword ', 8 => 'qword ' }[@msz]
|
29
|
+
r << '['
|
30
|
+
r << @base if @base
|
31
|
+
r << '+' if @base and off
|
32
|
+
r << off if off
|
33
|
+
r << ']'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/metasm/cpu/ppc/decode.rb
CHANGED
@@ -176,12 +176,6 @@ class PowerPC
|
|
176
176
|
df
|
177
177
|
end
|
178
178
|
|
179
|
-
# hash opname => lambda { |di, *sym_args| binding }
|
180
|
-
def backtrace_binding
|
181
|
-
@backtrace_binding ||= init_backtrace_binding
|
182
|
-
end
|
183
|
-
def backtrace_binding=(b) @backtrace_binding = b end
|
184
|
-
|
185
179
|
def init_backtrace_binding
|
186
180
|
@backtrace_binding ||= {}
|
187
181
|
opcode_list.map { |ol| ol.name }.uniq.each { |op|
|
@@ -231,25 +225,6 @@ class PowerPC
|
|
231
225
|
@backtrace_binding
|
232
226
|
end
|
233
227
|
|
234
|
-
def get_backtrace_binding(di)
|
235
|
-
a = di.instruction.args.map { |arg|
|
236
|
-
case arg
|
237
|
-
when Memref; arg.symbolic(di.address)
|
238
|
-
when Reg; arg.symbolic
|
239
|
-
else arg
|
240
|
-
end
|
241
|
-
}
|
242
|
-
|
243
|
-
binding = if binding = backtrace_binding[di.instruction.opname]
|
244
|
-
binding[di, *a]
|
245
|
-
else
|
246
|
-
puts "unknown instruction to emu #{di}" if $VERBOSE
|
247
|
-
{}
|
248
|
-
end
|
249
|
-
|
250
|
-
binding
|
251
|
-
end
|
252
|
-
|
253
228
|
def get_xrefs_x(dasm, di)
|
254
229
|
return [] if not di.opcode.props[:setip]
|
255
230
|
|
data/metasm/cpu/ppc/main.rb
CHANGED
@@ -32,7 +32,7 @@ class PowerPC < CPU
|
|
32
32
|
@s_to_i = (0..31).inject({}) { |h, i| h.update((i == 1 ? 'sp' : "r#{i}") => i) }
|
33
33
|
@i_to_s = @s_to_i.invert
|
34
34
|
Sym = @s_to_i.sort.transpose.last
|
35
|
-
def symbolic ; Sym[@i] end
|
35
|
+
def symbolic(di=nil) ; Sym[@i] end
|
36
36
|
end
|
37
37
|
|
38
38
|
# special purpose reg
|
@@ -47,7 +47,7 @@ class PowerPC < CPU
|
|
47
47
|
end
|
48
48
|
|
49
49
|
Sym = @i_to_s.sort.inject({}) { |h, (k, v)| h.update k => v.to_sym }
|
50
|
-
def symbolic ; Sym[@i] end
|
50
|
+
def symbolic(di=nil) ; Sym[@i] end
|
51
51
|
def render ; [self.class.i_to_s[@i] || "spr#@i"] end
|
52
52
|
end
|
53
53
|
|
@@ -65,7 +65,7 @@ class PowerPC < CPU
|
|
65
65
|
|
66
66
|
# machine state reg
|
67
67
|
class MSR < Reg
|
68
|
-
def symbolic ; :msr end
|
68
|
+
def symbolic(di=nil) ; :msr end
|
69
69
|
def render ; ['msr'] end
|
70
70
|
end
|
71
71
|
|
@@ -79,7 +79,7 @@ class PowerPC < CPU
|
|
79
79
|
@s_to_i = (0..31).inject({}) { |h, i| h.update "cr#{i}" => i }
|
80
80
|
@i_to_s = @s_to_i.invert
|
81
81
|
Sym = @s_to_i.sort.transpose.last
|
82
|
-
def symbolic ; "cr#@i".to_sym end
|
82
|
+
def symbolic(di=nil) ; "cr#@i".to_sym end
|
83
83
|
end
|
84
84
|
|
85
85
|
# indirection : reg+reg or reg+16b_off
|
@@ -90,12 +90,12 @@ class PowerPC < CPU
|
|
90
90
|
@base, @offset = base, offset
|
91
91
|
end
|
92
92
|
|
93
|
-
def symbolic(
|
93
|
+
def symbolic(di=nil)
|
94
94
|
b = @base.symbolic
|
95
95
|
b = nil if b == :r0 # XXX is it true ?
|
96
96
|
o = @offset
|
97
97
|
o = o.symbolic if o.kind_of?(Reg)
|
98
|
-
Indirection[Expression[b, :+, o].reduce, 4,
|
98
|
+
Indirection[Expression[b, :+, o].reduce, 4, (di.address if di)]
|
99
99
|
end
|
100
100
|
|
101
101
|
include Renderable
|
data/metasm/cpu/ppc/opcodes.rb
CHANGED
@@ -39,7 +39,7 @@ class PowerPC
|
|
39
39
|
addop_branch(nbase+'dz', bin|(0b10010<<21), :ign_bo_at2, :stopexec, *argprops) if not argprops.include? :ctr
|
40
40
|
addop_branch(nbase+'dnz', bin|(0b10000<<21), :ign_bo_at2, :stopexec, *argprops) if not argprops.include? :ctr
|
41
41
|
|
42
|
-
#
|
42
|
+
# conditional
|
43
43
|
%w[lt gt eq so].each_with_index { |cd, i|
|
44
44
|
ncd = {'lt' => 'gte', 'gt' => 'lte', 'eq' => 'ne', 'so' => 'nso'}[cd]
|
45
45
|
addop_branch(nbase+cd, bin|(0b1100<<21)|(i<<16), :ign_bo_at, *argprops)
|
@@ -116,14 +116,13 @@ class PowerPC
|
|
116
116
|
:tbr => 0x3FF, :th => 15, :to => 31, :u => 15, :ui => 0xFFFF,
|
117
117
|
:ign_bo_zzz => 0b101111111, :ign_bo_z => 1, :ign_bo_at => 3, :ign_bo_at2 => 0b100111111
|
118
118
|
|
119
|
-
@valid_args = @fields_mask.dup
|
120
|
-
[:ign_bo_zzz, :ign_bo_z, :ign_bo_at, :ign_bo_at2, :aa, :lk, :oe, :rc, :l].each { |k| @valid_args.delete k }
|
121
|
-
|
122
119
|
@fields_shift[:ra_i16] = @fields_shift[:ra_i16s] = @fields_shift[:ra_i16q] = 0
|
123
120
|
@fields_mask[:ra_i16] = (@fields_mask[:d] << @fields_shift[:d]) | (@fields_mask[:ra] << @fields_shift[:ra])
|
124
121
|
@fields_mask[:ra_i16s] = (@fields_mask[:ds] << @fields_shift[:d]) | (@fields_mask[:ra] << @fields_shift[:ra])
|
125
122
|
@fields_mask[:ra_i16q] = (@fields_mask[:dq] << @fields_shift[:d]) | (@fields_mask[:ra] << @fields_shift[:ra])
|
126
123
|
|
124
|
+
@valid_args = @fields_mask.dup
|
125
|
+
[:ign_bo_zzz, :ign_bo_z, :ign_bo_at, :ign_bo_at2, :aa, :lk, :oe, :rc, :l].each { |k| @valid_args.delete k }
|
127
126
|
|
128
127
|
addop_branch 'b', 0x48000000, :li, :stopexec
|
129
128
|
addop_branchcond 'b', 0x40000000, :bd
|
data/metasm/cpu/python/decode.rb
CHANGED
@@ -66,10 +66,6 @@ class Python
|
|
66
66
|
di
|
67
67
|
end
|
68
68
|
|
69
|
-
def backtrace_binding
|
70
|
-
@backtrace_binding ||= init_backtrace_binding
|
71
|
-
end
|
72
|
-
|
73
69
|
def init_backtrace_binding
|
74
70
|
@backtrace_binding ||= {}
|
75
71
|
|
@@ -83,22 +79,6 @@ class Python
|
|
83
79
|
@backtrace_binding
|
84
80
|
end
|
85
81
|
|
86
|
-
def get_backtrace_binding(di)
|
87
|
-
a = di.instruction.args.map { |arg|
|
88
|
-
case arg
|
89
|
-
when Var; arg.symbolic
|
90
|
-
else arg
|
91
|
-
end
|
92
|
-
}
|
93
|
-
|
94
|
-
if binding = backtrace_binding[di.opcode.basename]
|
95
|
-
binding[di, *a]
|
96
|
-
else
|
97
|
-
puts "unhandled instruction to backtrace: #{di}" if $VERBOSE
|
98
|
-
{ :incomplete_binding => Expression[1] }
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
82
|
def get_xrefs_x(dasm, di)
|
103
83
|
return [] if not di.opcode.props[:setip]
|
104
84
|
|
data/metasm/cpu/python/main.rb
CHANGED
data/metasm/cpu/sh4/decode.rb
CHANGED
@@ -197,10 +197,6 @@ class Sh4
|
|
197
197
|
end
|
198
198
|
end
|
199
199
|
|
200
|
-
def backtrace_binding
|
201
|
-
@backtrace_binding ||= init_backtrace_binding
|
202
|
-
end
|
203
|
-
|
204
200
|
def opsz(di)
|
205
201
|
ret = @size
|
206
202
|
ret = 8 if di and di.opcode.name =~ /\.b/
|
@@ -298,7 +294,7 @@ class Sh4
|
|
298
294
|
when GPR, XFR, XDR, FVR, DR, FR, XMTRX; arg.symbolic
|
299
295
|
when MACH, MACL, PR, FPUL, PC, FPSCR; arg.symbolic
|
300
296
|
when SR, SSR, SPC, GBR, VBR, SGR, DBR; arg.symbolic
|
301
|
-
when Memref; arg.symbolic(di
|
297
|
+
when Memref; arg.symbolic(di)
|
302
298
|
else arg
|
303
299
|
end
|
304
300
|
}
|
@@ -332,7 +328,7 @@ class Sh4
|
|
332
328
|
|
333
329
|
val = case val
|
334
330
|
when Reg; val.symbolic
|
335
|
-
when Memref; arg.symbolic(di
|
331
|
+
when Memref; arg.symbolic(di)
|
336
332
|
else val
|
337
333
|
end
|
338
334
|
|
data/metasm/cpu/sh4/main.rb
CHANGED
@@ -48,7 +48,7 @@ class Sh4 < CPU
|
|
48
48
|
def initialize(i); @i = i end
|
49
49
|
Sym = (0..15).map { |i| "r#{i}".to_sym }
|
50
50
|
|
51
|
-
def symbolic ; Sym[@i] end
|
51
|
+
def symbolic(di=nil) ; Sym[@i] end
|
52
52
|
|
53
53
|
def render ; ["r#@i"] end
|
54
54
|
end
|
@@ -59,7 +59,7 @@ class Sh4 < CPU
|
|
59
59
|
def initialize(i); @i = i end
|
60
60
|
Sym = (0..7).map { |i| "r#{i}_bank".to_sym }
|
61
61
|
|
62
|
-
def symbolic ; Sym[@i] end
|
62
|
+
def symbolic(di=nil) ; Sym[@i] end
|
63
63
|
|
64
64
|
def render ; ["r#{@i}_bank"] end
|
65
65
|
end
|
@@ -71,7 +71,7 @@ class Sh4 < CPU
|
|
71
71
|
def initialize(i); @i = i end
|
72
72
|
Sym = (0..15).map { |i| "fr#{i}".to_sym }
|
73
73
|
|
74
|
-
def symbolic ; Sym[@i] end
|
74
|
+
def symbolic(di=nil) ; Sym[@i] end
|
75
75
|
|
76
76
|
def render ; ["fr#@i"] end
|
77
77
|
end
|
@@ -91,7 +91,7 @@ class Sh4 < CPU
|
|
91
91
|
def initialize(i); @i = i end
|
92
92
|
Sym = (0..7).map { |i| "dr#{i*2}".to_sym }
|
93
93
|
|
94
|
-
def symbolic ; Sym[@i/2] end
|
94
|
+
def symbolic(di=nil) ; Sym[@i/2] end
|
95
95
|
|
96
96
|
def render ; ["dr#@i"] end
|
97
97
|
end
|
@@ -107,7 +107,7 @@ class Sh4 < CPU
|
|
107
107
|
def initialize(i); @i = i end
|
108
108
|
Sym = (0..3).map { |i| "fv#{i*4}".to_sym }
|
109
109
|
|
110
|
-
def symbolic ; Sym[@i/4] end
|
110
|
+
def symbolic(di=nil) ; Sym[@i/4] end
|
111
111
|
|
112
112
|
def render ; ["fv#@i"] end
|
113
113
|
end
|
@@ -119,7 +119,7 @@ class Sh4 < CPU
|
|
119
119
|
def initialize(i); @i = i end
|
120
120
|
Sym = (0..15).map { |i| "xf#{i}".to_sym }
|
121
121
|
|
122
|
-
def symbolic ; Sym[@i] end
|
122
|
+
def symbolic(di=nil) ; Sym[@i] end
|
123
123
|
|
124
124
|
def render ; ["xf#@i"] end
|
125
125
|
end
|
@@ -139,14 +139,14 @@ class Sh4 < CPU
|
|
139
139
|
def initialize(i); @i = i end
|
140
140
|
Sym = (0..7).map { |i| "xd#{i*2}".to_sym }
|
141
141
|
|
142
|
-
def symbolic ; Sym[@i/2] end
|
142
|
+
def symbolic(di=nil) ; Sym[@i/2] end
|
143
143
|
|
144
144
|
def render ; ["xd#@i"] end
|
145
145
|
end
|
146
146
|
|
147
147
|
# Single-precision floating-point extended register matrix
|
148
148
|
class XMTRX < Reg
|
149
|
-
def symbolic ; :xmtrx ; end
|
149
|
+
def symbolic(di=nil) ; :xmtrx ; end
|
150
150
|
def render ; ['xmtrx'] ; end
|
151
151
|
end
|
152
152
|
|
@@ -154,42 +154,42 @@ class Sh4 < CPU
|
|
154
154
|
# Multiply-and-accumulate register high
|
155
155
|
class MACH < Reg
|
156
156
|
|
157
|
-
def symbolic ; :mach end
|
157
|
+
def symbolic(di=nil) ; :mach end
|
158
158
|
def render ; ['mach'] end
|
159
159
|
end
|
160
160
|
|
161
161
|
# Multiply-and-accumulate register low
|
162
162
|
class MACL < Reg
|
163
163
|
|
164
|
-
def symbolic ; :macl end
|
164
|
+
def symbolic(di=nil) ; :macl end
|
165
165
|
def render ; ['macl'] end
|
166
166
|
end
|
167
167
|
|
168
168
|
# Procedure register
|
169
169
|
class PR < Reg
|
170
170
|
|
171
|
-
def symbolic ; :pr end
|
171
|
+
def symbolic(di=nil) ; :pr end
|
172
172
|
def render ; ['pr'] end
|
173
173
|
end
|
174
174
|
|
175
175
|
# Floating-point communication register
|
176
176
|
class FPUL < Reg
|
177
177
|
|
178
|
-
def symbolic ; :fpul end
|
178
|
+
def symbolic(di=nil) ; :fpul end
|
179
179
|
def render ; ['fpul'] end
|
180
180
|
end
|
181
181
|
|
182
182
|
# Program counter
|
183
183
|
class PC < Reg
|
184
184
|
|
185
|
-
def symbolic ; :pc end
|
185
|
+
def symbolic(di=nil) ; :pc end
|
186
186
|
def render ; ['pc'] end
|
187
187
|
end
|
188
188
|
|
189
189
|
# Floating-point status/control register
|
190
190
|
class FPSCR < Reg
|
191
191
|
|
192
|
-
def symbolic ; :fpscr end
|
192
|
+
def symbolic(di=nil) ; :fpscr end
|
193
193
|
def render ; ['fpscr'] end
|
194
194
|
end
|
195
195
|
|
@@ -198,49 +198,49 @@ class Sh4 < CPU
|
|
198
198
|
# Status register
|
199
199
|
class SR < Reg
|
200
200
|
|
201
|
-
def symbolic ; :sr end
|
201
|
+
def symbolic(di=nil) ; :sr end
|
202
202
|
def render ; ['sr'] end
|
203
203
|
end
|
204
204
|
|
205
205
|
# Saved status register
|
206
206
|
class SSR < Reg
|
207
207
|
|
208
|
-
def symbolic ; :ssr end
|
208
|
+
def symbolic(di=nil) ; :ssr end
|
209
209
|
def render ; ['ssr'] end
|
210
210
|
end
|
211
211
|
|
212
212
|
# Saved program counter
|
213
213
|
class SPC < Reg
|
214
214
|
|
215
|
-
def symbolic ; :spc end
|
215
|
+
def symbolic(di=nil) ; :spc end
|
216
216
|
def render ; ['spc'] end
|
217
217
|
end
|
218
218
|
|
219
219
|
# Global base register
|
220
220
|
class GBR < Reg
|
221
221
|
|
222
|
-
def symbolic ; :spc end
|
222
|
+
def symbolic(di=nil) ; :spc end
|
223
223
|
def render ; ['gbr'] end
|
224
224
|
end
|
225
225
|
|
226
226
|
# Vector base register
|
227
227
|
class VBR < Reg
|
228
228
|
|
229
|
-
def symbolic ; :spc end
|
229
|
+
def symbolic(di=nil) ; :spc end
|
230
230
|
def render ; ['vbr'] end
|
231
231
|
end
|
232
232
|
|
233
233
|
# Saved general register
|
234
234
|
class SGR < Reg
|
235
235
|
|
236
|
-
def symbolic ; :sgr end
|
236
|
+
def symbolic(di=nil) ; :sgr end
|
237
237
|
def render ; ['sgr'] end
|
238
238
|
end
|
239
239
|
|
240
240
|
# Debug base register
|
241
241
|
class DBR < Reg
|
242
242
|
|
243
|
-
def symbolic ; :dbr end
|
243
|
+
def symbolic(di=nil) ; :dbr end
|
244
244
|
def render ; ['dbr'] end
|
245
245
|
end
|
246
246
|
|
@@ -253,7 +253,9 @@ class Sh4 < CPU
|
|
253
253
|
@base, @disp, @action = base, offset, action
|
254
254
|
end
|
255
255
|
|
256
|
-
def symbolic(
|
256
|
+
def symbolic(di=nil)
|
257
|
+
sz = 32
|
258
|
+
sz = di.opcode.props[:memsz] if di
|
257
259
|
b = @base
|
258
260
|
b = b.symbolic if b.kind_of? Reg
|
259
261
|
|
@@ -267,7 +269,7 @@ class Sh4 < CPU
|
|
267
269
|
e = Expression[b].reduce
|
268
270
|
end
|
269
271
|
|
270
|
-
Indirection[e, sz,
|
272
|
+
Indirection[e, sz, (di.address if di)]
|
271
273
|
end
|
272
274
|
|
273
275
|
include Renderable
|
data/metasm/cpu/st20/decode.rb
CHANGED
@@ -169,12 +169,5 @@ class ST20
|
|
169
169
|
def backtrace_is_stack_address(expr)
|
170
170
|
Expression[expr].expr_externals.include?(:sp)
|
171
171
|
end
|
172
|
-
|
173
|
-
# updates an instruction's argument replacing an expression with another (eg label renamed)
|
174
|
-
def replace_instr_arg_immediate(i, old, new)
|
175
|
-
i.args.map! { |a|
|
176
|
-
a == old ? new : Expression[a.bind(old => new).reduce]
|
177
|
-
}
|
178
|
-
end
|
179
172
|
end
|
180
173
|
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# This file is part of Metasm, the Ruby assembly manipulation suite
|
2
|
+
# Copyright (C) 2006-2009 Yoann GUILLOT
|
3
|
+
#
|
4
|
+
# Licence is LGPL, see LICENCE in the top-level directory
|
5
|
+
|
6
|
+
|
7
|
+
require 'metasm/main'
|
8
|
+
require 'metasm/cpu/webasm/decode'
|
9
|
+
require 'metasm/cpu/webasm/encode'
|
10
|
+
require 'metasm/cpu/webasm/decompile'
|
11
|
+
require 'metasm/cpu/webasm/debug'
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# This file is part of Metasm, the Ruby assembly manipulation suite
|
2
|
+
# Copyright (C) 2006-2009 Yoann GUILLOT
|
3
|
+
#
|
4
|
+
# Licence is LGPL, see LICENCE in the top-level directory
|
5
|
+
|
6
|
+
|
7
|
+
require 'metasm/cpu/webasm/opcodes'
|
8
|
+
|
9
|
+
module Metasm
|
10
|
+
class WebAsm
|
11
|
+
def dbg_register_list
|
12
|
+
@dbg_register_list ||= [:pc, :opstack, :mem, :local_base]
|
13
|
+
end
|
14
|
+
|
15
|
+
def dbg_resolve_pc(di, fbd, pc_reg, dbg_ctx)
|
16
|
+
case di.opcode.name
|
17
|
+
when 'br_if', 'if'
|
18
|
+
if dbg_ctx.resolve(Indirection[:opstack, 8]) != 0
|
19
|
+
fbd[pc_reg] = (di.opcode.name == 'if' ? di.next_addr : di.misc[:x])
|
20
|
+
else
|
21
|
+
fbd[pc_reg] = (di.opcode.name == 'if' ? di.misc[:x] : di.next_addr)
|
22
|
+
end
|
23
|
+
else return super(di, fbd, pc_reg, dbg_ctx)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def dbg_end_stepout(dbg, addr, di)
|
28
|
+
di and di.opcode.props[:stopexec] and (di.opcode.name == 'return' or di.opcode.name == 'end')
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|