citra-emu
/
citra
Archived
1
0
Fork 0

Use BreakpointAddress struct instead of passing address directly

This commit is contained in:
polaris- 2015-10-04 11:22:31 -04:00
parent 6ea428addf
commit 42928659e8
3 changed files with 18 additions and 8 deletions

View File

@ -3583,7 +3583,7 @@ unsigned InterpreterMainLoop(ARMul_State* cpu) {
Common::Profiling::ScopeTimer timer_execute(profile_execute); Common::Profiling::ScopeTimer timer_execute(profile_execute);
MICROPROFILE_SCOPE(DynCom_Execute); MICROPROFILE_SCOPE(DynCom_Execute);
int breakpoint_offset = -1; GDBStub::BreakpointAddress breakpoint_data;
#undef RM #undef RM
#undef RS #undef RS
@ -3613,7 +3613,7 @@ unsigned InterpreterMainLoop(ARMul_State* cpu) {
cpu->Cpsr &= ~(1 << 5); \ cpu->Cpsr &= ~(1 << 5); \
cpu->Cpsr |= cpu->TFlag << 5; \ cpu->Cpsr |= cpu->TFlag << 5; \
if (GDBStub::g_server_enabled) { \ if (GDBStub::g_server_enabled) { \
if (GDBStub::IsMemoryBreak() || PC == breakpoint_offset) { \ if (GDBStub::IsMemoryBreak() || (breakpoint_data.type != GDBStub::BreakpointType::None && PC == breakpoint_data.address)) { \
GDBStub::Break(); \ GDBStub::Break(); \
goto END; \ goto END; \
} \ } \
@ -3923,7 +3923,7 @@ unsigned InterpreterMainLoop(ARMul_State* cpu) {
// Find breakpoint if one exists within the block // Find breakpoint if one exists within the block
if (GDBStub::g_server_enabled && GDBStub::IsConnected()) { if (GDBStub::g_server_enabled && GDBStub::IsConnected()) {
breakpoint_offset = GDBStub::GetNextBreakpointFromAddress(cpu->Reg[15], GDBStub::BreakpointType::Execute); breakpoint_data = GDBStub::GetNextBreakpointFromAddress(cpu->Reg[15], GDBStub::BreakpointType::Execute);
} }
inst_base = (arm_inst *)&inst_buf[ptr]; inst_base = (arm_inst *)&inst_buf[ptr];

View File

@ -231,13 +231,18 @@ static void RemoveBreakpoint(BreakpointType type, PAddr addr) {
} }
} }
PAddr GetNextBreakpointFromAddress(PAddr addr, BreakpointType type) { BreakpointAddress GetNextBreakpointFromAddress(PAddr addr, BreakpointType type) {
std::map<u32, Breakpoint>& p = GetBreakpointList(type); std::map<u32, Breakpoint>& p = GetBreakpointList(type);
auto next_breakpoint = p.lower_bound(addr); auto next_breakpoint = p.lower_bound(addr);
u32 breakpoint = -1; BreakpointAddress breakpoint;
if (next_breakpoint != p.end()) if (next_breakpoint != p.end()) {
breakpoint = next_breakpoint->first; breakpoint.address = next_breakpoint->first;
breakpoint.type = type;
} else {
breakpoint.address = 0;
breakpoint.type = BreakpointType::None;
}
return breakpoint; return breakpoint;
} }

View File

@ -18,6 +18,11 @@ enum class BreakpointType {
Access ///< Access (R/W) Breakpoint Access ///< Access (R/W) Breakpoint
}; };
struct BreakpointAddress {
PAddr address;
BreakpointType type;
};
/// If set to false, the server will never be started and no gdbstub-related functions will be executed. /// If set to false, the server will never be started and no gdbstub-related functions will be executed.
extern std::atomic<bool> g_server_enabled; extern std::atomic<bool> g_server_enabled;
@ -63,7 +68,7 @@ void HandlePacket();
* @param addr Address to search from. * @param addr Address to search from.
* @param type Type of breakpoint. * @param type Type of breakpoint.
*/ */
PAddr GetNextBreakpointFromAddress(u32 addr, GDBStub::BreakpointType type); BreakpointAddress GetNextBreakpointFromAddress(u32 addr, GDBStub::BreakpointType type);
/** /**
* Check if a breakpoint of the specified type exists at the given address. * Check if a breakpoint of the specified type exists at the given address.