// Copyright 2022 IBM // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef CPU_FEATURES_INCLUDE_CPUINFO_S390X_H_ #define CPU_FEATURES_INCLUDE_CPUINFO_S390X_H_ #include "cpu_features_cache_info.h" #include "cpu_features_macros.h" CPU_FEATURES_START_CPP_NAMESPACE typedef struct { int esan3: 1; // instructions named N3, "backported" to esa-mode int zarch: 1; // z/Architecture mode active int stfle: 1; // store-facility-list-extended int msa: 1; // message-security assist int ldisp: 1; // long-displacement int eimm: 1; // extended-immediate int dfp: 1; // decimal floating point & perform floating point operation int edat: 1; // huge page support int etf3eh: 1; // extended-translation facility 3 enhancement int highgprs: 1; // 64-bit register support for 31-bit processes int te: 1; // transactional execution int vx: 1; // vector extension facility int vxd: 1; // vector-packed-decimal facility int vxe: 1; // vector-enhancement facility 1 int gs: 1; // guarded-storage facility int vxe2: 1; // vector-enhancements facility 2 int vxp: 1; // vector-packed-decimal-enhancement facility int sort: 1; // enhanced-sort facility int dflt: 1; // deflate-conversion facility int vxp2: 1; // vector-packed-decimal-enhancement facility 2 int nnpa: 1; // neural network processing assist facility int pcimio: 1; // PCI mio facility int sie: 1; // virtualization support // Make sure to update S390XFeaturesEnum below if you add a field here. } S390XFeatures; typedef struct { S390XFeatures features; } S390XInfo; S390XInfo GetS390XInfo(void); typedef struct { char platform[64]; // 0 terminated string } S390XPlatformTypeStrings; typedef struct { int num_processors; // -1 if N/A S390XPlatformTypeStrings type; } S390XPlatformStrings; S390XPlatformStrings GetS390XPlatformStrings(void); //////////////////////////////////////////////////////////////////////////////// // Introspection functions typedef enum { S390_ESAN3, S390_ZARCH, S390_STFLE, S390_MSA, S390_LDISP, S390_EIMM, S390_DFP, S390_EDAT, S390_ETF3EH, S390_HIGHGPRS, S390_TE, S390_VX, S390_VXD, S390_VXE, S390_GS, S390_VXE2, S390_VXP, S390_SORT, S390_DFLT, S390_VXP2, S390_NNPA, S390_PCIMIO, S390_SIE, S390X_LAST_, } S390XFeaturesEnum; int GetS390XFeaturesEnumValue(const S390XFeatures* features, S390XFeaturesEnum value); const char* GetS390XFeaturesEnumName(S390XFeaturesEnum); CPU_FEATURES_END_CPP_NAMESPACE #if !defined(CPU_FEATURES_ARCH_S390X) #error "Including cpuinfo_s390x.h from a non-s390x target." #endif #endif // CPU_FEATURES_INCLUDE_CPUINFO_S390X_H_