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);