diff --git a/src/LibHac/Boot/Package1.cs b/src/LibHac/Boot/Package1.cs
index c49db99d..476c51ab 100644
--- a/src/LibHac/Boot/Package1.cs
+++ b/src/LibHac/Boot/Package1.cs
@@ -315,7 +315,7 @@ namespace LibHac.Boot
int start = IsModern ? 6 : 0;
int end = IsModern ? 0x20 : 6;
- Decryptor decryptor = IsModern ? Crypto.Aes.DecryptCbc128 : (Decryptor)Crypto.Aes.DecryptCtr128;
+ Decryptor decryptor = IsModern ? Crypto.Aes.DecryptCbc128 : Crypto.Aes.DecryptCtr128;
for (int i = start; i < end; i++)
{
diff --git a/src/LibHac/FsSrv/FileSystemServerInitializer.cs b/src/LibHac/FsSrv/FileSystemServerInitializer.cs
index 7120c338..ee0efb0f 100644
--- a/src/LibHac/FsSrv/FileSystemServerInitializer.cs
+++ b/src/LibHac/FsSrv/FileSystemServerInitializer.cs
@@ -5,6 +5,7 @@ using LibHac.FsSrv.FsCreator;
using LibHac.FsSrv.Impl;
using LibHac.FsSrv.Sf;
using LibHac.FsSrv.Storage;
+using LibHac.FsSystem;
using LibHac.Sm;
namespace LibHac.FsSrv
@@ -14,6 +15,10 @@ namespace LibHac.FsSrv
private const ulong SpeedEmulationProgramIdMinimum = 0x100000000000000;
private const ulong SpeedEmulationProgramIdMaximum = 0x100000000001FFF;
+ private const int BufferManagerHeapSize = 1024 * 1024 * 14;
+ private const int BufferManagerCacheSize = 1024;
+ private const int BufferManagerBlockSize = 0x4000;
+
///
/// Initializes a with the provided .
///
@@ -57,6 +62,17 @@ namespace LibHac.FsSrv
private static FileSystemProxyConfiguration InitializeFileSystemProxy(FileSystemServer server,
FileSystemServerConfig config)
{
+ var random = new Random();
+ RandomDataGenerator randomGenerator = buffer =>
+ {
+ random.NextBytes(buffer);
+ return Result.Success;
+ };
+
+ var bufferManager = new FileSystemBufferManager();
+ Memory heapBuffer = GC.AllocateArray(BufferManagerHeapSize, true);
+ bufferManager.Initialize(BufferManagerCacheSize, heapBuffer, BufferManagerBlockSize);
+
var saveDataIndexerManager = new SaveDataIndexerManager(server.Hos.Fs, Fs.SaveData.SaveIndexerId,
new ArrayPoolMemoryResource(), new SdHandleManager(), false);
@@ -93,7 +109,7 @@ namespace LibHac.FsSrv
var ncaFsServiceConfig = new NcaFileSystemServiceImpl.Configuration();
ncaFsServiceConfig.BaseFsService = baseFsService;
- ncaFsServiceConfig.HostFsCreator = config.FsCreators.HostFileSystemCreator;
+ ncaFsServiceConfig.LocalFsCreator = config.FsCreators.LocalFileSystemCreator;
ncaFsServiceConfig.TargetManagerFsCreator = config.FsCreators.TargetManagerFileSystemCreator;
ncaFsServiceConfig.PartitionFsCreator = config.FsCreators.PartitionFileSystemCreator;
ncaFsServiceConfig.RomFsCreator = config.FsCreators.RomFileSystemCreator;
@@ -109,12 +125,16 @@ namespace LibHac.FsSrv
var saveFsServiceConfig = new SaveDataFileSystemServiceImpl.Configuration();
saveFsServiceConfig.BaseFsService = baseFsService;
- saveFsServiceConfig.HostFsCreator = config.FsCreators.HostFileSystemCreator;
+ saveFsServiceConfig.TimeService = timeService;
+ saveFsServiceConfig.LocalFsCreator = config.FsCreators.LocalFileSystemCreator;
saveFsServiceConfig.TargetManagerFsCreator = config.FsCreators.TargetManagerFileSystemCreator;
saveFsServiceConfig.SaveFsCreator = config.FsCreators.SaveDataFileSystemCreator;
saveFsServiceConfig.EncryptedFsCreator = config.FsCreators.EncryptedFileSystemCreator;
saveFsServiceConfig.ProgramRegistryService = programRegistryService;
- saveFsServiceConfig.ShouldCreateDirectorySaveData = () => true;
+ saveFsServiceConfig.BufferManager = bufferManager;
+ saveFsServiceConfig.GenerateRandomData = randomGenerator;
+ saveFsServiceConfig.IsPseudoSaveData = () => true;
+ saveFsServiceConfig.MaxSaveFsCacheCount = 1;
saveFsServiceConfig.SaveIndexerManager = saveDataIndexerManager;
saveFsServiceConfig.FsServer = server;
diff --git a/src/LibHac/FsSrv/FsCreator/FileSystemCreatorInterfaces.cs b/src/LibHac/FsSrv/FsCreator/FileSystemCreatorInterfaces.cs
index 7168481b..556a35e9 100644
--- a/src/LibHac/FsSrv/FsCreator/FileSystemCreatorInterfaces.cs
+++ b/src/LibHac/FsSrv/FsCreator/FileSystemCreatorInterfaces.cs
@@ -6,7 +6,7 @@
public IPartitionFileSystemCreator PartitionFileSystemCreator { get; set; }
public IStorageOnNcaCreator StorageOnNcaCreator { get; set; }
public IFatFileSystemCreator FatFileSystemCreator { get; set; }
- public IHostFileSystemCreator HostFileSystemCreator { get; set; }
+ public ILocalFileSystemCreator LocalFileSystemCreator { get; set; }
public ITargetManagerFileSystemCreator TargetManagerFileSystemCreator { get; set; }
public ISubDirectoryFileSystemCreator SubDirectoryFileSystemCreator { get; set; }
public IBuiltInStorageCreator BuiltInStorageCreator { get; set; }
diff --git a/src/LibHac/FsSrv/FsCreator/IHostFileSystemCreator.cs b/src/LibHac/FsSrv/FsCreator/ILocalFileSystemCreator.cs
similarity index 83%
rename from src/LibHac/FsSrv/FsCreator/IHostFileSystemCreator.cs
rename to src/LibHac/FsSrv/FsCreator/ILocalFileSystemCreator.cs
index da53e495..c978e93b 100644
--- a/src/LibHac/FsSrv/FsCreator/IHostFileSystemCreator.cs
+++ b/src/LibHac/FsSrv/FsCreator/ILocalFileSystemCreator.cs
@@ -2,7 +2,7 @@
namespace LibHac.FsSrv.FsCreator
{
- public interface IHostFileSystemCreator
+ public interface ILocalFileSystemCreator
{
Result Create(out IFileSystem fileSystem, bool someBool);
Result Create(out IFileSystem fileSystem, string path, bool openCaseSensitive);
diff --git a/src/LibHac/FsSrv/NcaFileSystemServiceImpl.cs b/src/LibHac/FsSrv/NcaFileSystemServiceImpl.cs
index fec6aa00..09700b91 100644
--- a/src/LibHac/FsSrv/NcaFileSystemServiceImpl.cs
+++ b/src/LibHac/FsSrv/NcaFileSystemServiceImpl.cs
@@ -42,7 +42,7 @@ namespace LibHac.FsSrv
public struct Configuration
{
public BaseFileSystemServiceImpl BaseFsService;
- public IHostFileSystemCreator HostFsCreator;
+ public ILocalFileSystemCreator LocalFsCreator;
public ITargetManagerFileSystemCreator TargetManagerFsCreator;
public IPartitionFileSystemCreator PartitionFsCreator;
public IRomFileSystemCreator RomFsCreator;
diff --git a/src/LibHac/FsSrv/SaveDataFileSystemService.cs b/src/LibHac/FsSrv/SaveDataFileSystemService.cs
index fe785669..75e5de4b 100644
--- a/src/LibHac/FsSrv/SaveDataFileSystemService.cs
+++ b/src/LibHac/FsSrv/SaveDataFileSystemService.cs
@@ -336,6 +336,7 @@ namespace LibHac.FsSrv
return rc;
}
+ // Allow access when opening a directory save FS on a dev console
if (extraData.OwnerId == 0 && extraData.DataSize == 0 && extraData.JournalSize == 0 &&
programInfo.AccessControl.CanCall(OperationType.DebugSaveData))
{
diff --git a/src/LibHac/FsSrv/SaveDataFileSystemServiceImpl.cs b/src/LibHac/FsSrv/SaveDataFileSystemServiceImpl.cs
index 90256358..9b960375 100644
--- a/src/LibHac/FsSrv/SaveDataFileSystemServiceImpl.cs
+++ b/src/LibHac/FsSrv/SaveDataFileSystemServiceImpl.cs
@@ -34,17 +34,17 @@ namespace LibHac.FsSrv
public struct Configuration
{
public BaseFileSystemServiceImpl BaseFsService;
- // Time service
- public IHostFileSystemCreator HostFsCreator;
+ public TimeServiceImpl TimeService;
+ public ILocalFileSystemCreator LocalFsCreator;
public ITargetManagerFileSystemCreator TargetManagerFsCreator;
public ISaveDataFileSystemCreator SaveFsCreator;
public IEncryptedFileSystemCreator EncryptedFsCreator;
public ProgramRegistryServiceImpl ProgramRegistryService;
- // Buffer manager
+ public IBufferManager BufferManager;
public RandomDataGenerator GenerateRandomData;
public SaveDataTransferCryptoConfiguration SaveTransferCryptoConfig;
- // Max save FS cache size
- public Func ShouldCreateDirectorySaveData;
+ public int MaxSaveFsCacheCount;
+ public Func IsPseudoSaveData;
public ISaveDataIndexerManager SaveIndexerManager;
// LibHac additions
@@ -316,7 +316,7 @@ namespace LibHac.FsSrv
var sb = new U8StringBuilder(saveDataPathBuffer);
sb.Append((byte)'/').AppendFormat(saveDataId, 'x', 16);
- if (_config.ShouldCreateDirectorySaveData())
+ if (_config.IsPseudoSaveData())
{
return Utility.EnsureDirectory(fileSystem.Target, new U8Span(saveDataPathBuffer));
}
diff --git a/src/LibHac/FsSystem/Buffers/FileSystemBufferManager.cs b/src/LibHac/FsSystem/Buffers/FileSystemBufferManager.cs
index 049c7cf9..f069fe8c 100644
--- a/src/LibHac/FsSystem/Buffers/FileSystemBufferManager.cs
+++ b/src/LibHac/FsSystem/Buffers/FileSystemBufferManager.cs
@@ -54,6 +54,7 @@ namespace LibHac.FsSystem
public void DecrementCacheCount() => _cacheCount--;
public int GetCacheSize() => _cacheSize;
public void AddCacheSize(int diff) => _cacheSize += diff;
+
public void SubtractCacheSize(int diff)
{
Assert.SdkRequiresGreaterEqual(_cacheSize, diff);
@@ -350,6 +351,36 @@ namespace LibHac.FsSystem
base.Dispose(disposing);
}
+ public Result Initialize(int maxCacheCount, Memory heapBuffer, int blockSize)
+ {
+ Result rc = CacheTable.Initialize(maxCacheCount);
+ if (rc.IsFailure()) return rc;
+
+ rc = BuddyHeap.Initialize(heapBuffer, blockSize);
+ if (rc.IsFailure()) return rc;
+
+ TotalSize = (int)BuddyHeap.GetTotalFreeSize();
+ PeakFreeSize = TotalSize;
+ PeakTotalAllocatableSize = TotalSize;
+
+ return Result.Success;
+ }
+
+ public Result Initialize(int maxCacheCount, Memory heapBuffer, int blockSize, int maxOrder)
+ {
+ Result rc = CacheTable.Initialize(maxCacheCount);
+ if (rc.IsFailure()) return rc;
+
+ rc = BuddyHeap.Initialize(heapBuffer, blockSize, maxOrder);
+ if (rc.IsFailure()) return rc;
+
+ TotalSize = (int)BuddyHeap.GetTotalFreeSize();
+ PeakFreeSize = TotalSize;
+ PeakTotalAllocatableSize = TotalSize;
+
+ return Result.Success;
+ }
+
public Result Initialize(int maxCacheCount, Memory heapBuffer, int blockSize, Memory workBuffer)
{
// Note: We can't use an external buffer for the cache handle table since it contains managed pointers,
@@ -368,6 +399,25 @@ namespace LibHac.FsSystem
return Result.Success;
}
+ public Result Initialize(int maxCacheCount, Memory heapBuffer, int blockSize, int maxOrder,
+ Memory workBuffer)
+ {
+ // Note: We can't use an external buffer for the cache handle table since it contains managed pointers,
+ // so pass the work buffer directly to the buddy heap.
+
+ Result rc = CacheTable.Initialize(maxCacheCount);
+ if (rc.IsFailure()) return rc;
+
+ rc = BuddyHeap.Initialize(heapBuffer, blockSize, maxOrder, workBuffer);
+ if (rc.IsFailure()) return rc;
+
+ TotalSize = (int)BuddyHeap.GetTotalFreeSize();
+ PeakFreeSize = TotalSize;
+ PeakTotalAllocatableSize = TotalSize;
+
+ return Result.Success;
+ }
+
protected override Buffer DoAllocateBuffer(int size, BufferAttribute attribute)
{
lock (Locker)
@@ -393,6 +443,7 @@ namespace LibHac.FsSystem
// No cached buffers left to deallocate.
return Buffer.Empty;
}
+
DeallocateBufferImpl(deallocateBuffer);
}
@@ -565,4 +616,4 @@ namespace LibHac.FsSystem
RetriedCount = 0;
}
}
-}
+}
\ No newline at end of file