diff --git a/libraries/libvapours/include/vapours/prfile2/prfile2_cache.hpp b/libraries/libvapours/include/vapours/prfile2/prfile2_cache.hpp index 41a975853..2a50ac3ae 100644 --- a/libraries/libvapours/include/vapours/prfile2/prfile2_cache.hpp +++ b/libraries/libvapours/include/vapours/prfile2/prfile2_cache.hpp @@ -30,6 +30,7 @@ namespace ams::prfile2 { u32 mode; u16 num_fat_pages; u16 num_data_pages; + pf::CachePage *pages; pf::CachePage *current_fat; pf::CachePage *current_data; pf::SectorBuffer *buffers; @@ -38,10 +39,14 @@ namespace ams::prfile2 { void *signature; }; + struct Volume; + } namespace ams::prfile2::cache { - /* ... */ + void SetCache(Volume *vol, pf::CachePage *cache_page, pf::SectorBuffer *cache_buf, u16 num_fat_pages, u16 num_data_pages); + void SetFatBufferSize(Volume *vol, u32 size); + void SetDataBufferSize(Volume *vol, u32 size); } diff --git a/libraries/libvapours/source/prfile2/prfile2_cache.cpp b/libraries/libvapours/source/prfile2/prfile2_cache.cpp new file mode 100644 index 000000000..655820032 --- /dev/null +++ b/libraries/libvapours/source/prfile2/prfile2_cache.cpp @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2020 Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#if defined(ATMOSPHERE_IS_STRATOSPHERE) +#include +#elif defined(ATMOSPHERE_IS_MESOSPHERE) +#include +#elif defined(ATMOSPHERE_IS_EXOSPHERE) +#include +#else +#include +#endif + +namespace ams::prfile2::cache { + + void SetCache(Volume *vol, pf::CachePage *cache_page, pf::SectorBuffer *cache_buf, u16 num_fat_pages, u16 num_data_pages) { + /* Set the cache fields. */ + vol->cache.pages = cache_page; + vol->cache.buffers = cache_buf; + vol->cache.num_fat_pages = num_fat_pages; + vol->cache.num_data_pages = num_data_pages; + std::memset(vol->cache.pages, 0, sizeof(*vol->cache.pages) * (num_fat_pages + num_data_pages)); + } + + void SetFatBufferSize(Volume *vol, u32 size) { + if (size > 0) { + vol->cache.fat_buf_size = size; + } + } + + void SetDataBufferSize(Volume *vol, u32 size) { + if (size > 0) { + vol->cache.data_buf_size = size; + } + } + +} diff --git a/libraries/libvapours/source/prfile2/prfile2_volume.cpp b/libraries/libvapours/source/prfile2/prfile2_volume.cpp index 5034bab20..7ff09c2a5 100644 --- a/libraries/libvapours/source/prfile2/prfile2_volume.cpp +++ b/libraries/libvapours/source/prfile2/prfile2_volume.cpp @@ -278,9 +278,9 @@ namespace ams::prfile2::vol { } /* Setup the cache. */ - /* TODO: cache::SetCache(vol, drive_table->cache->pages, drive_table->cache->buffers, drive_table->cache->num_fat_pages, drive_table->cache->num_data_pages); */ - /* TODO: cache::SetFatBufferSize(vol, drive_table->cache->fat_buf_size); */ - /* TODO: cache::SetDataBufferSize(vol, drive_table->cache->data_buf_size); */ + cache::SetCache(vol, drive_table->cache->pages, drive_table->cache->buffers, drive_table->cache->num_fat_pages, drive_table->cache->num_data_pages); + cache::SetFatBufferSize(vol, drive_table->cache->fat_buf_size); + cache::SetDataBufferSize(vol, drive_table->cache->data_buf_size); /* Set flags. */ vol->SetAttached(true);