From 2a725029846183f3ffa881668c978ac42e6740be Mon Sep 17 00:00:00 2001 From: Florin9doi Date: Sun, 28 Dec 2025 18:03:07 +0200 Subject: [PATCH] USB: Stop sending USB replies after prx_unload --- rpcs3/Emu/Cell/PPUModule.cpp | 9 +++++++++ rpcs3/Emu/Cell/lv2/sys_usbd.cpp | 6 ++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/Cell/PPUModule.cpp b/rpcs3/Emu/Cell/PPUModule.cpp index 65ab0fe18d..309608707b 100644 --- a/rpcs3/Emu/Cell/PPUModule.cpp +++ b/rpcs3/Emu/Cell/PPUModule.cpp @@ -51,6 +51,7 @@ std::unordered_map& ppu_module_manager::get() std::vector g_ppu_function_names; atomic_t liblv2_begin = 0, liblv2_end = 0; +atomic_t libusbd_active = false; extern u32 ppu_generate_id(std::string_view name) { @@ -1919,6 +1920,10 @@ shared_ptr ppu_load_prx(const ppu_prx_object& elf, bool virtual_load, c liblv2_begin = prx->segs[0].addr; liblv2_end = prx->segs[0].addr + prx->segs[0].size; } + if (prx->path.ends_with("sys/external/libusbd.sprx"sv)) + { + libusbd_active = true; + } std::vector applied; @@ -2053,6 +2058,10 @@ void ppu_unload_prx(const lv2_prx& prx) liblv2_begin = 0; liblv2_end = 0; } + if (prx.path.ends_with("sys/external/libusbd.sprx"sv)) + { + libusbd_active = false; + } // Format patch name std::string hash = fmt::format("PRX-%s", fmt::base57(prx.sha1)); diff --git a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp index cf6339081e..941c06173f 100644 --- a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp @@ -55,6 +55,8 @@ cfg_guncon3 g_cfg_guncon3; cfg_topshotelite g_cfg_topshotelite; cfg_topshotfearmaster g_cfg_topshotfearmaster; +extern atomic_t libusbd_active; + template <> void fmt_class_string::format(std::string& out, u64 arg) { @@ -636,7 +638,7 @@ void usb_handler_thread::operator()() u64 delay = 1'000; // Process fake transfers - if (!fake_transfers.empty()) + if (libusbd_active && !fake_transfers.empty()) { std::lock_guard lock_tf(mutex_transfers); u64 timestamp = get_system_time() - Emu.GetPauseTime(); @@ -1099,7 +1101,7 @@ error_code sys_usbd_finalize(ppu_thread& ppu, u32 handle) // Forcefully awake all waiters while (auto cpu = lv2_obj::schedule(usbh.sq, SYS_SYNC_FIFO)) { - // Special ternimation signal value + // Special termination signal value cpu->gpr[4] = 4; cpu->gpr[5] = 0; cpu->gpr[6] = 0;