Skip to content
Permalink
Browse files
Merge pull request #6421 from leoetlino/fs-interface
IOS: Refactor the filesystem code
  • Loading branch information
leoetlino committed Apr 6, 2018
2 parents c2fa6f5 + 4e54777 commit a957bd1
Show file tree
Hide file tree
Showing 26 changed files with 1,612 additions and 1,167 deletions.
@@ -138,6 +138,7 @@
<ClInclude Include="PcapFile.h" />
<ClInclude Include="Profiler.h" />
<ClInclude Include="QoSSession.h" />
<ClInclude Include="Result.h" />
<ClInclude Include="ScopeGuard.h" />
<ClInclude Include="SDCardUtil.h" />
<ClInclude Include="Semaphore.h" />
@@ -59,6 +59,7 @@
<ClInclude Include="PcapFile.h" />
<ClInclude Include="Profiler.h" />
<ClInclude Include="QoSSession.h" />
<ClInclude Include="Result.h" />
<ClInclude Include="ScopeGuard.h" />
<ClInclude Include="SDCardUtil.h" />
<ClInclude Include="SettingsHandler.h" />
@@ -31,7 +31,7 @@ enum LOG_TYPE
IOS,
IOS_DI,
IOS_ES,
IOS_FILEIO,
IOS_FS,
IOS_NET,
IOS_SD,
IOS_SSL,
@@ -99,7 +99,7 @@ LogManager::LogManager()
m_log[LogTypes::IOS] = {"IOS", "IOS"};
m_log[LogTypes::IOS_DI] = {"IOS_DI", "IOS - Drive Interface"};
m_log[LogTypes::IOS_ES] = {"IOS_ES", "IOS - ETicket Services"};
m_log[LogTypes::IOS_FILEIO] = {"IOS_FILEIO", "IOS - FileIO"};
m_log[LogTypes::IOS_FS] = {"IOS_FS", "IOS - Filesystem Services"};
m_log[LogTypes::IOS_SD] = {"IOS_SD", "IOS - SDIO"};
m_log[LogTypes::IOS_SSL] = {"IOS_SSL", "IOS - SSL"};
m_log[LogTypes::IOS_STM] = {"IOS_STM", "IOS - State Transition Manager"};
@@ -0,0 +1,30 @@
// Copyright 2018 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.

#pragma once

#include <variant>

namespace Common
{
template <typename ResultCode, typename T>
class Result final
{
public:
Result(ResultCode code) : m_variant{code} {}
Result(const T& t) : m_variant{t} {}
Result(T&& t) : m_variant{std::move(t)} {}
explicit operator bool() const { return Succeeded(); }
bool Succeeded() const { return std::holds_alternative<T>(m_variant); }
// Must only be called when Succeeded() returns false.
ResultCode Error() const { return std::get<ResultCode>(m_variant); }
// Must only be called when Succeeded() returns true.
const T& operator*() const { return std::get<T>(m_variant); }
const T* operator->() const { return &std::get<T>(m_variant); }
T& operator*() { return std::get<T>(m_variant); }
T* operator->() { return &std::get<T>(m_variant); }
private:
std::variant<ResultCode, T> m_variant;
};
} // namespace Common
@@ -166,4 +166,16 @@ inline T FromBigEndian(T data)
swap<sizeof(data)>(reinterpret_cast<u8*>(&data));
return data;
}

template <typename value_type>
struct BigEndianValue
{
static_assert(std::is_arithmetic<value_type>(), "value_type must be an arithmetic type");
BigEndianValue() = default;
explicit BigEndianValue(value_type val) { *this = val; }
operator value_type() const { return FromBigEndian(raw); }
void operator=(value_type v) { raw = FromBigEndian(v); }
private:
value_type raw;
};
} // Namespace Common
@@ -2,37 +2,67 @@
// Licensed under GPLv2+
// Refer to the license.txt file included.

#include <cstddef>
#include <algorithm>
#include <memory>
#include <string>

#include "Common/CommonPaths.h"
#include "Common/CommonTypes.h"
#include "Common/FileUtil.h"
#include "Common/MsgHandler.h"
#include "Common/NandPaths.h"

