From 3508cce5b36fa86e3f375d34fd61c7cf580e89d2 Mon Sep 17 00:00:00 2001 From: Ben Vanik Date: Sat, 29 Aug 2015 19:35:43 -0700 Subject: [PATCH] Fixing module loading. --- src/xenia/kernel/objects/xuser_module.cc | 38 ++++++++++-------------- src/xenia/kernel/objects/xuser_module.h | 3 +- 2 files changed, 16 insertions(+), 25 deletions(-) diff --git a/src/xenia/kernel/objects/xuser_module.cc b/src/xenia/kernel/objects/xuser_module.cc index 78090b3a8..7605a7e94 100644 --- a/src/xenia/kernel/objects/xuser_module.cc +++ b/src/xenia/kernel/objects/xuser_module.cc @@ -46,16 +46,8 @@ X_STATUS XUserModule::LoadFromFile(std::string path) { return result; } - ModuleFormat fmt; - auto magic = *(xe::be*)mmap->data(); - if (magic == 'XEX2') { - fmt = kModuleFormatXex; - } else if (magic == 0x7F454C46 /* 0x7F 'ELF' */) { - fmt = kModuleFormatElf; - } - // Load the module. - result = LoadFromMemory(mmap->data(), mmap->size(), fmt); + result = LoadFromMemory(mmap->data(), mmap->size()); } else { std::vector buffer(fs_entry->size()); @@ -75,27 +67,27 @@ X_STATUS XUserModule::LoadFromFile(std::string path) { return result; } - ModuleFormat fmt; - uint32_t magic = *(uint32_t*)buffer.data(); - if (magic == 'XEX2') { - fmt = kModuleFormatXex; - } else if (magic == 0x7F454C46 /* 0x7F 'ELF' */) { - fmt = kModuleFormatElf; - } - // Load the module. - result = LoadFromMemory(buffer.data(), bytes_read, fmt); + result = LoadFromMemory(buffer.data(), bytes_read); } return result; } -X_STATUS XUserModule::LoadFromMemory(const void* addr, const size_t length, - ModuleFormat module_format) { +X_STATUS XUserModule::LoadFromMemory(const void* addr, const size_t length) { auto processor = kernel_state()->processor(); - module_format_ = module_format; - if (module_format == kModuleFormatXex) { + auto magic = xe::load_and_swap(addr); + if (magic == 'XEX2') { + module_format_ = kModuleFormatXex; + } else if (magic == 0x7F454C46 /* 0x7F 'ELF' */) { + module_format_ = kModuleFormatElf; + } else { + XELOGE("Unknown module magic: %.8X", magic); + return X_STATUS_NOT_IMPLEMENTED; + } + + if (module_format_ == kModuleFormatXex) { // Prepare the module for execution. // Runtime takes ownership. auto xex_module = @@ -127,7 +119,7 @@ X_STATUS XUserModule::LoadFromMemory(const void* addr, const size_t length, this->xex_module()->GetOptHeader(XEX_HEADER_DEFAULT_STACK_SIZE, &stack_size_); dll_module_ = !!(header->module_flags & XEX_MODULE_DLL_MODULE); - } else if (module_format == kModuleFormatElf) { + } else if (module_format_ == kModuleFormatElf) { auto elf_module = std::make_unique(processor, kernel_state()); if (!elf_module->Load(name_, path_, addr, length)) { diff --git a/src/xenia/kernel/objects/xuser_module.h b/src/xenia/kernel/objects/xuser_module.h index 61f90b3a4..c33b31c68 100644 --- a/src/xenia/kernel/objects/xuser_module.h +++ b/src/xenia/kernel/objects/xuser_module.h @@ -54,8 +54,7 @@ class XUserModule : public XModule { uint32_t stack_size() const { return stack_size_; } X_STATUS LoadFromFile(std::string path); - X_STATUS LoadFromMemory(const void* addr, const size_t length, - ModuleFormat module_type); + X_STATUS LoadFromMemory(const void* addr, const size_t length); X_STATUS Unload(); uint32_t GetProcAddressByOrdinal(uint16_t ordinal) override;