From d3d198c363427bb04ca7374095e859de4fc97c01 Mon Sep 17 00:00:00 2001 From: water111 <48171810+water111@users.noreply.github.com> Date: Fri, 4 Mar 2022 19:15:45 -0500 Subject: [PATCH] fix memory corruption during merc death (#1220) --- game/mips2c/functions/generic_merc.cpp | 53 ++++++++++++++++++++------ goal_src/engine/game/main-h.gc | 3 -- goal_src/engine/gfx/merc/merc-death.gc | 12 +++--- 3 files changed, 47 insertions(+), 21 deletions(-) diff --git a/game/mips2c/functions/generic_merc.cpp b/game/mips2c/functions/generic_merc.cpp index 77b156d265..4174d4cce8 100644 --- a/game/mips2c/functions/generic_merc.cpp +++ b/game/mips2c/functions/generic_merc.cpp @@ -1,7 +1,29 @@ -//--------------------------MIPS2C--------------------- -// clang-format off #include "game/mips2c/mips2c_private.h" #include "game/kernel/kscheme.h" + +namespace Mips2C { +namespace generic_prepare_dma_single { +u64 execute(void* ctxt); +} +namespace generic_prepare_dma_double { +u64 execute(void* ctxt); +} +namespace mercneric_convert { +u64 execute(void* ctxt); +} +namespace generic_light_proc { +u64 execute(void* ctxt); +} +namespace generic_envmap_proc { +u64 execute(void* ctxt); +} +namespace high_speed_reject { +u64 execute(void* ctxt); +} +} // namespace Mips2C + +//--------------------------MIPS2C--------------------- +// clang-format off namespace Mips2C { namespace generic_merc_init_asm { struct Cache { @@ -683,7 +705,8 @@ u64 execute(void* ctxt) { c->lwu(t9, 7328, v1); // lwu t9, 7328(v1) call_addr = c->gprs[t9].du32[0]; // function call: c->sll(v0, ra, 0); // sll v0, ra, 0 - c->jalr(call_addr); // jalr ra, t9 + // c->jalr(call_addr); // jalr ra, t9 + mercneric_convert::execute(c); block_44: get_fake_spad_addr(v1, cache.fake_scratchpad_data, 0, c);// lui v1, 28672 @@ -1009,17 +1032,20 @@ u64 execute(void* ctxt) { c->lwu(t9, 7336, v1); // lwu t9, 7336(v1) call_addr = c->gprs[t9].du32[0]; // function call: c->sll(v0, ra, 0); // sll v0, ra, 0 - c->jalr(call_addr); // jalr ra, t9 + // c->jalr(call_addr); // jalr ra, t9 + generic_prepare_dma_double::execute(c); get_fake_spad_addr(v1, cache.fake_scratchpad_data, 0, c);// lui v1, 28672 c->lwu(t9, 7340, v1); // lwu t9, 7340(v1) call_addr = c->gprs[t9].du32[0]; // function call: c->sll(v0, ra, 0); // sll v0, ra, 0 - c->jalr(call_addr); // jalr ra, t9 + // c->jalr(call_addr); // jalr ra, t9 + generic_light_proc::execute(c); get_fake_spad_addr(v1, cache.fake_scratchpad_data, 0, c);// lui v1, 28672 c->lwu(t9, 7344, v1); // lwu t9, 7344(v1) call_addr = c->gprs[t9].du32[0]; // function call: c->sll(v0, ra, 0); // sll v0, ra, 0 - c->jalr(call_addr); // jalr ra, t9 + // c->jalr(call_addr); // jalr ra, t9 + generic_envmap_proc::execute(c); c->lw(v1, 40, at); // lw v1, 40(at) c->lw(a0, 56, at); // lw a0, 56(at) c->mov64(a3, v1); // or a3, v1, r0 @@ -1115,17 +1141,20 @@ u64 execute(void* ctxt) { c->lwu(t9, 7336, v1); // lwu t9, 7336(v1) call_addr = c->gprs[t9].du32[0]; // function call: c->sll(v0, ra, 0); // sll v0, ra, 0 - c->jalr(call_addr); // jalr ra, t9 + // c->jalr(call_addr); // jalr ra, t9 + generic_prepare_dma_double::execute(c); get_fake_spad_addr(v1, cache.fake_scratchpad_data, 0, c);// lui v1, 28672 c->lwu(t9, 7340, v1); // lwu t9, 7340(v1) call_addr = c->gprs[t9].du32[0]; // function call: c->sll(v0, ra, 0); // sll v0, ra, 0 - c->jalr(call_addr); // jalr ra, t9 + // c->jalr(call_addr); // jalr ra, t9 + generic_light_proc::execute(c); get_fake_spad_addr(v1, cache.fake_scratchpad_data, 0, c);// lui v1, 28672 c->lwu(t9, 7344, v1); // lwu t9, 7344(v1) call_addr = c->gprs[t9].du32[0]; // function call: c->sll(v0, ra, 0); // sll v0, ra, 0 - c->jalr(call_addr); // jalr ra, t9 + // c->jalr(call_addr); // jalr ra, t9 + generic_envmap_proc::execute(c); c->lw(v1, 40, at); // lw v1, 40(at) c->lw(a0, 56, at); // lw a0, 56(at) c->mov64(a3, v1); // or a3, v1, r0 @@ -1201,12 +1230,14 @@ u64 execute(void* ctxt) { c->lwu(t9, 7332, v1); // lwu t9, 7332(v1) call_addr = c->gprs[t9].du32[0]; // function call: c->sll(v0, ra, 0); // sll v0, ra, 0 - c->jalr(call_addr); // jalr ra, t9 + // c->jalr(call_addr); // jalr ra, t9 + generic_prepare_dma_single::execute(c); get_fake_spad_addr(v1, cache.fake_scratchpad_data, 0, c);// lui v1, 28672 c->lwu(t9, 7340, v1); // lwu t9, 7340(v1) call_addr = c->gprs[t9].du32[0]; // function call: c->sll(v0, ra, 0); // sll v0, ra, 0 - c->jalr(call_addr); // jalr ra, t9 + // c->jalr(call_addr); // jalr ra, t9 + generic_light_proc::execute(c); c->lw(v1, 40, at); // lw v1, 40(at) c->lw(a0, 56, at); // lw a0, 56(at) c->mov64(a3, v1); // or a3, v1, r0 diff --git a/goal_src/engine/game/main-h.gc b/goal_src/engine/game/main-h.gc index 6cef2eb483..419b02bd3a 100644 --- a/goal_src/engine/game/main-h.gc +++ b/goal_src/engine/game/main-h.gc @@ -5,9 +5,6 @@ ;; name in dgo: main-h ;; dgos: GAME, ENGINE -;; hacks -(defglobalconstant SKIP_MERC_DEATH_PARTICLES #t) - ;; Global engine settings: (define *stats-poly* #f) (define *stats-memory* #f) diff --git a/goal_src/engine/gfx/merc/merc-death.gc b/goal_src/engine/gfx/merc/merc-death.gc index 696a4a95d5..e1373ce820 100644 --- a/goal_src/engine/gfx/merc/merc-death.gc +++ b/goal_src/engine/gfx/merc/merc-death.gc @@ -86,13 +86,11 @@ ) (defun merc-death-spawn ((arg0 int) (arg1 vector) (arg2 vector)) - (#unless SKIP_MERC_DEATH_PARTICLES - (let ((v1-2 (-> *part-id-table* arg0))) - (if (and (nonzero? v1-2) (= (-> v1-2 type) sparticle-launcher)) - (sp-launch-particles-death *sp-particle-system-2d* v1-2 arg1) - ) - ) - ) + (let ((v1-2 (-> *part-id-table* arg0))) + (if (and (nonzero? v1-2) (= (-> v1-2 type) sparticle-launcher)) + (sp-launch-particles-death *sp-particle-system-2d* v1-2 arg1) + ) + ) 0 (none) )