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);