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.
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