metasm/cpu/bpf/decode.rb in metasm-1.0.3 vs metasm/cpu/bpf/decode.rb in metasm-1.0.4

- old
+ new

@@ -31,13 +31,13 @@ di.instruction.args << case a when :k; Expression[k] when :x; Reg.new(:x) when :a; Reg.new(:a) when :len; Reg.new(:len) - when :p_k; PktRef.new(nil, Expression[k], op.props[:msz]) - when :p_xk; PktRef.new(Reg.new(:x), Expression[k], op.props[:msz]) - when :m_k; MemRef.new(nil, Expression[4*k], 4) + when :p_k; Pktref.new(nil, Expression[k], op.props[:msz]) + when :p_xk; Pktref.new(Reg.new(:x), Expression[k], op.props[:msz]) + when :m_k; Memref.new(nil, Expression[4*k], 4) when :jt; Expression[jt] when :jf; Expression[jf] else raise "unhandled arg #{a}" end } @@ -72,16 +72,10 @@ end di end - # hash opcode_name => lambda { |dasm, di, *symbolic_args| instr_binding } - def backtrace_binding - @backtrace_binding ||= init_backtrace_binding - end - def backtrace_binding=(b) @backtrace_binding = b end - # populate the @backtrace_binding hash with default values def init_backtrace_binding @backtrace_binding ||= {} opcode_list.map { |ol| ol.basename }.uniq.sort.each { |op| @@ -101,42 +95,16 @@ } @backtrace_binding end - def get_backtrace_binding(di) - a = di.instruction.args.map { |arg| - case arg - when PktRef, MemRef, Reg; arg.symbolic(di) - else arg - end - } - - if binding = backtrace_binding[di.opcode.name] - binding[di, *a] - else - puts "unhandled instruction to backtrace: #{di}" if $VERBOSE - {:incomplete_binding => Expression[1]} - end - end - def get_xrefs_x(dasm, di) return [] if not di.opcode.props[:setip] if di.instruction.args.length == 4 di.instruction.args[-2, 2] else di.instruction.args[-1, 1] end - end - - # updates an instruction's argument replacing an expression with another (eg label renamed) - def replace_instr_arg_immediate(i, old, new) - i.args.map! { |a| - case a - when Expression; a == old ? new : Expression[a.bind(old => new).reduce] - else a - end - } end end end