diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2020-05-03 19:54:50 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-05-04 08:54:50 +1000 |
| commit | f77694e4f774c9391aad5344e70a7c8721cfedc6 (patch) | |
| tree | 36bccaeb153bd5d921c751966b8a734a7b4b6ae1 /Ryujinx.Tests/Cpu | |
| parent | 1758424208335d1f4ff7c27c554e517c81bf72f6 (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.cs | 39 | ||||
| -rw-r--r-- | Ryujinx.Tests/Cpu/CpuTest32.cs | 50 |
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]); } |
