Skip to content

Commit

Permalink
Linux: Fixes PAGESIZE checks that could return <= 0
Browse files Browse the repository at this point in the history
If any `sysconf(_SC_PAGESIZE);` errors then we can get bad values, make
sure to at minimum use the x86 page size.

Also changes a hardcoded page size to use the FEX pagesize define.
  • Loading branch information
Sonicadvance1 committed Feb 13, 2025
1 parent 6651f9e commit 5d37253
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 21 deletions.
9 changes: 7 additions & 2 deletions Source/Tools/CommonTools/HarnessHelpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -401,7 +401,8 @@ class HarnessCodeLoader final : public FEX::CodeLoader {
}

uint64_t StackSize() const override {
return sysconf(_SC_PAGESIZE);
const auto Page = sysconf(_SC_PAGESIZE);
return Page > 0 ? Page : FEXCore::Utils::FEX_PAGE_SIZE;
}

uint64_t GetStackPointer() override {
Expand All @@ -426,7 +427,11 @@ class HarnessCodeLoader final : public FEX::CodeLoader {
return Result;
};

const auto AllocPageSize = sysconf(_SC_PAGESIZE);
auto AllocPageSize = sysconf(_SC_PAGESIZE);
if (AllocPageSize <= 0) {
AllocPageSize = FEXCore::Utils::FEX_PAGE_SIZE;
}

if (LimitedSize) {
DoMMap(0xe000'0000, AllocPageSize * 10);

Expand Down
30 changes: 15 additions & 15 deletions Source/Tools/FEXLoader/ELFCodeLoader.h
Original file line number Diff line number Diff line change
Expand Up @@ -564,21 +564,21 @@ class ELFCodeLoader final : public FEX::CodeLoader {
// All done

// Setup AuxVars
AuxVariables.emplace_back(auxv_t {11, getauxval(AT_UID)}); // AT_UID
AuxVariables.emplace_back(auxv_t {12, getauxval(AT_EUID)}); // AT_EUID
AuxVariables.emplace_back(auxv_t {13, getauxval(AT_GID)}); // AT_GID
AuxVariables.emplace_back(auxv_t {14, getauxval(AT_EGID)}); // AT_EGID
AuxVariables.emplace_back(auxv_t {17, getauxval(AT_CLKTCK)}); // AT_CLKTIK
AuxVariables.emplace_back(auxv_t {6, 0x1000}); // AT_PAGESIZE
AuxRandom = &AuxVariables.emplace_back(auxv_t {25, ~0ULL}); // AT_RANDOM
AuxVariables.emplace_back(auxv_t {23, getauxval(AT_SECURE)}); // AT_SECURE
AuxVariables.emplace_back(auxv_t {8, 0}); // AT_FLAGS
AuxVariables.emplace_back(auxv_t {5, MainElf.phdrs.size()}); // AT_PHNUM
AuxVariables.emplace_back(auxv_t {16, HWCap}); // AT_HWCAP
AuxVariables.emplace_back(auxv_t {26, HWCap2}); // AT_HWCAP2
AuxVariables.emplace_back(auxv_t {51, CalculateSignalStackSize()}); // AT_MINSIGSTKSZ
AuxPlatform = &AuxVariables.emplace_back(auxv_t {24, ~0ULL}); // AT_PLATFORM
AuxExecFN = &AuxVariables.emplace_back(auxv_t {AT_EXECFN, ~0ULL}); // AT_EXECFN
AuxVariables.emplace_back(auxv_t {11, getauxval(AT_UID)}); // AT_UID
AuxVariables.emplace_back(auxv_t {12, getauxval(AT_EUID)}); // AT_EUID
AuxVariables.emplace_back(auxv_t {13, getauxval(AT_GID)}); // AT_GID
AuxVariables.emplace_back(auxv_t {14, getauxval(AT_EGID)}); // AT_EGID
AuxVariables.emplace_back(auxv_t {17, getauxval(AT_CLKTCK)}); // AT_CLKTIK
AuxVariables.emplace_back(auxv_t {6, FEXCore::Utils::FEX_PAGE_SIZE}); // AT_PAGESIZE
AuxRandom = &AuxVariables.emplace_back(auxv_t {25, ~0ULL}); // AT_RANDOM
AuxVariables.emplace_back(auxv_t {23, getauxval(AT_SECURE)}); // AT_SECURE
AuxVariables.emplace_back(auxv_t {8, 0}); // AT_FLAGS
AuxVariables.emplace_back(auxv_t {5, MainElf.phdrs.size()}); // AT_PHNUM
AuxVariables.emplace_back(auxv_t {16, HWCap}); // AT_HWCAP
AuxVariables.emplace_back(auxv_t {26, HWCap2}); // AT_HWCAP2
AuxVariables.emplace_back(auxv_t {51, CalculateSignalStackSize()}); // AT_MINSIGSTKSZ
AuxPlatform = &AuxVariables.emplace_back(auxv_t {24, ~0ULL}); // AT_PLATFORM
AuxExecFN = &AuxVariables.emplace_back(auxv_t {AT_EXECFN, ~0ULL}); // AT_EXECFN

if (Is64BitMode()) {
AuxVariables.emplace_back(auxv_t {4, 0x38}); // AT_PHENT
Expand Down
4 changes: 1 addition & 3 deletions Source/Tools/LinuxEmulation/LinuxSyscalls/ThreadManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,7 @@ void ThreadManager::StatAlloc::Initialize() {
return;
}
CurrentSize = sysconf(_SC_PAGESIZE);
if (CurrentSize == 0) {
CurrentSize = 4096;
}
CurrentSize = CurrentSize > 0 ? CurrentSize : FEXCore::Utils::FEX_PAGE_SIZE;

if (ftruncate(fd, CurrentSize) == -1) {
LogMan::Msg::EFmt("[StatAlloc] ftruncate failed");
Expand Down
2 changes: 1 addition & 1 deletion Source/Tools/LinuxEmulation/VDSO_Emulation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -652,7 +652,7 @@ void LoadGuestVDSOSymbols(bool Is64Bit, char* VDSOBase) {
void LoadUnique32BitSigreturn(VDSOMapping* Mapping) {
// Hardcoded to one page for now
const auto PageSize = sysconf(_SC_PAGESIZE);
Mapping->OptionalMappingSize = PageSize;
Mapping->OptionalMappingSize = PageSize > 0 ? PageSize : FEXCore::Utils::FEX_PAGE_SIZE;

// First 64bit page
constexpr uintptr_t LOCATION_MAX = 0x1'0000'0000;
Expand Down

0 comments on commit 5d37253

Please sign in to comment.