From 8da60d02afbf881e1e25e39e5a16d6ba51658322 Mon Sep 17 00:00:00 2001 From: PabloMK7 Date: Sun, 18 May 2025 17:27:37 +0200 Subject: [PATCH] Add setting to toggle RPC server (disabled by default) (#1047) --- .../features/settings/model/BooleanSetting.kt | 1 + .../features/settings/ui/SettingsFragmentPresenter.kt | 9 +++++++++ src/android/app/src/main/jni/config.cpp | 1 + src/android/app/src/main/jni/default_ini.h | 4 ++++ src/android/app/src/main/res/values/strings.xml | 2 ++ src/citra_qt/configuration/configure_debug.cpp | 7 +++++++ src/citra_qt/configuration/configure_debug.ui | 10 ++++++++++ src/common/settings.h | 1 + src/core/core.cpp | 4 +++- 9 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt index 26b97453e..ba6338bb8 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt @@ -16,6 +16,7 @@ enum class BooleanSetting( ALLOW_PLUGIN_LOADER("allow_plugin_loader", Settings.SECTION_SYSTEM, true), SWAP_SCREEN("swap_screen", Settings.SECTION_LAYOUT, false), INSTANT_DEBUG_LOG("instant_debug_log", Settings.SECTION_DEBUG, false), + ENABLE_RPC_SERVER("enable_rpc_server", Settings.SECTION_DEBUG, false), CUSTOM_LAYOUT("custom_layout",Settings.SECTION_LAYOUT,false), DELAY_START_LLE_MODULES("delay_start_for_lle_modules", Settings.SECTION_DEBUG, true), DETERMINISTIC_ASYNC_OPERATIONS("deterministic_async_operations", Settings.SECTION_DEBUG, false), diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt index b560a7af7..a22189482 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -1473,6 +1473,15 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) BooleanSetting.INSTANT_DEBUG_LOG.defaultValue ) ) + add( + SwitchSetting( + BooleanSetting.ENABLE_RPC_SERVER, + R.string.enable_rpc_server, + R.string.enable_rpc_server_desc, + BooleanSetting.ENABLE_RPC_SERVER.key, + BooleanSetting.ENABLE_RPC_SERVER.defaultValue + ) + ) add( SwitchSetting( BooleanSetting.DELAY_START_LLE_MODULES, diff --git a/src/android/app/src/main/jni/config.cpp b/src/android/app/src/main/jni/config.cpp index e7d878294..025136273 100644 --- a/src/android/app/src/main/jni/config.cpp +++ b/src/android/app/src/main/jni/config.cpp @@ -292,6 +292,7 @@ void Config::ReadValues() { ReadSetting("Debugging", Settings::values.use_gdbstub); ReadSetting("Debugging", Settings::values.gdbstub_port); ReadSetting("Debugging", Settings::values.instant_debug_log); + ReadSetting("Debugging", Settings::values.enable_rpc_server); for (const auto& service_module : Service::service_module_map) { bool use_lle = sdl2_config->GetBoolean("Debugging", "LLE\\" + service_module.name, false); diff --git a/src/android/app/src/main/jni/default_ini.h b/src/android/app/src/main/jni/default_ini.h index 5bed81173..3c0d527b8 100644 --- a/src/android/app/src/main/jni/default_ini.h +++ b/src/android/app/src/main/jni/default_ini.h @@ -436,6 +436,10 @@ gdbstub_port=24689 # Immediately commits the debug log to file. Use this if Azahar crashes and the log output is being cut. instant_debug_log = +# Enable RPC server for scripting purposes. Allows accessing guest memory remotely. +# 0 (default): Off, 1: On +enable_rpc_server = + # Delay the start of apps when LLE modules are enabled # 0: Off, 1 (default): On delay_start_for_lle_modules = diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 16d84d1bc..7b8616772 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -318,6 +318,8 @@ Delays the start of the app when LLE modules are enabled. Deterministic Async Operations Makes async operations deterministic for debugging. Enabling this may cause freezes. + Enable RPC Server + Enables the RPC server on port 45987. This allows remotely reading/writing guest memory. Screen Orientation diff --git a/src/citra_qt/configuration/configure_debug.cpp b/src/citra_qt/configuration/configure_debug.cpp index 3fa9205f6..d1c3457c0 100644 --- a/src/citra_qt/configuration/configure_debug.cpp +++ b/src/citra_qt/configuration/configure_debug.cpp @@ -104,6 +104,11 @@ void ConfigureDebug::SetConfiguration() { Settings::values.delay_start_for_lle_modules.GetValue()); ui->deterministic_async_operations->setChecked( Settings::values.deterministic_async_operations.GetValue()); + ui->enable_rpc_server->setChecked(Settings::values.enable_rpc_server.GetValue()); +#ifndef ENABLE_SCRIPTING + ui->enable_rpc_server->setVisible(false); +#endif // !ENABLE_SCRIPTING + ui->toggle_renderer_debug->setChecked(Settings::values.renderer_debug.GetValue()); ui->toggle_dump_command_buffers->setChecked(Settings::values.dump_command_buffers.GetValue()); @@ -141,6 +146,7 @@ void ConfigureDebug::ApplyConfiguration() { Settings::values.delay_start_for_lle_modules = ui->delay_start_for_lle_modules->isChecked(); Settings::values.deterministic_async_operations = ui->deterministic_async_operations->isChecked(); + Settings::values.enable_rpc_server = ui->enable_rpc_server->isChecked(); Settings::values.renderer_debug = ui->toggle_renderer_debug->isChecked(); Settings::values.dump_command_buffers = ui->toggle_dump_command_buffers->isChecked(); Settings::values.instant_debug_log = ui->instant_debug_log->isChecked(); @@ -164,6 +170,7 @@ void ConfigureDebug::SetupPerGameUI() { ui->groupBox->setVisible(false); ui->groupBox_2->setVisible(false); + ui->enable_rpc_server->setVisible(false); ui->toggle_cpu_jit->setVisible(false); } diff --git a/src/citra_qt/configuration/configure_debug.ui b/src/citra_qt/configuration/configure_debug.ui index 2caafc919..fd870d9a4 100644 --- a/src/citra_qt/configuration/configure_debug.ui +++ b/src/citra_qt/configuration/configure_debug.ui @@ -279,6 +279,16 @@ + + + + Enable RPC server + + + <html><head/><body><p>Enables the RPC server on port 45987. This allows remotely reading/writing guest memory, do not enable if you don't know what you are doing.</p></body></html> + + + diff --git a/src/common/settings.h b/src/common/settings.h index d061add3c..d9f1a1e87 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -587,6 +587,7 @@ struct Values { Setting use_gdbstub{false, "use_gdbstub"}; Setting gdbstub_port{24689, "gdbstub_port"}; Setting instant_debug_log{false, "instant_debug_log"}; + Setting enable_rpc_server{false, "enable_rpc_server"}; // Miscellaneous Setting log_filter{"*:Info", "log_filter"}; diff --git a/src/core/core.cpp b/src/core/core.cpp index d5064787d..36fb8cc56 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -503,7 +503,9 @@ System::ResultStatus System::Init(Frontend::EmuWindow& emu_window, dsp_core->EnableStretching(Settings::values.enable_audio_stretching.GetValue()); #ifdef ENABLE_SCRIPTING - rpc_server = std::make_unique(*this); + if (Settings::values.enable_rpc_server.GetValue()) { + rpc_server = std::make_unique(*this); + } #endif service_manager = std::make_unique(*this);