Fill out SaveDataFileSystemServiceImpl.Configuration

This commit is contained in:
Alex Barney 2021-04-28 00:23:02 -07:00
parent 433e7bb98e
commit 3bf8826a5b
8 changed files with 86 additions and 14 deletions

View file

@ -315,7 +315,7 @@ namespace LibHac.Boot
int start = IsModern ? 6 : 0; int start = IsModern ? 6 : 0;
int end = IsModern ? 0x20 : 6; 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++) for (int i = start; i < end; i++)
{ {

View file

@ -5,6 +5,7 @@ using LibHac.FsSrv.FsCreator;
using LibHac.FsSrv.Impl; using LibHac.FsSrv.Impl;
using LibHac.FsSrv.Sf; using LibHac.FsSrv.Sf;
using LibHac.FsSrv.Storage; using LibHac.FsSrv.Storage;
using LibHac.FsSystem;
using LibHac.Sm; using LibHac.Sm;
namespace LibHac.FsSrv namespace LibHac.FsSrv
@ -14,6 +15,10 @@ namespace LibHac.FsSrv
private const ulong SpeedEmulationProgramIdMinimum = 0x100000000000000; private const ulong SpeedEmulationProgramIdMinimum = 0x100000000000000;
private const ulong SpeedEmulationProgramIdMaximum = 0x100000000001FFF; private const ulong SpeedEmulationProgramIdMaximum = 0x100000000001FFF;
private const int BufferManagerHeapSize = 1024 * 1024 * 14;
private const int BufferManagerCacheSize = 1024;
private const int BufferManagerBlockSize = 0x4000;
/// <summary> /// <summary>
/// Initializes a <see cref="FileSystemServer"/> with the provided <see cref="FileSystemServerConfig"/>. /// Initializes a <see cref="FileSystemServer"/> with the provided <see cref="FileSystemServerConfig"/>.
/// </summary> /// </summary>
@ -57,6 +62,17 @@ namespace LibHac.FsSrv
private static FileSystemProxyConfiguration InitializeFileSystemProxy(FileSystemServer server, private static FileSystemProxyConfiguration InitializeFileSystemProxy(FileSystemServer server,
FileSystemServerConfig config) FileSystemServerConfig config)
{ {
var random = new Random();
RandomDataGenerator randomGenerator = buffer =>
{
random.NextBytes(buffer);
return Result.Success;
};
var bufferManager = new FileSystemBufferManager();
Memory<byte> heapBuffer = GC.AllocateArray<byte>(BufferManagerHeapSize, true);
bufferManager.Initialize(BufferManagerCacheSize, heapBuffer, BufferManagerBlockSize);
var saveDataIndexerManager = new SaveDataIndexerManager(server.Hos.Fs, Fs.SaveData.SaveIndexerId, var saveDataIndexerManager = new SaveDataIndexerManager(server.Hos.Fs, Fs.SaveData.SaveIndexerId,
new ArrayPoolMemoryResource(), new SdHandleManager(), false); new ArrayPoolMemoryResource(), new SdHandleManager(), false);
@ -93,7 +109,7 @@ namespace LibHac.FsSrv
var ncaFsServiceConfig = new NcaFileSystemServiceImpl.Configuration(); var ncaFsServiceConfig = new NcaFileSystemServiceImpl.Configuration();
ncaFsServiceConfig.BaseFsService = baseFsService; ncaFsServiceConfig.BaseFsService = baseFsService;
ncaFsServiceConfig.HostFsCreator = config.FsCreators.HostFileSystemCreator; ncaFsServiceConfig.LocalFsCreator = config.FsCreators.LocalFileSystemCreator;
ncaFsServiceConfig.TargetManagerFsCreator = config.FsCreators.TargetManagerFileSystemCreator; ncaFsServiceConfig.TargetManagerFsCreator = config.FsCreators.TargetManagerFileSystemCreator;
ncaFsServiceConfig.PartitionFsCreator = config.FsCreators.PartitionFileSystemCreator; ncaFsServiceConfig.PartitionFsCreator = config.FsCreators.PartitionFileSystemCreator;
ncaFsServiceConfig.RomFsCreator = config.FsCreators.RomFileSystemCreator; ncaFsServiceConfig.RomFsCreator = config.FsCreators.RomFileSystemCreator;
@ -109,12 +125,16 @@ namespace LibHac.FsSrv
var saveFsServiceConfig = new SaveDataFileSystemServiceImpl.Configuration(); var saveFsServiceConfig = new SaveDataFileSystemServiceImpl.Configuration();
saveFsServiceConfig.BaseFsService = baseFsService; saveFsServiceConfig.BaseFsService = baseFsService;
saveFsServiceConfig.HostFsCreator = config.FsCreators.HostFileSystemCreator; saveFsServiceConfig.TimeService = timeService;
saveFsServiceConfig.LocalFsCreator = config.FsCreators.LocalFileSystemCreator;
saveFsServiceConfig.TargetManagerFsCreator = config.FsCreators.TargetManagerFileSystemCreator; saveFsServiceConfig.TargetManagerFsCreator = config.FsCreators.TargetManagerFileSystemCreator;
saveFsServiceConfig.SaveFsCreator = config.FsCreators.SaveDataFileSystemCreator; saveFsServiceConfig.SaveFsCreator = config.FsCreators.SaveDataFileSystemCreator;
saveFsServiceConfig.EncryptedFsCreator = config.FsCreators.EncryptedFileSystemCreator; saveFsServiceConfig.EncryptedFsCreator = config.FsCreators.EncryptedFileSystemCreator;
saveFsServiceConfig.ProgramRegistryService = programRegistryService; saveFsServiceConfig.ProgramRegistryService = programRegistryService;
saveFsServiceConfig.ShouldCreateDirectorySaveData = () => true; saveFsServiceConfig.BufferManager = bufferManager;
saveFsServiceConfig.GenerateRandomData = randomGenerator;
saveFsServiceConfig.IsPseudoSaveData = () => true;
saveFsServiceConfig.MaxSaveFsCacheCount = 1;
saveFsServiceConfig.SaveIndexerManager = saveDataIndexerManager; saveFsServiceConfig.SaveIndexerManager = saveDataIndexerManager;
saveFsServiceConfig.FsServer = server; saveFsServiceConfig.FsServer = server;

View file

@ -6,7 +6,7 @@
public IPartitionFileSystemCreator PartitionFileSystemCreator { get; set; } public IPartitionFileSystemCreator PartitionFileSystemCreator { get; set; }
public IStorageOnNcaCreator StorageOnNcaCreator { get; set; } public IStorageOnNcaCreator StorageOnNcaCreator { get; set; }
public IFatFileSystemCreator FatFileSystemCreator { get; set; } public IFatFileSystemCreator FatFileSystemCreator { get; set; }
public IHostFileSystemCreator HostFileSystemCreator { get; set; } public ILocalFileSystemCreator LocalFileSystemCreator { get; set; }
public ITargetManagerFileSystemCreator TargetManagerFileSystemCreator { get; set; } public ITargetManagerFileSystemCreator TargetManagerFileSystemCreator { get; set; }
public ISubDirectoryFileSystemCreator SubDirectoryFileSystemCreator { get; set; } public ISubDirectoryFileSystemCreator SubDirectoryFileSystemCreator { get; set; }
public IBuiltInStorageCreator BuiltInStorageCreator { get; set; } public IBuiltInStorageCreator BuiltInStorageCreator { get; set; }

View file

@ -2,7 +2,7 @@
namespace LibHac.FsSrv.FsCreator namespace LibHac.FsSrv.FsCreator
{ {
public interface IHostFileSystemCreator public interface ILocalFileSystemCreator
{ {
Result Create(out IFileSystem fileSystem, bool someBool); Result Create(out IFileSystem fileSystem, bool someBool);
Result Create(out IFileSystem fileSystem, string path, bool openCaseSensitive); Result Create(out IFileSystem fileSystem, string path, bool openCaseSensitive);

View file

@ -42,7 +42,7 @@ namespace LibHac.FsSrv
public struct Configuration public struct Configuration
{ {
public BaseFileSystemServiceImpl BaseFsService; public BaseFileSystemServiceImpl BaseFsService;
public IHostFileSystemCreator HostFsCreator; public ILocalFileSystemCreator LocalFsCreator;
public ITargetManagerFileSystemCreator TargetManagerFsCreator; public ITargetManagerFileSystemCreator TargetManagerFsCreator;
public IPartitionFileSystemCreator PartitionFsCreator; public IPartitionFileSystemCreator PartitionFsCreator;
public IRomFileSystemCreator RomFsCreator; public IRomFileSystemCreator RomFsCreator;

View file

@ -336,6 +336,7 @@ namespace LibHac.FsSrv
return rc; return rc;
} }
// Allow access when opening a directory save FS on a dev console
if (extraData.OwnerId == 0 && extraData.DataSize == 0 && extraData.JournalSize == 0 && if (extraData.OwnerId == 0 && extraData.DataSize == 0 && extraData.JournalSize == 0 &&
programInfo.AccessControl.CanCall(OperationType.DebugSaveData)) programInfo.AccessControl.CanCall(OperationType.DebugSaveData))
{ {

View file

@ -34,17 +34,17 @@ namespace LibHac.FsSrv
public struct Configuration public struct Configuration
{ {
public BaseFileSystemServiceImpl BaseFsService; public BaseFileSystemServiceImpl BaseFsService;
// Time service public TimeServiceImpl TimeService;
public IHostFileSystemCreator HostFsCreator; public ILocalFileSystemCreator LocalFsCreator;
public ITargetManagerFileSystemCreator TargetManagerFsCreator; public ITargetManagerFileSystemCreator TargetManagerFsCreator;
public ISaveDataFileSystemCreator SaveFsCreator; public ISaveDataFileSystemCreator SaveFsCreator;
public IEncryptedFileSystemCreator EncryptedFsCreator; public IEncryptedFileSystemCreator EncryptedFsCreator;
public ProgramRegistryServiceImpl ProgramRegistryService; public ProgramRegistryServiceImpl ProgramRegistryService;
// Buffer manager public IBufferManager BufferManager;
public RandomDataGenerator GenerateRandomData; public RandomDataGenerator GenerateRandomData;
public SaveDataTransferCryptoConfiguration SaveTransferCryptoConfig; public SaveDataTransferCryptoConfiguration SaveTransferCryptoConfig;
// Max save FS cache size public int MaxSaveFsCacheCount;
public Func<bool> ShouldCreateDirectorySaveData; public Func<bool> IsPseudoSaveData;
public ISaveDataIndexerManager SaveIndexerManager; public ISaveDataIndexerManager SaveIndexerManager;
// LibHac additions // LibHac additions
@ -316,7 +316,7 @@ namespace LibHac.FsSrv
var sb = new U8StringBuilder(saveDataPathBuffer); var sb = new U8StringBuilder(saveDataPathBuffer);
sb.Append((byte)'/').AppendFormat(saveDataId, 'x', 16); sb.Append((byte)'/').AppendFormat(saveDataId, 'x', 16);
if (_config.ShouldCreateDirectorySaveData()) if (_config.IsPseudoSaveData())
{ {
return Utility.EnsureDirectory(fileSystem.Target, new U8Span(saveDataPathBuffer)); return Utility.EnsureDirectory(fileSystem.Target, new U8Span(saveDataPathBuffer));
} }

View file

@ -54,6 +54,7 @@ namespace LibHac.FsSystem
public void DecrementCacheCount() => _cacheCount--; public void DecrementCacheCount() => _cacheCount--;
public int GetCacheSize() => _cacheSize; public int GetCacheSize() => _cacheSize;
public void AddCacheSize(int diff) => _cacheSize += diff; public void AddCacheSize(int diff) => _cacheSize += diff;
public void SubtractCacheSize(int diff) public void SubtractCacheSize(int diff)
{ {
Assert.SdkRequiresGreaterEqual(_cacheSize, diff); Assert.SdkRequiresGreaterEqual(_cacheSize, diff);
@ -350,6 +351,36 @@ namespace LibHac.FsSystem
base.Dispose(disposing); base.Dispose(disposing);
} }
public Result Initialize(int maxCacheCount, Memory<byte> 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<byte> 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<byte> heapBuffer, int blockSize, Memory<byte> workBuffer) public Result Initialize(int maxCacheCount, Memory<byte> heapBuffer, int blockSize, Memory<byte> workBuffer)
{ {
// Note: We can't use an external buffer for the cache handle table since it contains managed pointers, // 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; return Result.Success;
} }
public Result Initialize(int maxCacheCount, Memory<byte> heapBuffer, int blockSize, int maxOrder,
Memory<byte> 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) protected override Buffer DoAllocateBuffer(int size, BufferAttribute attribute)
{ {
lock (Locker) lock (Locker)
@ -393,6 +443,7 @@ namespace LibHac.FsSystem
// No cached buffers left to deallocate. // No cached buffers left to deallocate.
return Buffer.Empty; return Buffer.Empty;
} }
DeallocateBufferImpl(deallocateBuffer); DeallocateBufferImpl(deallocateBuffer);
} }