aboutsummaryrefslogtreecommitdiff
path: root/ChocolArm64/State/CpuThreadState.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2019-02-18 20:52:06 -0300
committerjduncanator <1518948+jduncanator@users.noreply.github.com>2019-02-19 10:52:06 +1100
commit932224f05112180aa5f52162cbbc3a17c339075f (patch)
treeeed53f37bfd78db97d6f8301c021b7de9dd3becf /ChocolArm64/State/CpuThreadState.cs
parentdd00a4b62d48b7d55a6e66a69a83f09267d34143 (diff)
ARM exclusive monitor and multicore fixes (#589)
* Implement ARM exclusive load/store with compare exchange insts, and enable multicore by default * Fix comment typo * Support Linux and OSX on MemoryAlloc and CompareExchange128, some cleanup * Use intel syntax on assembly code * Adjust identation * Add CPUID check and fix exclusive reservation granule size * Update schema multicore scheduling default value * Make the cpu id check code lower case aswell
Diffstat (limited to 'ChocolArm64/State/CpuThreadState.cs')
-rw-r--r--ChocolArm64/State/CpuThreadState.cs31
1 files changed, 30 insertions, 1 deletions
diff --git a/ChocolArm64/State/CpuThreadState.cs b/ChocolArm64/State/CpuThreadState.cs
index abec60bb..caf73deb 100644
--- a/ChocolArm64/State/CpuThreadState.cs
+++ b/ChocolArm64/State/CpuThreadState.cs
@@ -37,7 +37,6 @@ namespace ChocolArm64.State
public int ElrHyp;
public bool Running { get; set; }
- public int Core { get; set; }
private bool _interrupted;
@@ -85,6 +84,16 @@ namespace ChocolArm64.State
internal Translator CurrentTranslator;
+ private ulong _exclusiveAddress;
+
+ internal ulong ExclusiveValueLow { get; set; }
+ internal ulong ExclusiveValueHigh { get; set; }
+
+ public CpuThreadState()
+ {
+ ClearExclusiveAddress();
+ }
+
static CpuThreadState()
{
_hostTickFreq = 1.0 / Stopwatch.Frequency;
@@ -94,6 +103,26 @@ namespace ChocolArm64.State
_tickCounter.Start();
}
+ internal void SetExclusiveAddress(ulong address)
+ {
+ _exclusiveAddress = GetMaskedExclusiveAddress(address);
+ }
+
+ internal bool CheckExclusiveAddress(ulong address)
+ {
+ return GetMaskedExclusiveAddress(address) == _exclusiveAddress;
+ }
+
+ internal void ClearExclusiveAddress()
+ {
+ _exclusiveAddress = ulong.MaxValue;
+ }
+
+ private ulong GetMaskedExclusiveAddress(ulong address)
+ {
+ return address & ~((4UL << ErgSizeLog2) - 1);
+ }
+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal bool Synchronize(int bbWeight)
{