From 40701814e2ef54576054f1b3006de2d11771617d Mon Sep 17 00:00:00 2001 From: MaranBr Date: Fri, 13 Mar 2026 09:25:04 -0400 Subject: [PATCH 01/30] Reapply "Simplify TextureCache GC and remove redundant code" --- src/video_core/texture_cache/texture_cache.h | 137 ++---------------- .../texture_cache/texture_cache_base.h | 1 - 2 files changed, 9 insertions(+), 129 deletions(-) diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index efae825885..0ca086e14b 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -70,14 +70,10 @@ TextureCache

::TextureCache(Runtime& runtime_, Tegra::MaxwellDeviceMemoryManag (std::max)((std::min)(device_local_memory - min_vacancy_critical, min_spacing_critical), DEFAULT_CRITICAL_MEMORY)); minimum_memory = static_cast((device_local_memory - mem_threshold) / 2); - - lowmemorydevice = false; } else { expected_memory = DEFAULT_EXPECTED_MEMORY + 512_MiB; critical_memory = DEFAULT_CRITICAL_MEMORY + 1_GiB; minimum_memory = 0; - - lowmemorydevice = true; } const bool gpu_unswizzle_enabled = Settings::values.gpu_unswizzle_enabled.GetValue(); @@ -122,102 +118,44 @@ void TextureCache

