1
0
Fork 0
mirror of https://github.com/Atmosphere-NX/Atmosphere.git synced 2024-12-21 01:42:12 +00:00

dmnt: use hardware single step extension if available

This commit is contained in:
Michael Scire 2021-07-27 05:34:51 -07:00
parent ae91a32059
commit 6139b7d5ac
2 changed files with 28 additions and 17 deletions

View file

@ -273,6 +273,10 @@ namespace ams::dmnt {
/* Note that we're stepping. */ /* Note that we're stepping. */
m_stepping = true; m_stepping = true;
if (m_use_hardware_single_step) {
/* Set thread single step. */
R_TRY(this->SetThreadContext(std::addressof(ctx), thread_id, svc::ThreadContextFlag_SetSingleStep));
} else {
/* Determine where we're stepping to. */ /* Determine where we're stepping to. */
u64 current_pc = ctx.pc; u64 current_pc = ctx.pc;
u64 step_target = 0; u64 step_target = 0;
@ -292,6 +296,8 @@ namespace ams::dmnt {
} }
bp_guard.Cancel(); bp_guard.Cancel();
}
return ResultSuccess(); return ResultSuccess();
} }

View file

@ -52,6 +52,7 @@ namespace ams::dmnt {
u64 m_continue_thread_id{}; u64 m_continue_thread_id{};
GdbSignal m_last_signal{}; GdbSignal m_last_signal{};
bool m_stepping{false}; bool m_stepping{false};
bool m_use_hardware_single_step{false};
bool m_thread_valid[ThreadCountMax]{}; bool m_thread_valid[ThreadCountMax]{};
u64 m_thread_ids[ThreadCountMax]{}; u64 m_thread_ids[ThreadCountMax]{};
osdbg::ThreadInfo m_thread_infos[ThreadCountMax]{}; osdbg::ThreadInfo m_thread_infos[ThreadCountMax]{};
@ -64,8 +65,12 @@ namespace ams::dmnt {
size_t m_module_count{}; size_t m_module_count{};
size_t m_main_module{}; size_t m_main_module{};
public: public:
/* TODO: ifdef for hardware breakpoints. */ DebugProcess() : m_software_breakpoints(this), m_hardware_breakpoints(this), m_hardware_watchpoints(this), m_step_breakpoints(m_software_breakpoints) {
DebugProcess() : m_software_breakpoints(this), m_hardware_breakpoints(this), m_hardware_watchpoints(this), m_step_breakpoints(m_software_breakpoints) { /* ... */ } if (svc::IsKernelMesosphere()) {
uint64_t value = 0;
m_use_hardware_single_step = R_SUCCEEDED(::ams::svc::GetInfo(std::addressof(value), ::ams::svc::InfoType_MesosphereMeta, ::ams::svc::InvalidHandle, ::ams::svc::MesosphereMetaInfo_IsSingleStepEnabled)) && value != 0;
}
}
~DebugProcess() { this->Detach(); } ~DebugProcess() { this->Detach(); }
svc::Handle GetHandle() const { return m_debug_handle; } svc::Handle GetHandle() const { return m_debug_handle; }