mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	hle: added a hokey way to force a thread reschedule during CPU single step mode (as used by the debugger)
This commit is contained in:
		
							parent
							
								
									6cdad8390c
								
							
						
					
					
						commit
						174cc9a0ed
					
				
					 3 changed files with 7 additions and 1 deletions
				
			
		|  | @ -13,6 +13,7 @@ | ||||||
| #include "core/arm/disassembler/arm_disasm.h" | #include "core/arm/disassembler/arm_disasm.h" | ||||||
| #include "core/arm/interpreter/arm_interpreter.h" | #include "core/arm/interpreter/arm_interpreter.h" | ||||||
| 
 | 
 | ||||||
|  | #include "core/hle/hle.h" | ||||||
| #include "core/hle/kernel/thread.h" | #include "core/hle/kernel/thread.h" | ||||||
| 
 | 
 | ||||||
| namespace Core { | namespace Core { | ||||||
|  | @ -36,7 +37,7 @@ void SingleStep() { | ||||||
| 
 | 
 | ||||||
|     g_app_core->Step(); |     g_app_core->Step(); | ||||||
|      |      | ||||||
|     if (ticks >= LCD::kFrameTicks / 2) { |     if ((ticks >= LCD::kFrameTicks / 2) || HLE::g_reschedule) { | ||||||
|         HW::Update(); |         HW::Update(); | ||||||
|         Kernel::Reschedule(); |         Kernel::Reschedule(); | ||||||
|         ticks = 0; |         ticks = 0; | ||||||
|  |  | ||||||
|  | @ -16,6 +16,8 @@ namespace HLE { | ||||||
| 
 | 
 | ||||||
| static std::vector<ModuleDef> g_module_db; | static std::vector<ModuleDef> g_module_db; | ||||||
| 
 | 
 | ||||||
|  | bool g_reschedule = false;  ///< If true, immediately reschedules the CPU to a new thread
 | ||||||
|  | 
 | ||||||
| const FunctionDef* GetSVCInfo(u32 opcode) { | const FunctionDef* GetSVCInfo(u32 opcode) { | ||||||
|     u32 func_num = opcode & 0xFFFFFF; // 8 bits
 |     u32 func_num = opcode & 0xFFFFFF; // 8 bits
 | ||||||
|     if (func_num > 0xFF) { |     if (func_num > 0xFF) { | ||||||
|  | @ -47,6 +49,7 @@ void Reschedule(const char *reason) { | ||||||
|     _dbg_assert_msg_(HLE, reason != 0 && strlen(reason) < 256, "Reschedule: Invalid or too long reason."); |     _dbg_assert_msg_(HLE, reason != 0 && strlen(reason) < 256, "Reschedule: Invalid or too long reason."); | ||||||
| #endif | #endif | ||||||
|     Core::g_app_core->PrepareReschedule(); |     Core::g_app_core->PrepareReschedule(); | ||||||
|  |     g_reschedule = true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void RegisterModule(std::string name, int num_functions, const FunctionDef* func_table) { | void RegisterModule(std::string name, int num_functions, const FunctionDef* func_table) { | ||||||
|  |  | ||||||
|  | @ -16,6 +16,8 @@ | ||||||
| 
 | 
 | ||||||
| namespace HLE { | namespace HLE { | ||||||
| 
 | 
 | ||||||
|  | extern bool g_reschedule;   ///< If true, immediately reschedules the CPU to a new thread
 | ||||||
|  | 
 | ||||||
| typedef u32 Addr; | typedef u32 Addr; | ||||||
| typedef void (*Func)(); | typedef void (*Func)(); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue