From e83b81ec98cfd21db64ff79ec87ca17be055969e 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 10fd07a72..e74802da4 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), OVERLAY_SHOW_FPS("overlay_show_fps", Settings.SECTION_LAYOUT, true), OVERLAY_SHOW_FRAMETIME("overlay_show_frame_time", Settings.SECTION_LAYOUT, 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 c075aadde..6247e59cc 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 @@ -1605,6 +1605,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 ed24f3c8e..08e492a7b 100644 --- a/src/android/app/src/main/jni/config.cpp +++ b/src/android/app/src/main/jni/config.cpp @@ -293,6 +293,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 d85ec9273..f3a6a169a 100644 --- a/src/android/app/src/main/jni/default_ini.h +++ b/src/android/app/src/main/jni/default_ini.h @@ -445,6 +445,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 4c50488de..9dab4eaee 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 ed6d438bd..19b3dfa48 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -596,6 +596,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);