From bb30453d43e4d9e05a96a08de9687d1810f1c14b Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Mon, 28 Dec 2020 00:57:15 -0800 Subject: [PATCH] kern: fix KTrace buffer memory region type to match official kernel --- .../include/mesosphere/kern_k_memory_region_type.hpp | 5 ++--- .../source/kern_k_memory_layout.board.nintendo_nx.cpp | 7 +++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/libmesosphere/include/mesosphere/kern_k_memory_region_type.hpp b/libmesosphere/include/mesosphere/kern_k_memory_region_type.hpp index 06fd11d2..5c77ed36 100644 --- a/libmesosphere/include/mesosphere/kern_k_memory_region_type.hpp +++ b/libmesosphere/include/mesosphere/kern_k_memory_region_type.hpp @@ -184,14 +184,13 @@ namespace ams::kern { constexpr inline const auto KMemoryRegionType_DramReservedEarly = KMemoryRegionType_DramReservedBase.DeriveAttribute(KMemoryRegionAttr_NoUserMap); static_assert(KMemoryRegionType_DramReservedEarly.GetValue() == (0x16 | KMemoryRegionAttr_NoUserMap)); - /* UNUSED: DeriveSparse(0, 3, 0); */ + constexpr inline const auto KMemoryRegionType_KernelTraceBuffer = KMemoryRegionType_DramReservedBase.DeriveSparse(0, 3, 0).SetAttribute(KMemoryRegionAttr_LinearMapped).SetAttribute(KMemoryRegionAttr_UserReadOnly); constexpr inline const auto KMemoryRegionType_OnMemoryBootImage = KMemoryRegionType_DramReservedBase.DeriveSparse(0, 3, 1); constexpr inline const auto KMemoryRegionType_DTB = KMemoryRegionType_DramReservedBase.DeriveSparse(0, 3, 2); + static_assert(KMemoryRegionType_KernelTraceBuffer.GetValue() == (0xD6 | KMemoryRegionAttr_LinearMapped | KMemoryRegionAttr_UserReadOnly)); static_assert(KMemoryRegionType_OnMemoryBootImage.GetValue() == 0x156); static_assert(KMemoryRegionType_DTB.GetValue() == 0x256); - constexpr inline const auto KMemoryRegionType_KernelTraceBuffer = KMemoryRegionType_DramHeapBase.DeriveTransition(1, 3).SetAttribute(KMemoryRegionAttr_UserReadOnly); - static_assert(KMemoryRegionType_KernelTraceBuffer.GetValue() == (0xA6 | KMemoryRegionAttr_LinearMapped | KMemoryRegionAttr_UserReadOnly)); constexpr inline const auto KMemoryRegionType_DramPoolPartition = KMemoryRegionType_DramHeapBase.DeriveAttribute(KMemoryRegionAttr_NoUserMap); static_assert(KMemoryRegionType_DramPoolPartition.GetValue() == (0x26 | KMemoryRegionAttr_LinearMapped | KMemoryRegionAttr_NoUserMap)); diff --git a/libmesosphere/source/kern_k_memory_layout.board.nintendo_nx.cpp b/libmesosphere/source/kern_k_memory_layout.board.nintendo_nx.cpp index 129edaba..5d972d12 100644 --- a/libmesosphere/source/kern_k_memory_layout.board.nintendo_nx.cpp +++ b/libmesosphere/source/kern_k_memory_layout.board.nintendo_nx.cpp @@ -100,6 +100,13 @@ namespace ams::kern { /* Insert blocks into the tree. */ MESOSPHERE_INIT_ABORT_UNLESS(KMemoryLayout::GetPhysicalMemoryRegionTree().Insert(GetInteger(physical_memory_base_address), intended_memory_size, KMemoryRegionType_Dram)); MESOSPHERE_INIT_ABORT_UNLESS(KMemoryLayout::GetPhysicalMemoryRegionTree().Insert(GetInteger(physical_memory_base_address), ReservedEarlyDramSize, KMemoryRegionType_DramReservedEarly)); + + /* Insert the KTrace block at the end of Dram, if KTrace is enabled. */ + static_assert(!IsKTraceEnabled || KTraceBufferSize > 0); + if constexpr (IsKTraceEnabled) { + const KPhysicalAddress ktrace_buffer_phys_addr = physical_memory_base_address + intended_memory_size - KTraceBufferSize; + MESOSPHERE_INIT_ABORT_UNLESS(KMemoryLayout::GetPhysicalMemoryRegionTree().Insert(GetInteger(ktrace_buffer_phys_addr), KTraceBufferSize, KMemoryRegionType_KernelTraceBuffer)); + } } void SetupPoolPartitionMemoryRegions() {