diff --git a/ARMeilleure/Instructions/InstEmitSystem.cs b/ARMeilleure/Instructions/InstEmitSystem.cs index 49973404..c13f0c3e 100644 --- a/ARMeilleure/Instructions/InstEmitSystem.cs +++ b/ARMeilleure/Instructions/InstEmitSystem.cs @@ -40,6 +40,7 @@ namespace ARMeilleure.Instructions case 0b11_011_1101_0000_011: dlg = new _U64(NativeInterface.GetTpidr); break; case 0b11_011_1110_0000_000: dlg = new _U64(NativeInterface.GetCntfrqEl0); break; case 0b11_011_1110_0000_001: dlg = new _U64(NativeInterface.GetCntpctEl0); break; + case 0b11_011_1110_0000_010: dlg = new _U64(NativeInterface.GetCntvctEl0); break; default: throw new NotImplementedException($"Unknown MRS 0x{op.RawOpCode:X8} at 0x{op.Address:X16}."); } diff --git a/ARMeilleure/Instructions/NativeInterface.cs b/ARMeilleure/Instructions/NativeInterface.cs index f42dc283..49faab35 100644 --- a/ARMeilleure/Instructions/NativeInterface.cs +++ b/ARMeilleure/Instructions/NativeInterface.cs @@ -136,6 +136,11 @@ namespace ARMeilleure.Instructions return GetContext().CntpctEl0; } + public static ulong GetCntvctEl0() + { + return GetContext().CntvctEl0; + } + public static void SetFpcr(ulong value) { GetContext().Fpcr = (FPCR)value; diff --git a/ARMeilleure/State/ExecutionContext.cs b/ARMeilleure/State/ExecutionContext.cs index 8593f41e..2755122f 100644 --- a/ARMeilleure/State/ExecutionContext.cs +++ b/ARMeilleure/State/ExecutionContext.cs @@ -32,6 +32,10 @@ namespace ARMeilleure.State } } + // CNTVCT_EL0 = CNTPCT_EL0 - CNTVOFF_EL2 + // Since EL2 isn't implemented, CNTVOFF_EL2 = 0 + public ulong CntvctEl0 => CntpctEl0; + public static TimeSpan ElapsedTime => _tickCounter.Elapsed; public long TpidrEl0 { get; set; }