Merge pull request #931 from DarkLordZach/nca-as-drd

loader: Make AppLoader_NCA rely on directory loading code
This commit is contained in:
bunnei 2018-08-06 22:02:41 -04:00 committed by GitHub
commit 826b1394e8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 24 additions and 37 deletions

View file

@ -20,6 +20,10 @@ namespace Loader {
AppLoader_DeconstructedRomDirectory::AppLoader_DeconstructedRomDirectory(FileSys::VirtualFile file) AppLoader_DeconstructedRomDirectory::AppLoader_DeconstructedRomDirectory(FileSys::VirtualFile file)
: AppLoader(std::move(file)) {} : AppLoader(std::move(file)) {}
AppLoader_DeconstructedRomDirectory::AppLoader_DeconstructedRomDirectory(
FileSys::VirtualDir directory)
: AppLoader(directory->GetFile("main")), dir(std::move(directory)) {}
FileType AppLoader_DeconstructedRomDirectory::IdentifyType(const FileSys::VirtualFile& file) { FileType AppLoader_DeconstructedRomDirectory::IdentifyType(const FileSys::VirtualFile& file) {
if (FileSys::IsDirectoryExeFS(file->GetContainingDirectory())) { if (FileSys::IsDirectoryExeFS(file->GetContainingDirectory())) {
return FileType::DeconstructedRomDirectory; return FileType::DeconstructedRomDirectory;
@ -34,7 +38,12 @@ ResultStatus AppLoader_DeconstructedRomDirectory::Load(
return ResultStatus::ErrorAlreadyLoaded; return ResultStatus::ErrorAlreadyLoaded;
} }
if (dir == nullptr) {
if (file == nullptr)
return ResultStatus::ErrorInvalidFormat;
const FileSys::VirtualDir dir = file->GetContainingDirectory(); const FileSys::VirtualDir dir = file->GetContainingDirectory();
}
const FileSys::VirtualFile npdm = dir->GetFile("main.npdm"); const FileSys::VirtualFile npdm = dir->GetFile("main.npdm");
if (npdm == nullptr) if (npdm == nullptr)
return ResultStatus::ErrorInvalidFormat; return ResultStatus::ErrorInvalidFormat;

View file

@ -22,6 +22,9 @@ class AppLoader_DeconstructedRomDirectory final : public AppLoader {
public: public:
explicit AppLoader_DeconstructedRomDirectory(FileSys::VirtualFile main_file); explicit AppLoader_DeconstructedRomDirectory(FileSys::VirtualFile main_file);
// Overload to accept exefs directory. Must contain 'main' and 'main.npdm'
explicit AppLoader_DeconstructedRomDirectory(FileSys::VirtualDir directory);
/** /**
* Returns the type of the file * Returns the type of the file
* @param file std::shared_ptr<VfsFile> open file * @param file std::shared_ptr<VfsFile> open file
@ -40,6 +43,7 @@ public:
private: private:
FileSys::ProgramMetadata metadata; FileSys::ProgramMetadata metadata;
FileSys::VirtualFile romfs; FileSys::VirtualFile romfs;
FileSys::VirtualDir dir;
}; };
} // namespace Loader } // namespace Loader

View file

@ -22,7 +22,8 @@
namespace Loader { namespace Loader {
AppLoader_NCA::AppLoader_NCA(FileSys::VirtualFile file) : AppLoader(std::move(file)) {} AppLoader_NCA::AppLoader_NCA(FileSys::VirtualFile file_)
: AppLoader(std::move(file_)), nca(std::make_unique<FileSys::NCA>(file)) {}
FileType AppLoader_NCA::IdentifyType(const FileSys::VirtualFile& file) { FileType AppLoader_NCA::IdentifyType(const FileSys::VirtualFile& file) {
FileSys::NCA nca(file); FileSys::NCA nca(file);
@ -39,8 +40,7 @@ ResultStatus AppLoader_NCA::Load(Kernel::SharedPtr<Kernel::Process>& process) {
return ResultStatus::ErrorAlreadyLoaded; return ResultStatus::ErrorAlreadyLoaded;
} }
nca = std::make_unique<FileSys::NCA>(file); const auto result = nca->GetStatus();
ResultStatus result = nca->GetStatus();
if (result != ResultStatus::Success) { if (result != ResultStatus::Success) {
return result; return result;
} }
@ -48,44 +48,16 @@ ResultStatus AppLoader_NCA::Load(Kernel::SharedPtr<Kernel::Process>& process) {
if (nca->GetType() != FileSys::NCAContentType::Program) if (nca->GetType() != FileSys::NCAContentType::Program)
return ResultStatus::ErrorInvalidFormat; return ResultStatus::ErrorInvalidFormat;
auto exefs = nca->GetExeFS(); const auto exefs = nca->GetExeFS();
if (exefs == nullptr) if (exefs == nullptr)
return ResultStatus::ErrorInvalidFormat; return ResultStatus::ErrorInvalidFormat;
result = metadata.Load(exefs->GetFile("main.npdm")); directory_loader = std::make_unique<AppLoader_DeconstructedRomDirectory>(exefs);
if (result != ResultStatus::Success) {
return result;
}
metadata.Print();
const FileSys::ProgramAddressSpaceType arch_bits{metadata.GetAddressSpaceType()}; const auto load_result = directory_loader->Load(process);
if (arch_bits == FileSys::ProgramAddressSpaceType::Is32Bit) { if (load_result != ResultStatus::Success)
return ResultStatus::ErrorUnsupportedArch; return load_result;
}
VAddr next_load_addr{Memory::PROCESS_IMAGE_VADDR};
for (const auto& module : {"rtld", "main", "subsdk0", "subsdk1", "subsdk2", "subsdk3",
"subsdk4", "subsdk5", "subsdk6", "subsdk7", "sdk"}) {
const VAddr load_addr = next_load_addr;
next_load_addr = AppLoader_NSO::LoadModule(exefs->GetFile(module), load_addr);
if (next_load_addr) {
LOG_DEBUG(Loader, "loaded module {} @ 0x{:X}", module, load_addr);
// Register module with GDBStub
GDBStub::RegisterModule(module, load_addr, next_load_addr - 1, false);
} else {
next_load_addr = load_addr;
}
}
process->program_id = metadata.GetTitleID();
process->svc_access_mask.set();
process->address_mappings = default_address_mappings;
process->resource_limit =
Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION);
process->Run(Memory::PROCESS_IMAGE_VADDR, metadata.GetMainThreadPriority(),
metadata.GetMainThreadStackSize());
if (nca->GetRomFS() != nullptr && nca->GetRomFS()->GetSize() > 0) if (nca->GetRomFS() != nullptr && nca->GetRomFS()->GetSize() > 0)
Service::FileSystem::RegisterRomFS(std::make_unique<FileSys::RomFSFactory>(*this)); Service::FileSystem::RegisterRomFS(std::make_unique<FileSys::RomFSFactory>(*this));

View file

@ -10,6 +10,7 @@
#include "core/file_sys/program_metadata.h" #include "core/file_sys/program_metadata.h"
#include "core/hle/kernel/object.h" #include "core/hle/kernel/object.h"
#include "core/loader/loader.h" #include "core/loader/loader.h"
#include "deconstructed_rom_directory.h"
namespace Loader { namespace Loader {
@ -41,6 +42,7 @@ private:
FileSys::ProgramMetadata metadata; FileSys::ProgramMetadata metadata;
std::unique_ptr<FileSys::NCA> nca; std::unique_ptr<FileSys::NCA> nca;
std::unique_ptr<AppLoader_DeconstructedRomDirectory> directory_loader;
}; };
} // namespace Loader } // namespace Loader