aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Tests/Cpu
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2020-05-03 19:54:50 -0300
committerGitHub <noreply@github.com>2020-05-04 08:54:50 +1000
commitf77694e4f774c9391aad5344e70a7c8721cfedc6 (patch)
tree36bccaeb153bd5d921c751966b8a734a7b4b6ae1 /Ryujinx.Tests/Cpu
parent1758424208335d1f4ff7c27c554e517c81bf72f6 (diff)
Implement a new physical memory manager and replace DeviceMemory (#856)
* Implement a new physical memory manager and replace DeviceMemory * Proper generic constraints * Fix debug build * Add memory tests * New CPU memory manager and general code cleanup * Remove host memory management from CPU project, use Ryujinx.Memory instead * Fix tests * Document exceptions on MemoryBlock * Fix leak on unix memory allocation * Proper disposal of some objects on tests * Fix JitCache not being set as initialized * GetRef without checks for 8-bits and 16-bits CAS * Add MemoryBlock destructor * Throw in separate method to improve codegen * Address PR feedback * QueryModified improvements * Fix memory write tracking not marking all pages as modified in some cases * Simplify MarkRegionAsModified * Remove XML doc for ghost param * Add back optimization to avoid useless buffer updates * Add Ryujinx.Cpu project, move MemoryManager there and remove MemoryBlockWrapper * Some nits * Do not perform address translation when size is 0 * Address PR feedback and format NativeInterface class * Remove ghost parameter description * Update Ryujinx.Cpu to .NET Core 3.1 * Address PR feedback * Fix build * Return a well defined value for GetPhysicalAddress with invalid VA, and do not return unmapped ranges as modified * Typo
Diffstat (limited to 'Ryujinx.Tests/Cpu')
-rw-r--r--Ryujinx.Tests/Cpu/CpuTest.cs39
-rw-r--r--Ryujinx.Tests/Cpu/CpuTest32.cs50
2 files changed, 47 insertions, 42 deletions
diff --git a/Ryujinx.Tests/Cpu/CpuTest.cs b/Ryujinx.Tests/Cpu/CpuTest.cs
index fb9a8f17..b3f316f4 100644
--- a/Ryujinx.Tests/Cpu/CpuTest.cs
+++ b/Ryujinx.Tests/Cpu/CpuTest.cs
@@ -1,13 +1,12 @@
-using ARMeilleure.Memory;
using ARMeilleure.State;
-using ARMeilleure.Translation;
using NUnit.Framework;
-
+using Ryujinx.Cpu;
+using Ryujinx.Memory;
using Ryujinx.Tests.Unicorn;
using System;
-using System.Runtime.InteropServices;
+using MemoryPermission = Ryujinx.Tests.Unicorn.MemoryPermission;
namespace Ryujinx.Tests.Cpu
{
@@ -15,17 +14,17 @@ namespace Ryujinx.Tests.Cpu
public class CpuTest
{
private ulong _currAddress;
- private long _size;
+ private ulong _size;
private ulong _entryPoint;
- private IntPtr _ramPointer;
+ private MemoryBlock _ram;
private MemoryManager _memory;
private ExecutionContext _context;
- private Translator _translator;
+ private CpuContext _cpuContext;
private static bool _unicornAvailable;
private UnicornAArch64 _unicornEmu;
@@ -48,18 +47,18 @@ namespace Ryujinx.Tests.Cpu
_entryPoint = _currAddress;
- _ramPointer = Marshal.AllocHGlobal(new IntPtr(_size));
- _memory = new MemoryManager(_ramPointer);
- _memory.Map((long)_currAddress, 0, _size);
+ _ram = new MemoryBlock(_size);
+ _memory = new MemoryManager(_ram, 1UL << 16);
+ _memory.Map(_currAddress, 0, _size);
- _context = new ExecutionContext();
+ _context = CpuContext.CreateExecutionContext();
- _translator = new Translator(_memory);
+ _cpuContext = new CpuContext(_memory);
if (_unicornAvailable)
{
_unicornEmu = new UnicornAArch64();
- _unicornEmu.MemoryMap(_currAddress, (ulong)_size, MemoryPermission.READ | MemoryPermission.EXEC);
+ _unicornEmu.MemoryMap(_currAddress, _size, MemoryPermission.READ | MemoryPermission.EXEC);
_unicornEmu.PC = _entryPoint;
}
}
@@ -67,10 +66,12 @@ namespace Ryujinx.Tests.Cpu
[TearDown]
public void Teardown()
{
- Marshal.FreeHGlobal(_ramPointer);
+ _memory.Dispose();
+ _context.Dispose();
+ _ram.Dispose();
_memory = null;
_context = null;
- _translator = null;
+ _cpuContext = null;
_unicornEmu = null;
}
@@ -82,11 +83,11 @@ namespace Ryujinx.Tests.Cpu
protected void Opcode(uint opcode)
{
- _memory.WriteUInt32((long)_currAddress, opcode);
+ _memory.Write(_currAddress, opcode);
if (_unicornAvailable)
{
- _unicornEmu.MemoryWrite32((ulong)_currAddress, opcode);
+ _unicornEmu.MemoryWrite32(_currAddress, opcode);
}
_currAddress += 4;
@@ -168,11 +169,11 @@ namespace Ryujinx.Tests.Cpu
protected void ExecuteOpcodes()
{
- _translator.Execute(_context, _entryPoint);
+ _cpuContext.Execute(_context, _entryPoint);
if (_unicornAvailable)
{
- _unicornEmu.RunForCount((ulong)(_currAddress - _entryPoint - 4) / 4);
+ _unicornEmu.RunForCount((_currAddress - _entryPoint - 4) / 4);
}
}
diff --git a/Ryujinx.Tests/Cpu/CpuTest32.cs b/Ryujinx.Tests/Cpu/CpuTest32.cs
index 0cd8f4df..9b8b89a1 100644
--- a/Ryujinx.Tests/Cpu/CpuTest32.cs
+++ b/Ryujinx.Tests/Cpu/CpuTest32.cs
@@ -1,10 +1,12 @@
-using ARMeilleure.Memory;
-using ARMeilleure.State;
-using ARMeilleure.Translation;
+using ARMeilleure.State;
+
using NUnit.Framework;
+using Ryujinx.Cpu;
+using Ryujinx.Memory;
using Ryujinx.Tests.Unicorn;
+
using System;
-using System.Runtime.InteropServices;
+using MemoryPermission = Ryujinx.Tests.Unicorn.MemoryPermission;
namespace Ryujinx.Tests.Cpu
{
@@ -12,17 +14,17 @@ namespace Ryujinx.Tests.Cpu
public class CpuTest32
{
private uint _currAddress;
- private long _size;
+ private ulong _size;
private uint _entryPoint;
- private IntPtr _ramPointer;
+ private MemoryBlock _ram;
private MemoryManager _memory;
private ExecutionContext _context;
- private Translator _translator;
+ private CpuContext _cpuContext;
private static bool _unicornAvailable;
private UnicornAArch32 _unicornEmu;
@@ -47,20 +49,20 @@ namespace Ryujinx.Tests.Cpu
_entryPoint = _currAddress;
- _ramPointer = Marshal.AllocHGlobal(new IntPtr(_size * 2));
- _memory = new MemoryManager(_ramPointer, addressSpaceBits: 16, useFlatPageTable: true);
- _memory.Map((long)_currAddress, 0, _size*2);
+ _ram = new MemoryBlock(_size * 2);
+ _memory = new MemoryManager(_ram, 1UL << 16);
+ _memory.Map(_currAddress, 0, _size * 2);
- _context = new ExecutionContext();
+ _context = CpuContext.CreateExecutionContext();
_context.IsAarch32 = true;
- _translator = new Translator(_memory);
+ _cpuContext = new CpuContext(_memory);
if (_unicornAvailable)
{
_unicornEmu = new UnicornAArch32();
- _unicornEmu.MemoryMap(_currAddress, (ulong)_size, MemoryPermission.READ | MemoryPermission.EXEC);
- _unicornEmu.MemoryMap((ulong)(_currAddress + _size), (ulong)_size, MemoryPermission.READ | MemoryPermission.WRITE);
+ _unicornEmu.MemoryMap(_currAddress, _size, MemoryPermission.READ | MemoryPermission.EXEC);
+ _unicornEmu.MemoryMap(_currAddress + _size, _size, MemoryPermission.READ | MemoryPermission.WRITE);
_unicornEmu.PC = _entryPoint;
}
}
@@ -68,10 +70,12 @@ namespace Ryujinx.Tests.Cpu
[TearDown]
public void Teardown()
{
- Marshal.FreeHGlobal(_ramPointer);
+ _memory.Dispose();
+ _context.Dispose();
+ _ram.Dispose();
_memory = null;
_context = null;
- _translator = null;
+ _cpuContext = null;
_unicornEmu = null;
}
@@ -83,11 +87,11 @@ namespace Ryujinx.Tests.Cpu
protected void Opcode(uint opcode)
{
- _memory.WriteUInt32((long)_currAddress, opcode);
+ _memory.Write(_currAddress, opcode);
if (_unicornAvailable)
{
- _unicornEmu.MemoryWrite32((ulong)_currAddress, opcode);
+ _unicornEmu.MemoryWrite32(_currAddress, opcode);
}
_currAddress += 4;
@@ -166,7 +170,7 @@ namespace Ryujinx.Tests.Cpu
protected void ExecuteOpcodes(bool runUnicorn = true)
{
- _translator.Execute(_context, _entryPoint);
+ _cpuContext.Execute(_context, _entryPoint);
if (_unicornAvailable && runUnicorn)
{
@@ -210,7 +214,7 @@ namespace Ryujinx.Tests.Cpu
protected void SetWorkingMemory(byte[] data)
{
- _memory.WriteBytes(0x2000, data);
+ _memory.Write(0x2000, data);
if (_unicornAvailable)
{
@@ -357,10 +361,10 @@ namespace Ryujinx.Tests.Cpu
if (usingMemory)
{
- byte[] meilleureMem = _memory.ReadBytes((long)(0x2000), _size);
- byte[] unicornMem = _unicornEmu.MemoryRead((ulong)(0x2000), (ulong)_size);
+ ReadOnlySpan<byte> meilleureMem = _memory.GetSpan(0x2000, (int)_size);
+ byte[] unicornMem = _unicornEmu.MemoryRead(0x2000, _size);
- for (int i = 0; i < _size; i++)
+ for (int i = 0; i < (int)_size; i++)
{
Assert.AreEqual(meilleureMem[i], unicornMem[i]);
}