mirror of
https://github.com/FEX-Emu/FEX.git
synced 2026-10-06 17:00:19 +02:00
LinuxSyscalls: Fix LookupExecutableFileSection implementation
The file offset of a file mapping doesn't necessarily match its address offset in virtual memory from the base file mapping. Indeed, most libraries violate this assumption. Now that the MappedResource::FirstVMA reliably identifies the base memory mapping for a given library (even when that library is mapped multiple times), this can easily be fixed.
This commit is contained in:
1 parent
cf6c0765fa
commit
2cfba8c6d0
1 file changed
+4
-6
@@ -174,15 +174,13 @@ std::optional<FEXCore::ExecutableFileSectionInfo>
|
||||
SyscallHandler::LookupExecutableFileSection(FEXCore::Core::InternalThreadState& Thread, uint64_t GuestAddr) {
|
||||
auto lk = FEXCore::GuardSignalDeferringSection<std::shared_lock>(VMATracking.Mutex, &Thread);
|
||||
|
||||
// Get the first mapping after GuestAddr, or end
|
||||
// GuestAddr is inclusive
|
||||
// If the write spans two pages, they will be flushed one at a time (generating two faults)
|
||||
auto Entry = VMATracking.FindVMAEntry(GuestAddr);
|
||||
if (Entry == VMATracking.VMAs.end() || !Entry->second.Resource) {
|
||||
auto EntryIt = VMATracking.FindVMAEntry(GuestAddr);
|
||||
if (EntryIt == VMATracking.VMAs.end() || !EntryIt->second.Resource) {
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
return FEXCore::ExecutableFileSectionInfo {*Entry->second.Resource->MappedFile, Entry->second.Base - Entry->second.Offset};
|
||||
auto& [MappingBaseAddr, Entry] = *EntryIt;
|
||||
return FEXCore::ExecutableFileSectionInfo {*Entry.Resource->MappedFile, Entry.Resource->FirstVMA->Base};
|
||||
}
|
||||
|
||||
FEXCore::HLE::ExecutableRangeInfo SyscallHandler::QueryGuestExecutableRange(FEXCore::Core::InternalThreadState* Thread, uint64_t Address) {
|
||||
|
||||
Reference in new issue
Block a user