From 77a01f0a9be1c19d443a019c3e292f6631ca593e Mon Sep 17 00:00:00 2001 From: Christoph Baumann Date: Tue, 20 May 2025 23:52:02 +0200 Subject: [PATCH] allow emmc writes (to write warmboot to emusd), allow unaligned emmc writes --- fusee/program/source/fatfs/fusee_diskio.cpp | 3 +-- fusee/program/source/fs/fusee_fs_storage.hpp | 2 +- fusee/program/source/fs/fusee_multi_file_storage.cpp | 4 ++-- fusee/program/source/fusee_emummc.cpp | 2 +- fusee/program/source/fusee_emusd.cpp | 2 +- fusee/program/source/fusee_setup_horizon.cpp | 2 +- .../source/sdmmc/impl/sdmmc_mmc_device_accessor.cpp | 11 +++++------ 7 files changed, 12 insertions(+), 14 deletions(-) diff --git a/fusee/program/source/fatfs/fusee_diskio.cpp b/fusee/program/source/fatfs/fusee_diskio.cpp index fa7643338..8e55b710d 100644 --- a/fusee/program/source/fatfs/fusee_diskio.cpp +++ b/fusee/program/source/fatfs/fusee_diskio.cpp @@ -32,8 +32,7 @@ bool diskio_read_system(void *dst, size_t size, size_t sector_index, size_t sect } bool diskio_write_system(size_t sector_index, size_t sector_count, const void *src, size_t size) { - /* Don't allow writes to eMMC GPP partition */ - return false; + return R_SUCCEEDED(::ams::nxboot::WriteMmc(::ams::sdmmc::MmcPartition::MmcPartition_UserData, sector_index, sector_count, src, size)); } bool diskio_read_boot1(void *dst, size_t size, size_t sector_index, size_t sector_count) { diff --git a/fusee/program/source/fs/fusee_fs_storage.hpp b/fusee/program/source/fs/fusee_fs_storage.hpp index 89e9077ca..336b6551e 100644 --- a/fusee/program/source/fs/fusee_fs_storage.hpp +++ b/fusee/program/source/fs/fusee_fs_storage.hpp @@ -241,7 +241,7 @@ namespace ams::fs { private: void EnsureFile(int id); public: - MultiFileStorage(const char *base_path); + MultiFileStorage(const char *base_path, OpenMode mode); virtual Result Read(s64 offset, void *buffer, size_t size) override; virtual Result Flush() override; virtual Result GetSize(s64 *out) override; diff --git a/fusee/program/source/fs/fusee_multi_file_storage.cpp b/fusee/program/source/fs/fusee_multi_file_storage.cpp index 9213c8167..df4b0c5b1 100644 --- a/fusee/program/source/fs/fusee_multi_file_storage.cpp +++ b/fusee/program/source/fs/fusee_multi_file_storage.cpp @@ -34,7 +34,7 @@ namespace ams::fs { } } - MultiFileStorage::MultiFileStorage(const char *base_path) { + MultiFileStorage::MultiFileStorage(const char *base_path, fs::OpenMode mode) { util::Strlcpy(m_base_path, base_path, sizeof(m_base_path) - 2); m_file_path_ofs = strlen(m_base_path); @@ -44,7 +44,7 @@ namespace ams::fs { std::memcpy(m_base_path + m_file_path_ofs, "00", 3); Result r; - if (R_FAILED(r = fs::OpenFile(std::addressof(m_handles[0]), m_base_path, fs::OpenMode_Read))) { + if (R_FAILED(r = fs::OpenFile(std::addressof(m_handles[0]), m_base_path, mode))) { nxboot::ShowFatalError("Failed to open part %02d (%s): 0x%08" PRIx32 "!\n", 0, m_base_path, r.GetValue()); } diff --git a/fusee/program/source/fusee_emummc.cpp b/fusee/program/source/fusee_emummc.cpp index 9b71a787c..3da268a8d 100644 --- a/fusee/program/source/fusee_emummc.cpp +++ b/fusee/program/source/fusee_emummc.cpp @@ -191,7 +191,7 @@ namespace ams::nxboot { /* Create partition */ /* TODO: construct boot0 storage from path instead */ g_boot0_storage = AllocateObject(boot0_file); - g_user_storage = AllocateObject(path); + g_user_storage = AllocateObject(path, fs::OpenMode_Read); } else { ShowFatalError("Unknown emummc type %d\n", static_cast(emummc_cfg.base_cfg.type)); } diff --git a/fusee/program/source/fusee_emusd.cpp b/fusee/program/source/fusee_emusd.cpp index 87ac396ea..2042c93d3 100644 --- a/fusee/program/source/fusee_emusd.cpp +++ b/fusee/program/source/fusee_emusd.cpp @@ -117,7 +117,7 @@ namespace ams::nxboot { memcpy(path + strlen(path), "/SD/", 5); path[sizeof(path) - 1] = '\x00'; - g_emusd_storage = AllocateObject(path); + g_emusd_storage = AllocateObject(path, fs::OpenMode_ReadWrite); } else { ShowFatalError("Invalid emuSD config!\n"); } diff --git a/fusee/program/source/fusee_setup_horizon.cpp b/fusee/program/source/fusee_setup_horizon.cpp index ed330f462..cfe87dd74 100644 --- a/fusee/program/source/fusee_setup_horizon.cpp +++ b/fusee/program/source/fusee_setup_horizon.cpp @@ -622,7 +622,7 @@ namespace ams::nxboot { /* Determine whether we're using emummc. */ const bool emummc_driver_enabled = ConfigureEmummc(); - const bool emummc_enabled = GetEmummcConfig().emmc_cfg.IsActive(); + const bool emummc_enabled = GetEmummcConfig().emmc_cfg.IsActive(); /* Initialize emummc. */ /* NOTE: SYSTEM:/ accessible past this point. */ diff --git a/libraries/libvapours/source/sdmmc/impl/sdmmc_mmc_device_accessor.cpp b/libraries/libvapours/source/sdmmc/impl/sdmmc_mmc_device_accessor.cpp index 506c5432d..3f918f05b 100644 --- a/libraries/libvapours/source/sdmmc/impl/sdmmc_mmc_device_accessor.cpp +++ b/libraries/libvapours/source/sdmmc/impl/sdmmc_mmc_device_accessor.cpp @@ -498,17 +498,16 @@ namespace ams::sdmmc::impl { Result MmcDeviceAccessor::OnReadWrite(u32 sector_index, u32 num_sectors, void *buf, size_t buf_size, bool is_read) { /* Get the sector index alignment. */ u32 sector_index_alignment = 0; + + /* Allow unaligned writes for exosphere/fusee */ + /* TODO: bad */ + #ifndef ATMOSPHERE_IS_EXOSPHERE if (!is_read) { - #ifdef ATMOSPHERE_IS_EXOSPHERE - /* Allow unaligned writes */ - /* TODO: bad */ - constexpr u32 MmcWriteSectorAlignment = 0; - #else constexpr u32 MmcWriteSectorAlignment = 16_KB / SectorSize; - #endif sector_index_alignment = MmcWriteSectorAlignment; AMS_ABORT_UNLESS(util::IsAligned(sector_index, MmcWriteSectorAlignment)); } + #endif /* Do the read/write. */ R_RETURN(BaseDeviceAccessor::ReadWriteMultiple(sector_index, num_sectors, sector_index_alignment, buf, buf_size, is_read));