From d9b02ecd8d440159a98239a311567e243665190d Mon Sep 17 00:00:00 2001 From: joevt Date: Wed, 20 Mar 2024 01:34:59 -0700 Subject: [PATCH] ppcmmu: Check 8 byte alignment spanning pages. --- cpu/ppc/ppcmmu.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/cpu/ppc/ppcmmu.cpp b/cpu/ppc/ppcmmu.cpp index b05545c..f25a756 100644 --- a/cpu/ppc/ppcmmu.cpp +++ b/cpu/ppc/ppcmmu.cpp @@ -1197,6 +1197,12 @@ template void mmu_write_vmem(uint32_t guest_va, uint64_t value); template static T read_unaligned(uint32_t guest_va, uint8_t *host_va) { + if ((sizeof(T) == 8) && (guest_va & 3)) { +#ifndef PPC_TESTS + ppc_alignment_exception(guest_va); +#endif + } + T result = 0; // is it a misaligned cross-page read? @@ -1222,9 +1228,6 @@ static T read_unaligned(uint32_t guest_va, uint8_t *host_va) case 4: return READ_DWORD_BE_U(host_va); case 8: - if (guest_va & 3) { - ppc_alignment_exception(guest_va); - } return READ_QWORD_BE_U(host_va); } } @@ -1239,6 +1242,12 @@ template uint64_t read_unaligned(uint32_t guest_va, uint8_t *host_va); template static void write_unaligned(uint32_t guest_va, uint8_t *host_va, T value) { + if ((sizeof(T) == 8) && (guest_va & 3)) { +#ifndef PPC_TESTS + ppc_alignment_exception(guest_va); +#endif + } + // is it a misaligned cross-page write? if (((guest_va & 0xFFF) + sizeof(T)) > 0x1000) { #ifdef MMU_PROFILING @@ -1268,9 +1277,6 @@ static void write_unaligned(uint32_t guest_va, uint8_t *host_va, T value) WRITE_DWORD_BE_U(host_va, value); break; case 8: - if (guest_va & 3) { - ppc_alignment_exception(guest_va); - } WRITE_QWORD_BE_U(host_va, value); break; }