From c8bb3cc50e32e957609ee190dd5f35b9a349f640 Mon Sep 17 00:00:00 2001 From: gdkchan Date: Sun, 13 Dec 2020 12:19:38 -0300 Subject: [PATCH] Fix register read after write on STREX implementation (#1801) * Fix register read after write on STREX implementation * PTC version update --- .../Instructions/InstEmitMemoryExHelper.cs | 19 ++++++++++++++++++- ARMeilleure/Translation/PTC/Ptc.cs | 2 +- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/ARMeilleure/Instructions/InstEmitMemoryExHelper.cs b/ARMeilleure/Instructions/InstEmitMemoryExHelper.cs index 5b890dd3..317e4276 100644 --- a/ARMeilleure/Instructions/InstEmitMemoryExHelper.cs +++ b/ARMeilleure/Instructions/InstEmitMemoryExHelper.cs @@ -48,6 +48,18 @@ namespace ARMeilleure.Instructions Operand exValuePtr = context.Add(arg0, Const((long)NativeContext.GetExclusiveValueOffset())); context.Store(exAddrPtr, context.BitwiseAnd(address, Const(address.Type, GetExclusiveAddressMask()))); + + // Make sure the unused higher bits of the value are cleared. + if (size < 3) + { + context.Store(exValuePtr, Const(0UL)); + } + if (size < 4) + { + context.Store(context.Add(exValuePtr, Const(exValuePtr.Type, 8L)), Const(0UL)); + } + + // Store the new exclusive value. context.Store(exValuePtr, value); return value; @@ -74,6 +86,11 @@ namespace ARMeilleure.Instructions if (exclusive) { + // We overwrite one of the register (Rs), + // keep a copy of the values to ensure we are working with the correct values. + address = context.Copy(address); + value = context.Copy(value); + void SetRs(Operand value) { if (a32) @@ -98,7 +115,7 @@ namespace ARMeilleure.Instructions Operand lblExit = Label(); - SetRs(exFailed); + SetRs(Const(1)); context.BranchIfTrue(lblExit, exFailed); diff --git a/ARMeilleure/Translation/PTC/Ptc.cs b/ARMeilleure/Translation/PTC/Ptc.cs index 2145f350..05dd352e 100644 --- a/ARMeilleure/Translation/PTC/Ptc.cs +++ b/ARMeilleure/Translation/PTC/Ptc.cs @@ -21,7 +21,7 @@ namespace ARMeilleure.Translation.PTC { private const string HeaderMagic = "PTChd"; - private const int InternalVersion = 1783; //! To be incremented manually for each change to the ARMeilleure project. + private const int InternalVersion = 1801; //! To be incremented manually for each change to the ARMeilleure project. private const string ActualDir = "0"; private const string BackupDir = "1";