diff --git a/src/core/arm/skyeye_common/armstate.cpp b/src/core/arm/skyeye_common/armstate.cpp index dd388d38a..8a0e43a21 100644 --- a/src/core/arm/skyeye_common/armstate.cpp +++ b/src/core/arm/skyeye_common/armstate.cpp @@ -7,7 +7,7 @@ #include "common/swap.h" #include "core/arm/skyeye_common/armstate.h" #include "core/arm/skyeye_common/vfp/vfp.h" -#include "core/gdbstub/gdbstub.h" +#include "core/core.h" #include "core/memory.h" ARMul_State::ARMul_State(PrivilegeMode initial_mode) { @@ -595,3 +595,18 @@ void ARMul_State::WriteCP15Register(u32 value, u32 crn, u32 opcode_1, u32 crm, u CP15[CP15_THREAD_UPRW] = value; } } + +void ARMul_State::ServeBreak() { + if (GDBStub::IsServerEnabled()) { + if (last_bkpt_hit) { + Reg[15] = last_bkpt.address; + } + Kernel::Thread* thread = Kernel::GetCurrentThread(); + Core::CPU().SaveContext(thread->context); + if (last_bkpt_hit || GDBStub::GetCpuStepFlag()) { + last_bkpt_hit = false; + GDBStub::Break(); + GDBStub::SendTrap(thread, 5); + } + } +} diff --git a/src/core/arm/skyeye_common/armstate.h b/src/core/arm/skyeye_common/armstate.h index cca754b31..2f99b738b 100644 --- a/src/core/arm/skyeye_common/armstate.h +++ b/src/core/arm/skyeye_common/armstate.h @@ -21,7 +21,6 @@ #include #include "common/common_types.h" #include "core/arm/skyeye_common/arm_regformat.h" -#include "core/core.h" #include "core/gdbstub/gdbstub.h" // Signal levels @@ -196,20 +195,7 @@ public: last_bkpt_hit = true; } - void ServeBreak() { - if (GDBStub::IsServerEnabled()) { - if (last_bkpt_hit) { - Reg[15] = last_bkpt.address; - } - Kernel::Thread* thread = Kernel::GetCurrentThread(); - Core::CPU().SaveContext(thread->context); - if (last_bkpt_hit || GDBStub::GetCpuStepFlag()) { - last_bkpt_hit = false; - GDBStub::Break(); - GDBStub::SendTrap(thread, 5); - } - } - } + void ServeBreak(); std::array Reg{}; // The current register file std::array Reg_usr{}; diff --git a/src/core/gdbstub/gdbstub.cpp b/src/core/gdbstub/gdbstub.cpp index ddf306207..cc8fc9ffb 100644 --- a/src/core/gdbstub/gdbstub.cpp +++ b/src/core/gdbstub/gdbstub.cpp @@ -128,7 +128,7 @@ static u32 command_length; static u32 latest_signal = 0; static bool memory_break = false; -Kernel::Thread* current_thread = nullptr; +static Kernel::Thread* current_thread = nullptr; // Binding to a port within the reserved ports range (0-1023) requires root permissions, // so default to a port outside of that range. @@ -173,9 +173,9 @@ static u32 RegRead(std::size_t id, Kernel::Thread* thread = nullptr) { } if (id <= PC_REGISTER) { - return thread->context.get()->GetCpuRegister(id); + return thread->context->GetCpuRegister(id); } else if (id == CPSR_REGISTER) { - return thread->context.get()->GetCpsr(); + return thread->context->GetCpsr(); } else { return 0; } @@ -187,9 +187,9 @@ static void RegWrite(std::size_t id, u32 val, Kernel::Thread* thread = nullptr) } if (id <= PC_REGISTER) { - return thread->context.get()->SetCpuRegister(id, val); + return thread->context->SetCpuRegister(id, val); } else if (id == CPSR_REGISTER) { - return thread->context.get()->SetCpsr(val); + return thread->context->SetCpsr(val); } } @@ -199,12 +199,11 @@ static u64 FpuRead(std::size_t id, Kernel::Thread* thread = nullptr) { } if (id >= D0_REGISTER && id < FPSCR_REGISTER) { - u64 ret = thread->context.get()->GetFpuRegister(2 * (id - D0_REGISTER)); - ret |= static_cast(thread->context.get()->GetFpuRegister(2 * (id - D0_REGISTER) + 1)) - << 32; + u64 ret = thread->context->GetFpuRegister(2 * (id - D0_REGISTER)); + ret |= static_cast(thread->context->GetFpuRegister(2 * (id - D0_REGISTER) + 1)) << 32; return ret; } else if (id == FPSCR_REGISTER) { - return thread->context.get()->GetFpscr(); + return thread->context->GetFpscr(); } else { return 0; } @@ -216,10 +215,10 @@ static void FpuWrite(std::size_t id, u64 val, Kernel::Thread* thread = nullptr) } if (id >= D0_REGISTER && id < FPSCR_REGISTER) { - thread->context.get()->SetFpuRegister(2 * (id - D0_REGISTER), (u32)val); - thread->context.get()->SetFpuRegister(2 * (id - D0_REGISTER) + 1, val >> 32); + thread->context->SetFpuRegister(2 * (id - D0_REGISTER), (u32)val); + thread->context->SetFpuRegister(2 * (id - D0_REGISTER) + 1, val >> 32); } else if (id == FPSCR_REGISTER) { - return thread->context.get()->SetFpscr(static_cast(val)); + return thread->context->SetFpscr(static_cast(val)); } } @@ -531,8 +530,7 @@ static void HandleQuery() { std::string val = "m"; const auto& threads = Kernel::GetThreadList(); for (const auto& thread : threads) { - val += fmt::format("{:x}", thread->GetThreadId()); - val += ","; + val += fmt::format("{:x},", thread->GetThreadId()); } val.pop_back(); SendReply(val.c_str()); @@ -1214,13 +1212,15 @@ void SetCpuStepFlag(bool is_step) { } void SendTrap(Kernel::Thread* thread, int trap) { - if (send_trap) { - if (!halt_loop || current_thread == thread) { - current_thread = thread; - SendSignal(thread, trap); - } - halt_loop = true; - send_trap = false; + if (!send_trap) { + return; } + + if (!halt_loop || current_thread == thread) { + current_thread = thread; + SendSignal(thread, trap); + } + halt_loop = true; + send_trap = false; } }; // namespace GDBStub