aboutsummaryrefslogtreecommitdiff
path: root/ChocolArm64
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-08-16 20:47:36 -0300
committerGitHub <noreply@github.com>2018-08-16 20:47:36 -0300
commit521751795a1c97c0d97f6f8904a3be69b13d3a9d (patch)
tree942a05899c40e2de6d92a38b93a494bd96ee64b8 /ChocolArm64
parent182d716867ae477c2b15a5332430dc2641fa1cc3 (diff)
Code style fixes and nits on the HLE project (#355)
* Some style fixes and nits on ITimeZoneService * Remove some unneeded usings * Remove the Ryujinx.HLE.OsHle.Handles namespace * Remove hbmenu automatic load on process exit * Rename Ns to Device, rename Os to System, rename SystemState to State * Move Exceptions and Utilities out of OsHle * Rename OsHle to HOS * Rename OsHle folder to HOS * IManagerDisplayService and ISystemDisplayService style fixes * BsdError shouldn't be public * Add a empty new line before using static * Remove unused file * Some style fixes on NPDM * Exit gracefully when the application is closed * Code style fixes on IGeneralService * Add 0x prefix on values printed as hex * Small improvements on finalization code * Move ProcessId and ThreadId out of AThreadState * Rename VFs to FileSystem * FsAccessHeader shouldn't be public. Also fix file names casing * More case changes on NPDM * Remove unused files * Move using to the correct place on NPDM * Use properties on KernelAccessControlMmio * Address PR feedback
Diffstat (limited to 'ChocolArm64')
-rw-r--r--ChocolArm64/AThread.cs2
-rw-r--r--ChocolArm64/Memory/AMemory.cs16
-rw-r--r--ChocolArm64/State/AThreadState.cs8
-rw-r--r--ChocolArm64/Translation/AILEmitterCtx.cs21
4 files changed, 34 insertions, 13 deletions
diff --git a/ChocolArm64/AThread.cs b/ChocolArm64/AThread.cs
index 4fc79d5e..7b8360f8 100644
--- a/ChocolArm64/AThread.cs
+++ b/ChocolArm64/AThread.cs
@@ -18,8 +18,6 @@ namespace ChocolArm64
public event EventHandler WorkFinished;
- public int ThreadId => ThreadState.ThreadId;
-
private int IsExecuting;
public AThread(ATranslator Translator, AMemory Memory, long EntryPoint)
diff --git a/ChocolArm64/Memory/AMemory.cs b/ChocolArm64/Memory/AMemory.cs
index 1b4ff6fb..566e6b54 100644
--- a/ChocolArm64/Memory/AMemory.cs
+++ b/ChocolArm64/Memory/AMemory.cs
@@ -41,7 +41,7 @@ namespace ChocolArm64.Memory
}
}
- private Dictionary<int, ArmMonitor> Monitors;
+ private Dictionary<AThreadState, ArmMonitor> Monitors;
private ConcurrentDictionary<long, IntPtr> ObservedPages;
@@ -53,7 +53,7 @@ namespace ChocolArm64.Memory
public AMemory(IntPtr Ram)
{
- Monitors = new Dictionary<int, ArmMonitor>();
+ Monitors = new Dictionary<AThreadState, ArmMonitor>();
ObservedPages = new ConcurrentDictionary<long, IntPtr>();
@@ -75,7 +75,7 @@ namespace ChocolArm64.Memory
{
ClearExclusive(State);
- Monitors.Remove(State.ThreadId);
+ Monitors.Remove(State);
}
}
@@ -93,11 +93,11 @@ namespace ChocolArm64.Memory
}
}
- if (!Monitors.TryGetValue(ThreadState.ThreadId, out ArmMonitor ThreadMon))
+ if (!Monitors.TryGetValue(ThreadState, out ArmMonitor ThreadMon))
{
ThreadMon = new ArmMonitor();
- Monitors.Add(ThreadState.ThreadId, ThreadMon);
+ Monitors.Add(ThreadState, ThreadMon);
}
ThreadMon.Position = Position;
@@ -113,7 +113,7 @@ namespace ChocolArm64.Memory
Monitor.Enter(Monitors);
- if (!Monitors.TryGetValue(ThreadState.ThreadId, out ArmMonitor ThreadMon))
+ if (!Monitors.TryGetValue(ThreadState, out ArmMonitor ThreadMon))
{
return false;
}
@@ -130,7 +130,7 @@ namespace ChocolArm64.Memory
public void ClearExclusiveForStore(AThreadState ThreadState)
{
- if (Monitors.TryGetValue(ThreadState.ThreadId, out ArmMonitor ThreadMon))
+ if (Monitors.TryGetValue(ThreadState, out ArmMonitor ThreadMon))
{
ThreadMon.ExState = false;
}
@@ -142,7 +142,7 @@ namespace ChocolArm64.Memory
{
lock (Monitors)
{
- if (Monitors.TryGetValue(ThreadState.ThreadId, out ArmMonitor ThreadMon))
+ if (Monitors.TryGetValue(ThreadState, out ArmMonitor ThreadMon))
{
ThreadMon.ExState = false;
}
diff --git a/ChocolArm64/State/AThreadState.cs b/ChocolArm64/State/AThreadState.cs
index a84e3242..7b69d817 100644
--- a/ChocolArm64/State/AThreadState.cs
+++ b/ChocolArm64/State/AThreadState.cs
@@ -40,9 +40,6 @@ namespace ChocolArm64.State
public bool Zero;
public bool Negative;
- public int ProcessId;
- public int ThreadId;
-
public bool Running { get; set; }
public long TpidrEl0 { get; set; }
@@ -100,6 +97,11 @@ namespace ChocolArm64.State
TickCounter.Start();
}
+ internal bool Synchronize()
+ {
+ return Running;
+ }
+
internal void OnBreak(long Position, int Imm)
{
Break?.Invoke(this, new AInstExceptionEventArgs(Position, Imm));
diff --git a/ChocolArm64/Translation/AILEmitterCtx.cs b/ChocolArm64/Translation/AILEmitterCtx.cs
index 3fa46e96..40e33ba8 100644
--- a/ChocolArm64/Translation/AILEmitterCtx.cs
+++ b/ChocolArm64/Translation/AILEmitterCtx.cs
@@ -110,6 +110,8 @@ namespace ChocolArm64.Translation
if (OpcIndex == 0)
{
MarkLabel(GetLabel(CurrBlock.Position));
+
+ EmitSynchronization();
}
CurrOp.Emitter(this);
@@ -117,6 +119,25 @@ namespace ChocolArm64.Translation
ILBlock.Add(new AILBarrier());
}
+ private void EmitSynchronization()
+ {
+ EmitLdarg(ATranslatedSub.StateArgIdx);
+
+ EmitPrivateCall(typeof(AThreadState), nameof(AThreadState.Synchronize));
+
+ EmitLdc_I4(0);
+
+ AILLabel LblContinue = new AILLabel();
+
+ Emit(OpCodes.Bne_Un_S, LblContinue);
+
+ EmitLdc_I8(0);
+
+ Emit(OpCodes.Ret);
+
+ MarkLabel(LblContinue);
+ }
+
public bool TryOptEmitSubroutineCall()
{
if (CurrBlock.Next == null)