mirror of
https://github.com/ryujinx-mirror/ryujinx.git
synced 2025-09-13 09:07:54 -05:00
Only throw undefined instruction exception at execution, not at translation stage
This commit is contained in:
13
Ryujinx/OsHle/Exceptions/UndefinedInstructionException.cs
Normal file
13
Ryujinx/OsHle/Exceptions/UndefinedInstructionException.cs
Normal file
@@ -0,0 +1,13 @@
|
||||
using System;
|
||||
|
||||
namespace Ryujinx.OsHle.Exceptions
|
||||
{
|
||||
public class UndefinedInstructionException : Exception
|
||||
{
|
||||
private const string ExMsg = "The instruction at 0x{0:x16} (opcode 0x{1:x8}) is undefined!";
|
||||
|
||||
public UndefinedInstructionException() : base() { }
|
||||
|
||||
public UndefinedInstructionException(long Position, int OpCode) : base(string.Format(ExMsg, Position, OpCode)) { }
|
||||
}
|
||||
}
|
@@ -137,25 +137,31 @@ namespace Ryujinx.OsHle
|
||||
return -1;
|
||||
}
|
||||
|
||||
Thread.Registers.Break += BreakHandler;
|
||||
Thread.Registers.SvcCall += SvcHandler.SvcCall;
|
||||
Thread.Registers.ProcessId = ProcessId;
|
||||
Thread.Registers.ThreadId = Ns.Os.IdGen.GenerateId();
|
||||
Thread.Registers.Tpidr = TlsPageAddr + TlsSlot * TlsSize;
|
||||
Thread.Registers.X0 = (ulong)ArgsPtr;
|
||||
Thread.Registers.X1 = (ulong)Handle;
|
||||
Thread.Registers.X31 = (ulong)StackTop;
|
||||
Thread.Registers.Break += BreakHandler;
|
||||
Thread.Registers.SvcCall += SvcHandler.SvcCall;
|
||||
Thread.Registers.Undefined += UndefinedHandler;
|
||||
Thread.Registers.ProcessId = ProcessId;
|
||||
Thread.Registers.ThreadId = Ns.Os.IdGen.GenerateId();
|
||||
Thread.Registers.Tpidr = TlsPageAddr + TlsSlot * TlsSize;
|
||||
Thread.Registers.X0 = (ulong)ArgsPtr;
|
||||
Thread.Registers.X1 = (ulong)Handle;
|
||||
Thread.Registers.X31 = (ulong)StackTop;
|
||||
|
||||
Thread.WorkFinished += ThreadFinished;
|
||||
|
||||
return Handle;
|
||||
}
|
||||
|
||||
private void BreakHandler(object sender, AExceptionEventArgs e)
|
||||
private void BreakHandler(object sender, AInstExceptEventArgs e)
|
||||
{
|
||||
throw new GuestBrokeExecutionException();
|
||||
}
|
||||
|
||||
private void UndefinedHandler(object sender, AInstUndEventArgs e)
|
||||
{
|
||||
throw new UndefinedInstructionException(e.Position, e.RawOpCode);
|
||||
}
|
||||
|
||||
private int GetFreeTlsSlot(AThread Thread)
|
||||
{
|
||||
for (int Index = 1; Index < TotalTlsSlots; Index++)
|
||||
|
@@ -63,7 +63,7 @@ namespace Ryujinx.OsHle.Svc
|
||||
Rng = new Random();
|
||||
}
|
||||
|
||||
public void SvcCall(object sender, AExceptionEventArgs e)
|
||||
public void SvcCall(object sender, AInstExceptEventArgs e)
|
||||
{
|
||||
ARegisters Registers = (ARegisters)sender;
|
||||
|
||||
|
Reference in New Issue
Block a user