From 1cef40131a0481325a0647ce0213d9e4c1726735 Mon Sep 17 00:00:00 2001 From: merry Date: Sat, 19 Feb 2022 15:59:07 +0000 Subject: [PATCH] Support vectors in write registers # Conflicts: # src/Ryujinx.HLE/Debugger/Debugger.cs --- src/Ryujinx.HLE/Debugger/Debugger.cs | 68 ++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 18 deletions(-) diff --git a/src/Ryujinx.HLE/Debugger/Debugger.cs b/src/Ryujinx.HLE/Debugger/Debugger.cs index 67f2bdbd8..9fbdc2175 100644 --- a/src/Ryujinx.HLE/Debugger/Debugger.cs +++ b/src/Ryujinx.HLE/Debugger/Debugger.cs @@ -1,3 +1,4 @@ +using ARMeilleure.State; using Ryujinx.Common; using Ryujinx.Common.Logging; using Ryujinx.Memory; @@ -94,19 +95,47 @@ namespace Ryujinx.HLE.Debugger } } - private bool GdbWriteRegister(Ryujinx.Cpu.IExecutionContext state, int gdbRegId, ulong value) + private bool GdbWriteRegister(IExecutionContext state, int gdbRegId, StringStream ss) { switch (gdbRegId) { case >= 0 and <= 31: - state.SetX(gdbRegId, value); - return true; + { + ulong value = ss.ReadLengthAsHex(16); + state.SetX(gdbRegId, value); + return true; + } case 32: - state.DebugPc = value; - return true; + { + ulong value = ss.ReadLengthAsHex(8); + state.DebugPc = value; + return true; + } case 33: - state.Pstate = (uint)value; - return true; + { + ulong value = ss.ReadLengthAsHex(8); + state.Pstate = (uint)value; + return true; + } + case >= 34 and <= 65: + { + ulong value0 = ss.ReadLengthAsHex(16); + ulong value1 = ss.ReadLengthAsHex(16); + state.SetV(gdbRegId - 34, new V128(value0, value1)); + return true; + } + case 66: + { + ulong value = ss.ReadLengthAsHex(8); + state.Fpsr = (uint)value; + return true; + } + case 67: + { + ulong value = ss.ReadLengthAsHex(8); + state.Fpcr = (uint)value; + return true; + } default: return false; } @@ -184,10 +213,10 @@ namespace Ryujinx.HLE.Debugger goto unknownCommand; } - CommandReadGeneralRegisters(); + CommandReadRegisters(); break; case 'G': - CommandWriteGeneralRegisters(ss); + CommandWriteRegisters(ss); break; case 'H': { @@ -217,14 +246,13 @@ namespace Ryujinx.HLE.Debugger case 'p': { ulong gdbRegId = ss.ReadRemainingAsHex(); - CommandReadGeneralRegister((int)gdbRegId); + CommandReadRegister((int)gdbRegId); break; } case 'P': { ulong gdbRegId = ss.ReadUntilAsHex('='); - ulong value = ss.ReadRemainingAsHex(); - CommandWriteGeneralRegister((int)gdbRegId, value); + CommandWriteRegister((int)gdbRegId, ss); break; } case 'q': @@ -352,7 +380,7 @@ namespace Ryujinx.HLE.Debugger CommandContinue(null); } - void CommandReadGeneralRegisters() + void CommandReadRegisters() { if (gThread == null) { @@ -370,7 +398,7 @@ namespace Ryujinx.HLE.Debugger Reply(registers); } - void CommandWriteGeneralRegisters(StringStream ss) + void CommandWriteRegisters(StringStream ss) { if (gThread == null) { @@ -381,7 +409,11 @@ namespace Ryujinx.HLE.Debugger var ctx = GetThread(gThread.Value); for (int i = 0; i < GdbRegisterCount; i++) { - GdbWriteRegister(ctx, i, ss.ReadLengthAsLEHex(GdbRegisterHexSize(i))); + if (!GdbWriteRegister(ctx, i, ss)) + { + ReplyError(); + return; + } } if (ss.IsEmpty()) @@ -451,7 +483,7 @@ namespace Ryujinx.HLE.Debugger } } - void CommandReadGeneralRegister(int gdbRegId) + void CommandReadRegister(int gdbRegId) { if (gThread == null) { @@ -471,7 +503,7 @@ namespace Ryujinx.HLE.Debugger } } - void CommandWriteGeneralRegister(int gdbRegId, ulong value) + void CommandWriteRegister(int gdbRegId, StringStream ss) { if (gThread == null) { @@ -480,7 +512,7 @@ namespace Ryujinx.HLE.Debugger } var ctx = GetThread(gThread.Value); - if (GdbWriteRegister(ctx, gdbRegId, value)) + if (GdbWriteRegister(ctx, gdbRegId, ss) && ss.IsEmpty()) { ReplyOK(); }