0
0
Fork 0

Add pl:u stub, use higher precision on CNTPCT_EL0 register tick count

This commit is contained in:
gdkchan 2018-03-13 21:24:17 -03:00
parent 4d90d60119
commit 2ed24af756
5 changed files with 47 additions and 3 deletions

View file

@ -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}");

View file

@ -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));

View file

@ -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;

View file

@ -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

View 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
}
}