diff options
author | Lioncash <[email protected]> | 2018-09-29 15:57:40 -0400 |
---|---|---|
committer | Lioncash <[email protected]> | 2018-09-29 16:00:03 -0400 |
commit | a63e6f9dfd75f89841817a0185d606da52c7a4a6 (patch) | |
tree | 5ebf817e2c5ce6736d89e938769be3f73fbb30f4 /src/core | |
parent | 0921558a9fb1a4bfe0ffd64a2e8be27693017b20 (diff) | |
download | yuzu-android-a63e6f9dfd75f89841817a0185d606da52c7a4a6.tar.gz yuzu-android-a63e6f9dfd75f89841817a0185d606da52c7a4a6.zip |
loader: Make the Load() function take a process as a regular reference, not a SharedPtr
A process should never require being reference counted in this
situation. If the handle to a process is freed before this function is
called, it's definitely a bug with our lifetime management, so we can
put the requirement in place for the API that the process must be a
valid instance.
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/core.cpp | 2 | ||||
-rw-r--r-- | src/core/loader/deconstructed_rom_directory.cpp | 9 | ||||
-rw-r--r-- | src/core/loader/deconstructed_rom_directory.h | 3 | ||||
-rw-r--r-- | src/core/loader/elf.cpp | 8 | ||||
-rw-r--r-- | src/core/loader/elf.h | 5 | ||||
-rw-r--r-- | src/core/loader/loader.h | 3 | ||||
-rw-r--r-- | src/core/loader/nax.cpp | 2 | ||||
-rw-r--r-- | src/core/loader/nax.h | 2 | ||||
-rw-r--r-- | src/core/loader/nca.cpp | 2 | ||||
-rw-r--r-- | src/core/loader/nca.h | 3 | ||||
-rw-r--r-- | src/core/loader/nro.cpp | 6 | ||||
-rw-r--r-- | src/core/loader/nro.h | 3 | ||||
-rw-r--r-- | src/core/loader/nso.cpp | 6 | ||||
-rw-r--r-- | src/core/loader/nso.h | 4 | ||||
-rw-r--r-- | src/core/loader/nsp.cpp | 4 | ||||
-rw-r--r-- | src/core/loader/nsp.h | 2 | ||||
-rw-r--r-- | src/core/loader/xci.cpp | 4 | ||||
-rw-r--r-- | src/core/loader/xci.h | 2 |
18 files changed, 28 insertions, 42 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp index 7666354dc..b6acfb3e4 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -202,7 +202,7 @@ struct System::Impl { return init_result; } - const Loader::ResultStatus load_result{app_loader->Load(kernel.CurrentProcess())}; + const Loader::ResultStatus load_result{app_loader->Load(*kernel.CurrentProcess())}; if (load_result != Loader::ResultStatus::Success) { LOG_CRITICAL(Core, "Failed to load ROM (Error {})!", static_cast<int>(load_result)); Shutdown(); diff --git a/src/core/loader/deconstructed_rom_directory.cpp b/src/core/loader/deconstructed_rom_directory.cpp index 7e8035d0f..1b198cc5c 100644 --- a/src/core/loader/deconstructed_rom_directory.cpp +++ b/src/core/loader/deconstructed_rom_directory.cpp @@ -86,8 +86,7 @@ FileType AppLoader_DeconstructedRomDirectory::IdentifyType(const FileSys::Virtua return FileType::Error; } -ResultStatus AppLoader_DeconstructedRomDirectory::Load( - Kernel::SharedPtr<Kernel::Process>& process) { +ResultStatus AppLoader_DeconstructedRomDirectory::Load(Kernel::Process& process) { if (is_loaded) { return ResultStatus::ErrorAlreadyLoaded; } @@ -130,10 +129,10 @@ ResultStatus AppLoader_DeconstructedRomDirectory::Load( return ResultStatus::Error32BitISA; } - process->LoadFromMetadata(metadata); + process.LoadFromMetadata(metadata); // Load NSO modules - const VAddr base_address = process->vm_manager.GetCodeRegionBaseAddress(); + const VAddr base_address = process.vm_manager.GetCodeRegionBaseAddress(); VAddr next_load_addr = base_address; for (const auto& module : {"rtld", "main", "subsdk0", "subsdk1", "subsdk2", "subsdk3", "subsdk4", "subsdk5", "subsdk6", "subsdk7", "sdk"}) { @@ -147,7 +146,7 @@ ResultStatus AppLoader_DeconstructedRomDirectory::Load( } } - process->Run(base_address, metadata.GetMainThreadPriority(), metadata.GetMainThreadStackSize()); + process.Run(base_address, metadata.GetMainThreadPriority(), metadata.GetMainThreadStackSize()); // Find the RomFS by searching for a ".romfs" file in this directory const auto& files = dir->GetFiles(); diff --git a/src/core/loader/deconstructed_rom_directory.h b/src/core/loader/deconstructed_rom_directory.h index 8a0dc1b1e..d109ed2b5 100644 --- a/src/core/loader/deconstructed_rom_directory.h +++ b/src/core/loader/deconstructed_rom_directory.h @@ -7,7 +7,6 @@ #include <string> #include "common/common_types.h" #include "core/file_sys/program_metadata.h" -#include "core/hle/kernel/object.h" #include "core/loader/loader.h" namespace Loader { @@ -38,7 +37,7 @@ public: return IdentifyType(file); } - ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override; + ResultStatus Load(Kernel::Process& process) override; ResultStatus ReadRomFS(FileSys::VirtualFile& dir) override; ResultStatus ReadIcon(std::vector<u8>& buffer) override; diff --git a/src/core/loader/elf.cpp b/src/core/loader/elf.cpp index ff1221574..5712a2a11 100644 --- a/src/core/loader/elf.cpp +++ b/src/core/loader/elf.cpp @@ -387,7 +387,7 @@ FileType AppLoader_ELF::IdentifyType(const FileSys::VirtualFile& file) { return FileType::Error; } -ResultStatus AppLoader_ELF::Load(Kernel::SharedPtr<Kernel::Process>& process) { +ResultStatus AppLoader_ELF::Load(Kernel::Process& process) { if (is_loaded) return ResultStatus::ErrorAlreadyLoaded; @@ -395,13 +395,13 @@ ResultStatus AppLoader_ELF::Load(Kernel::SharedPtr<Kernel::Process>& process) { if (buffer.size() != file->GetSize()) return ResultStatus::ErrorIncorrectELFFileSize; - const VAddr base_address = process->vm_manager.GetCodeRegionBaseAddress(); + const VAddr base_address = process.vm_manager.GetCodeRegionBaseAddress(); ElfReader elf_reader(&buffer[0]); SharedPtr<CodeSet> codeset = elf_reader.LoadInto(base_address); codeset->name = file->GetName(); - process->LoadModule(codeset, codeset->entrypoint); - process->Run(codeset->entrypoint, 48, Memory::DEFAULT_STACK_SIZE); + process.LoadModule(codeset, codeset->entrypoint); + process.Run(codeset->entrypoint, 48, Memory::DEFAULT_STACK_SIZE); is_loaded = true; return ResultStatus::Success; diff --git a/src/core/loader/elf.h b/src/core/loader/elf.h index b8fb982d0..6af76441c 100644 --- a/src/core/loader/elf.h +++ b/src/core/loader/elf.h @@ -8,9 +8,6 @@ #include "common/common_types.h" #include "core/loader/loader.h" -//////////////////////////////////////////////////////////////////////////////////////////////////// -// Loader namespace - namespace Loader { /// Loads an ELF/AXF file @@ -29,7 +26,7 @@ public: return IdentifyType(file); } - ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override; + ResultStatus Load(Kernel::Process& process) override; }; } // namespace Loader diff --git a/src/core/loader/loader.h b/src/core/loader/loader.h index 843c4bb91..20e66109b 100644 --- a/src/core/loader/loader.h +++ b/src/core/loader/loader.h @@ -12,7 +12,6 @@ #include <boost/optional.hpp> #include "common/common_types.h" #include "core/file_sys/vfs.h" -#include "core/hle/kernel/object.h" namespace Kernel { struct AddressMapping; @@ -136,7 +135,7 @@ public: * @param process The newly created process. * @return The status result of the operation. */ - virtual ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) = 0; + virtual ResultStatus Load(Kernel::Process& process) = 0; /** * Loads the system mode that this application needs. diff --git a/src/core/loader/nax.cpp b/src/core/loader/nax.cpp index 5d4380684..073fb9d2f 100644 --- a/src/core/loader/nax.cpp +++ b/src/core/loader/nax.cpp @@ -41,7 +41,7 @@ FileType AppLoader_NAX::GetFileType() { return IdentifyTypeImpl(*nax); } -ResultStatus AppLoader_NAX::Load(Kernel::SharedPtr<Kernel::Process>& process) { +ResultStatus AppLoader_NAX::Load(Kernel::Process& process) { if (is_loaded) { return ResultStatus::ErrorAlreadyLoaded; } diff --git a/src/core/loader/nax.h b/src/core/loader/nax.h index 56605fe45..fc3c01876 100644 --- a/src/core/loader/nax.h +++ b/src/core/loader/nax.h @@ -33,7 +33,7 @@ public: FileType GetFileType() override; - ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override; + ResultStatus Load(Kernel::Process& process) override; ResultStatus ReadRomFS(FileSys::VirtualFile& dir) override; ResultStatus ReadProgramId(u64& out_program_id) override; diff --git a/src/core/loader/nca.cpp b/src/core/loader/nca.cpp index 6aaffae59..7e1b0d84f 100644 --- a/src/core/loader/nca.cpp +++ b/src/core/loader/nca.cpp @@ -30,7 +30,7 @@ FileType AppLoader_NCA::IdentifyType(const FileSys::VirtualFile& file) { return FileType::Error; } -ResultStatus AppLoader_NCA::Load(Kernel::SharedPtr<Kernel::Process>& process) { +ResultStatus AppLoader_NCA::Load(Kernel::Process& process) { if (is_loaded) { return ResultStatus::ErrorAlreadyLoaded; } diff --git a/src/core/loader/nca.h b/src/core/loader/nca.h index 10be197c4..95d9b73a1 100644 --- a/src/core/loader/nca.h +++ b/src/core/loader/nca.h @@ -6,7 +6,6 @@ #include "common/common_types.h" #include "core/file_sys/vfs.h" -#include "core/hle/kernel/object.h" #include "core/loader/loader.h" namespace FileSys { @@ -34,7 +33,7 @@ public: return IdentifyType(file); } - ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override; + ResultStatus Load(Kernel::Process& process) override; ResultStatus ReadRomFS(FileSys::VirtualFile& dir) override; u64 ReadRomFSIVFCOffset() const override; diff --git a/src/core/loader/nro.cpp b/src/core/loader/nro.cpp index b72871efa..8ad973c3a 100644 --- a/src/core/loader/nro.cpp +++ b/src/core/loader/nro.cpp @@ -175,19 +175,19 @@ bool AppLoader_NRO::LoadNro(FileSys::VirtualFile file, VAddr load_base) { return true; } -ResultStatus AppLoader_NRO::Load(Kernel::SharedPtr<Kernel::Process>& process) { +ResultStatus AppLoader_NRO::Load(Kernel::Process& process) { if (is_loaded) { return ResultStatus::ErrorAlreadyLoaded; } // Load NRO - const VAddr base_address = process->vm_manager.GetCodeRegionBaseAddress(); + const VAddr base_address = process.vm_manager.GetCodeRegionBaseAddress(); if (!LoadNro(file, base_address)) { return ResultStatus::ErrorLoadingNRO; } - process->Run(base_address, Kernel::THREADPRIO_DEFAULT, Memory::DEFAULT_STACK_SIZE); + process.Run(base_address, Kernel::THREADPRIO_DEFAULT, Memory::DEFAULT_STACK_SIZE); is_loaded = true; return ResultStatus::Success; diff --git a/src/core/loader/nro.h b/src/core/loader/nro.h index 96d2de305..04b46119a 100644 --- a/src/core/loader/nro.h +++ b/src/core/loader/nro.h @@ -6,7 +6,6 @@ #include <string> #include "common/common_types.h" -#include "core/hle/kernel/object.h" #include "core/loader/linker.h" #include "core/loader/loader.h" @@ -33,7 +32,7 @@ public: return IdentifyType(file); } - ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override; + ResultStatus Load(Kernel::Process& process) override; ResultStatus ReadIcon(std::vector<u8>& buffer) override; ResultStatus ReadProgramId(u64& out_program_id) override; diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp index 1a6876a22..6fe3e17a7 100644 --- a/src/core/loader/nso.cpp +++ b/src/core/loader/nso.cpp @@ -153,17 +153,17 @@ VAddr AppLoader_NSO::LoadModule(FileSys::VirtualFile file, VAddr load_base) { return load_base + image_size; } -ResultStatus AppLoader_NSO::Load(Kernel::SharedPtr<Kernel::Process>& process) { +ResultStatus AppLoader_NSO::Load(Kernel::Process& process) { if (is_loaded) { return ResultStatus::ErrorAlreadyLoaded; } // Load module - const VAddr base_address = process->vm_manager.GetCodeRegionBaseAddress(); + const VAddr base_address = process.vm_manager.GetCodeRegionBaseAddress(); LoadModule(file, base_address); LOG_DEBUG(Loader, "loaded module {} @ 0x{:X}", file->GetName(), base_address); - process->Run(base_address, Kernel::THREADPRIO_DEFAULT, Memory::DEFAULT_STACK_SIZE); + process.Run(base_address, Kernel::THREADPRIO_DEFAULT, Memory::DEFAULT_STACK_SIZE); is_loaded = true; return ResultStatus::Success; diff --git a/src/core/loader/nso.h b/src/core/loader/nso.h index aaeb1f2a9..7f142405b 100644 --- a/src/core/loader/nso.h +++ b/src/core/loader/nso.h @@ -4,9 +4,7 @@ #pragma once -#include <string> #include "common/common_types.h" -#include "core/hle/kernel/object.h" #include "core/loader/linker.h" #include "core/loader/loader.h" @@ -30,7 +28,7 @@ public: static VAddr LoadModule(FileSys::VirtualFile file, VAddr load_base); - ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override; + ResultStatus Load(Kernel::Process& process) override; }; } // namespace Loader diff --git a/src/core/loader/nsp.cpp b/src/core/loader/nsp.cpp index 291a9876d..b7ba77ef4 100644 --- a/src/core/loader/nsp.cpp +++ b/src/core/loader/nsp.cpp @@ -10,8 +10,6 @@ #include "core/file_sys/control_metadata.h" #include "core/file_sys/nca_metadata.h" #include "core/file_sys/patch_manager.h" -#include "core/file_sys/registered_cache.h" -#include "core/file_sys/romfs.h" #include "core/file_sys/submission_package.h" #include "core/hle/kernel/process.h" #include "core/loader/deconstructed_rom_directory.h" @@ -62,7 +60,7 @@ FileType AppLoader_NSP::IdentifyType(const FileSys::VirtualFile& file) { return FileType::Error; } -ResultStatus AppLoader_NSP::Load(Kernel::SharedPtr<Kernel::Process>& process) { +ResultStatus AppLoader_NSP::Load(Kernel::Process& process) { if (is_loaded) { return ResultStatus::ErrorAlreadyLoaded; } diff --git a/src/core/loader/nsp.h b/src/core/loader/nsp.h index 7ef810499..eac9b819a 100644 --- a/src/core/loader/nsp.h +++ b/src/core/loader/nsp.h @@ -35,7 +35,7 @@ public: return IdentifyType(file); } - ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override; + ResultStatus Load(Kernel::Process& process) override; ResultStatus ReadRomFS(FileSys::VirtualFile& dir) override; ResultStatus ReadProgramId(u64& out_program_id) override; diff --git a/src/core/loader/xci.cpp b/src/core/loader/xci.cpp index 16509229f..eda67a8c8 100644 --- a/src/core/loader/xci.cpp +++ b/src/core/loader/xci.cpp @@ -9,8 +9,6 @@ #include "core/file_sys/content_archive.h" #include "core/file_sys/control_metadata.h" #include "core/file_sys/patch_manager.h" -#include "core/file_sys/romfs.h" -#include "core/file_sys/submission_package.h" #include "core/hle/kernel/process.h" #include "core/loader/nca.h" #include "core/loader/xci.h" @@ -46,7 +44,7 @@ FileType AppLoader_XCI::IdentifyType(const FileSys::VirtualFile& file) { return FileType::Error; } -ResultStatus AppLoader_XCI::Load(Kernel::SharedPtr<Kernel::Process>& process) { +ResultStatus AppLoader_XCI::Load(Kernel::Process& process) { if (is_loaded) { return ResultStatus::ErrorAlreadyLoaded; } diff --git a/src/core/loader/xci.h b/src/core/loader/xci.h index cc4287e17..17e47b658 100644 --- a/src/core/loader/xci.h +++ b/src/core/loader/xci.h @@ -35,7 +35,7 @@ public: return IdentifyType(file); } - ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override; + ResultStatus Load(Kernel::Process& process) override; ResultStatus ReadRomFS(FileSys::VirtualFile& dir) override; ResultStatus ReadProgramId(u64& out_program_id) override; |