mirror of
				https://github.com/N64Recomp/N64ModernRuntime.git
				synced 2025-10-30 08:02:29 +00:00 
			
		
		
		
	Update runtime for fixed address mod sections, fix some live recompiler errors not triggering mod loading errors (#120)
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
		
			
				
	
				validate / ubuntu (arm64, Debug) (push) Has been cancelled
				
			
		
			
				
	
				validate / ubuntu (arm64, Release) (push) Has been cancelled
				
			
		
			
				
	
				validate / ubuntu (x64, Debug) (push) Has been cancelled
				
			
		
			
				
	
				validate / ubuntu (x64, Release) (push) Has been cancelled
				
			
		
			
				
	
				validate / windows (x64, Debug) (push) Has been cancelled
				
			
		
			
				
	
				validate / windows (x64, Release) (push) Has been cancelled
				
			
		
			
				
	
				validate / macos (arm64, Debug) (push) Has been cancelled
				
			
		
			
				
	
				validate / macos (arm64, Release) (push) Has been cancelled
				
			
		
			
				
	
				validate / macos (x64, Debug) (push) Has been cancelled
				
			
		
			
				
	
				validate / macos (x64, Release) (push) Has been cancelled
				
			
		
		
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	validate / ubuntu (arm64, Debug) (push) Has been cancelled
				
			validate / ubuntu (arm64, Release) (push) Has been cancelled
				
			validate / ubuntu (x64, Debug) (push) Has been cancelled
				
			validate / ubuntu (x64, Release) (push) Has been cancelled
				
			validate / windows (x64, Debug) (push) Has been cancelled
				
			validate / windows (x64, Release) (push) Has been cancelled
				
			validate / macos (arm64, Debug) (push) Has been cancelled
				
			validate / macos (arm64, Release) (push) Has been cancelled
				
			validate / macos (x64, Debug) (push) Has been cancelled
				
			validate / macos (x64, Release) (push) Has been cancelled
				
			This commit is contained in:
		
							parent
							
								
									bd1dde8774
								
							
						
					
					
						commit
						df547d2c06
					
				
					 2 changed files with 26 additions and 18 deletions
				
			
		|  | @ -1 +1 @@ | ||||||
| Subproject commit 6e7a5bdb2f1fff8b3d16122cc0b760d3c2541eae | Subproject commit c1a6dc93bfa5977de0ea256562058be4f1b73353 | ||||||
|  | @ -505,18 +505,20 @@ recomp::mods::LiveRecompilerCodeHandle::LiveRecompilerCodeHandle( | ||||||
|     N64Recomp::LiveGenerator generator{ context.functions.size(), recompiler_inputs }; |     N64Recomp::LiveGenerator generator{ context.functions.size(), recompiler_inputs }; | ||||||
|     std::vector<std::vector<uint32_t>> dummy_static_funcs{}; |     std::vector<std::vector<uint32_t>> dummy_static_funcs{}; | ||||||
| 
 | 
 | ||||||
|  |     bool errored = false; | ||||||
|  | 
 | ||||||
|     for (size_t func_index = 0; func_index < context.functions.size(); func_index++) { |     for (size_t func_index = 0; func_index < context.functions.size(); func_index++) { | ||||||
|         std::ostringstream dummy_ostream{}; |         std::ostringstream dummy_ostream{}; | ||||||
| 
 | 
 | ||||||
|         if (!N64Recomp::recompile_function_live(generator, context, func_index, dummy_ostream, dummy_static_funcs, true)) { |         if (!N64Recomp::recompile_function_live(generator, context, func_index, dummy_ostream, dummy_static_funcs, true)) { | ||||||
|             is_good = false; |             errored = true; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // Generate the code.
 |     // Generate the code.
 | ||||||
|     recompiler_output = std::make_unique<N64Recomp::LiveGeneratorOutput>(generator.finish()); |     recompiler_output = std::make_unique<N64Recomp::LiveGeneratorOutput>(generator.finish()); | ||||||
|     is_good = recompiler_output->good; |     is_good = !errored && recompiler_output->good; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void recomp::mods::LiveRecompilerCodeHandle::set_imported_function(size_t import_index, GenericFunction func) { | void recomp::mods::LiveRecompilerCodeHandle::set_imported_function(size_t import_index, GenericFunction func) { | ||||||
|  | @ -2167,22 +2169,28 @@ recomp::mods::CodeModLoadError recomp::mods::ModContext::init_mod_code(uint8_t* | ||||||
|     int32_t cur_section_addr = load_address; |     int32_t cur_section_addr = load_address; | ||||||
|     for (size_t section_index = 0; section_index < mod_sections.size(); section_index++) { |     for (size_t section_index = 0; section_index < mod_sections.size(); section_index++) { | ||||||
|         const auto& section = mod_sections[section_index]; |         const auto& section = mod_sections[section_index]; | ||||||
|         for (size_t i = 0; i < section.size; i++) { |         // Do not load fixed address sections into mod memory. Use their address as-is.
 | ||||||
|             MEM_B(i, (gpr)cur_section_addr) = binary_data[section.rom_addr + i]; |         if (section.fixed_address) { | ||||||
|  |             mod.section_load_addresses[section_index] = section.ram_addr; | ||||||
|         } |         } | ||||||
|         mod.section_load_addresses[section_index] = cur_section_addr; |         else { | ||||||
|         // Calculate the bss section's address based on the size of this section.
 |             for (size_t i = 0; i < section.size; i++) { | ||||||
|         cur_section_addr += section.size; |                 MEM_B(i, (gpr)cur_section_addr) = binary_data[section.rom_addr + i]; | ||||||
|         // Zero the bss section.
 |             } | ||||||
|         for (size_t i = 0; i < section.bss_size; i++) { |             mod.section_load_addresses[section_index] = cur_section_addr; | ||||||
|             MEM_B(i, (gpr)cur_section_addr) = 0; |             // Calculate the bss section's address based on the size of this section.
 | ||||||
|  |             cur_section_addr += section.size; | ||||||
|  |             // Zero the bss section.
 | ||||||
|  |             for (size_t i = 0; i < section.bss_size; i++) { | ||||||
|  |                 MEM_B(i, (gpr)cur_section_addr) = 0; | ||||||
|  |             } | ||||||
|  |             // Calculate the next section's address based on the size of the bss section.
 | ||||||
|  |             cur_section_addr += section.bss_size; | ||||||
|  |             // Align the next section's address to 16 bytes.
 | ||||||
|  |             cur_section_addr = (cur_section_addr + 15) & ~15; | ||||||
|  |             // Add some empty space between mods to act as a buffer for misbehaving mods that have out of bounds accesses.
 | ||||||
|  |             cur_section_addr += 0x400; | ||||||
|         } |         } | ||||||
|         // Calculate the next section's address based on the size of the bss section.
 |  | ||||||
|         cur_section_addr += section.bss_size; |  | ||||||
|         // Align the next section's address to 16 bytes.
 |  | ||||||
|         cur_section_addr = (cur_section_addr + 15) & ~15; |  | ||||||
|         // Add some empty space between mods to act as a buffer for misbehaving mods that have out of bounds accesses.
 |  | ||||||
|         cur_section_addr += 0x400; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // Iterate over each section again after loading them to perform R_MIPS_32 relocations.
 |     // Iterate over each section again after loading them to perform R_MIPS_32 relocations.
 | ||||||
|  | @ -2245,7 +2253,7 @@ recomp::mods::CodeModLoadError recomp::mods::ModContext::load_mod_code(uint8_t* | ||||||
|     std::unordered_map<size_t, size_t> entry_func_hooks{}; |     std::unordered_map<size_t, size_t> entry_func_hooks{}; | ||||||
|     std::unordered_map<size_t, size_t> return_func_hooks{}; |     std::unordered_map<size_t, size_t> return_func_hooks{}; | ||||||
| 
 | 
 | ||||||
|     // Scan the replacements and check for any 
 |     // Scan the replacements to handle hooks on the replaced functions.
 | ||||||
|     for (const auto& replacement : mod.recompiler_context->replacements) { |     for (const auto& replacement : mod.recompiler_context->replacements) { | ||||||
|         // Check if there's a hook slot for the entry of this function.
 |         // Check if there's a hook slot for the entry of this function.
 | ||||||
|         HookDefinition entry_def { |         HookDefinition entry_def { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Wiseguy
						Wiseguy