aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Core
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-02-27 20:45:07 -0300
committergdkchan <gab.dark.100@gmail.com>2018-02-27 20:45:07 -0300
commitf876bd2a805805d9e5dc350b65e8d02fbc5b88b5 (patch)
tree7a3af73448166b628526028cb35d09cc8a010eac /Ryujinx.Core
parent708761963e09ceb4619f8f21fffc7af051a8f020 (diff)
Change SvcGetInfo 5 to return actual heap size, remove AMemoryAlloc since it is no longer needed with direct memory access, move some memory management logic out of AMemoryMgr, change default virtual filesystem path to AppData
Diffstat (limited to 'Ryujinx.Core')
-rw-r--r--Ryujinx.Core/Loaders/Executable.cs4
-rw-r--r--Ryujinx.Core/OsHle/Handles/HSharedMem.cs2
-rw-r--r--Ryujinx.Core/OsHle/Homebrew.cs2
-rw-r--r--Ryujinx.Core/OsHle/Horizon.cs23
-rw-r--r--Ryujinx.Core/OsHle/MemoryInfo.cs28
-rw-r--r--Ryujinx.Core/OsHle/MemoryRegions.cs21
-rw-r--r--Ryujinx.Core/OsHle/Process.cs52
-rw-r--r--Ryujinx.Core/OsHle/Svc/SvcHandler.cs3
-rw-r--r--Ryujinx.Core/OsHle/Svc/SvcMemory.cs65
-rw-r--r--Ryujinx.Core/OsHle/Svc/SvcSystem.cs128
-rw-r--r--Ryujinx.Core/VirtualFs.cs12
11 files changed, 175 insertions, 165 deletions
diff --git a/Ryujinx.Core/Loaders/Executable.cs b/Ryujinx.Core/Loaders/Executable.cs
index 95cb7d6f..fa204460 100644
--- a/Ryujinx.Core/Loaders/Executable.cs
+++ b/Ryujinx.Core/Loaders/Executable.cs
@@ -96,7 +96,7 @@ namespace Ryujinx.Core.Loaders
MemoryType Type,
AMemoryPerm Perm)
{
- Memory.Manager.MapPhys(Position, Data.Count, (int)Type, AMemoryPerm.Write);
+ Memory.Manager.Map(Position, Data.Count, (int)Type, AMemoryPerm.Write);
for (int Index = 0; Index < Data.Count; Index++)
{
@@ -108,7 +108,7 @@ namespace Ryujinx.Core.Loaders
private void MapBss(long Position, long Size)
{
- Memory.Manager.MapPhys(Position, Size, (int)MemoryType.Normal, AMemoryPerm.RW);
+ Memory.Manager.Map(Position, Size, (int)MemoryType.Normal, AMemoryPerm.RW);
}
private ElfRel GetRelocation(long Position)
diff --git a/Ryujinx.Core/OsHle/Handles/HSharedMem.cs b/Ryujinx.Core/OsHle/Handles/HSharedMem.cs
index 3d56ff92..9cd0a0d4 100644
--- a/Ryujinx.Core/OsHle/Handles/HSharedMem.cs
+++ b/Ryujinx.Core/OsHle/Handles/HSharedMem.cs
@@ -12,7 +12,7 @@ namespace Ryujinx.Core.OsHle.Handles
public EventHandler<EventArgs> MemoryMapped;
public EventHandler<EventArgs> MemoryUnmapped;
- public HSharedMem(long PhysPos)
+ public HSharedMem()
{
Positions = new List<long>();
}
diff --git a/Ryujinx.Core/OsHle/Homebrew.cs b/Ryujinx.Core/OsHle/Homebrew.cs
index f177b37e..e2e95e4d 100644
--- a/Ryujinx.Core/OsHle/Homebrew.cs
+++ b/Ryujinx.Core/OsHle/Homebrew.cs
@@ -7,7 +7,7 @@ namespace Ryujinx.Core.OsHle
//http://switchbrew.org/index.php?title=Homebrew_ABI
public static void WriteHbAbiData(AMemory Memory, long Position, int MainThreadHandle)
{
- Memory.Manager.MapPhys(Position, AMemoryMgr.PageSize, (int)MemoryType.Normal, AMemoryPerm.RW);
+ Memory.Manager.Map(Position, AMemoryMgr.PageSize, (int)MemoryType.Normal, AMemoryPerm.RW);
//MainThreadHandle
WriteConfigEntry(Memory, ref Position, 1, 0, MainThreadHandle);
diff --git a/Ryujinx.Core/OsHle/Horizon.cs b/Ryujinx.Core/OsHle/Horizon.cs
index 9929102d..c2389143 100644
--- a/Ryujinx.Core/OsHle/Horizon.cs
+++ b/Ryujinx.Core/OsHle/Horizon.cs
@@ -1,4 +1,3 @@
-using ChocolArm64.Memory;
using Ryujinx.Core.Loaders.Executables;
using Ryujinx.Core.OsHle.Handles;
using Ryujinx.Core.OsHle.Utilities;
@@ -16,9 +15,6 @@ namespace Ryujinx.Core.OsHle
internal int HidHandle { get; private set; }
internal int FontHandle { get; private set; }
- public long HidOffset { get; private set; }
- public long FontOffset { get; private set; }
-
internal IdPool IdGen { get; private set; }
internal IdPool NvMapIds { get; private set; }
@@ -33,8 +29,6 @@ namespace Ryujinx.Core.OsHle
private HSharedMem HidSharedMem;
- private AMemoryAlloc Allocator;
-
private Switch Ns;
public Horizon(Switch Ns)
@@ -53,18 +47,13 @@ namespace Ryujinx.Core.OsHle
Processes = new ConcurrentDictionary<int, Process>();
- Allocator = new AMemoryAlloc();
-
- HidOffset = Allocator.Alloc(HidSize);
- FontOffset = Allocator.Alloc(FontSize);
-
- HidSharedMem = new HSharedMem(HidOffset);
+ HidSharedMem = new HSharedMem();
HidSharedMem.MemoryMapped += HidInit;
HidHandle = Handles.GenerateId(HidSharedMem);
- FontHandle = Handles.GenerateId(new HSharedMem(FontOffset));
+ FontHandle = Handles.GenerateId(new HSharedMem());
}
public void LoadCart(string ExeFsDir, string RomFsFile = null)
@@ -76,7 +65,7 @@ namespace Ryujinx.Core.OsHle
int ProcessId = IdGen.GenerateId();
- Process MainProcess = new Process(Ns, Allocator, ProcessId);
+ Process MainProcess = new Process(Ns, ProcessId);
void LoadNso(string FileName)
{
@@ -106,7 +95,6 @@ namespace Ryujinx.Core.OsHle
LoadNso("subsdk*");
LoadNso("sdk");
- MainProcess.InitializeHeap();
MainProcess.Run();
Processes.TryAdd(ProcessId, MainProcess);
@@ -118,7 +106,7 @@ namespace Ryujinx.Core.OsHle
int ProcessId = IdGen.GenerateId();
- Process MainProcess = new Process(Ns, Allocator, ProcessId);
+ Process MainProcess = new Process(Ns, ProcessId);
using (FileStream Input = new FileStream(FileName, FileMode.Open))
{
@@ -128,7 +116,6 @@ namespace Ryujinx.Core.OsHle
}
MainProcess.SetEmptyArgs();
- MainProcess.InitializeHeap();
MainProcess.Run(IsNro);
Processes.TryAdd(ProcessId, MainProcess);
@@ -186,7 +173,7 @@ namespace Ryujinx.Core.OsHle
if (SharedMem.TryGetLastVirtualPosition(out long Position))
{
- Logging.Info($"HID shared memory successfully mapped to {Position:x16}!");
+ Logging.Info($"HID shared memory successfully mapped to 0x{Position:x16}!");
Ns.Hid.Init(Position);
}
diff --git a/Ryujinx.Core/OsHle/MemoryInfo.cs b/Ryujinx.Core/OsHle/MemoryInfo.cs
deleted file mode 100644
index 76a4bef3..00000000
--- a/Ryujinx.Core/OsHle/MemoryInfo.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using ChocolArm64.Memory;
-
-namespace Ryujinx.Core.OsHle
-{
- struct MemoryInfo
- {
- public long BaseAddress;
- public long Size;
- public int MemType;
- public int MemAttr;
- public int MemPerm;
- public int IpcRefCount;
- public int DeviceRefCount;
- public int Padding; //SBZ
-
- public MemoryInfo(AMemoryMapInfo MapInfo)
- {
- BaseAddress = MapInfo.Position;
- Size = MapInfo.Size;
- MemType = MapInfo.Type;
- MemAttr = MapInfo.Attr;
- MemPerm = (int)MapInfo.Perm;
- IpcRefCount = 0;
- DeviceRefCount = 0;
- Padding = 0;
- }
- }
-} \ No newline at end of file
diff --git a/Ryujinx.Core/OsHle/MemoryRegions.cs b/Ryujinx.Core/OsHle/MemoryRegions.cs
index 86d266f6..3b690426 100644
--- a/Ryujinx.Core/OsHle/MemoryRegions.cs
+++ b/Ryujinx.Core/OsHle/MemoryRegions.cs
@@ -1,11 +1,28 @@
+using ChocolArm64.Memory;
+
namespace Ryujinx.Core.OsHle
{
static class MemoryRegions
{
- public const long MapRegionAddress = 0x80000000;
+ public const long AddrSpaceStart = 0x08000000;
+
+ public const long MapRegionAddress = 0x10000000;
public const long MapRegionSize = 0x40000000;
+ public const long MainStackSize = 0x100000;
+
+ public const long MainStackAddress = AMemoryMgr.AddrSize - MainStackSize;
+
+ public const long TlsPagesSize = 0x4000;
+
+ public const long TlsPagesAddress = MainStackAddress - TlsPagesSize;
+
public const long HeapRegionAddress = MapRegionAddress + MapRegionSize;
- public const long HeapRegionSize = 0x40000000;
+
+ public const long TotalMemoryUsed = HeapRegionAddress + TlsPagesSize + MainStackSize;
+
+ public const long TotalMemoryAvailable = AMemoryMgr.RamSize - AddrSpaceStart;
+
+ public const long AddrSpaceSize = AMemoryMgr.AddrSize - AddrSpaceStart;
}
} \ No newline at end of file
diff --git a/Ryujinx.Core/OsHle/Process.cs b/Ryujinx.Core/OsHle/Process.cs
index 9ca9a2bd..f0b568c8 100644
--- a/Ryujinx.Core/OsHle/Process.cs
+++ b/Ryujinx.Core/OsHle/Process.cs
@@ -15,19 +15,15 @@ namespace Ryujinx.Core.OsHle
{
public class Process : IDisposable
{
- private const int MaxStackSize = 8 * 1024 * 1024;
-
private const int TlsSize = 0x200;
private const int TotalTlsSlots = 32;
- private const int TlsTotalSize = TotalTlsSlots * TlsSize;
- private const long TlsPageAddr = (AMemoryMgr.AddrSize - TlsTotalSize) & ~AMemoryMgr.PageMask;
private Switch Ns;
- private ATranslator Translator;
-
public int ProcessId { get; private set; }
+ private ATranslator Translator;
+
public AMemory Memory { get; private set; }
public KProcessScheduler Scheduler { get; private set; }
@@ -44,12 +40,12 @@ namespace Ryujinx.Core.OsHle
private long ImageBase;
- public Process(Switch Ns, AMemoryAlloc Allocator, int ProcessId)
+ public Process(Switch Ns, int ProcessId)
{
this.Ns = Ns;
this.ProcessId = ProcessId;
- Memory = new AMemory(Ns.Ram, Allocator);
+ Memory = new AMemory(Ns.Ram);
Scheduler = new KProcessScheduler();
@@ -61,13 +57,12 @@ namespace Ryujinx.Core.OsHle
Executables = new List<Executable>();
- ImageBase = 0x8000000;
+ ImageBase = MemoryRegions.AddrSpaceStart;
- Memory.Manager.MapPhys(
- TlsPageAddr,
- TlsTotalSize,
- (int)MemoryType.ThreadLocal,
- AMemoryPerm.RW);
+ MapRWMemRegion(
+ MemoryRegions.TlsPagesAddress,
+ MemoryRegions.TlsPagesSize,
+ MemoryType.ThreadLocal);
}
public void LoadProgram(IExecutable Program)
@@ -86,11 +81,6 @@ namespace Ryujinx.Core.OsHle
ImageBase += AMemoryMgr.PageSize;
}
- public void InitializeHeap()
- {
- Memory.Manager.SetHeapAddr(MemoryRegions.HeapRegionAddress);
- }
-
public bool Run(bool UseHbAbi = false)
{
if (Executables.Count == 0)
@@ -98,11 +88,14 @@ namespace Ryujinx.Core.OsHle
return false;
}
- long StackBot = TlsPageAddr - MaxStackSize;
-
- Memory.Manager.MapPhys(StackBot, MaxStackSize, (int)MemoryType.Normal, AMemoryPerm.RW);
+ MapRWMemRegion(
+ MemoryRegions.MainStackAddress,
+ MemoryRegions.MainStackSize,
+ MemoryType.Normal);
+
+ long StackTop = MemoryRegions.MainStackAddress + MemoryRegions.MainStackSize;
- int Handle = MakeThread(Executables[0].ImageBase, TlsPageAddr, 0, 0, 0);
+ int Handle = MakeThread(Executables[0].ImageBase, StackTop, 0, 0, 0);
if (Handle == -1)
{
@@ -113,7 +106,7 @@ namespace Ryujinx.Core.OsHle
if (UseHbAbi)
{
- long HbAbiDataPosition = (Executables[0].ImageEnd + 0xfff) & ~0xfff;
+ long HbAbiDataPosition = AMemoryHelper.PageRoundUp(Executables[0].ImageEnd);
Homebrew.WriteHbAbiData(Memory, HbAbiDataPosition, Handle);
@@ -126,6 +119,11 @@ namespace Ryujinx.Core.OsHle
return true;
}
+ private void MapRWMemRegion(long Position, long Size, MemoryType Type)
+ {
+ Memory.Manager.Map(Position, Size, (int)Type, AMemoryPerm.RW);
+ }
+
public void StopAllThreads()
{
if (MainThread != null)
@@ -188,12 +186,14 @@ namespace Ryujinx.Core.OsHle
return -1;
}
+ long Tpidr = MemoryRegions.TlsPagesAddress + TlsSlot * TlsSize;
+
Thread.ThreadState.Break += BreakHandler;
Thread.ThreadState.SvcCall += SvcHandler.SvcCall;
Thread.ThreadState.Undefined += UndefinedHandler;
Thread.ThreadState.ProcessId = ProcessId;
Thread.ThreadState.ThreadId = Ns.Os.IdGen.GenerateId();
- Thread.ThreadState.Tpidr = TlsPageAddr + TlsSlot * TlsSize;
+ Thread.ThreadState.Tpidr = Tpidr;
Thread.ThreadState.X0 = (ulong)ArgsPtr;
Thread.ThreadState.X1 = (ulong)Handle;
Thread.ThreadState.X31 = (ulong)StackTop;
@@ -267,7 +267,7 @@ namespace Ryujinx.Core.OsHle
private int GetTlsSlot(long Position)
{
- return (int)((Position - TlsPageAddr) / TlsSize);
+ return (int)((Position - MemoryRegions.TlsPagesAddress) / TlsSize);
}
public HThread GetThread(long Tpidr)
diff --git a/Ryujinx.Core/OsHle/Svc/SvcHandler.cs b/Ryujinx.Core/OsHle/Svc/SvcHandler.cs
index ec53f47f..212d30a6 100644
--- a/Ryujinx.Core/OsHle/Svc/SvcHandler.cs
+++ b/Ryujinx.Core/OsHle/Svc/SvcHandler.cs
@@ -17,6 +17,8 @@ namespace Ryujinx.Core.OsHle.Svc
private AMemory Memory;
private static Random Rng;
+
+ private ulong CurrentHeapSize;
public SvcHandler(Switch Ns, Process Process)
{
@@ -25,6 +27,7 @@ namespace Ryujinx.Core.OsHle.Svc
{ 0x01, SvcSetHeapSize },
{ 0x03, SvcSetMemoryAttribute },
{ 0x04, SvcMapMemory },
+ { 0x05, SvcUnmapMemory },
{ 0x06, SvcQueryMemory },
{ 0x07, SvcExitProcess },
{ 0x08, SvcCreateThread },
diff --git a/Ryujinx.Core/OsHle/Svc/SvcMemory.cs b/Ryujinx.Core/OsHle/Svc/SvcMemory.cs
index 6ca27f16..e7559a14 100644
--- a/Ryujinx.Core/OsHle/Svc/SvcMemory.cs
+++ b/Ryujinx.Core/OsHle/Svc/SvcMemory.cs
@@ -10,10 +10,21 @@ namespace Ryujinx.Core.OsHle.Svc
{
uint Size = (uint)ThreadState.X1;
- Memory.Manager.SetHeapSize(Size, (int)MemoryType.Heap);
+ long Position = MemoryRegions.HeapRegionAddress;
+
+ if (Size > CurrentHeapSize)
+ {
+ Memory.Manager.Map(Position, Size, (int)MemoryType.Heap, AMemoryPerm.RW);
+ }
+ else
+ {
+ Memory.Manager.Unmap(Position + Size, (long)CurrentHeapSize - Size);
+ }
+
+ CurrentHeapSize = Size;
ThreadState.X0 = (int)SvcResult.Success;
- ThreadState.X1 = (ulong)Memory.Manager.HeapAddr;
+ ThreadState.X1 = (ulong)Position;
}
private void SvcSetMemoryAttribute(AThreadState ThreadState)
@@ -42,7 +53,30 @@ namespace Ryujinx.Core.OsHle.Svc
long Src = (long)ThreadState.X1;
long Size = (long)ThreadState.X2;
- Memory.Manager.MapMirror(Src, Dst, Size, (int)MemoryType.MappedMemory);
+ AMemoryMapInfo SrcInfo = Memory.Manager.GetMapInfo(Src);
+
+ Memory.Manager.Map(Dst, Size, (int)MemoryType.MappedMemory, SrcInfo.Perm);
+
+ Memory.Manager.Reprotect(Src, Size, AMemoryPerm.None);
+
+ Memory.Manager.SetAttrBit(Src, Size, 0);
+
+ ThreadState.X0 = (int)SvcResult.Success;
+ }
+
+ private void SvcUnmapMemory(AThreadState ThreadState)
+ {
+ long Dst = (long)ThreadState.X0;
+ long Src = (long)ThreadState.X1;
+ long Size = (long)ThreadState.X2;
+
+ AMemoryMapInfo DstInfo = Memory.Manager.GetMapInfo(Dst);
+
+ Memory.Manager.Unmap(Dst, Size, (int)MemoryType.MappedMemory);
+
+ Memory.Manager.Reprotect(Src, Size, DstInfo.Perm);
+
+ Memory.Manager.ClearAttrBit(Src, Size, 0);
ThreadState.X0 = (int)SvcResult.Success;
}
@@ -54,17 +88,22 @@ namespace Ryujinx.Core.OsHle.Svc
AMemoryMapInfo MapInfo = Memory.Manager.GetMapInfo(Position);
- MemoryInfo Info = new MemoryInfo(MapInfo);
+ if (MapInfo == null)
+ {
+ //TODO: Correct error code.
+ ThreadState.X0 = ulong.MaxValue;
- Memory.WriteInt64(InfoPtr + 0x00, Info.BaseAddress);
- Memory.WriteInt64(InfoPtr + 0x08, Info.Size);
- Memory.WriteInt32(InfoPtr + 0x10, Info.MemType);
- Memory.WriteInt32(InfoPtr + 0x14, Info.MemAttr);
- Memory.WriteInt32(InfoPtr + 0x18, Info.MemPerm);
- Memory.WriteInt32(InfoPtr + 0x1c, Info.IpcRefCount);
- Memory.WriteInt32(InfoPtr + 0x20, Info.DeviceRefCount);
- Memory.WriteInt32(InfoPtr + 0x24, Info.Padding);
+ return;
+ }
+ Memory.WriteInt64(InfoPtr + 0x00, MapInfo.Position);
+ Memory.WriteInt64(InfoPtr + 0x08, MapInfo.Size);
+ Memory.WriteInt32(InfoPtr + 0x10, MapInfo.Type);
+ Memory.WriteInt32(InfoPtr + 0x14, MapInfo.Attr);
+ Memory.WriteInt32(InfoPtr + 0x18, (int)MapInfo.Perm);
+ Memory.WriteInt32(InfoPtr + 0x1c, 0);
+ Memory.WriteInt32(InfoPtr + 0x20, 0);
+ Memory.WriteInt32(InfoPtr + 0x24, 0);
//TODO: X1.
ThreadState.X0 = (int)SvcResult.Success;
@@ -84,7 +123,7 @@ namespace Ryujinx.Core.OsHle.Svc
{
SharedMem.AddVirtualPosition(Src);
- Memory.Manager.MapPhys(Src, Size, (int)MemoryType.SharedMemory, (AMemoryPerm)Perm);
+ Memory.Manager.Map(Src, Size, (int)MemoryType.SharedMemory, (AMemoryPerm)Perm);
ThreadState.X0 = (int)SvcResult.Success;
}
diff --git a/Ryujinx.Core/OsHle/Svc/SvcSystem.cs b/Ryujinx.Core/OsHle/Svc/SvcSystem.cs
index 3b9142c7..51b2e26c 100644
--- a/Ryujinx.Core/OsHle/Svc/SvcSystem.cs
+++ b/Ryujinx.Core/OsHle/Svc/SvcSystem.cs
@@ -11,7 +11,14 @@ namespace Ryujinx.Core.OsHle.Svc
{
partial class SvcHandler
{
- private void SvcExitProcess(AThreadState ThreadState) => Ns.Os.ExitProcess(ThreadState.ProcessId);
+ private const int AllowedCpuIdBitmask = 0b1111;
+
+ private const bool EnableProcessDebugging = false;
+
+ private void SvcExitProcess(AThreadState ThreadState)
+ {
+ Ns.Os.ExitProcess(ThreadState.ProcessId);
+ }
private void SvcCloseHandle(AThreadState ThreadState)
{
@@ -162,79 +169,62 @@ namespace Ryujinx.Core.OsHle.Svc
switch (InfoType)
{
- case 0: ThreadState.X1 = AllowedCpuIdBitmask(); break;
- case 2: ThreadState.X1 = GetMapRegionBaseAddr(); break;
- case 3: ThreadState.X1 = GetMapRegionSize(); break;
- case 4: ThreadState.X1 = GetHeapRegionBaseAddr(); break;
- case 5: ThreadState.X1 = GetHeapRegionSize(); break;
- case 6: ThreadState.X1 = GetTotalMem(); break;
- case 7: ThreadState.X1 = GetUsedMem(); break;
- case 8: ThreadState.X1 = IsCurrentProcessBeingDebugged(); break;
- case 11: ThreadState.X1 = GetRnd64(); break;
- case 12: ThreadState.X1 = GetAddrSpaceBaseAddr(); break;
- case 13: ThreadState.X1 = GetAddrSpaceSize(); break;
- case 14: ThreadState.X1 = GetMapRegionBaseAddr(); break;
- case 15: ThreadState.X1 = GetMapRegionSize(); break;
+ case 0:
+ ThreadState.X1 = AllowedCpuIdBitmask;
+ break;
+
+ case 2:
+ ThreadState.X1 = MemoryRegions.MapRegionAddress;
+ break;
+
+ case 3:
+ ThreadState.X1 = MemoryRegions.MapRegionSize;
+ break;
+
+ case 4:
+ ThreadState.X1 = MemoryRegions.HeapRegionAddress;
+ break;
+
+ case 5:
+ ThreadState.X1 = CurrentHeapSize;
+ break;
+
+ case 6:
+ ThreadState.X1 = MemoryRegions.TotalMemoryAvailable;
+ break;
+
+ case 7:
+ ThreadState.X1 = MemoryRegions.TotalMemoryUsed + CurrentHeapSize;
+ break;
+
+ case 8:
+ ThreadState.X1 = EnableProcessDebugging ? 1 : 0;
+ break;
+
+ case 11:
+ ThreadState.X1 = (ulong)Rng.Next() + ((ulong)Rng.Next() << 32);
+ break;
+
+ case 12:
+ ThreadState.X1 = MemoryRegions.AddrSpaceStart;
+ break;
+
+ case 13:
+ ThreadState.X1 = MemoryRegions.AddrSpaceSize;
+ break;
+
+ case 14:
+ ThreadState.X1 = MemoryRegions.MapRegionAddress;
+ break;
+
+ case 15:
+ ThreadState.X1 = MemoryRegions.MapRegionSize;
+ break;
default: throw new NotImplementedException($"SvcGetInfo: {InfoType} {Handle} {InfoId}");
}
ThreadState.X0 = (int)SvcResult.Success;
}
-
- private ulong AllowedCpuIdBitmask()
- {
- return 0xF; //Mephisto value.
- }
-
- private ulong GetMapRegionBaseAddr()
- {
- return MemoryRegions.MapRegionAddress;
- }
-
- private ulong GetMapRegionSize()
- {
- return MemoryRegions.MapRegionSize;
- }
-
- private ulong GetHeapRegionBaseAddr()
- {
- return MemoryRegions.HeapRegionAddress;
- }
-
- private ulong GetHeapRegionSize()
- {
- return MemoryRegions.HeapRegionSize;
- }
-
- private ulong GetTotalMem()
- {
- return (ulong)Memory.Manager.GetTotalMemorySize();
- }
-
- private ulong GetUsedMem()
- {
- return (ulong)Memory.Manager.GetUsedMemorySize();
- }
-
- private ulong IsCurrentProcessBeingDebugged()
- {
- return (ulong)0;
- }
-
- private ulong GetRnd64()
- {
- return (ulong)Rng.Next() + ((ulong)Rng.Next() << 32);
- }
-
- private ulong GetAddrSpaceBaseAddr()
- {
- return 0x08000000;
- }
-
- private ulong GetAddrSpaceSize()
- {
- return AMemoryMgr.AddrSize - GetAddrSpaceBaseAddr();
- }
}
}
diff --git a/Ryujinx.Core/VirtualFs.cs b/Ryujinx.Core/VirtualFs.cs
index 0c911116..195fb6a3 100644
--- a/Ryujinx.Core/VirtualFs.cs
+++ b/Ryujinx.Core/VirtualFs.cs
@@ -5,9 +5,9 @@ namespace Ryujinx.Core
{
class VirtualFs : IDisposable
{
- private const string BasePath = "Fs";
- private const string SavesPath = "Saves";
- private const string SdCardPath = "SdCard";
+ private const string BasePath = "RyuFs";
+ private const string NandPath = "nand";
+ private const string SdCardPath = "sdmc";
public Stream RomFs { get; private set; }
@@ -35,7 +35,7 @@ namespace Ryujinx.Core
public string GetSdCardPath() => MakeDirAndGetFullPath(SdCardPath);
- public string GetGameSavesPath() => MakeDirAndGetFullPath(SavesPath);
+ public string GetGameSavesPath() => MakeDirAndGetFullPath(NandPath);
private string MakeDirAndGetFullPath(string Dir)
{
@@ -56,7 +56,9 @@ namespace Ryujinx.Core
public string GetBasePath()
{
- return Path.Combine(Directory.GetCurrentDirectory(), BasePath);
+ string AppDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
+
+ return Path.Combine(AppDataPath, BasePath);
}
public void Dispose()