History

Add support for traps in VM Add instruction trap to enable single step scenario in debugger Remote get_state() function from thread

arr committed 9 years ago

Commit cb408a11 parent eb570d98 files · +120 −40Browse files

Showing the changes to src/vm/tool_dispatch.cpp (1 of 8 files). Show all

Unified · Split

src/vm/tool_dispatch.cpp+25−0
@@ -92,6 +92,22 @@ std::size_t vm_tool_dispatch_t::unload_tool(std::size_t tool_id) · 91 unmodified lines
9292 return _tools.size();
9393 }
9494
95+namespace
96+{
97+ DEFINE_ENUM_FLAG_OPERATORS(vm_trap_flags_t);
98+}
99+
100+void vm_tool_dispatch_t::on_trap(vm_registers_t &r, vm_trap_flags_t f)
101+{
102+ vm_event_context_t cxt{};
103+ cxt.value1.registers = &r;
104+ cxt.value2.trap = f;
105+
106+ // Clear the trap flag
107+ r.trap_flags &= ~f;
108+ _events.fire_event_callbacks(vm_event_t::trap, cxt);
109+}
110+
95111 opcode_t vm_tool_dispatch_t::on_breakpoint(vm_registers_t &r)
96112 {
97113 opcode_t original_op;
@@ -361,6 +377,15 @@ void vm_tool_dispatch_t::resume_all_threads() · 263 unmodified lines
361377 _threads_resume.notify_all();
362378 }
363379
380+void vm_tool_dispatch_t::set_thread_trap_flag(const vm_registers_t &r, vm_trap_flags_t flag)
381+{
382+ std::lock_guard<std::mutex> suspend_lock{ _threads_resume_lock };
383+ if (!_threads_suspended)
384+ throw vm_system_exception{ "Unable to set thread trap flag while threads are not suspended" };
385+
386+ const_cast<vm_trap_flags_t &>(r.trap_flags) |= flag;
387+}
388+
364389 std::tuple<opcode_t, cookie_t> vm_tool_dispatch_t::get_original_opcode_and_cookie(const vm_registers_t &r)
365390 {
366391 const auto module = r.module_ref->module.get();