mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	Use BreakpointAddress struct instead of passing address directly
This commit is contained in:
		
							parent
							
								
									6ea428addf
								
							
						
					
					
						commit
						42928659e8
					
				
					 3 changed files with 18 additions and 8 deletions
				
			
		|  | @ -3583,7 +3583,7 @@ unsigned InterpreterMainLoop(ARMul_State* cpu) { | |||
|     Common::Profiling::ScopeTimer timer_execute(profile_execute); | ||||
|     MICROPROFILE_SCOPE(DynCom_Execute); | ||||
| 
 | ||||
|     int breakpoint_offset = -1; | ||||
|     GDBStub::BreakpointAddress breakpoint_data; | ||||
| 
 | ||||
|     #undef RM | ||||
|     #undef RS | ||||
|  | @ -3613,7 +3613,7 @@ unsigned InterpreterMainLoop(ARMul_State* cpu) { | |||
|     cpu->Cpsr &= ~(1 << 5); \ | ||||
|     cpu->Cpsr |= cpu->TFlag << 5; \ | ||||
|     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(); \ | ||||
|             goto END; \ | ||||
|         } \ | ||||
|  | @ -3923,7 +3923,7 @@ unsigned InterpreterMainLoop(ARMul_State* cpu) { | |||
| 
 | ||||
|         // Find breakpoint if one exists within the block
 | ||||
|         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]; | ||||
|  |  | |||
|  | @ -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); | ||||
|     auto next_breakpoint = p.lower_bound(addr); | ||||
|     u32 breakpoint = -1; | ||||
|     BreakpointAddress breakpoint; | ||||
| 
 | ||||
|     if (next_breakpoint != p.end()) | ||||
|         breakpoint = next_breakpoint->first; | ||||
|     if (next_breakpoint != p.end()) { | ||||
|         breakpoint.address = next_breakpoint->first; | ||||
|         breakpoint.type = type; | ||||
|     } else { | ||||
|         breakpoint.address = 0; | ||||
|         breakpoint.type = BreakpointType::None; | ||||
|     } | ||||
| 
 | ||||
|     return breakpoint; | ||||
| } | ||||
|  |  | |||
|  | @ -18,6 +18,11 @@ enum class BreakpointType { | |||
|     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.
 | ||||
| extern std::atomic<bool> g_server_enabled; | ||||
| 
 | ||||
|  | @ -63,7 +68,7 @@ void HandlePacket(); | |||
|  * @param addr Address to search from. | ||||
|  * @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. | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue