From 002400d0711629e2ff8b7478485a1c60dc653692 Mon Sep 17 00:00:00 2001 From: Ben Vanik Date: Sun, 20 Oct 2013 12:39:59 -0700 Subject: [PATCH] Adding memory info dumping utility, use --log_heap. --- src/xenia/core/memory.cc | 38 +++++++++++++++++++ src/xenia/core/memory.h | 2 + .../modules/xboxkrnl/xboxkrnl_memory.cc | 1 - 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/xenia/core/memory.cc b/src/xenia/core/memory.cc index bc507faca..758d517c8 100644 --- a/src/xenia/core/memory.cc +++ b/src/xenia/core/memory.cc @@ -9,6 +9,7 @@ #include +#include #include #if !XE_PLATFORM(WIN32) @@ -24,8 +25,15 @@ #define DEFAULT_GRANULARITY 64 * 1024 #define DEFAULT_TRIM_THRESHOLD MAX_SIZE_T #define MALLOC_ALIGNMENT 32 +#if XE_DEBUG +#define FOOTERS 1 +#define MALLOC_INSPECT_ALL 1 +#endif // XE_DEBUG #include +DEFINE_bool(log_heap, false, + "Log heap structure on alloc/free."); + /** * Memory map: @@ -197,6 +205,30 @@ uint32_t xe_memory_search_aligned(xe_memory_ref memory, size_t start, return 0; } +void xe_memory_heap_dump_handler( + void* start, void* end, size_t used_bytes, void* context) { + xe_memory_ref memory = (xe_memory_ref)context; + uint32_t guest_start = (uint32_t)((uintptr_t)start - (uintptr_t)memory->ptr); + uint32_t guest_end = (uint32_t)((uintptr_t)end - (uintptr_t)memory->ptr); + XELOGI(" - %.8X-%.8X (%9db) %.16llX-%.16llX - %9db used", + guest_start, guest_end, (guest_end - guest_start), + (uint64_t)start, (uint64_t)end, + used_bytes); +} +void xe_memory_heap_dump(xe_memory_ref memory) { + XELOGI("xe_memory_heap_dump:"); + struct mallinfo info = mspace_mallinfo(memory->heap); + XELOGI(" arena: %lld", info.arena); + XELOGI(" ordblks: %lld", info.ordblks); + XELOGI(" hblks: %lld", info.hblks); + XELOGI(" hblkhd: %lld", info.hblkhd); + XELOGI(" usmblks: %lld", info.usmblks); + XELOGI(" uordblks: %lld", info.uordblks); + XELOGI(" fordblks: %lld", info.fordblks); + XELOGI(" keepcost: %lld", info.keepcost); + mspace_inspect_all(memory->heap, xe_memory_heap_dump_handler, memory); +} + uint32_t xe_memory_heap_alloc( xe_memory_ref memory, uint32_t base_address, uint32_t size, uint32_t flags, uint32_t alignment) { @@ -208,6 +240,9 @@ uint32_t xe_memory_heap_alloc( // Normal allocation from the managed heap. XEIGNORE(xe_mutex_lock(memory->heap_mutex)); uint8_t* p = (uint8_t*)mspace_memalign(memory->heap, alignment, size); + if (FLAGS_log_heap) { + xe_memory_heap_dump(memory); + } XEIGNORE(xe_mutex_unlock(memory->heap_mutex)); if (!p) { return 0; @@ -251,6 +286,9 @@ int xe_memory_heap_free( XEIGNORE(xe_mutex_lock(memory->heap_mutex)); mspace_free(memory->heap, p); + if (FLAGS_log_heap) { + xe_memory_heap_dump(memory); + } XEIGNORE(xe_mutex_unlock(memory->heap_mutex)); return (uint32_t)real_size; } else { diff --git a/src/xenia/core/memory.h b/src/xenia/core/memory.h index 5f2e69297..235aec12f 100644 --- a/src/xenia/core/memory.h +++ b/src/xenia/core/memory.h @@ -50,6 +50,8 @@ enum { XE_MEMORY_ACCESS_WRITE = (1 << 2) }; +void xe_memory_heap_dump(xe_memory_ref memory); + uint32_t xe_memory_heap_alloc(xe_memory_ref memory, uint32_t base_address, uint32_t size, uint32_t flags, uint32_t alignment = 0x20); diff --git a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_memory.cc b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_memory.cc index b5aaee7aa..8eaa47316 100644 --- a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_memory.cc +++ b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_memory.cc @@ -33,7 +33,6 @@ X_STATUS xeNtAllocateVirtualMemory( // NTSTATUS // _Inout_ PVOID *BaseAddress, - // _In_ ULONG_PTR ZeroBits, // _Inout_ PSIZE_T RegionSize, // _In_ ULONG AllocationType, // _In_ ULONG Protect