metasm 1.0.3 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|