#include "Core/Boot/Boot.h"
#include "Core/CommonTitles.h"
#include "Core/IOS/ES/ES.h"
#include "Core/IOS/ES/Formats.h"
#include "Core/IOS/FS/FileIO.h"
#include "Core/IOS/FS/FileSystem.h"
#include "Core/IOS/IOS.h"
#include "Core/WiiUtils.h"

#include "DiscIO/WiiWad.h"

// cdb.vff is a virtual Fat filesystem created on first launch of sysmenu
// we create it here as it is faster ~3 minutes for me when sysmenu does it
// ~1 second created here
static void CreateVirtualFATFilesystem(std::shared_ptr<IOS::HLE::FS::FileSystem> fs)
{
constexpr u32 SYSMENU_UID = 0x1000;
constexpr u16 SYSMENU_GID = 0x1;

const std::string cdb_path = "/title/00000001/00000002/data/cdb.vff";
fs->CreateFile(SYSMENU_UID, SYSMENU_GID, cdb_path, 0, IOS::HLE::FS::Mode::ReadWrite,
IOS::HLE::FS::Mode::ReadWrite, IOS::HLE::FS::Mode::ReadWrite);

constexpr size_t CDB_SIZE = 0x01400000;
const auto metadata = fs->GetMetadata(SYSMENU_UID, SYSMENU_GID, cdb_path);
if (!metadata || metadata->size >= CDB_SIZE)
return;

const auto fd = fs->OpenFile(SYSMENU_UID, SYSMENU_GID, cdb_path, IOS::HLE::FS::Mode::Write);
if (!fd)
return;

constexpr u8 CDB_HEADER[0x20] = {'V', 'F', 'F', 0x20, 0xfe, 0xff, 1, 0, 1, 0x40, 0, 0, 0, 0x20};
constexpr u8 CDB_FAT[4] = {0xf0, 0xff, 0xff, 0xff};
std::vector<u8> data(CDB_SIZE);
std::copy_n(CDB_HEADER, sizeof(CDB_HEADER), data.begin());
std::copy_n(CDB_FAT, sizeof(CDB_FAT), data.begin() + sizeof(CDB_HEADER));
std::copy_n(CDB_FAT, sizeof(CDB_FAT), data.begin() + 0x14020);
// write the final 0 to 0 file from the second FAT to 20 MiB
data[CDB_SIZE - 1] = 0;
fs->WriteFile(*fd, data.data(), static_cast<u32>(data.size()));
}

bool CBoot::BootNANDTitle(const u64 title_id)
{
UpdateStateFlags([](StateFlags* state) {
state->type = 0x04; // TYPE_NANDBOOT
});

auto* ios = IOS::HLE::GetIOS();

if (title_id == Titles::SYSTEM_MENU)
IOS::HLE::CreateVirtualFATFilesystem();
CreateVirtualFATFilesystem(ios->GetFS());

SetupWiiMemory();
auto* ios = IOS::HLE::GetIOS();
return ios->GetES()->LaunchTitle(title_id);
}

