all repos — mgba @ b97c871e1b7e62928368d3288321070a9f11dc9c

mGBA Game Boy Advance Emulator

GBA BIOS: Fix INT_MIN/-1 crash
Vicki Pfau vi@endrift.com
Tue, 13 Jun 2017 20:43:34 -0700
commit

b97c871e1b7e62928368d3288321070a9f11dc9c

parent

5fd8ebbbaf2e9db17bb0ab388478bbbb09eafc51

1 files changed, 7 insertions(+), 2 deletions(-)

jump to
M src/gba/bios.csrc/gba/bios.c

@@ -256,18 +256,23 @@ }

static void _Div(struct GBA* gba, int32_t num, int32_t denom) { struct ARMCore* cpu = gba->cpu; - if (denom != 0) { + if (denom != 0 && (denom != -1 || num != INT32_MIN)) { div_t result = div(num, denom); cpu->gprs[0] = result.quot; cpu->gprs[1] = result.rem; cpu->gprs[3] = abs(result.quot); - } else { + } else if (denom == 0) { mLOG(GBA_BIOS, GAME_ERROR, "Attempting to divide %i by zero!", num); // If abs(num) > 1, this should hang, but that would be painful to // emulate in HLE, and no game will get into a state where it hangs... cpu->gprs[0] = (num < 0) ? -1 : 1; cpu->gprs[1] = num; cpu->gprs[3] = 1; + } else { + mLOG(GBA_BIOS, GAME_ERROR, "Attempting to divide INT_MIN by -1!"); + cpu->gprs[0] = INT32_MIN; + cpu->gprs[1] = 0; + cpu->gprs[3] = INT32_MIN; } }