metasm 1.0.3 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +3 -0
  3. data.tar.gz.sig +0 -0
  4. data/Gemfile +3 -2
  5. data/metasm.gemspec +3 -2
  6. data/metasm.rb +4 -1
  7. data/metasm/compile_c.rb +2 -2
  8. data/metasm/cpu/arc/decode.rb +0 -21
  9. data/metasm/cpu/arc/main.rb +4 -4
  10. data/metasm/cpu/arm/decode.rb +1 -5
  11. data/metasm/cpu/arm/main.rb +3 -3
  12. data/metasm/cpu/arm64/decode.rb +2 -6
  13. data/metasm/cpu/arm64/main.rb +5 -5
  14. data/metasm/cpu/bpf/decode.rb +3 -35
  15. data/metasm/cpu/bpf/main.rb +5 -5
  16. data/metasm/cpu/bpf/render.rb +1 -12
  17. data/metasm/cpu/cy16/decode.rb +0 -6
  18. data/metasm/cpu/cy16/main.rb +3 -3
  19. data/metasm/cpu/cy16/render.rb +0 -11
  20. data/metasm/cpu/dalvik/decode.rb +4 -26
  21. data/metasm/cpu/dalvik/main.rb +20 -2
  22. data/metasm/cpu/dalvik/opcodes.rb +3 -2
  23. data/metasm/cpu/{mips/compile_c.rb → ebpf.rb} +5 -2
  24. data/metasm/cpu/ebpf/debug.rb +61 -0
  25. data/metasm/cpu/ebpf/decode.rb +142 -0
  26. data/metasm/cpu/ebpf/main.rb +58 -0
  27. data/metasm/cpu/ebpf/opcodes.rb +97 -0
  28. data/metasm/cpu/ebpf/render.rb +36 -0
  29. data/metasm/cpu/ia32/debug.rb +39 -1
  30. data/metasm/cpu/ia32/decode.rb +111 -90
  31. data/metasm/cpu/ia32/decompile.rb +45 -37
  32. data/metasm/cpu/ia32/main.rb +10 -0
  33. data/metasm/cpu/ia32/parse.rb +6 -0
  34. data/metasm/cpu/mcs51/decode.rb +1 -1
  35. data/metasm/cpu/mcs51/main.rb +11 -0
  36. data/metasm/cpu/mips/decode.rb +8 -18
  37. data/metasm/cpu/mips/main.rb +3 -3
  38. data/metasm/cpu/mips/opcodes.rb +1 -1
  39. data/metasm/cpu/msp430/decode.rb +2 -6
  40. data/metasm/cpu/msp430/main.rb +3 -3
  41. data/metasm/cpu/openrisc.rb +11 -0
  42. data/metasm/cpu/openrisc/debug.rb +106 -0
  43. data/metasm/cpu/openrisc/decode.rb +182 -0
  44. data/metasm/cpu/openrisc/decompile.rb +350 -0
  45. data/metasm/cpu/openrisc/main.rb +70 -0
  46. data/metasm/cpu/openrisc/opcodes.rb +109 -0
  47. data/metasm/cpu/openrisc/render.rb +37 -0
  48. data/metasm/cpu/ppc/decode.rb +0 -25
  49. data/metasm/cpu/ppc/main.rb +6 -6
  50. data/metasm/cpu/ppc/opcodes.rb +3 -4
  51. data/metasm/cpu/python/decode.rb +0 -20
  52. data/metasm/cpu/python/main.rb +1 -1
  53. data/metasm/cpu/sh4/decode.rb +2 -6
  54. data/metasm/cpu/sh4/main.rb +25 -23
  55. data/metasm/cpu/st20/decode.rb +0 -7
  56. data/metasm/cpu/webasm.rb +11 -0
  57. data/metasm/cpu/webasm/debug.rb +31 -0
  58. data/metasm/cpu/webasm/decode.rb +321 -0
  59. data/metasm/cpu/webasm/decompile.rb +386 -0
  60. data/metasm/cpu/webasm/encode.rb +104 -0
  61. data/metasm/cpu/webasm/main.rb +81 -0
  62. data/metasm/cpu/webasm/opcodes.rb +214 -0
  63. data/metasm/cpu/x86_64/compile_c.rb +13 -9
  64. data/metasm/cpu/x86_64/parse.rb +1 -1
  65. data/metasm/cpu/z80/decode.rb +0 -27
  66. data/metasm/cpu/z80/main.rb +3 -3
  67. data/metasm/cpu/z80/render.rb +0 -11
  68. data/metasm/debug.rb +43 -8
  69. data/metasm/decode.rb +62 -14
  70. data/metasm/decompile.rb +793 -466
  71. data/metasm/disassemble.rb +188 -131
  72. data/metasm/disassemble_api.rb +30 -17
  73. data/metasm/dynldr.rb +2 -2
  74. data/metasm/encode.rb +8 -2
  75. data/metasm/exe_format/autoexe.rb +2 -0
  76. data/metasm/exe_format/coff.rb +21 -3
  77. data/metasm/exe_format/coff_decode.rb +12 -0
  78. data/metasm/exe_format/coff_encode.rb +6 -3
  79. data/metasm/exe_format/dex.rb +13 -3
  80. data/metasm/exe_format/elf.rb +12 -2
  81. data/metasm/exe_format/elf_decode.rb +59 -1
  82. data/metasm/exe_format/main.rb +2 -0
  83. data/metasm/exe_format/mz.rb +1 -0
  84. data/metasm/exe_format/pe.rb +25 -3
  85. data/metasm/exe_format/wasm.rb +402 -0
  86. data/metasm/gui/dasm_decomp.rb +171 -95
  87. data/metasm/gui/dasm_graph.rb +61 -2
  88. data/metasm/gui/dasm_hex.rb +2 -2
  89. data/metasm/gui/dasm_main.rb +45 -19
  90. data/metasm/gui/debug.rb +13 -4
  91. data/metasm/gui/gtk.rb +12 -4
  92. data/metasm/main.rb +108 -103
  93. data/metasm/os/emulator.rb +175 -0
  94. data/metasm/os/main.rb +11 -6
  95. data/metasm/parse.rb +23 -12
  96. data/metasm/parse_c.rb +189 -135
  97. data/metasm/preprocessor.rb +16 -1
  98. data/misc/openrisc-parser.rb +79 -0
  99. data/samples/dasm-plugins/scanxrefs.rb +6 -4
  100. data/samples/dasm-plugins/selfmodify.rb +8 -8
  101. data/samples/dbg-plugins/trace_func.rb +1 -1
  102. data/samples/disassemble-gui.rb +14 -3
  103. data/samples/emubios.rb +251 -0
  104. data/samples/emudbg.rb +127 -0
  105. data/samples/lindebug.rb +79 -78
  106. data/samples/metasm-shell.rb +8 -8
  107. data/tests/all.rb +1 -1
  108. data/tests/expression.rb +2 -0
  109. data/tests/graph_layout.rb +1 -1
  110. data/tests/ia32.rb +1 -0
  111. data/tests/mips.rb +1 -1
  112. data/tests/preprocessor.rb +18 -0
  113. metadata +124 -6
  114. 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
@@ -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
 
@@ -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(orig)
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, orig]
98
+ Indirection[Expression[b, :+, o].reduce, 4, (di.address if di)]
99
99
  end
100
100
 
101
101
  include Renderable
@@ -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
- # conditionnal
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
@@ -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
 
@@ -25,7 +25,7 @@ class Python < CPU
25
25
  o.class == self.class and o.i == i
26
26
  end
27
27
 
28
- def symbolic; "var_#{@i}".to_sym end
28
+ def symbolic(di=nil); "var_#{@i}".to_sym end
29
29
 
30
30
  def render
31
31
  ["var_#@i"]
@@ -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.address, di.opcode.props[:memsz]/8)
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.address, 4)
331
+ when Memref; arg.symbolic(di)
336
332
  else val
337
333
  end
338
334
 
@@ -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(orig=nil, sz=32)
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, orig]
272
+ Indirection[e, sz, (di.address if di)]
271
273
  end
272
274
 
273
275
  include Renderable
@@ -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