@@ -165,8 +165,10 @@ add_library(core
IOS/ES/TitleInformation.cpp
IOS/ES/TitleManagement.cpp
IOS/ES/Views.cpp
IOS/FS/FileIO.cpp
IOS/FS/FS.cpp
IOS/FS/FileSystem.cpp
IOS/FS/FileSystemProxy.cpp
IOS/FS/HostBackend/File.cpp
IOS/FS/HostBackend/FS.cpp
IOS/Network/ICMPLin.cpp
IOS/Network/MACUtils.cpp
IOS/Network/Socket.cpp
@@ -195,8 +195,10 @@
<ClCompile Include="IOS\ES\TitleInformation.cpp" />
<ClCompile Include="IOS\ES\TitleManagement.cpp" />
<ClCompile Include="IOS\ES\Views.cpp" />
<ClCompile Include="IOS\FS\FileIO.cpp" />
<ClCompile Include="IOS\FS\FS.cpp" />
<ClCompile Include="IOS\FS\FileSystem.cpp" />
<ClCompile Include="IOS\FS\FileSystemProxy.cpp" />
<ClCompile Include="IOS\FS\HostBackend\FS.cpp" />
<ClCompile Include="IOS\FS\HostBackend\File.cpp" />
<ClCompile Include="IOS\Network\ICMPLin.cpp" />
<ClCompile Include="IOS\Network\MACUtils.cpp" />
<ClCompile Include="IOS\Network\Socket.cpp" />
@@ -445,8 +447,10 @@
<ClInclude Include="IOS\DI\DI.h" />
<ClInclude Include="IOS\ES\ES.h" />
<ClInclude Include="IOS\ES\Formats.h" />
<ClInclude Include="IOS\FS\FileIO.h" />
<ClInclude Include="IOS\FS\FS.h" />
<ClInclude Include="IOS\FS\FileSystem.h" />
<ClInclude Include="IOS\FS\FileSystemProxy.h" />
<ClInclude Include="IOS\FS\HostBackend\File.h" />
<ClInclude Include="IOS\FS\HostBackend\FS.h" />
<ClInclude Include="IOS\Network\ICMPLin.h" />
<ClInclude Include="IOS\Network\ICMP.h" />
<ClInclude Include="IOS\Network\MACUtils.h" />
@@ -732,7 +732,16 @@
<ClCompile Include="IOS\DI\DI.cpp">
<Filter>IOS\DI</Filter>
</ClCompile>
<ClCompile Include="IOS\FS\FileIO.cpp">
<ClCompile Include="IOS\FS\FileSystem.cpp">
<Filter>IOS\FS</Filter>
</ClCompile>
<ClCompile Include="IOS\FS\FileSystemProxy.cpp">
<Filter>IOS\FS</Filter>
</ClCompile>
<ClCompile Include="IOS\FS\HostBackend\FS.cpp">
<Filter>IOS\FS</Filter>
</ClCompile>
<ClCompile Include="IOS\FS\HostBackend\File.cpp">
<Filter>IOS\FS</Filter>
</ClCompile>
<ClCompile Include="IOS\ES\ES.cpp">
@@ -759,9 +768,6 @@
<ClCompile Include="IOS\ES\Views.cpp">
<Filter>IOS\ES</Filter>
</ClCompile>
<ClCompile Include="IOS\FS\FS.cpp">
<Filter>IOS\FS</Filter>
</ClCompile>
<ClCompile Include="IOS\Network\ICMPLin.cpp">
<Filter>IOS\Network</Filter>
</ClCompile>
@@ -1401,15 +1407,21 @@
<ClInclude Include="IOS\ES\ES.h">
<Filter>IOS\ES</Filter>
</ClInclude>
<ClInclude Include="IOS\FS\FileIO.h">
<ClInclude Include="IOS\FS\FileSystem.h">
<Filter>IOS\FS</Filter>
</ClInclude>
<ClInclude Include="IOS\ES\Formats.h">
<Filter>IOS\ES</Filter>
<ClInclude Include="IOS\FS\FileSystemProxy.h">
<Filter>IOS\FS</Filter>
</ClInclude>
<ClInclude Include="IOS\FS\HostBackend\File.h">
<Filter>IOS\FS</Filter>
</ClInclude>
<ClInclude Include="IOS\FS\FS.h">
<ClInclude Include="IOS\FS\HostBackend\FS.h">
<Filter>IOS\FS</Filter>
</ClInclude>
<ClInclude Include="IOS\ES\Formats.h">
<Filter>IOS\ES</Filter>
</ClInclude>
<ClInclude Include="IOS\USB\Bluetooth\hci.h">
<Filter>IOS\USB\Bluetooth</Filter>
</ClInclude>
@@ -173,7 +173,6 @@ class Device
enum class DeviceType : u32
{
Static, // Devices which appear in s_device_map.
FileIO, // FileIO devices which are created dynamically.
OH0, // OH0 child devices which are created dynamically.
};

0 comments on commit a957bd1

Please sign in to comment.