summaryrefslogtreecommitdiff
path: root/src/core/loader/elf.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2018-07-07 20:24:51 -0700
committerGravatar bunnei2018-07-07 20:24:51 -0700
commit913896cbd99e414c325c9d47a987376ed6d9fffd (patch)
treeb660920a49f538f0ee00486c50a0d153d53c423d /src/core/loader/elf.cpp
parentMerge pull request #632 from FearlessTobi/add-discord-link (diff)
downloadyuzu-913896cbd99e414c325c9d47a987376ed6d9fffd.tar.gz
yuzu-913896cbd99e414c325c9d47a987376ed6d9fffd.tar.xz
yuzu-913896cbd99e414c325c9d47a987376ed6d9fffd.zip
Revert "Virtual Filesystem (#597)"
This reverts commit 77c684c1140f6bf3fb7d4560d06d2efb1a2ee5e2.
Diffstat (limited to 'src/core/loader/elf.cpp')
-rw-r--r--src/core/loader/elf.cpp24
1 files changed, 17 insertions, 7 deletions
diff --git a/src/core/loader/elf.cpp b/src/core/loader/elf.cpp
index 4bfd5f536..b69e5c6ef 100644
--- a/src/core/loader/elf.cpp
+++ b/src/core/loader/elf.cpp
@@ -365,17 +365,20 @@ SectionID ElfReader::GetSectionByName(const char* name, int firstSection) const
365 365
366namespace Loader { 366namespace Loader {
367 367
368AppLoader_ELF::AppLoader_ELF(FileSys::VirtualFile file) : AppLoader(std::move(file)) {} 368AppLoader_ELF::AppLoader_ELF(FileUtil::IOFile&& file, std::string filename)
369 : AppLoader(std::move(file)), filename(std::move(filename)) {}
369 370
370FileType AppLoader_ELF::IdentifyType(const FileSys::VirtualFile& file) { 371FileType AppLoader_ELF::IdentifyType(FileUtil::IOFile& file, const std::string&) {
371 static constexpr u16 ELF_MACHINE_ARM{0x28}; 372 static constexpr u16 ELF_MACHINE_ARM{0x28};
372 373
373 u32 magic = 0; 374 u32 magic = 0;
374 if (4 != file->ReadObject(&magic)) 375 file.Seek(0, SEEK_SET);
376 if (1 != file.ReadArray<u32>(&magic, 1))
375 return FileType::Error; 377 return FileType::Error;
376 378
377 u16 machine = 0; 379 u16 machine = 0;
378 if (2 != file->ReadObject(&machine, 18)) 380 file.Seek(18, SEEK_SET);
381 if (1 != file.ReadArray<u16>(&machine, 1))
379 return FileType::Error; 382 return FileType::Error;
380 383
381 if (Common::MakeMagic('\x7f', 'E', 'L', 'F') == magic && ELF_MACHINE_ARM == machine) 384 if (Common::MakeMagic('\x7f', 'E', 'L', 'F') == magic && ELF_MACHINE_ARM == machine)
@@ -388,13 +391,20 @@ ResultStatus AppLoader_ELF::Load(Kernel::SharedPtr<Kernel::Process>& process) {
388 if (is_loaded) 391 if (is_loaded)
389 return ResultStatus::ErrorAlreadyLoaded; 392 return ResultStatus::ErrorAlreadyLoaded;
390 393
391 std::vector<u8> buffer = file->ReadAllBytes(); 394 if (!file.IsOpen())
392 if (buffer.size() != file->GetSize()) 395 return ResultStatus::Error;
396
397 // Reset read pointer in case this file has been read before.
398 file.Seek(0, SEEK_SET);
399
400 size_t size = file.GetSize();
401 std::unique_ptr<u8[]> buffer(new u8[size]);
402 if (file.ReadBytes(&buffer[0], size) != size)
393 return ResultStatus::Error; 403 return ResultStatus::Error;
394 404
395 ElfReader elf_reader(&buffer[0]); 405 ElfReader elf_reader(&buffer[0]);
396 SharedPtr<CodeSet> codeset = elf_reader.LoadInto(Memory::PROCESS_IMAGE_VADDR); 406 SharedPtr<CodeSet> codeset = elf_reader.LoadInto(Memory::PROCESS_IMAGE_VADDR);
397 codeset->name = file->GetName(); 407 codeset->name = filename;
398 408
399 process->LoadModule(codeset, codeset->entrypoint); 409 process->LoadModule(codeset, codeset->entrypoint);
400 process->svc_access_mask.set(); 410 process->svc_access_mask.set();