From 561a16a3487243a5eb2999ba3a2582e4cca42470 Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Wed, 7 Apr 2021 08:50:44 -0700 Subject: [PATCH] kern: flush memory before reading in KPageTableBase::ReadDebugMemory --- libraries/libmesosphere/source/kern_k_page_table_base.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/libraries/libmesosphere/source/kern_k_page_table_base.cpp b/libraries/libmesosphere/source/kern_k_page_table_base.cpp index dc44eecbc..5e5ff59d1 100644 --- a/libraries/libmesosphere/source/kern_k_page_table_base.cpp +++ b/libraries/libmesosphere/source/kern_k_page_table_base.cpp @@ -2198,7 +2198,9 @@ namespace ams::kern { /* Copy as much aligned data as we can. */ if (cur_size >= sizeof(u32)) { const size_t copy_size = util::AlignDown(cur_size, sizeof(u32)); - R_UNLESS(UserspaceAccess::CopyMemoryToUserAligned32Bit(buffer, GetVoidPointer(GetLinearMappedVirtualAddress(cur_addr)), copy_size), svc::ResultInvalidPointer()); + const void * copy_src = GetVoidPointer(GetLinearMappedVirtualAddress(cur_addr)); + cpu::FlushDataCache(copy_src, copy_size); + R_UNLESS(UserspaceAccess::CopyMemoryToUserAligned32Bit(buffer, copy_src, copy_size), svc::ResultInvalidPointer()); buffer = reinterpret_cast(reinterpret_cast(buffer) + copy_size); cur_addr += copy_size; cur_size -= copy_size; @@ -2206,7 +2208,9 @@ namespace ams::kern { /* Copy remaining data. */ if (cur_size > 0) { - R_UNLESS(UserspaceAccess::CopyMemoryToUser(buffer, GetVoidPointer(GetLinearMappedVirtualAddress(cur_addr)), cur_size), svc::ResultInvalidPointer()); + const void * copy_src = GetVoidPointer(GetLinearMappedVirtualAddress(cur_addr)); + cpu::FlushDataCache(copy_src, cur_size); + R_UNLESS(UserspaceAccess::CopyMemoryToUser(buffer, copy_src, cur_size), svc::ResultInvalidPointer()); } return ResultSuccess();