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