diff --git a/src/Ryujinx.Gtk3/UI/Windows/SettingsWindow.cs b/src/Ryujinx.Gtk3/UI/Windows/SettingsWindow.cs index 9e029ac12..8cfc763ce 100644 --- a/src/Ryujinx.Gtk3/UI/Windows/SettingsWindow.cs +++ b/src/Ryujinx.Gtk3/UI/Windows/SettingsWindow.cs @@ -674,8 +674,8 @@ namespace Ryujinx.UI.Windows ConfigurationState.Instance.Graphics.ScalingFilterLevel.Value = (int)_scalingFilterLevel.Value; ConfigurationState.Instance.Multiplayer.LanInterfaceId.Value = _multiLanSelect.ActiveId; ConfigurationState.Instance.Debug.EnableGdbStub.Value = _gdbStubToggle.Active; - ConfigurationState.Instance.Debug.DebuggerSuspendOnStart.Value = _suspendOnStartToggle.Active; ConfigurationState.Instance.Debug.GdbStubPort.Value = (ushort)_gdbStubPortSpinAdjustment.Value; + ConfigurationState.Instance.Debug.DebuggerSuspendOnStart.Value = _suspendOnStartToggle.Active; _previousVolumeLevel = ConfigurationState.Instance.System.AudioVolume.Value; diff --git a/src/Ryujinx.HLE/Debugger/Debugger.cs b/src/Ryujinx.HLE/Debugger/Debugger.cs index 9045cae61..e9f535440 100644 --- a/src/Ryujinx.HLE/Debugger/Debugger.cs +++ b/src/Ryujinx.HLE/Debugger/Debugger.cs @@ -21,7 +21,6 @@ namespace Ryujinx.HLE.Debugger internal Switch Device { get; private set; } public ushort GdbStubPort { get; private set; } - public bool SuspendOnStart { get; private set; } private TcpListener ListenerSocket; private Socket ClientSocket = null; @@ -35,11 +34,10 @@ namespace Ryujinx.HLE.Debugger private ulong? cThread; private ulong? gThread; - public Debugger(Switch device, ushort port, bool suspendOnStart) + public Debugger(Switch device, ushort port) { Device = device; GdbStubPort = port; - SuspendOnStart = suspendOnStart; ARMeilleure.Optimizations.EnableDebugging = true; diff --git a/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs b/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs index abd792cc5..9586a8080 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs @@ -93,6 +93,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process public HleProcessDebugger Debugger { get; private set; } public IDebuggableProcess DebugInterface { get; private set; } + protected int debugState = (int)DebugState.Running; public KProcess(KernelContext context, bool allowCodeMemoryForJit = false) : base(context) { @@ -685,6 +686,12 @@ namespace Ryujinx.HLE.HOS.Kernel.Process SetState(newState); + if (KernelContext.Device.Configuration.DebuggerSuspendOnStart && IsApplication) + { + mainThread.Suspend(ThreadSchedState.ThreadPauseFlag); + debugState = (int)DebugState.Stopped; + } + result = mainThread.Start(); if (result != Result.Success) @@ -1197,7 +1204,6 @@ namespace Ryujinx.HLE.HOS.Kernel.Process private readonly KProcess _parent; private readonly KernelContext _kernelContext; private KThread steppingThread; - private int _debugState = (int)DebugState.Running; public DebuggerInterface(KProcess p) { @@ -1208,7 +1214,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process public void DebugStop() { - if (Interlocked.CompareExchange(ref _debugState, (int)DebugState.Stopping, + if (Interlocked.CompareExchange(ref _parent.debugState, (int)DebugState.Stopping, (int)DebugState.Running) != (int)DebugState.Running) { return; @@ -1225,13 +1231,13 @@ namespace Ryujinx.HLE.HOS.Kernel.Process } } - _debugState = (int)DebugState.Stopped; + _parent.debugState = (int)DebugState.Stopped; _kernelContext.CriticalSection.Leave(); } public void DebugContinue() { - if (Interlocked.CompareExchange(ref _debugState, (int)DebugState.Running, + if (Interlocked.CompareExchange(ref _parent.debugState, (int)DebugState.Running, (int)DebugState.Stopped) != (int)DebugState.Stopped) { return; @@ -1250,7 +1256,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process public bool DebugStep(KThread target) { - if (_debugState != (int)DebugState.Stopped) + if (_parent.debugState != (int)DebugState.Stopped) { return false; } @@ -1299,7 +1305,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process public DebugState GetDebugState() { - return (DebugState)_debugState; + return (DebugState)_parent.debugState; } public ulong[] GetThreadUids() diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs index 2c6d77c15..40d366bf4 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs @@ -205,6 +205,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading } Context.TpidrroEl0 = (long)_tlsAddress; + Context.DebugPc = _entrypoint; ThreadUid = KernelContext.NewThreadUid(); Context.ThreadUid = ThreadUid; diff --git a/src/Ryujinx.HLE/Switch.cs b/src/Ryujinx.HLE/Switch.cs index 05d07c6ec..e1e386181 100644 --- a/src/Ryujinx.HLE/Switch.cs +++ b/src/Ryujinx.HLE/Switch.cs @@ -54,7 +54,7 @@ namespace Ryujinx.HLE AudioDeviceDriver = new CompatLayerHardwareDeviceDriver(Configuration.AudioDeviceDriver); Memory = new MemoryBlock(Configuration.MemoryConfiguration.ToDramSize(), memoryAllocationFlags); Gpu = new GpuContext(Configuration.GpuRenderer); - Debugger = Configuration.EnableGdbStub ? new Debugger.Debugger(this, Configuration.GdbStubPort, Configuration.DebuggerSuspendOnStart) : null; + Debugger = Configuration.EnableGdbStub ? new Debugger.Debugger(this, Configuration.GdbStubPort) : null; System = new HOS.Horizon(this); Statistics = new PerformanceStatistics(); Hid = new Hid(this, System.HidStorage); diff --git a/src/Ryujinx.UI.Common/Configuration/ConfigurationFileFormat.cs b/src/Ryujinx.UI.Common/Configuration/ConfigurationFileFormat.cs index a63d17145..0090ff0dc 100644 --- a/src/Ryujinx.UI.Common/Configuration/ConfigurationFileFormat.cs +++ b/src/Ryujinx.UI.Common/Configuration/ConfigurationFileFormat.cs @@ -397,9 +397,9 @@ namespace Ryujinx.UI.Common.Configuration public ushort GdbStubPort { get; set; } /// - /// Which TCP port should the GDB stub listen on + /// Suspend execution when starting an application /// - public ushort DebuggerSuspendOnStart { get; set; } + public bool DebuggerSuspendOnStart { get; set; } /// /// Loads a configuration file from disk diff --git a/src/Ryujinx.UI.Common/Configuration/ConfigurationState.cs b/src/Ryujinx.UI.Common/Configuration/ConfigurationState.cs index 255175fa3..d255eb217 100644 --- a/src/Ryujinx.UI.Common/Configuration/ConfigurationState.cs +++ b/src/Ryujinx.UI.Common/Configuration/ConfigurationState.cs @@ -805,6 +805,7 @@ namespace Ryujinx.UI.Common.Configuration MultiplayerMode = Multiplayer.Mode, EnableGdbStub = Debug.EnableGdbStub, GdbStubPort = Debug.GdbStubPort, + DebuggerSuspendOnStart = Debug.DebuggerSuspendOnStart, }; return configurationFile; @@ -964,6 +965,7 @@ namespace Ryujinx.UI.Common.Configuration }; Debug.EnableGdbStub.Value = false; Debug.GdbStubPort.Value = 55555; + Debug.DebuggerSuspendOnStart.Value = false; } public void Load(ConfigurationFileFormat configurationFileFormat, string configurationFilePath) @@ -1484,6 +1486,7 @@ namespace Ryujinx.UI.Common.Configuration configurationFileFormat.EnableGdbStub = false; configurationFileFormat.GdbStubPort = 55555; + configurationFileFormat.DebuggerSuspendOnStart = false; configurationFileUpdated = true; } @@ -1616,6 +1619,7 @@ namespace Ryujinx.UI.Common.Configuration Hid.InputConfig.Value = configurationFileFormat.InputConfig; Debug.EnableGdbStub.Value = configurationFileFormat.EnableGdbStub; Debug.GdbStubPort.Value = configurationFileFormat.GdbStubPort; + Debug.DebuggerSuspendOnStart.Value = configurationFileFormat.DebuggerSuspendOnStart; if (Hid.InputConfig.Value == null) { diff --git a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs index d48ec95a2..a0e4fd455 100644 --- a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs @@ -511,6 +511,7 @@ namespace Ryujinx.Ava.UI.ViewModels // Debug EnableGdbStub = config.Debug.EnableGdbStub.Value; GDBStubPort = config.Debug.GdbStubPort.Value; + DebuggerSuspendOnStart = config.Debug.DebuggerSuspendOnStart.Value; } public void SaveSettings() @@ -623,6 +624,7 @@ namespace Ryujinx.Ava.UI.ViewModels // Debug config.Debug.EnableGdbStub.Value = EnableGdbStub; config.Debug.GdbStubPort.Value = GDBStubPort; + config.Debug.DebuggerSuspendOnStart.Value = DebuggerSuspendOnStart; config.ToFileFormat().SaveConfig(Program.ConfigurationPath);