From bb2f9df0a1d5e7cbd333c39cd485a42a19a772dc Mon Sep 17 00:00:00 2001 From: merry Date: Fri, 11 Mar 2022 02:16:32 +0000 Subject: KThread: Fix GetPsr mask (#3180) * ExecutionContext: GetPstate / SetPstate * Put it in NativeContext * KThread: Fix GetPsr mask * ExecutionContext: Turn methods into Pstate property * Address nit --- ARMeilleure/State/ExecutionContext.cs | 6 ++++++ ARMeilleure/State/NativeContext.cs | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+) (limited to 'ARMeilleure') diff --git a/ARMeilleure/State/ExecutionContext.cs b/ARMeilleure/State/ExecutionContext.cs index a6f74cd0..8309864f 100644 --- a/ARMeilleure/State/ExecutionContext.cs +++ b/ARMeilleure/State/ExecutionContext.cs @@ -43,6 +43,12 @@ namespace ARMeilleure.State public long TpidrEl0 { get; set; } public long Tpidr { get; set; } + public uint Pstate + { + get => _nativeContext.GetPstate(); + set => _nativeContext.SetPstate(value); + } + public FPCR Fpcr { get; set; } public FPSR Fpsr { get; set; } public FPCR StandardFpcrValue => (Fpcr & (FPCR.Ahp)) | FPCR.Dn | FPCR.Fz; diff --git a/ARMeilleure/State/NativeContext.cs b/ARMeilleure/State/NativeContext.cs index 962783f5..f911f762 100644 --- a/ARMeilleure/State/NativeContext.cs +++ b/ARMeilleure/State/NativeContext.cs @@ -95,6 +95,25 @@ namespace ARMeilleure.State GetStorage().Flags[(int)flag] = value ? 1u : 0u; } + public unsafe uint GetPstate() + { + uint value = 0; + for (int flag = 0; flag < RegisterConsts.FlagsCount; flag++) + { + value |= GetStorage().Flags[flag] != 0 ? 1u << flag : 0u; + } + return value; + } + + public unsafe void SetPstate(uint value) + { + for (int flag = 0; flag < RegisterConsts.FlagsCount; flag++) + { + uint bit = 1u << flag; + GetStorage().Flags[flag] = (value & bit) == bit ? 1u : 0u; + } + } + public unsafe bool GetFPStateFlag(FPState flag) { if ((uint)flag >= RegisterConsts.FpFlagsCount) -- cgit v1.2.3