::RunGarbageCollector() { bool aggressive_mode = false; u64 ticks_to_destroy = 0; size_t num_iterations = 0; - const auto Configure = [&](bool allow_aggressive) { high_priority_mode = total_used_memory >= expected_memory; aggressive_mode = allow_aggressive && total_used_memory >= critical_memory; ticks_to_destroy = aggressive_mode ? 10ULL : high_priority_mode ? 25ULL : 50ULL; num_iterations = aggressive_mode ? 40 : (high_priority_mode ? 20 : 10); }; - - const auto Cleanup = [this, &num_iterations, &high_priority_mode, - &aggressive_mode](ImageId image_id) { + const auto Cleanup = [this, &num_iterations, &high_priority_mode, &aggressive_mode](ImageId image_id) { if (num_iterations == 0) { return true; } --num_iterations; auto& image = slot_images[image_id]; - - // Never delete recently allocated sparse textures (within 3 frames) - const bool is_recently_allocated = image.allocation_tick >= frame_tick - 3; - if (is_recently_allocated && image.info.is_sparse) { - return false; - } - if (True(image.flags & ImageFlagBits::IsDecoding)) { - // This image is still being decoded, deleting it will invalidate the slot - // used by the async decoder thread. return false; } - - // Prioritize large sparse textures for cleanup - const bool is_large_sparse = lowmemorydevice && - image.info.is_sparse && - image.guest_size_bytes >= 256_MiB; - - if (!aggressive_mode && !is_large_sparse && - True(image.flags & ImageFlagBits::CostlyLoad)) { - return false; - } - - const bool must_download = - image.IsSafeDownload() && False(image.flags & ImageFlagBits::BadOverlap); - if (!high_priority_mode && !is_large_sparse && must_download) { - return false; - } - - if (must_download && !is_large_sparse) { + if (image.IsSafeDownload() && False(image.flags & ImageFlagBits::BadOverlap)) { auto map = runtime.DownloadStagingBuffer(image.unswizzled_size_bytes); const auto copies = FixSmallVectorADL(FullDownloadCopies(image.info)); image.DownloadMemory(map, copies); runtime.Finish(); - SwizzleImage(*gpu_memory, image.gpu_addr, image.info, copies, map.mapped_span, - swizzle_data_buffer); + SwizzleImage(*gpu_memory, image.gpu_addr, image.info, copies, map.mapped_span, swizzle_data_buffer); } - if (True(image.flags & ImageFlagBits::Tracked)) { UntrackImage(image, image_id); } UnregisterImage(image_id); DeleteImage(image_id, image.scale_tick > frame_tick + 5); - - if (total_used_memory < critical_memory) { - if (aggressive_mode) { - // Sink the aggresiveness. - num_iterations >>= 2; - aggressive_mode = false; - return false; - } - if (high_priority_mode && total_used_memory < expected_memory) { - num_iterations >>= 1; - high_priority_mode = false; - } + if (aggressive_mode && total_used_memory < critical_memory) { + num_iterations >>= 2; + aggressive_mode = false; + } else if (high_priority_mode && total_used_memory < expected_memory) { + num_iterations >>= 1; + high_priority_mode = false; } return false; }; - - // Aggressively clear massive sparse textures - if (total_used_memory >= expected_memory) { - lru_cache.ForEachItemBelow(frame_tick, [&](ImageId image_id) { - auto& image = slot_images[image_id]; - // Only target sparse textures that are old enough - if (lowmemorydevice && - image.info.is_sparse && - image.guest_size_bytes >= 256_MiB && - image.allocation_tick < frame_tick - 3) { - LOG_DEBUG(HW_GPU, "GC targeting old sparse texture at 0x{:X} ({} MiB, age: {} frames)", - image.gpu_addr, image.guest_size_bytes / (1024 * 1024), - frame_tick - image.allocation_tick); - return Cleanup(image_id); - } - return false; - }); - } - Configure(false); lru_cache.ForEachItemBelow(frame_tick - ticks_to_destroy, Cleanup); - - // If pressure is still too high, prune aggressively. if (total_used_memory >= critical_memory) { Configure(true); lru_cache.ForEachItemBelow(frame_tick - ticks_to_destroy, Cleanup); @@ -1196,9 +1134,6 @@ void TextureCache

::RefreshContents(Image& image, ImageId image_id) { } image.flags &= ~ImageFlagBits::CpuModified; - if( lowmemorydevice && image.info.format == PixelFormat::BC1_RGBA_UNORM && MapSizeBytes(image) >= 256_MiB ) { - return; - } TrackImage(image, image_id); @@ -1619,39 +1554,6 @@ ImageId TextureCache

::InsertImage(const ImageInfo& info, GPUVAddr gpu_addr, } } ASSERT_MSG(cpu_addr, "Tried to insert an image to an invalid gpu_addr=0x{:x}", gpu_addr); - - // For large sparse textures, aggressively clean up old allocations at same address - if (lowmemorydevice && info.is_sparse && CalculateGuestSizeInBytes(info) >= 256_MiB) { - const auto alloc_it = image_allocs_table.find(gpu_addr); - if (alloc_it != image_allocs_table.end()) { - const ImageAllocId alloc_id = alloc_it->second; - auto& alloc_images = slot_image_allocs[alloc_id].images; - - // Collect old images at this address that were created more than 2 frames ago - boost::container::small_vector to_delete; - for (ImageId old_image_id : alloc_images) { - Image& old_image = slot_images[old_image_id]; - if (old_image.info.is_sparse && - old_image.gpu_addr == gpu_addr && - old_image.allocation_tick < frame_tick - 2) { // Try not to delete fresh textures - to_delete.push_back(old_image_id); - } - } - - // Delete old images immediately - for (ImageId old_id : to_delete) { - Image& old_image = slot_images[old_id]; - LOG_DEBUG(HW_GPU, "Immediately deleting old sparse texture at 0x{:X} ({} MiB)", - gpu_addr, old_image.guest_size_bytes / (1024 * 1024)); - if (True(old_image.flags & ImageFlagBits::Tracked)) { - UntrackImage(old_image, old_id); - } - UnregisterImage(old_id); - DeleteImage(old_id, true); - } - } - } - const ImageId image_id = JoinImages(info, gpu_addr, *cpu_addr); const Image& image = slot_images[image_id]; // Using "image.gpu_addr" instead of "gpu_addr" is important because it might be different @@ -1667,27 +1569,6 @@ template ImageId TextureCache

::JoinImages(const ImageInfo& info, GPUVAddr gpu_addr, DAddr cpu_addr) { ImageInfo new_info = info; const size_t size_bytes = CalculateGuestSizeInBytes(new_info); - - // Proactive cleanup for large sparse texture allocations - if (lowmemorydevice && new_info.is_sparse && size_bytes >= 256_MiB) { - const u64 estimated_alloc_size = size_bytes; - - if (total_used_memory + estimated_alloc_size >= critical_memory) { - LOG_DEBUG(HW_GPU, "Large sparse texture allocation ({} MiB) - running aggressive GC. " - "Current memory: {} MiB, Critical: {} MiB", - size_bytes / (1024 * 1024), - total_used_memory / (1024 * 1024), - critical_memory / (1024 * 1024)); - RunGarbageCollector(); - - // If still over threshold after GC, try one more aggressive pass - if (total_used_memory + estimated_alloc_size >= critical_memory) { - LOG_DEBUG(HW_GPU, "Still critically low on memory, running second GC pass"); - RunGarbageCollector(); - } - } - } - const bool broken_views = runtime.HasBrokenTextureViewFormats(); const bool native_bgr = runtime.HasNativeBgr(); join_overlap_ids.clear(); diff --git a/src/video_core/texture_cache/texture_cache_base.h b/src/video_core/texture_cache/texture_cache_base.h index 4b4061f21d..47f52c5c99 100644 --- a/src/video_core/texture_cache/texture_cache_base.h +++ b/src/video_core/texture_cache/texture_cache_base.h @@ -478,7 +478,6 @@ private: u64 minimum_memory; u64 expected_memory; u64 critical_memory; - bool lowmemorydevice = false; size_t gpu_unswizzle_maxsize = 0; size_t swizzle_chunk_size = 0; u32 swizzle_slices_per_batch = 0; From 653b134ae1992023f895b0c18a91d4154edf3aa8 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Fri, 13 Mar 2026 15:51:07 -0400 Subject: [PATCH 02/30] Relax GC if it's not in High Priority mode --- src/video_core/texture_cache/texture_cache.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 0ca086e14b..2150189131 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -133,6 +133,9 @@ void TextureCache

::RunGarbageCollector() { if (True(image.flags & ImageFlagBits::IsDecoding)) { return false; } + if (!high_priority_mode && True(image.flags & ImageFlagBits::CostlyLoad)) { + return false; + } if (image.IsSafeDownload() && False(image.flags & ImageFlagBits::BadOverlap)) { auto map = runtime.DownloadStagingBuffer(image.unswizzled_size_bytes); const auto copies = FixSmallVectorADL(FullDownloadCopies(image.info)); From fd7f6c9130f34e5792eaa9019098326c4c0a2745 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Fri, 13 Mar 2026 22:23:00 +0100 Subject: [PATCH 03/30] ?ploo --- src/video_core/texture_cache/texture_cache.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 2150189131..335069ab8d 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -133,10 +133,11 @@ void TextureCache

::RunGarbageCollector() { if (True(image.flags & ImageFlagBits::IsDecoding)) { return false; } - if (!high_priority_mode && True(image.flags & ImageFlagBits::CostlyLoad)) { + const bool must_download = image.IsSafeDownload() && False(image.flags & ImageFlagBits::BadOverlap); + if (!high_priority_mode && must_download) { return false; } - if (image.IsSafeDownload() && False(image.flags & ImageFlagBits::BadOverlap)) { + if (must_download) { auto map = runtime.DownloadStagingBuffer(image.unswizzled_size_bytes); const auto copies = FixSmallVectorADL(FullDownloadCopies(image.info)); image.DownloadMemory(map, copies); From f9e9f5c64cb4386ba4227c3b0a530b8484805c96 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Sat, 14 Mar 2026 03:16:16 +0100 Subject: [PATCH 04/30] Again --- src/video_core/texture_cache/texture_cache.h | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 335069ab8d..5829e0773f 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -133,11 +133,7 @@ void TextureCache

::RunGarbageCollector() { if (True(image.flags & ImageFlagBits::IsDecoding)) { return false; } - const bool must_download = image.IsSafeDownload() && False(image.flags & ImageFlagBits::BadOverlap); - if (!high_priority_mode && must_download) { - return false; - } - if (must_download) { + if (image.IsSafeDownload() && False(image.flags & ImageFlagBits::BadOverlap)) { auto map = runtime.DownloadStagingBuffer(image.unswizzled_size_bytes); const auto copies = FixSmallVectorADL(FullDownloadCopies(image.info)); image.DownloadMemory(map, copies); @@ -148,7 +144,7 @@ void TextureCache

::RunGarbageCollector() { UntrackImage(image, image_id); } UnregisterImage(image_id); - DeleteImage(image_id, image.scale_tick > frame_tick + 5); + DeleteImage(image_id, image.scale_tick > frame_tick + 5 || aggressive_mode); if (aggressive_mode && total_used_memory < critical_memory) { num_iterations >>= 2; aggressive_mode = false; From a00b14f70f573d8b9446fceb203d243739217216 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Sun, 15 Mar 2026 15:31:07 +0100 Subject: [PATCH 05/30] ?ploo --- src/video_core/texture_cache/texture_cache.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 5829e0773f..82aae27ad9 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -144,7 +144,7 @@ void TextureCache

::RunGarbageCollector() { UntrackImage(image, image_id); } UnregisterImage(image_id); - DeleteImage(image_id, image.scale_tick > frame_tick + 5 || aggressive_mode); + DeleteImage(image_id, image.scale_tick > frame_tick + 10 || aggressive_mode); if (aggressive_mode && total_used_memory < critical_memory) { num_iterations >>= 2; aggressive_mode = false; From d3cabad8d6ea46e8c3ae6c2b8a67e28dd61101f1 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Mon, 16 Mar 2026 15:43:52 +0100 Subject: [PATCH 06/30] Relax a little bit --- src/video_core/texture_cache/texture_cache.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 82aae27ad9..138f6bb5f8 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -128,12 +128,16 @@ void TextureCache

::RunGarbageCollector() { if (num_iterations == 0) { return true; } - --num_iterations; auto& image = slot_images[image_id]; if (True(image.flags & ImageFlagBits::IsDecoding)) { return false; } - if (image.IsSafeDownload() && False(image.flags & ImageFlagBits::BadOverlap)) { + const bool must_download = image.IsSafeDownload() && False(image.flags & ImageFlagBits::BadOverlap); + if (!aggressive_mode && !high_priority_mode && (True(image.flags & ImageFlagBits::CostlyLoad) || must_download)) { + return false; + } + --num_iterations; + if (must_download && !image.info.is_sparse) { auto map = runtime.DownloadStagingBuffer(image.unswizzled_size_bytes); const auto copies = FixSmallVectorADL(FullDownloadCopies(image.info)); image.DownloadMemory(map, copies); @@ -144,7 +148,7 @@ void TextureCache

::RunGarbageCollector() { UntrackImage(image, image_id); } UnregisterImage(image_id); - DeleteImage(image_id, image.scale_tick > frame_tick + 10 || aggressive_mode); + DeleteImage(image_id, image.scale_tick > frame_tick + 5); if (aggressive_mode && total_used_memory < critical_memory) { num_iterations >>= 2; aggressive_mode = false; From 5b53c13a6a44447f0b6f5722c160dff2fed48fba Mon Sep 17 00:00:00 2001 From: MaranBr Date: Mon, 16 Mar 2026 19:01:44 +0100 Subject: [PATCH 07/30] Minor adjustment --- src/video_core/texture_cache/texture_cache.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 138f6bb5f8..e73dad354b 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -137,7 +137,7 @@ void TextureCache

::RunGarbageCollector() { return false; } --num_iterations; - if (must_download && !image.info.is_sparse) { + if (must_download) { auto map = runtime.DownloadStagingBuffer(image.unswizzled_size_bytes); const auto copies = FixSmallVectorADL(FullDownloadCopies(image.info)); image.DownloadMemory(map, copies); From 337ef2e21a809d6682af1e4b01367aba34bab442 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Mon, 27 Apr 2026 03:29:45 +0200 Subject: [PATCH 08/30] Relax a little bit --- src/video_core/texture_cache/texture_cache.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index e73dad354b..5a1c680830 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -133,7 +133,7 @@ void TextureCache

::RunGarbageCollector() { return false; } const bool must_download = image.IsSafeDownload() && False(image.flags & ImageFlagBits::BadOverlap); - if (!aggressive_mode && !high_priority_mode && (True(image.flags & ImageFlagBits::CostlyLoad) || must_download)) { + if ((!aggressive_mode && True(image.flags & ImageFlagBits::CostlyLoad)) || (!high_priority_mode && must_download)) { return false; } --num_iterations; From 1590e7c061898d23f3f8647b41d86b36aa148ad3 Mon Sep 17 00:00:00 2001 From: Duncan Ogilvie Date: Mon, 27 Apr 2026 03:39:34 +0200 Subject: [PATCH 09/30] [core] GDB improvements (#3848) The commands to reproduce the issues are in the commit messages. I tested on Super Mario Odyssey using [nx2elf](https://github.com/shuffle2/nx2elf) converted binaries and gdb-multiarch: ``` (gdb) monitor info Process: 0x51 (Application) Program Id: 0x0100000000010000 Layout: Alias: 0x1103400000 - 0x21033fffff Heap: 0x2103400000 - 0x23033fffff Aslr: 0x0008000000 - 0x7fffffffff Stack: 0x1083400000 - 0x11033fffff Modules: 0x0080b3d000 - 0x0080b40fff nnrtld 0x0080b41000 - 0x0081ff1fff RedStar.nss 0x0081ff2000 - 0x008270efff multimedia 0x008270f000 - 0x00833e2fff nnSdk (gdb) monitor mappings Mappings: 0x0000000000 - 0x0080b3cfff Free ----- [0, 0] 0x0080b3d000 - 0x0080b3efff r-x Code ----- [0, 0] 0x0080b3f000 - 0x0080b3ffff r-- Code ----- [0, 0] 0x0080b40000 - 0x0080b40fff rw- CodeData ----- [0, 0] 0x0080b41000 - 0x008156bfff r-x Code ----- [0, 0] 0x008156c000 - 0x0081cdafff r-- Code ----- [0, 0] 0x0081cdb000 - 0x0081ff1fff rw- CodeData ----- [0, 0] 0x0081ff2000 - 0x0082365fff r-x Code ----- [0, 0] 0x0082366000 - 0x00825c0fff r-- Code ----- [0, 0] 0x00825c1000 - 0x008270efff rw- CodeData ----- [0, 0] 0x008270f000 - 0x0082c3cfff r-x Code ----- [0, 0] 0x0082c3d000 - 0x00832bffff r-- Code ----- [0, 0] 0x00832c0000 - 0x00833e2fff rw- CodeData ----- [0, 0] 0x00833e3000 - 0x0083403fff Free ----- [0, 0] 0x0083404000 - 0x0083404fff rw- ThreadLocal ----- [0, 0] 0x0083405000 - 0x1083403fff Free ----- [0, 0] 0x1083404000 - 0x1083503fff rw- Stack ----- [0, 0] 0x1083504000 - 0x7fffffffff Free ----- [0, 0] (gdb) set sysroot (gdb) set solib-search-path /Users/duncan/Downloads/smo-program Reading symbols from /Users/duncan/Downloads/smo-program/rtld.elf... (No debugging symbols found in /Users/duncan/Downloads/smo-program/rtld.elf) Reading symbols from /Users/duncan/Downloads/smo-program/main.elf... (No debugging symbols found in /Users/duncan/Downloads/smo-program/main.elf) Reading symbols from /Users/duncan/Downloads/smo-program/subsdk0.elf... (No debugging symbols found in /Users/duncan/Downloads/smo-program/subsdk0.elf) Reading symbols from /Users/duncan/Downloads/smo-program/sdk.elf... (No debugging symbols found in /Users/duncan/Downloads/smo-program/sdk.elf) (gdb) info shared From To Syms Read Shared Object Library 0x0000000080b3d000 0x0000000080b41000 Yes (*) /Users/duncan/Downloads/smo-program/rtld.elf 0x0000000080b41000 0x0000000081ff2000 Yes (*) /Users/duncan/Downloads/smo-program/main.elf 0x0000000081ff2000 0x000000008270f000 Yes (*) /Users/duncan/Downloads/smo-program/subsdk0.elf 0x000000008270f000 0x00000000833e3000 Yes (*) /Users/duncan/Downloads/smo-program/sdk.elf (*): Shared library is missing debugging information. (gdb) info functions nnMain All functions matching regular expression "nnMain": Non-debugging symbols: 0x0000000081024250 nnMain 0x0000000082c2de40 nnMain@plt (gdb) b *nnMain Breakpoint 1 at 0x81024250 (gdb) c Continuing. Breakpoint 1, 0x0000000081024250 in nnMain () from /Users/duncan/Downloads/smo-program/main.elf (gdb) x/10i $pc => 0x81024250 : stp x22, x21, [sp, #-48]! 0x81024254 : stp x20, x19, [sp, #16] 0x81024258 : stp x29, x30, [sp, #32] 0x8102425c : add x29, sp, #0x20 0x81024260 : bl 0x81569aa0 0x81024264 : mov w19, w0 0x81024268 : bl 0x81569ab0 0x8102426c : mov x20, x0 0x81024270 : mov w0, w19 0x81024274 : mov x1, x20 ``` Symlinked like this: ``` ls -l /Users/duncan/Downloads/smo-program total 687472 -rw-r--r--@ 1 duncan staff 20385356 Apr 9 18:12 main.elf lrwxr-xr-x@ 1 duncan staff 11 Apr 9 15:26 multimedia -> subsdk0.elf lrwxr-xr-x@ 1 duncan staff 8 Apr 9 15:28 nnrtld -> rtld.elf lrwxr-xr-x@ 1 duncan staff 7 Apr 9 15:26 nnSdk -> sdk.elf lrwxr-xr-x@ 1 duncan staff 8 Apr 9 15:26 RedStar.nss -> main.elf -rw-r--r--@ 1 duncan staff 12440 Apr 9 18:12 rtld.elf -rw-r--r--@ 1 duncan staff 12662960 Apr 9 18:12 sdk.elf -rw-r--r--@ 1 duncan staff 6294336 Apr 9 18:12 subsdk0.elf ``` Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3848 Reviewed-by: Lizzie Reviewed-by: crueter --- src/core/debugger/gdbstub_arch.cpp | 4 ++-- src/core/hle/kernel/physical_core.cpp | 28 ++++++++++++++++++++++----- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/core/debugger/gdbstub_arch.cpp b/src/core/debugger/gdbstub_arch.cpp index fec75c3432..5c5f3e8704 100644 --- a/src/core/debugger/gdbstub_arch.cpp +++ b/src/core/debugger/gdbstub_arch.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project @@ -283,7 +283,7 @@ std::string_view GDBStubA32::GetTargetXML() const { - +