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
This commit is contained in:
gdkchan 2020-05-03 19:54:50 -03:00 committed by GitHub
parent 1758424208
commit f77694e4f7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
126 changed files with 2176 additions and 2092 deletions

View file

@ -19,7 +19,7 @@ namespace Ryujinx.HLE.HOS.Font
{
private Switch _device;
private long _physicalAddress;
private ulong _physicalAddress;
private struct FontInfo
{
@ -35,7 +35,7 @@ namespace Ryujinx.HLE.HOS.Font
private Dictionary<SharedFontType, FontInfo> _fontData;
public SharedFontManager(Switch device, long physicalAddress)
public SharedFontManager(Switch device, ulong physicalAddress)
{
_physicalAddress = physicalAddress;
_device = device;
@ -52,7 +52,7 @@ namespace Ryujinx.HLE.HOS.Font
{
if (_fontData == null)
{
_device.Memory.FillWithZeros(_physicalAddress, Horizon.FontSize);
_device.Memory.ZeroFill(_physicalAddress, Horizon.FontSize);
uint fontOffset = 0;
@ -67,7 +67,7 @@ namespace Ryujinx.HLE.HOS.Font
if (!string.IsNullOrWhiteSpace(fontPath))
{
byte[] data;
using (IStorage ncaFileStream = new LocalStorage(fontPath, FileAccess.Read, FileMode.Open))
{
Nca nca = new Nca(_device.System.KeySet, ncaFileStream);
@ -77,7 +77,7 @@ namespace Ryujinx.HLE.HOS.Font
data = DecryptFont(fontFile.AsStream());
}
FontInfo info = new FontInfo((int)fontOffset, data.Length);
WriteMagicAndSize(_physicalAddress + fontOffset, data.Length);
@ -88,7 +88,7 @@ namespace Ryujinx.HLE.HOS.Font
for (; fontOffset - start < data.Length; fontOffset++)
{
_device.Memory.WriteByte(_physicalAddress + fontOffset, data[fontOffset - start]);
_device.Memory.Write(_physicalAddress + fontOffset, data[fontOffset - start]);
}
return info;
@ -129,15 +129,15 @@ namespace Ryujinx.HLE.HOS.Font
}
}
private void WriteMagicAndSize(long position, int size)
private void WriteMagicAndSize(ulong address, int size)
{
const int decMagic = 0x18029a7f;
const int key = 0x49621806;
int encryptedSize = BinaryPrimitives.ReverseEndianness(size ^ key);
_device.Memory.WriteInt32(position + 0, decMagic);
_device.Memory.WriteInt32(position + 4, encryptedSize);
_device.Memory.Write(address + 0, decMagic);
_device.Memory.Write(address + 4, encryptedSize);
}
public int GetFontSize(SharedFontType fontType)