From c48f8327c609d26833998c3b455cef8e2d130b1a Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Wed, 13 Sep 2023 22:49:25 +0300 Subject: [PATCH] Start implementing SystemSaveData --- CMakeLists.txt | 3 +- include/fs/archive_system_save_data.hpp | 38 ++++++++++++++++++++++++ include/services/fs.hpp | 5 +++- src/core/fs/archive_system_save_data.cpp | 12 ++++++++ src/core/kernel/kernel.cpp | 7 +++++ src/core/services/fs.cpp | 1 + 6 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 include/fs/archive_system_save_data.hpp create mode 100644 src/core/fs/archive_system_save_data.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 55b8760b..f3459d1a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -148,7 +148,7 @@ set(PICA_SOURCE_FILES src/core/PICA/gpu.cpp src/core/PICA/regs.cpp src/core/PICA set(LOADER_SOURCE_FILES src/core/loader/elf.cpp src/core/loader/ncsd.cpp src/core/loader/ncch.cpp src/core/loader/3dsx.cpp src/core/loader/lz77.cpp) set(FS_SOURCE_FILES src/core/fs/archive_self_ncch.cpp src/core/fs/archive_save_data.cpp src/core/fs/archive_sdmc.cpp src/core/fs/archive_ext_save_data.cpp src/core/fs/archive_ncch.cpp src/core/fs/romfs.cpp - src/core/fs/ivfc.cpp src/core/fs/archive_user_save_data.cpp + src/core/fs/ivfc.cpp src/core/fs/archive_user_save_data.cpp src/core/fs/archive_system_save_data.cpp ) set(APPLET_SOURCE_FILES src/core/applets/applet.cpp src/core/applets/mii_selector.cpp src/core/applets/software_keyboard.cpp src/core/applets/applet_manager.cpp) @@ -183,6 +183,7 @@ set(HEADER_FILES include/emulator.hpp include/helpers.hpp include/termcolor.hpp include/applets/applet.hpp include/applets/mii_selector.hpp include/math_util.hpp include/services/soc.hpp include/services/news_u.hpp include/applets/software_keyboard.hpp include/applets/applet_manager.hpp include/fs/archive_user_save_data.hpp include/services/amiibo_device.hpp include/services/nfc_types.hpp include/swap.hpp include/services/csnd.hpp include/services/nwm_uds.hpp + include/fs/archive_system_save_data.hpp ) cmrc_add_resource_library( diff --git a/include/fs/archive_system_save_data.hpp b/include/fs/archive_system_save_data.hpp new file mode 100644 index 00000000..2c39401e --- /dev/null +++ b/include/fs/archive_system_save_data.hpp @@ -0,0 +1,38 @@ +#pragma once +#include "archive_base.hpp" + +class SystemSaveDataArchive : public ArchiveBase { + public: + SystemSaveDataArchive(Memory& mem) : ArchiveBase(mem) {} + + u64 getFreeBytes() override { + Helpers::panic("Unimplemented GetFreeBytes for SystemSaveData archive"); + return 32_MB; + } + + std::string name() override { return "SystemSaveData"; } + + //HorizonResult createDirectory(const FSPath& path) override; + HorizonResult createFile(const FSPath& path, u64 size) override { + Helpers::panic("Unimplemented CreateFile for SystemSaveData archive"); + return Result::Success; + }; + + HorizonResult deleteFile(const FSPath& path) override { + Helpers::panic("Unimplemented DeleteFile for SystemSaveData archive"); + return Result::Success; + }; + + Rust::Result openArchive(const FSPath& path) override; + //Rust::Result openDirectory(const FSPath& path) override; + + FileDescriptor openFile(const FSPath& path, const FilePerms& perms) override { + Helpers::panic("Unimplemented OpenFile for SystemSaveData archive"); + return {}; + } + + std::optional readFile(FileSession* file, u64 offset, u32 size, u32 dataPointer) override { + Helpers::panic("Unimplemented ReadFile for SystemSaveData archive"); + return {}; + }; +}; \ No newline at end of file diff --git a/include/services/fs.hpp b/include/services/fs.hpp index 2dff3544..dbaf8a1b 100644 --- a/include/services/fs.hpp +++ b/include/services/fs.hpp @@ -5,6 +5,7 @@ #include "fs/archive_save_data.hpp" #include "fs/archive_sdmc.hpp" #include "fs/archive_self_ncch.hpp" +#include "fs/archive_system_save_data.hpp" #include "fs/archive_user_save_data.hpp" #include "helpers.hpp" #include "kernel_types.hpp" @@ -33,6 +34,7 @@ class FSService { ExtSaveDataArchive extSaveData_sdmc; ExtSaveDataArchive sharedExtSaveData_nand; + SystemSaveDataArchive systemSaveData; ArchiveBase* getArchiveFromID(u32 id, const FSPath& archivePath); Rust::Result openArchiveHandle(u32 archiveID, const FSPath& path); @@ -77,7 +79,8 @@ class FSService { public: FSService(Memory& mem, Kernel& kernel, const EmulatorConfig& config) : mem(mem), saveData(mem), sharedExtSaveData_nand(mem, "../SharedFiles/NAND", true), extSaveData_sdmc(mem, "SDMC"), sdmc(mem), selfNcch(mem), - ncch(mem), userSaveData1(mem, ArchiveID::UserSaveData1), userSaveData2(mem, ArchiveID::UserSaveData2), kernel(kernel), config(config) {} + ncch(mem), userSaveData1(mem, ArchiveID::UserSaveData1), userSaveData2(mem, ArchiveID::UserSaveData2), kernel(kernel), config(config), + systemSaveData(mem) {} void reset(); void handleSyncRequest(u32 messagePointer); diff --git a/src/core/fs/archive_system_save_data.cpp b/src/core/fs/archive_system_save_data.cpp new file mode 100644 index 00000000..ed931ec1 --- /dev/null +++ b/src/core/fs/archive_system_save_data.cpp @@ -0,0 +1,12 @@ +#include +#include "fs/archive_system_save_data.hpp" + +namespace fs = std::filesystem; + +Rust::Result SystemSaveDataArchive::openArchive(const FSPath& path) { + if (path.type != PathType::Empty) { + Helpers::panic("Unimplemented path type for SystemSaveData::OpenArchive"); + } + + return Ok((ArchiveBase*)this); +} \ No newline at end of file diff --git a/src/core/kernel/kernel.cpp b/src/core/kernel/kernel.cpp index dfebfb6d..b21c4c58 100644 --- a/src/core/kernel/kernel.cpp +++ b/src/core/kernel/kernel.cpp @@ -228,6 +228,13 @@ void Kernel::getProcessInfo() { } switch (type) { + // Returns the amount of + total supervisor-mode stack size + page-rounded size of the external handle table + case 1: + Helpers::warn("GetProcessInfo: Unimplemented type 1"); + regs[1] = 0; + regs[2] = 0; + break; + // According to 3DBrew: Amount of private (code, data, heap) memory used by the process + total supervisor-mode // stack size + page-rounded size of the external handle table case 2: diff --git a/src/core/services/fs.cpp b/src/core/services/fs.cpp index 29646a8e..964ab237 100644 --- a/src/core/services/fs.cpp +++ b/src/core/services/fs.cpp @@ -85,6 +85,7 @@ ArchiveBase* FSService::getArchiveFromID(u32 id, const FSPath& archivePath) { case ArchiveID::SharedExtSaveData: return &sharedExtSaveData_nand; + case ArchiveID::SystemSaveData: return &systemSaveData; case ArchiveID::SDMC: return &sdmc; case ArchiveID::SavedataAndNcch: return &ncch; // This can only access NCCH outside of FSPXI default: