Fixed as per PR feedback.
This commit is contained in:
parent
bd658a8801
commit
a6ecb3c913
|
@ -7,7 +7,7 @@
|
||||||
#include "common/swap.h"
|
#include "common/swap.h"
|
||||||
#include "core/arm/skyeye_common/armstate.h"
|
#include "core/arm/skyeye_common/armstate.h"
|
||||||
#include "core/arm/skyeye_common/vfp/vfp.h"
|
#include "core/arm/skyeye_common/vfp/vfp.h"
|
||||||
#include "core/gdbstub/gdbstub.h"
|
#include "core/core.h"
|
||||||
#include "core/memory.h"
|
#include "core/memory.h"
|
||||||
|
|
||||||
ARMul_State::ARMul_State(PrivilegeMode initial_mode) {
|
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;
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
#include "core/arm/skyeye_common/arm_regformat.h"
|
#include "core/arm/skyeye_common/arm_regformat.h"
|
||||||
#include "core/core.h"
|
|
||||||
#include "core/gdbstub/gdbstub.h"
|
#include "core/gdbstub/gdbstub.h"
|
||||||
|
|
||||||
// Signal levels
|
// Signal levels
|
||||||
|
@ -196,20 +195,7 @@ public:
|
||||||
last_bkpt_hit = true;
|
last_bkpt_hit = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServeBreak() {
|
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::array<u32, 16> Reg{}; // The current register file
|
std::array<u32, 16> Reg{}; // The current register file
|
||||||
std::array<u32, 2> Reg_usr{};
|
std::array<u32, 2> Reg_usr{};
|
||||||
|
|
|
@ -128,7 +128,7 @@ static u32 command_length;
|
||||||
static u32 latest_signal = 0;
|
static u32 latest_signal = 0;
|
||||||
static bool memory_break = false;
|
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,
|
// Binding to a port within the reserved ports range (0-1023) requires root permissions,
|
||||||
// so default to a port outside of that range.
|
// 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) {
|
if (id <= PC_REGISTER) {
|
||||||
return thread->context.get()->GetCpuRegister(id);
|
return thread->context->GetCpuRegister(id);
|
||||||
} else if (id == CPSR_REGISTER) {
|
} else if (id == CPSR_REGISTER) {
|
||||||
return thread->context.get()->GetCpsr();
|
return thread->context->GetCpsr();
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -187,9 +187,9 @@ static void RegWrite(std::size_t id, u32 val, Kernel::Thread* thread = nullptr)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (id <= PC_REGISTER) {
|
if (id <= PC_REGISTER) {
|
||||||
return thread->context.get()->SetCpuRegister(id, val);
|
return thread->context->SetCpuRegister(id, val);
|
||||||
} else if (id == CPSR_REGISTER) {
|
} 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) {
|
if (id >= D0_REGISTER && id < FPSCR_REGISTER) {
|
||||||
u64 ret = thread->context.get()->GetFpuRegister(2 * (id - D0_REGISTER));
|
u64 ret = thread->context->GetFpuRegister(2 * (id - D0_REGISTER));
|
||||||
ret |= static_cast<u64>(thread->context.get()->GetFpuRegister(2 * (id - D0_REGISTER) + 1))
|
ret |= static_cast<u64>(thread->context->GetFpuRegister(2 * (id - D0_REGISTER) + 1)) << 32;
|
||||||
<< 32;
|
|
||||||
return ret;
|
return ret;
|
||||||
} else if (id == FPSCR_REGISTER) {
|
} else if (id == FPSCR_REGISTER) {
|
||||||
return thread->context.get()->GetFpscr();
|
return thread->context->GetFpscr();
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
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) {
|
if (id >= D0_REGISTER && id < FPSCR_REGISTER) {
|
||||||
thread->context.get()->SetFpuRegister(2 * (id - D0_REGISTER), (u32)val);
|
thread->context->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) + 1, val >> 32);
|
||||||
} else if (id == FPSCR_REGISTER) {
|
} else if (id == FPSCR_REGISTER) {
|
||||||
return thread->context.get()->SetFpscr(static_cast<u32>(val));
|
return thread->context->SetFpscr(static_cast<u32>(val));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -531,8 +530,7 @@ static void HandleQuery() {
|
||||||
std::string val = "m";
|
std::string val = "m";
|
||||||
const auto& threads = Kernel::GetThreadList();
|
const auto& threads = Kernel::GetThreadList();
|
||||||
for (const auto& thread : threads) {
|
for (const auto& thread : threads) {
|
||||||
val += fmt::format("{:x}", thread->GetThreadId());
|
val += fmt::format("{:x},", thread->GetThreadId());
|
||||||
val += ",";
|
|
||||||
}
|
}
|
||||||
val.pop_back();
|
val.pop_back();
|
||||||
SendReply(val.c_str());
|
SendReply(val.c_str());
|
||||||
|
@ -1214,13 +1212,15 @@ void SetCpuStepFlag(bool is_step) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void SendTrap(Kernel::Thread* thread, int trap) {
|
void SendTrap(Kernel::Thread* thread, int trap) {
|
||||||
if (send_trap) {
|
if (!send_trap) {
|
||||||
if (!halt_loop || current_thread == thread) {
|
return;
|
||||||
current_thread = thread;
|
|
||||||
SendSignal(thread, trap);
|
|
||||||
}
|
|
||||||
halt_loop = true;
|
|
||||||
send_trap = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!halt_loop || current_thread == thread) {
|
||||||
|
current_thread = thread;
|
||||||
|
SendSignal(thread, trap);
|
||||||
|
}
|
||||||
|
halt_loop = true;
|
||||||
|
send_trap = false;
|
||||||
}
|
}
|
||||||
}; // namespace GDBStub
|
}; // namespace GDBStub
|
||||||
|
|
Reference in New Issue