forked from Mirror/Ryujinx
Add pl:u stub, use higher precision on CNTPCT_EL0 register tick count
This commit is contained in:
parent
4d90d60119
commit
2ed24af756
5 changed files with 47 additions and 3 deletions
|
@ -30,6 +30,7 @@ namespace ChocolArm64.Instruction
|
||||||
case 0b11_011_0100_0100_001: PropName = nameof(AThreadState.Fpsr); break;
|
case 0b11_011_0100_0100_001: PropName = nameof(AThreadState.Fpsr); break;
|
||||||
case 0b11_011_1101_0000_010: PropName = nameof(AThreadState.TpidrEl0); break;
|
case 0b11_011_1101_0000_010: PropName = nameof(AThreadState.TpidrEl0); break;
|
||||||
case 0b11_011_1101_0000_011: PropName = nameof(AThreadState.Tpidr); break;
|
case 0b11_011_1101_0000_011: PropName = nameof(AThreadState.Tpidr); break;
|
||||||
|
case 0b11_011_1110_0000_000: PropName = nameof(AThreadState.CntfrqEl0); break;
|
||||||
case 0b11_011_1110_0000_001: PropName = nameof(AThreadState.CntpctEl0); break;
|
case 0b11_011_1110_0000_001: PropName = nameof(AThreadState.CntpctEl0); break;
|
||||||
|
|
||||||
default: throw new NotImplementedException($"Unknown MRS at {Op.Position:x16}");
|
default: throw new NotImplementedException($"Unknown MRS at {Op.Position:x16}");
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
using ChocolArm64.Events;
|
using ChocolArm64.Events;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
|
||||||
namespace ChocolArm64.State
|
namespace ChocolArm64.State
|
||||||
{
|
{
|
||||||
|
@ -40,15 +41,34 @@ namespace ChocolArm64.State
|
||||||
public uint CtrEl0 => 0x8444c004;
|
public uint CtrEl0 => 0x8444c004;
|
||||||
public uint DczidEl0 => 0x00000004;
|
public uint DczidEl0 => 0x00000004;
|
||||||
|
|
||||||
private const ulong TicksPerS = 19_200_000;
|
public ulong CntfrqEl0 { get; set; }
|
||||||
private const ulong TicksPerMS = TicksPerS / 1_000;
|
public ulong CntpctEl0
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
double Ticks = TickCounter.ElapsedTicks * HostTickFreq;
|
||||||
|
|
||||||
public ulong CntpctEl0 => (ulong)Environment.TickCount * TicksPerMS;
|
return (ulong)(Ticks * CntfrqEl0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public event EventHandler<AInstExceptionEventArgs> Break;
|
public event EventHandler<AInstExceptionEventArgs> Break;
|
||||||
public event EventHandler<AInstExceptionEventArgs> SvcCall;
|
public event EventHandler<AInstExceptionEventArgs> SvcCall;
|
||||||
public event EventHandler<AInstUndefinedEventArgs> Undefined;
|
public event EventHandler<AInstUndefinedEventArgs> Undefined;
|
||||||
|
|
||||||
|
private static Stopwatch TickCounter;
|
||||||
|
|
||||||
|
private static double HostTickFreq;
|
||||||
|
|
||||||
|
static AThreadState()
|
||||||
|
{
|
||||||
|
HostTickFreq = 1.0 / Stopwatch.Frequency;
|
||||||
|
|
||||||
|
TickCounter = new Stopwatch();
|
||||||
|
|
||||||
|
TickCounter.Start();
|
||||||
|
}
|
||||||
|
|
||||||
internal void OnBreak(int Imm)
|
internal void OnBreak(int Imm)
|
||||||
{
|
{
|
||||||
Break?.Invoke(this, new AInstExceptionEventArgs(Imm));
|
Break?.Invoke(this, new AInstExceptionEventArgs(Imm));
|
||||||
|
|
|
@ -17,6 +17,8 @@ namespace Ryujinx.Core.OsHle
|
||||||
private const int TlsSize = 0x200;
|
private const int TlsSize = 0x200;
|
||||||
private const int TotalTlsSlots = 32;
|
private const int TotalTlsSlots = 32;
|
||||||
|
|
||||||
|
private const int TickFreq = 19_200_000;
|
||||||
|
|
||||||
private Switch Ns;
|
private Switch Ns;
|
||||||
|
|
||||||
public bool NeedsHbAbi { get; private set; }
|
public bool NeedsHbAbi { get; private set; }
|
||||||
|
@ -197,6 +199,7 @@ namespace Ryujinx.Core.OsHle
|
||||||
Thread.ThreadState.Undefined += UndefinedHandler;
|
Thread.ThreadState.Undefined += UndefinedHandler;
|
||||||
Thread.ThreadState.ProcessId = ProcessId;
|
Thread.ThreadState.ProcessId = ProcessId;
|
||||||
Thread.ThreadState.ThreadId = ThreadId;
|
Thread.ThreadState.ThreadId = ThreadId;
|
||||||
|
Thread.ThreadState.CntfrqEl0 = TickFreq;
|
||||||
Thread.ThreadState.Tpidr = Tpidr;
|
Thread.ThreadState.Tpidr = Tpidr;
|
||||||
Thread.ThreadState.X0 = (ulong)ArgsPtr;
|
Thread.ThreadState.X0 = (ulong)ArgsPtr;
|
||||||
Thread.ThreadState.X1 = (ulong)Handle;
|
Thread.ThreadState.X1 = (ulong)Handle;
|
||||||
|
|
|
@ -13,6 +13,7 @@ namespace Ryujinx.Core.OsHle.IpcServices.Pl
|
||||||
{
|
{
|
||||||
m_Commands = new Dictionary<int, ServiceProcessRequest>()
|
m_Commands = new Dictionary<int, ServiceProcessRequest>()
|
||||||
{
|
{
|
||||||
|
{ 0, RequestLoad },
|
||||||
{ 1, GetLoadState },
|
{ 1, GetLoadState },
|
||||||
{ 2, GetFontSize },
|
{ 2, GetFontSize },
|
||||||
{ 3, GetSharedMemoryAddressOffset },
|
{ 3, GetSharedMemoryAddressOffset },
|
||||||
|
@ -20,6 +21,13 @@ namespace Ryujinx.Core.OsHle.IpcServices.Pl
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public long RequestLoad(ServiceCtx Context)
|
||||||
|
{
|
||||||
|
SharedFontType FontType = (SharedFontType)Context.RequestData.ReadInt32();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
public long GetLoadState(ServiceCtx Context)
|
public long GetLoadState(ServiceCtx Context)
|
||||||
{
|
{
|
||||||
Context.ResponseData.Write(1); //Loaded
|
Context.ResponseData.Write(1); //Loaded
|
||||||
|
|
12
Ryujinx.Core/OsHle/Services/Pl/SharedFontType.cs
Normal file
12
Ryujinx.Core/OsHle/Services/Pl/SharedFontType.cs
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
namespace Ryujinx.Core.OsHle.IpcServices.Pl
|
||||||
|
{
|
||||||
|
enum SharedFontType
|
||||||
|
{
|
||||||
|
JapanUsEurope = 0,
|
||||||
|
SimplifiedChinese = 1,
|
||||||
|
SimplifiedChineseEx = 2,
|
||||||
|
TraditionalChinese = 3,
|
||||||
|
Korean = 4,
|
||||||
|
NintendoEx = 5
|
||||||
|
}
|
||||||
|
}
|
Reference in a new issue