From fc662341e6f85da78ada0e443f6116b978f79f22 Mon Sep 17 00:00:00 2001 From: Igor Pavlov <87184205+ip7z@users.noreply.github.com> Date: Tue, 14 May 2024 00:00:00 +0000 Subject: 24.05 --- CPP/Windows/SystemInfo.cpp | 225 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 188 insertions(+), 37 deletions(-) (limited to 'CPP/Windows/SystemInfo.cpp') diff --git a/CPP/Windows/SystemInfo.cpp b/CPP/Windows/SystemInfo.cpp index 6bafc80..d23e84b 100644 --- a/CPP/Windows/SystemInfo.cpp +++ b/CPP/Windows/SystemInfo.cpp @@ -16,9 +16,28 @@ #include #ifdef __APPLE__ #include + #elif !defined(_AIX) +#if defined(__GLIBC__) && (__GLIBC__ * 100 + __GLIBC_MINOR__ >= 216) + #define Z7_GETAUXV_AVAILABLE +#else +// #pragma message("=== is not NEW GLIBC === ") + #if defined __has_include + #if __has_include () +// #pragma message("=== sys/auxv.h is avail=== ") + #define Z7_GETAUXV_AVAILABLE + #endif + #endif +#endif + +#ifdef Z7_GETAUXV_AVAILABLE +// #if defined __has_include +// #if __has_include () #include +#define USE_HWCAP +// #endif +// #endif // #undef AT_HWCAP // to debug // #undef AT_HWCAP2 // to debug @@ -36,11 +55,39 @@ #endif */ +#ifdef USE_HWCAP + +#if defined(__FreeBSD__) + +// #if (__FreeBSD__ >= 13) // (FreeBSD 12.01 is required for elf_aux_info() ???) +static unsigned long MY_getauxval(int aux) +{ + unsigned long val; + if (elf_aux_info(aux, &val, sizeof(val))) + return 0; + return val; +} + +#else // ! __FreeBSD__ + #ifdef MY_CPU_ARM_OR_ARM64 + #if defined __has_include + #if __has_include () #include + #endif + #endif #endif + +#if defined(AT_HWCAP) || defined(AT_HWCAP2) +#define MY_getauxval getauxval #endif +#endif // ! __FreeBSD__ +#endif // USE_HWCAP +#endif // Z7_GETAUXV_AVAILABLE + +#endif // !defined(_AIX) + #ifdef __linux__ #include "../Windows/FileIO.h" #endif @@ -70,13 +117,13 @@ static bool ReadFile_to_Buffer(CFSTR fileName, CByteBuffer &buf) return false; */ size_t size = 0; - size_t addSize = ((size_t)1 << 12); + size_t addSize = (size_t)1 << 12; for (;;) { // printf("\nsize = %d\n", (unsigned)size); buf.ChangeSize_KeepData(size + addSize, size); size_t processed; - if (!file.ReadFull(buf + size, addSize, processed)) + if (!file.ReadFull(buf.NonConstData() + size, addSize, processed)) return false; if (processed == 0) { @@ -107,19 +154,19 @@ static void PrintCpuChars(AString &s, UInt32 v) { for (unsigned j = 0; j < 4; j++) { - Byte b = (Byte)(v & 0xFF); + const Byte b = (Byte)(v & 0xFF); v >>= 8; if (b == 0) break; if (b >= 0x20 && b <= 0x7f) - s += (char)b; + s.Add_Char((char)b); else { - s += '['; + s.Add_Char('['); char temp[16]; ConvertUInt32ToHex(b, temp); s += temp; - s += ']'; + s.Add_Char(']'); } } } @@ -137,7 +184,7 @@ static void x86cpuid_to_String(AString &s) { for (unsigned i = 0; i < 3; i++) { - z7_x86_cpuid(a, 0x80000002 + i); + z7_x86_cpuid(a, (UInt32)(0x80000002 + i)); for (unsigned j = 0; j < 4; j++) PrintCpuChars(s, a[j]); } @@ -353,8 +400,8 @@ void PrintSize_KMGT_Or_Hex(AString &s, UInt64 v) } s.Add_UInt64(v); if (c) - s += c; - s += 'B'; + s.Add_Char(c); + s.Add_Char('B'); } // #endif // #endif @@ -380,7 +427,7 @@ static void SysInfo_To_String(AString &s, const SYSTEM_INFO &si) s += " act:"; PrintHex(s, si.dwActiveProcessorMask); } - s += " cpus:"; + s += " threads:"; s.Add_UInt32(si.dwNumberOfProcessors); if (si.dwPageSize != 1 << 12) { @@ -400,7 +447,7 @@ static void SysInfo_To_String(AString &s, const SYSTEM_INFO &si) if (minAdd != kReserveSize) { PrintSize_KMGT_Or_Hex(s, minAdd); - s += "-"; + s.Add_Minus(); } else { @@ -470,11 +517,10 @@ static void AddBracedString(AString &dest, AString &src) { if (!src.IsEmpty()) { - AString s; - s += '('; - s += src; - s += ')'; - dest.Add_OptSpaced(s); + dest.Add_Space_if_NotEmpty(); + dest.Add_Char('('); + dest += src; + dest.Add_Char(')'); } } @@ -527,6 +573,13 @@ void CCpuName::Fill() { Add_sysctlbyname_to_String("machdep.cpu.brand_string", s); } + #elif defined(MY_CPU_E2K) && defined(Z7_MCST_LCC_VERSION) && (Z7_MCST_LCC_VERSION >= 12323) + { + s += "mcst "; + s += __builtin_cpu_name(); + s.Add_Space(); + s += __builtin_cpu_arch(); + } #endif @@ -592,11 +645,11 @@ void CCpuName::Fill() const CByteBuffer &buf = bufs[i]; if (buf.Size() == 8) { - UInt32 high = GetUi32(buf); + const UInt32 high = GetUi32(buf); if (high != 0) { PrintHex(Microcode, high); - Microcode += "."; + Microcode.Add_Dot(); } PrintHex(Microcode, GetUi32(buf + 4)); } @@ -622,7 +675,7 @@ void AddCpuFeatures(AString &s) UInt64 flags = 0; for (unsigned i = 0; i < kNumFeatures; i++) { - if (IsProcessorFeaturePresent(i)) + if (IsProcessorFeaturePresent((DWORD)i)) { flags += (UInt64)1 << i; // s.Add_Space_if_NotEmpty(); @@ -682,7 +735,7 @@ void AddCpuFeatures(AString &s) #ifdef AT_HWCAP s.Add_OptSpaced("hwcap:"); { - unsigned long h = getauxval(AT_HWCAP); + unsigned long h = MY_getauxval(AT_HWCAP); PrintHex(s, h); #ifdef MY_CPU_ARM64 if (h & HWCAP_CRC32) s += ":CRC32"; @@ -698,7 +751,7 @@ void AddCpuFeatures(AString &s) #ifdef AT_HWCAP2 { - unsigned long h = getauxval(AT_HWCAP2); + unsigned long h = MY_getauxval(AT_HWCAP2); #ifndef MY_CPU_ARM if (h != 0) #endif @@ -722,6 +775,8 @@ void AddCpuFeatures(AString &s) #ifdef _WIN32 #ifndef UNDER_CE +Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION + EXTERN_C_BEGIN typedef void (WINAPI * Func_RtlGetVersion) (OSVERSIONINFOEXW *); EXTERN_C_END @@ -952,24 +1007,13 @@ void GetVirtCpuid(AString &s) void GetCompiler(AString &s) { - #ifdef __VERSION__ - s += __VERSION__; - #endif - - #ifdef __GNUC__ - s += " GCC "; - s.Add_UInt32(__GNUC__); - s.Add_Dot(); - s.Add_UInt32(__GNUC_MINOR__); - s.Add_Dot(); - s.Add_UInt32(__GNUC_PATCHLEVEL__); - #endif - #ifdef __clang__ s += " CLANG "; s.Add_UInt32(__clang_major__); s.Add_Dot(); s.Add_UInt32(__clang_minor__); + s.Add_Dot(); + s.Add_UInt32(__clang_patchlevel__); #endif #ifdef __xlC__ @@ -985,12 +1029,67 @@ void GetCompiler(AString &s) #endif #endif + // #define __LCC__ 126 + // #define __LCC_MINOR__ 20 + // #define __MCST__ 1 + #ifdef __MCST__ + s += " MCST"; + #endif + #ifdef __LCC__ + s += " LCC "; + s.Add_UInt32(__LCC__ / 100); + s.Add_Dot(); + s.Add_UInt32(__LCC__ % 100 / 10); + s.Add_UInt32(__LCC__ % 10); + #ifdef __LCC_MINOR__ + s.Add_Dot(); + s.Add_UInt32(__LCC_MINOR__ / 10); + s.Add_UInt32(__LCC_MINOR__ % 10); + #endif + #endif + + // #define __EDG_VERSION__ 602 + #ifdef __EDG_VERSION__ + s += " EDG "; + s.Add_UInt32(__EDG_VERSION__ / 100); + s.Add_Dot(); + s.Add_UInt32(__EDG_VERSION__ % 100 / 10); + s.Add_UInt32(__EDG_VERSION__ % 10); + #endif + + #ifdef __VERSION__ + s.Add_Space(); + s += "ver:"; + s += __VERSION__; + #endif + + #ifdef __GNUC__ + s += " GCC "; + s.Add_UInt32(__GNUC__); + s.Add_Dot(); + s.Add_UInt32(__GNUC_MINOR__); + s.Add_Dot(); + s.Add_UInt32(__GNUC_PATCHLEVEL__); + #endif + + #ifdef _MSC_VER s += " MSC "; s.Add_UInt32(_MSC_VER); + #ifdef _MSC_FULL_VER + s.Add_Dot(); + s.Add_UInt32(_MSC_FULL_VER); + #endif + #endif - #if defined(__AVX2__) + #if defined(__AVX512F__) + #if defined(__AVX512VL__) + #define MY_CPU_COMPILE_ISA "AVX512VL" + #else + #define MY_CPU_COMPILE_ISA "AVX512F" + #endif + #elif defined(__AVX2__) #define MY_CPU_COMPILE_ISA "AVX2" #elif defined(__AVX__) #define MY_CPU_COMPILE_ISA "AVX" @@ -1014,9 +1113,61 @@ void GetCompiler(AString &s) #define MY_CPU_COMPILE_ISA "IA32" #endif + AString s2; #ifdef MY_CPU_COMPILE_ISA - s += ':'; - s.Add_OptSpaced(MY_CPU_COMPILE_ISA); + s2.Add_OptSpaced(MY_CPU_COMPILE_ISA); + #endif + +#ifndef MY_CPU_ARM64 + #ifdef __ARM_FP + s2.Add_OptSpaced("FP"); + #endif + #ifdef __ARM_NEON + s2.Add_OptSpaced("NEON"); #endif + #ifdef __NEON__ + s2.Add_OptSpaced("__NEON__"); + #endif + #ifdef __ARM_FEATURE_SIMD32 + s2.Add_OptSpaced("SIMD32"); + #endif +#endif + + #ifdef __ARM_FEATURE_CRYPTO + s2.Add_OptSpaced("CRYPTO"); + #endif + + #ifdef __ARM_FEATURE_SHA2 + s2.Add_OptSpaced("SHA2"); + #endif + + #ifdef __ARM_FEATURE_AES + s2.Add_OptSpaced("AES"); + #endif + + #ifdef __ARM_FEATURE_CRC32 + s2.Add_OptSpaced("CRC32"); + #endif + + #ifdef __ARM_FEATURE_UNALIGNED + s2.Add_OptSpaced("UNALIGNED"); + #endif + + + #ifdef MY_CPU_BE + s2.Add_OptSpaced("BE"); + #endif + + #if defined(MY_CPU_LE_UNALIGN) \ + && !defined(MY_CPU_X86_OR_AMD64) \ + && !defined(MY_CPU_ARM64) + s2.Add_OptSpaced("LE-unaligned"); + #endif + + if (!s2.IsEmpty()) + { + s.Add_OptSpaced(": "); + s += s2; + } } -- cgit v1.2.3-55-g6feb