[SystemZ/ZOS] Implement computeHostNumPhysicalCores

On z/OS, the information is stored in the Common System Data Area
(CSD). It is the number of CPs allocated to the current LPAR.

Reviewers: aganea, hubert.reinterpertcast, MaskRay

Reviewed By: hubert.reinterpertcast

Differential Revision: https://reviews.llvm.org/D85531
This commit is contained in:
Kai Nacke 2020-07-28 10:33:50 +02:00 committed by Kai Nacke
parent ea8448e361
commit bca1b8ed99
2 changed files with 27 additions and 6 deletions

View File

@ -1311,6 +1311,28 @@ int computeHostNumPhysicalCores() {
}
return count;
}
#elif defined(__MVS__)
int computeHostNumPhysicalCores() {
enum {
// Byte offset of the pointer to the Communications Vector Table (CVT) in
// the Prefixed Save Area (PSA). The table entry is a 31-bit pointer and
// will be zero-extended to uintptr_t.
FLCCVT = 16,
// Byte offset of the pointer to the Common System Data Area (CSD) in the
// CVT. The table entry is a 31-bit pointer and will be zero-extended to
// uintptr_t.
CVTCSD = 660,
// Byte offset to the number of live CPs in the LPAR, stored as a signed
// 32-bit value in the table.
CSD_NUMBER_ONLINE_STANDARD_CPS = 264,
};
char *PSA = 0;
char *CVT = reinterpret_cast<char *>(
static_cast<uintptr_t>(reinterpret_cast<unsigned int &>(PSA[FLCCVT])));
char *CSD = reinterpret_cast<char *>(
static_cast<uintptr_t>(reinterpret_cast<unsigned int &>(CVT[CVTCSD])));
return reinterpret_cast<int &>(CSD[CSD_NUMBER_ONLINE_STANDARD_CPS]);
}
#elif defined(_WIN32) && LLVM_ENABLE_THREADS != 0
// Defined in llvm/lib/Support/Windows/Threading.inc
int computeHostNumPhysicalCores();

View File

@ -36,13 +36,12 @@ class HostTest : public testing::Test {
protected:
bool isSupportedArchAndOS() {
// Initially this is only testing detection of the number of
// physical cores, which is currently only supported/tested for
// x86_64 Linux and Darwin.
// physical cores, which is currently only supported/tested on
// some systems.
return (Host.isOSWindows() && llvm_is_multithreaded()) ||
(Host.isX86() &&
(Host.isOSDarwin() || Host.getOS() == Triple::Linux)) ||
(Host.getOS() == Triple::Linux &&
(Host.isPPC64() || Host.isSystemZ()));
(Host.isX86() && (Host.isOSDarwin() || Host.isOSLinux())) ||
(Host.isPPC64() && Host.isOSLinux()) ||
(Host.isSystemZ() && (Host.isOSLinux() || Host.isOSzOS()));
}
HostTest() : Host(Triple::normalize(sys::getProcessTriple())) {}