diff --git a/src/xenia/base/mapped_memory_posix.cc b/src/xenia/base/mapped_memory_posix.cc index 330ced53f..ddedf0f17 100644 --- a/src/xenia/base/mapped_memory_posix.cc +++ b/src/xenia/base/mapped_memory_posix.cc @@ -58,6 +58,7 @@ class PosixMappedMemory : public MappedMemory { void* data = mmap(0, map_length, protection, MAP_SHARED, file_descriptor, offset); + ftruncate(file_descriptor, map_length); if (!data) { close(file_descriptor); return nullptr; diff --git a/src/xenia/base/memory.cc b/src/xenia/base/memory.cc index 4fb537226..58ea8fb65 100644 --- a/src/xenia/base/memory.cc +++ b/src/xenia/base/memory.cc @@ -176,8 +176,12 @@ static void vastcpy_impl_movdir64m(CacheLine* XE_RESTRICT physaddr, static void vastcpy_impl_repmovs(CacheLine* XE_RESTRICT physaddr, CacheLine* XE_RESTRICT rdmapping, uint32_t written_length) { +#if XE_ARCH_AMD64 == 1 && XE_COMPILER_MSVC == 1 __movsq((unsigned long long*)physaddr, (unsigned long long*)rdmapping, written_length / 8); +#else + memcpy((unsigned char*)physaddr, (const unsigned char*)rdmapping, written_length); +#endif } XE_COLD static void first_vastcpy(CacheLine* XE_RESTRICT physaddr, diff --git a/src/xenia/base/memory_posix.cc b/src/xenia/base/memory_posix.cc index 2ff36a603..e1fdb2d2d 100644 --- a/src/xenia/base/memory_posix.cc +++ b/src/xenia/base/memory_posix.cc @@ -85,6 +85,12 @@ void* AllocFixed(void* base_address, size_t length, AllocationType allocation_type, PageAccess access) { // mmap does not support reserve / commit, so ignore allocation_type. uint32_t prot = ToPosixProtectFlags(access); + int flags = 0; + if (base_address != nullptr) { + flags = MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS; + } else { + flags = MAP_PRIVATE | MAP_ANONYMOUS; + } void* result = mmap(base_address, length, prot, MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS, -1, 0); if (result == MAP_FAILED) { diff --git a/src/xenia/cpu/xex_module.cc b/src/xenia/cpu/xex_module.cc index ad3b6ea41..bec353f5e 100644 --- a/src/xenia/cpu/xex_module.cc +++ b/src/xenia/cpu/xex_module.cc @@ -1120,7 +1120,7 @@ void XexModule::Precompile() { char fmtbuf[16]; - for (unsigned i = 0; i < 16; ++i) { + for (unsigned i = 0; i < 20; ++i) { sprintf_s(fmtbuf, "%X", image_sha_bytes_[i]); image_sha_str_ += &fmtbuf[0]; } diff --git a/src/xenia/cpu/xex_module.h b/src/xenia/cpu/xex_module.h index ded57c6f8..713fda78d 100644 --- a/src/xenia/cpu/xex_module.h +++ b/src/xenia/cpu/xex_module.h @@ -282,7 +282,7 @@ class XexModule : public xe::cpu::Module { XexFormat xex_format_ = kFormatUnknown; SecurityInfoContext security_info_ = {}; - uint8_t image_sha_bytes_[16]; + uint8_t image_sha_bytes_[20]; std::string image_sha_str_; XexInfoCache info_cache_; };