From b571ff841223f35d6b99776348e91a30b2b389cb Mon Sep 17 00:00:00 2001 From: Maxim Poliakovski Date: Mon, 7 Aug 2023 13:06:11 +0200 Subject: [PATCH] Revert "ppcmmu: Add 64-bit accesses to I/O" This reverts commit 16123dea45344ba6767ce2512be58dc7819d58b5. --- cpu/ppc/ppcmmu.cpp | 110 +++++++++++---------------------------------- 1 file changed, 27 insertions(+), 83 deletions(-) diff --git a/cpu/ppc/ppcmmu.cpp b/cpu/ppc/ppcmmu.cpp index 9199f40..790f743 100644 --- a/cpu/ppc/ppcmmu.cpp +++ b/cpu/ppc/ppcmmu.cpp @@ -988,10 +988,9 @@ void mmu_print_regs() } // Forward declarations. -template -static 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); +static uint32_t read_unaligned(uint32_t guest_va, uint8_t *host_va, uint32_t size); +static void write_unaligned(uint32_t guest_va, uint8_t *host_va, uint32_t value, + uint32_t size); template inline T mmu_read_vmem(uint32_t guest_va) @@ -1036,28 +1035,11 @@ inline T mmu_read_vmem(uint32_t guest_va) #ifdef MMU_PROFILING iomem_reads_total++; #endif - if (sizeof(T) == 8) { - if (guest_va & 3) { - ppc_exception_handler(Except_Type::EXC_ALIGNMENT, 0x0); - } - { - return ( - ((T)tlb2_entry->reg_desc->devobj->read(tlb2_entry->reg_desc->start, - static_cast(tlb2_entry->reg_va_offs + guest_va), - 4) << 32) | - tlb2_entry->reg_desc->devobj->read(tlb2_entry->reg_desc->start, - static_cast(tlb2_entry->reg_va_offs + guest_va) + 4, - 4) - ); - } - } - else { - return ( - tlb2_entry->reg_desc->devobj->read(tlb2_entry->reg_desc->start, - static_cast(tlb2_entry->reg_va_offs + guest_va), - sizeof(T)) - ); - } + return ( + tlb2_entry->reg_desc->devobj->read(tlb2_entry->reg_desc->start, + static_cast(tlb2_entry->reg_va_offs + guest_va), + sizeof(T)) + ); } } @@ -1067,7 +1049,7 @@ inline T mmu_read_vmem(uint32_t guest_va) // handle unaligned memory accesses if (sizeof(T) > 1 && (guest_va & (sizeof(T) - 1))) { - return read_unaligned(guest_va, host_va); + return read_unaligned(guest_va, host_va, sizeof(T)); } // handle aligned memory accesses @@ -1162,24 +1144,9 @@ inline void mmu_write_vmem(uint32_t guest_va, T value) #ifdef MMU_PROFILING iomem_writes_total++; #endif - if (sizeof(T) == 8) { - if (guest_va & 3) { - ppc_exception_handler(Except_Type::EXC_ALIGNMENT, 0x0); - } - { - tlb2_entry->reg_desc->devobj->write(tlb2_entry->reg_desc->start, - static_cast(tlb2_entry->reg_va_offs + guest_va), - value >> 32, 4); - tlb2_entry->reg_desc->devobj->write(tlb2_entry->reg_desc->start, - static_cast(tlb2_entry->reg_va_offs + guest_va) + 4, - (uint32_t)value, 4); - } - } - else { - tlb2_entry->reg_desc->devobj->write(tlb2_entry->reg_desc->start, - static_cast(tlb2_entry->reg_va_offs + guest_va), - value, sizeof(T)); - } + tlb2_entry->reg_desc->devobj->write(tlb2_entry->reg_desc->start, + static_cast(tlb2_entry->reg_va_offs + guest_va), + value, sizeof(T)); return; } } @@ -1190,7 +1157,7 @@ inline void mmu_write_vmem(uint32_t guest_va, T value) // handle unaligned memory accesses if (sizeof(T) > 1 && (guest_va & (sizeof(T) - 1))) { - write_unaligned(guest_va, host_va, value); + write_unaligned(guest_va, host_va, value, sizeof(T)); return; } @@ -1217,53 +1184,42 @@ template void mmu_write_vmem(uint32_t guest_va, uint16_t value); template void mmu_write_vmem(uint32_t guest_va, uint32_t value); 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) +static uint32_t read_unaligned(uint32_t guest_va, uint8_t *host_va, uint32_t size) { - T result = 0; + uint32_t result = 0; // is it a misaligned cross-page read? - if (((guest_va & 0xFFF) + sizeof(T)) > 0x1000) { + if (((guest_va & 0xFFF) + size) > 0x1000) { #ifdef MMU_PROFILING unaligned_crossp_r++; #endif // Break such a memory access into multiple, bytewise accesses. // Because such accesses suffer a performance penalty, they will be // presumably very rare so don't waste time optimizing the code below. - for (int i = 0; i < sizeof(T); guest_va++, i++) { + for (int i = 0; i < size; guest_va++, i++) { result = (result << 8) | mmu_read_vmem(guest_va); } } else { #ifdef MMU_PROFILING unaligned_reads++; #endif - switch(sizeof(T)) { - case 1: - return *host_va; + switch(size) { case 2: return READ_WORD_BE_U(host_va); case 4: return READ_DWORD_BE_U(host_va); - case 8: - if (guest_va & 3) { - ppc_exception_handler(Except_Type::EXC_ALIGNMENT, 0x0); - } + case 8: // FIXME: should we raise alignment exception here? return READ_QWORD_BE_U(host_va); } } return result; } -// explicitely instantiate all required read_unaligned variants -template uint16_t read_unaligned(uint32_t guest_va, uint8_t *host_va); -template uint32_t read_unaligned(uint32_t guest_va, uint8_t *host_va); -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) +static void write_unaligned(uint32_t guest_va, uint8_t *host_va, uint32_t value, + uint32_t size) { // is it a misaligned cross-page write? - if (((guest_va & 0xFFF) + sizeof(T)) > 0x1000) { + if (((guest_va & 0xFFF) + size) > 0x1000) { #ifdef MMU_PROFILING unaligned_crossp_w++; #endif @@ -1271,41 +1227,29 @@ static void write_unaligned(uint32_t guest_va, uint8_t *host_va, T value) // Because such accesses suffer a performance penalty, they will be // presumably very rare so don't waste time optimizing the code below. - uint32_t shift = (sizeof(T) - 1) * 8; + uint32_t shift = (size - 1) * 8; - for (int i = 0; i < sizeof(T); shift -= 8, guest_va++, i++) { + for (int i = 0; i < size; shift -= 8, guest_va++, i++) { mmu_write_vmem(guest_va, (value >> shift) & 0xFF); } } else { #ifdef MMU_PROFILING unaligned_writes++; #endif - switch(sizeof(T)) { - case 1: - *host_va = value; - break; + switch(size) { case 2: WRITE_WORD_BE_U(host_va, value); break; case 4: WRITE_DWORD_BE_U(host_va, value); break; - case 8: - if (guest_va & 3) { - ppc_exception_handler(Except_Type::EXC_ALIGNMENT, 0x0); - } + case 8: // FIXME: should we raise alignment exception here? WRITE_QWORD_BE_U(host_va, value); break; } } } -// explicitely instantiate all required write_unaligned variants -template void write_unaligned(uint32_t guest_va, uint8_t *host_va, uint16_t value); -template void write_unaligned(uint32_t guest_va, uint8_t *host_va, uint32_t value); -template void write_unaligned(uint32_t guest_va, uint8_t *host_va, uint64_t value); - - /* MMU profiling. */ #ifdef MMU_PROFILING @@ -1934,7 +1878,7 @@ uint8_t* quickinstruction_translate(uint32_t addr) { return real_addr; } -#endif // Old and slow code +#endif uint64_t mem_read_dbg(uint32_t virt_addr, uint32_t size) { uint32_t save_dsisr, save_dar;