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
92 return _tools.size();92 return _tools.size();
93}93}
94 94
95namespace
96{
97 DEFINE_ENUM_FLAG_OPERATORS(vm_trap_flags_t);
98}
99
100void 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
95opcode_t vm_tool_dispatch_t::on_breakpoint(vm_registers_t &r)111opcode_t vm_tool_dispatch_t::on_breakpoint(vm_registers_t &r)
96{112{
97 opcode_t original_op;113 opcode_t original_op;
@@ -361,6 +377,15 @@ void vm_tool_dispatch_t::resume_all_threads() · 263 unmodified lines
361 _threads_resume.notify_all();377 _threads_resume.notify_all();
362}378}
363 379
380void 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
364std::tuple<opcode_t, cookie_t> vm_tool_dispatch_t::get_original_opcode_and_cookie(const vm_registers_t &r)389std::tuple<opcode_t, cookie_t> vm_tool_dispatch_t::get_original_opcode_and_cookie(const vm_registers_t &r)
365{390{
366 const auto module = r.module_ref->module.get();391 const auto module = r.module_ref->module.get();