From 407c18e6fd4df84f9ecafbf815aa1f976d5fbfb5 Mon Sep 17 00:00:00 2001 From: PabloMK7 Date: Fri, 26 Sep 2025 17:34:31 +0200 Subject: [PATCH] plugin_loader: Make plugin reply timeout configurable (#2183) --- sysmodules/rosalina/include/plugin/plgldr.h | 8 +++++--- sysmodules/rosalina/source/plugin/file_loader.c | 1 + sysmodules/rosalina/source/plugin/plgloader.c | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/sysmodules/rosalina/include/plugin/plgldr.h b/sysmodules/rosalina/include/plugin/plgldr.h index 9a6f6e9e..f9a4e621 100644 --- a/sysmodules/rosalina/include/plugin/plgldr.h +++ b/sysmodules/rosalina/include/plugin/plgldr.h @@ -56,10 +56,12 @@ typedef struct s32* plgldrEvent; ///< Used for synchronization s32* plgldrReply; ///< Used for synchronization u8 notifyHomeEvent; - u8 padding[3]; - u32 reserved[23]; + u8 padding[7]; + u64 waitForReplyTimeout; + u32 reserved[20]; u32 config[32]; -} PluginHeader; +} PluginHeader; +_Static_assert(sizeof(PluginHeader) == 0x100, "Invalid PluginHeader size"); typedef void (*OnPlgLdrEventCb_t)(s32 eventType); diff --git a/sysmodules/rosalina/source/plugin/file_loader.c b/sysmodules/rosalina/source/plugin/file_loader.c index 0e2a3499..ab09021d 100644 --- a/sysmodules/rosalina/source/plugin/file_loader.c +++ b/sysmodules/rosalina/source/plugin/file_loader.c @@ -270,6 +270,7 @@ bool TryToLoadPlugin(Handle process, bool isHomebrew) } pluginHeader->version = header->version; + pluginHeader->waitForReplyTimeout = 10000000000ULL; // Code size must be page aligned exeHdr = &header->executable; pluginHeader->exeSize = (sizeof(PluginHeader) + exeHdr->codeSize + exeHdr->rodataSize + exeHdr->dataSize + exeHdr->bssSize + 0x1000) & ~0xFFF; diff --git a/sysmodules/rosalina/source/plugin/plgloader.c b/sysmodules/rosalina/source/plugin/plgloader.c index c1b3be1b..e8c3e316 100644 --- a/sysmodules/rosalina/source/plugin/plgloader.c +++ b/sysmodules/rosalina/source/plugin/plgloader.c @@ -516,7 +516,7 @@ void PLG__WaitForReply(void) { if (PluginLoaderCtx.eventsSelfManaged) return; __strex__(PluginLoaderCtx.plgReplyPA, PLG_WAIT); - svcArbitrateAddress(PluginLoaderCtx.arbiter, (u32)PluginLoaderCtx.plgReplyPA, ARBITRATION_WAIT_IF_LESS_THAN_TIMEOUT, PLG_OK, 10000000000ULL); + svcArbitrateAddress(PluginLoaderCtx.arbiter, (u32)PluginLoaderCtx.plgReplyPA, ARBITRATION_WAIT_IF_LESS_THAN_TIMEOUT, PLG_OK, MemoryBlock__GetMappedPluginHeader()->waitForReplyTimeout); } void PLG__SetConfigMemoryStatus(u32 status)