Add BRK instruction, fix wrong namespace on one of Am interfaces, and disable Debug/Trace logs by default
This commit is contained in:
parent
276f9f6d48
commit
9063766ed6
12 changed files with 51 additions and 16 deletions
|
@ -2,10 +2,10 @@
|
||||||
Logging_Enable_Info = true
|
Logging_Enable_Info = true
|
||||||
|
|
||||||
#Enabled print trace logs
|
#Enabled print trace logs
|
||||||
Logging_Enable_Trace = true
|
Logging_Enable_Trace = false
|
||||||
|
|
||||||
#Enabled print debug logs
|
#Enabled print debug logs
|
||||||
Logging_Enable_Debug = true
|
Logging_Enable_Debug = false
|
||||||
|
|
||||||
#Enabled print warning logs
|
#Enabled print warning logs
|
||||||
Logging_Enable_Warn = true
|
Logging_Enable_Warn = true
|
||||||
|
|
|
@ -150,7 +150,8 @@ namespace ChocolArm64.Decoder
|
||||||
|
|
||||||
private static bool IsException(AOpCode OpCode)
|
private static bool IsException(AOpCode OpCode)
|
||||||
{
|
{
|
||||||
return OpCode.Emitter == AInstEmit.Svc ||
|
return OpCode.Emitter == AInstEmit.Brk ||
|
||||||
|
OpCode.Emitter == AInstEmit.Svc ||
|
||||||
OpCode.Emitter == AInstEmit.Und;
|
OpCode.Emitter == AInstEmit.Und;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ namespace ChocolArm64.Decoder
|
||||||
|
|
||||||
public AOpCodeException(AInst Inst, long Position, int OpCode) : base(Inst, Position)
|
public AOpCodeException(AInst Inst, long Position, int OpCode) : base(Inst, Position)
|
||||||
{
|
{
|
||||||
Id = (OpCode >> 5) & 0xfff;
|
Id = (OpCode >> 5) & 0xffff;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -7,7 +7,17 @@ namespace ChocolArm64.Instruction
|
||||||
{
|
{
|
||||||
static partial class AInstEmit
|
static partial class AInstEmit
|
||||||
{
|
{
|
||||||
|
public static void Brk(AILEmitterCtx Context)
|
||||||
|
{
|
||||||
|
EmitExceptionCall(Context, nameof(ARegisters.OnBreak));
|
||||||
|
}
|
||||||
|
|
||||||
public static void Svc(AILEmitterCtx Context)
|
public static void Svc(AILEmitterCtx Context)
|
||||||
|
{
|
||||||
|
EmitExceptionCall(Context, nameof(ARegisters.OnSvcCall));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void EmitExceptionCall(AILEmitterCtx Context, string MthdName)
|
||||||
{
|
{
|
||||||
AOpCodeException Op = (AOpCodeException)Context.CurrOp;
|
AOpCodeException Op = (AOpCodeException)Context.CurrOp;
|
||||||
|
|
||||||
|
@ -17,7 +27,7 @@ namespace ChocolArm64.Instruction
|
||||||
|
|
||||||
Context.EmitLdc_I4(Op.Id);
|
Context.EmitLdc_I4(Op.Id);
|
||||||
|
|
||||||
Context.EmitCall(typeof(ARegisters), nameof(ARegisters.OnSvcCall));
|
Context.EmitCall(typeof(ARegisters), MthdName);
|
||||||
|
|
||||||
if (Context.CurrBlock.Next != null)
|
if (Context.CurrBlock.Next != null)
|
||||||
{
|
{
|
||||||
|
|
|
@ -2,11 +2,11 @@ using System;
|
||||||
|
|
||||||
namespace ChocolArm64.State
|
namespace ChocolArm64.State
|
||||||
{
|
{
|
||||||
public class SvcEventArgs : EventArgs
|
public class AExceptionEventArgs : EventArgs
|
||||||
{
|
{
|
||||||
public int Id { get; private set; }
|
public int Id { get; private set; }
|
||||||
|
|
||||||
public SvcEventArgs(int Id)
|
public AExceptionEventArgs(int Id)
|
||||||
{
|
{
|
||||||
this.Id = Id;
|
this.Id = Id;
|
||||||
}
|
}
|
|
@ -42,12 +42,18 @@ namespace ChocolArm64.State
|
||||||
|
|
||||||
public long CntpctEl0 => Environment.TickCount * TicksPerMS;
|
public long CntpctEl0 => Environment.TickCount * TicksPerMS;
|
||||||
|
|
||||||
public event EventHandler<SvcEventArgs> SvcCall;
|
public event EventHandler<AExceptionEventArgs> Break;
|
||||||
public event EventHandler<EventArgs> Undefined;
|
public event EventHandler<AExceptionEventArgs> SvcCall;
|
||||||
|
public event EventHandler<EventArgs> Undefined;
|
||||||
|
|
||||||
|
public void OnBreak(int Imm)
|
||||||
|
{
|
||||||
|
Break?.Invoke(this, new AExceptionEventArgs(Imm));
|
||||||
|
}
|
||||||
|
|
||||||
public void OnSvcCall(int Imm)
|
public void OnSvcCall(int Imm)
|
||||||
{
|
{
|
||||||
SvcCall?.Invoke(this, new SvcEventArgs(Imm));
|
SvcCall?.Invoke(this, new AExceptionEventArgs(Imm));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnUndefined()
|
public void OnUndefined()
|
||||||
|
|
11
Ryujinx/OsHle/Exceptions/GuestBrokeExecutionException.cs
Normal file
11
Ryujinx/OsHle/Exceptions/GuestBrokeExecutionException.cs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Ryujinx.OsHle.Exceptions
|
||||||
|
{
|
||||||
|
public class GuestBrokeExecutionException : Exception
|
||||||
|
{
|
||||||
|
private const string ExMsg = "The guest program broke execution!";
|
||||||
|
|
||||||
|
public GuestBrokeExecutionException() : base(ExMsg) { }
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,10 +1,9 @@
|
||||||
using Ryujinx.OsHle.Ipc;
|
using Ryujinx.OsHle.Ipc;
|
||||||
using Ryujinx.OsHle.Objects.Am;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
||||||
using static Ryujinx.OsHle.Objects.ObjHelper;
|
using static Ryujinx.OsHle.Objects.ObjHelper;
|
||||||
|
|
||||||
namespace Ryujinx.OsHle.Objects
|
namespace Ryujinx.OsHle.Objects.Am
|
||||||
{
|
{
|
||||||
class IApplicationProxy : IIpcInterface
|
class IApplicationProxy : IIpcInterface
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
using ChocolArm64;
|
using ChocolArm64;
|
||||||
using ChocolArm64.Memory;
|
using ChocolArm64.Memory;
|
||||||
|
using ChocolArm64.State;
|
||||||
using Ryujinx.Loaders;
|
using Ryujinx.Loaders;
|
||||||
using Ryujinx.Loaders.Executables;
|
using Ryujinx.Loaders.Executables;
|
||||||
|
using Ryujinx.OsHle.Exceptions;
|
||||||
using Ryujinx.OsHle.Handles;
|
using Ryujinx.OsHle.Handles;
|
||||||
using Ryujinx.OsHle.Svc;
|
using Ryujinx.OsHle.Svc;
|
||||||
using System;
|
using System;
|
||||||
|
@ -135,6 +137,7 @@ namespace Ryujinx.OsHle
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Thread.Registers.Break += BreakHandler;
|
||||||
Thread.Registers.SvcCall += SvcHandler.SvcCall;
|
Thread.Registers.SvcCall += SvcHandler.SvcCall;
|
||||||
Thread.Registers.ProcessId = ProcessId;
|
Thread.Registers.ProcessId = ProcessId;
|
||||||
Thread.Registers.ThreadId = Ns.Os.IdGen.GenerateId();
|
Thread.Registers.ThreadId = Ns.Os.IdGen.GenerateId();
|
||||||
|
@ -148,6 +151,11 @@ namespace Ryujinx.OsHle
|
||||||
return Handle;
|
return Handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void BreakHandler(object sender, AExceptionEventArgs e)
|
||||||
|
{
|
||||||
|
throw new GuestBrokeExecutionException();
|
||||||
|
}
|
||||||
|
|
||||||
private int GetFreeTlsSlot(AThread Thread)
|
private int GetFreeTlsSlot(AThread Thread)
|
||||||
{
|
{
|
||||||
for (int Index = 1; Index < TotalTlsSlots; Index++)
|
for (int Index = 1; Index < TotalTlsSlots; Index++)
|
||||||
|
|
|
@ -7,7 +7,7 @@ namespace Ryujinx.OsHle
|
||||||
{
|
{
|
||||||
class ServiceCtx
|
class ServiceCtx
|
||||||
{
|
{
|
||||||
public Switch Ns { get; private set; }
|
public Switch Ns { get; private set; }
|
||||||
public AMemory Memory { get; private set; }
|
public AMemory Memory { get; private set; }
|
||||||
public HSession Session { get; private set; }
|
public HSession Session { get; private set; }
|
||||||
public IpcMessage Request { get; private set; }
|
public IpcMessage Request { get; private set; }
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
using Ryujinx.OsHle.Objects;
|
using Ryujinx.OsHle.Objects.Am;
|
||||||
|
|
||||||
using static Ryujinx.OsHle.Objects.ObjHelper;
|
using static Ryujinx.OsHle.Objects.ObjHelper;
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,7 @@ namespace Ryujinx.OsHle.Svc
|
||||||
Rng = new Random();
|
Rng = new Random();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SvcCall(object sender, SvcEventArgs e)
|
public void SvcCall(object sender, AExceptionEventArgs e)
|
||||||
{
|
{
|
||||||
ARegisters Registers = (ARegisters)sender;
|
ARegisters Registers = (ARegisters)sender;
|
||||||
|
|
||||||
|
@ -75,7 +75,7 @@ namespace Ryujinx.OsHle.Svc
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw new NotImplementedException(e.Id.ToString("x3"));
|
throw new NotImplementedException(e.Id.ToString("x4"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue