Add populating missing runtime function pointers in offline compiled mods

This commit is contained in:
Mr-Wiseguy 2024-09-12 00:55:06 -04:00
parent 81ce18d0d3
commit c4ee705250
2 changed files with 28 additions and 2 deletions

View file

@ -212,6 +212,10 @@ namespace recomp {
virtual uint32_t get_base_event_index() = 0; virtual uint32_t get_base_event_index() = 0;
virtual void set_recomp_trigger_event_pointer(void (*ptr)(uint8_t* rdram, recomp_context* ctx, uint32_t index)) = 0; virtual void set_recomp_trigger_event_pointer(void (*ptr)(uint8_t* rdram, recomp_context* ctx, uint32_t index)) = 0;
virtual void set_get_function_pointer(recomp_func_t* (*ptr)(int32_t)) = 0; virtual void set_get_function_pointer(recomp_func_t* (*ptr)(int32_t)) = 0;
virtual void set_cop0_status_write_pointer(void (*ptr)(recomp_context* ctx, gpr value)) = 0;
virtual void set_cop0_status_read_pointer(gpr (*ptr)(recomp_context* ctx)) = 0;
virtual void set_switch_error_pointer(void (*ptr)(const char* func, uint32_t vram, uint32_t jtbl)) = 0;
virtual void set_do_break_pointer(void (*ptr)(uint32_t vram)) = 0;
virtual void set_reference_section_addresses_pointer(int32_t* ptr) = 0; virtual void set_reference_section_addresses_pointer(int32_t* ptr) = 0;
virtual void set_local_section_address(size_t section_index, int32_t address) = 0; virtual void set_local_section_address(size_t section_index, int32_t address) = 0;
virtual GenericFunction get_function_handle(size_t func_index) = 0; virtual GenericFunction get_function_handle(size_t func_index) = 0;
@ -281,6 +285,18 @@ namespace recomp {
void set_get_function_pointer(recomp_func_t* (*ptr)(int32_t)) final { void set_get_function_pointer(recomp_func_t* (*ptr)(int32_t)) final {
*get_function = ptr; *get_function = ptr;
}; };
void set_cop0_status_write_pointer(void (*ptr)(recomp_context* ctx, gpr value)) final {
*cop0_status_write = ptr;
}
void set_cop0_status_read_pointer(gpr (*ptr)(recomp_context* ctx)) final {
*cop0_status_read = ptr;
}
void set_switch_error_pointer(void (*ptr)(const char* func, uint32_t vram, uint32_t jtbl)) final {
*switch_error = ptr;
}
void set_do_break_pointer(void (*ptr)(uint32_t vram)) final {
*do_break = ptr;
}
void set_reference_section_addresses_pointer(int32_t* ptr) final { void set_reference_section_addresses_pointer(int32_t* ptr) final {
*reference_section_addresses = ptr; *reference_section_addresses = ptr;
}; };
@ -300,6 +316,10 @@ namespace recomp {
uint32_t* base_event_index; uint32_t* base_event_index;
void (**recomp_trigger_event)(uint8_t* rdram, recomp_context* ctx, uint32_t index); void (**recomp_trigger_event)(uint8_t* rdram, recomp_context* ctx, uint32_t index);
recomp_func_t* (**get_function)(int32_t vram); recomp_func_t* (**get_function)(int32_t vram);
void (**cop0_status_write)(recomp_context* ctx, gpr value);
gpr (**cop0_status_read)(recomp_context* ctx);
void (**switch_error)(const char* func, uint32_t vram, uint32_t jtbl);
void (**do_break)(uint32_t vram);
int32_t** reference_section_addresses; int32_t** reference_section_addresses;
int32_t* section_addresses; int32_t* section_addresses;
}; };

View file

@ -347,6 +347,10 @@ recomp::mods::NativeCodeHandle::NativeCodeHandle(const std::filesystem::path& dl
is_good &= dynamic_lib->get_dll_symbol(base_event_index, "base_event_index"); is_good &= dynamic_lib->get_dll_symbol(base_event_index, "base_event_index");
is_good &= dynamic_lib->get_dll_symbol(recomp_trigger_event, "recomp_trigger_event"); is_good &= dynamic_lib->get_dll_symbol(recomp_trigger_event, "recomp_trigger_event");
is_good &= dynamic_lib->get_dll_symbol(get_function, "get_function"); is_good &= dynamic_lib->get_dll_symbol(get_function, "get_function");
is_good &= dynamic_lib->get_dll_symbol(cop0_status_write, "cop0_status_write");
is_good &= dynamic_lib->get_dll_symbol(cop0_status_read, "cop0_status_read");
is_good &= dynamic_lib->get_dll_symbol(switch_error, "switch_error");
is_good &= dynamic_lib->get_dll_symbol(do_break, "do_break");
is_good &= dynamic_lib->get_dll_symbol(reference_section_addresses, "reference_section_addresses"); is_good &= dynamic_lib->get_dll_symbol(reference_section_addresses, "reference_section_addresses");
is_good &= dynamic_lib->get_dll_symbol(section_addresses, "section_addresses"); is_good &= dynamic_lib->get_dll_symbol(section_addresses, "section_addresses");
} }
@ -483,8 +487,6 @@ recomp::mods::ModLoadError recomp::mods::ModContext::load_mod(uint8_t* rdram, co
uint32_t target_section_original_vram = mod_sections[reloc.target_section].ram_addr; uint32_t target_section_original_vram = mod_sections[reloc.target_section].ram_addr;
uint32_t target_section_loaded_vram = handle.section_load_addresses[reloc.target_section]; uint32_t target_section_loaded_vram = handle.section_load_addresses[reloc.target_section];
uint32_t reloc_word_old = reloc_word;
// Recalculate the word and write it back into ram. // Recalculate the word and write it back into ram.
reloc_word += (target_section_loaded_vram - target_section_original_vram); reloc_word += (target_section_loaded_vram - target_section_original_vram);
MEM_W(0, reloc_word_addr) = reloc_word; MEM_W(0, reloc_word_addr) = reloc_word;
@ -889,6 +891,10 @@ recomp::mods::ModLoadError recomp::mods::ModContext::resolve_dependencies(recomp
// Populate the mod's state fields. // Populate the mod's state fields.
mod.code_handle->set_recomp_trigger_event_pointer(recomp_trigger_event); mod.code_handle->set_recomp_trigger_event_pointer(recomp_trigger_event);
mod.code_handle->set_get_function_pointer(get_function); mod.code_handle->set_get_function_pointer(get_function);
mod.code_handle->set_cop0_status_write_pointer(cop0_status_write);
mod.code_handle->set_cop0_status_read_pointer(cop0_status_read);
mod.code_handle->set_switch_error_pointer(switch_error);
mod.code_handle->set_do_break_pointer(do_break);
mod.code_handle->set_reference_section_addresses_pointer(section_addresses); mod.code_handle->set_reference_section_addresses_pointer(section_addresses);
for (size_t section_index = 0; section_index < mod.section_load_addresses.size(); section_index++) { for (size_t section_index = 0; section_index < mod.section_load_addresses.size(); section_index++) {
mod.code_handle->set_local_section_address(section_index, mod.section_load_addresses[section_index]); mod.code_handle->set_local_section_address(section_index, mod.section_load_addresses[section_index]);