aboutsummaryrefslogtreecommitdiff
path: root/CPP/Windows/SystemInfo.cpp
diff options
context:
space:
mode:
authorIgor Pavlov <87184205+ip7z@users.noreply.github.com>2024-05-14 00:00:00 +0000
committerIgor Pavlov <87184205+ip7z@users.noreply.github.com>2024-05-15 23:55:04 +0500
commitfc662341e6f85da78ada0e443f6116b978f79f22 (patch)
tree1be1cc402a7a9cbc18d4eeea6b141354c2d559e3 /CPP/Windows/SystemInfo.cpp
parent5b39dc76f1bc82f941d5c800ab9f34407a06b53a (diff)
download7zip-24.05.tar.gz
7zip-24.05.tar.bz2
7zip-24.05.zip
24.0524.05
Diffstat (limited to '')
-rw-r--r--CPP/Windows/SystemInfo.cpp225
1 files changed, 188 insertions, 37 deletions
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 @@
16#include <sys/utsname.h> 16#include <sys/utsname.h>
17#ifdef __APPLE__ 17#ifdef __APPLE__
18#include <sys/sysctl.h> 18#include <sys/sysctl.h>
19
19#elif !defined(_AIX) 20#elif !defined(_AIX)
20 21
22#if defined(__GLIBC__) && (__GLIBC__ * 100 + __GLIBC_MINOR__ >= 216)
23 #define Z7_GETAUXV_AVAILABLE
24#else
25// #pragma message("=== is not NEW GLIBC === ")
26 #if defined __has_include
27 #if __has_include (<sys/auxv.h>)
28// #pragma message("=== sys/auxv.h is avail=== ")
29 #define Z7_GETAUXV_AVAILABLE
30 #endif
31 #endif
32#endif
33
34#ifdef Z7_GETAUXV_AVAILABLE
35// #if defined __has_include
36// #if __has_include (<sys/auxv.h>)
21#include <sys/auxv.h> 37#include <sys/auxv.h>
38#define USE_HWCAP
39// #endif
40// #endif
22 41
23// #undef AT_HWCAP // to debug 42// #undef AT_HWCAP // to debug
24// #undef AT_HWCAP2 // to debug 43// #undef AT_HWCAP2 // to debug
@@ -36,11 +55,39 @@
36#endif 55#endif
37*/ 56*/
38 57
58#ifdef USE_HWCAP
59
60#if defined(__FreeBSD__)
61
62// #if (__FreeBSD__ >= 13) // (FreeBSD 12.01 is required for elf_aux_info() ???)
63static unsigned long MY_getauxval(int aux)
64{
65 unsigned long val;
66 if (elf_aux_info(aux, &val, sizeof(val)))
67 return 0;
68 return val;
69}
70
71#else // ! __FreeBSD__
72
39#ifdef MY_CPU_ARM_OR_ARM64 73#ifdef MY_CPU_ARM_OR_ARM64
74 #if defined __has_include
75 #if __has_include (<asm/hwcap.h>)
40#include <asm/hwcap.h> 76#include <asm/hwcap.h>
77 #endif
78 #endif
41#endif 79#endif
80
81#if defined(AT_HWCAP) || defined(AT_HWCAP2)
82#define MY_getauxval getauxval
42#endif 83#endif
43 84
85#endif // ! __FreeBSD__
86#endif // USE_HWCAP
87#endif // Z7_GETAUXV_AVAILABLE
88
89#endif // !defined(_AIX)
90
44#ifdef __linux__ 91#ifdef __linux__
45#include "../Windows/FileIO.h" 92#include "../Windows/FileIO.h"
46#endif 93#endif
@@ -70,13 +117,13 @@ static bool ReadFile_to_Buffer(CFSTR fileName, CByteBuffer &buf)
70 return false; 117 return false;
71 */ 118 */
72 size_t size = 0; 119 size_t size = 0;
73 size_t addSize = ((size_t)1 << 12); 120 size_t addSize = (size_t)1 << 12;
74 for (;;) 121 for (;;)
75 { 122 {
76 // printf("\nsize = %d\n", (unsigned)size); 123 // printf("\nsize = %d\n", (unsigned)size);
77 buf.ChangeSize_KeepData(size + addSize, size); 124 buf.ChangeSize_KeepData(size + addSize, size);
78 size_t processed; 125 size_t processed;
79 if (!file.ReadFull(buf + size, addSize, processed)) 126 if (!file.ReadFull(buf.NonConstData() + size, addSize, processed))
80 return false; 127 return false;
81 if (processed == 0) 128 if (processed == 0)
82 { 129 {
@@ -107,19 +154,19 @@ static void PrintCpuChars(AString &s, UInt32 v)
107{ 154{
108 for (unsigned j = 0; j < 4; j++) 155 for (unsigned j = 0; j < 4; j++)
109 { 156 {
110 Byte b = (Byte)(v & 0xFF); 157 const Byte b = (Byte)(v & 0xFF);
111 v >>= 8; 158 v >>= 8;
112 if (b == 0) 159 if (b == 0)
113 break; 160 break;
114 if (b >= 0x20 && b <= 0x7f) 161 if (b >= 0x20 && b <= 0x7f)
115 s += (char)b; 162 s.Add_Char((char)b);
116 else 163 else
117 { 164 {
118 s += '['; 165 s.Add_Char('[');
119 char temp[16]; 166 char temp[16];
120 ConvertUInt32ToHex(b, temp); 167 ConvertUInt32ToHex(b, temp);
121 s += temp; 168 s += temp;
122 s += ']'; 169 s.Add_Char(']');
123 } 170 }
124 } 171 }
125} 172}
@@ -137,7 +184,7 @@ static void x86cpuid_to_String(AString &s)
137 { 184 {
138 for (unsigned i = 0; i < 3; i++) 185 for (unsigned i = 0; i < 3; i++)
139 { 186 {
140 z7_x86_cpuid(a, 0x80000002 + i); 187 z7_x86_cpuid(a, (UInt32)(0x80000002 + i));
141 for (unsigned j = 0; j < 4; j++) 188 for (unsigned j = 0; j < 4; j++)
142 PrintCpuChars(s, a[j]); 189 PrintCpuChars(s, a[j]);
143 } 190 }
@@ -353,8 +400,8 @@ void PrintSize_KMGT_Or_Hex(AString &s, UInt64 v)
353 } 400 }
354 s.Add_UInt64(v); 401 s.Add_UInt64(v);
355 if (c) 402 if (c)
356 s += c; 403 s.Add_Char(c);
357 s += 'B'; 404 s.Add_Char('B');
358} 405}
359// #endif 406// #endif
360// #endif 407// #endif
@@ -380,7 +427,7 @@ static void SysInfo_To_String(AString &s, const SYSTEM_INFO &si)
380 s += " act:"; 427 s += " act:";
381 PrintHex(s, si.dwActiveProcessorMask); 428 PrintHex(s, si.dwActiveProcessorMask);
382 } 429 }
383 s += " cpus:"; 430 s += " threads:";
384 s.Add_UInt32(si.dwNumberOfProcessors); 431 s.Add_UInt32(si.dwNumberOfProcessors);
385 if (si.dwPageSize != 1 << 12) 432 if (si.dwPageSize != 1 << 12)
386 { 433 {
@@ -400,7 +447,7 @@ static void SysInfo_To_String(AString &s, const SYSTEM_INFO &si)
400 if (minAdd != kReserveSize) 447 if (minAdd != kReserveSize)
401 { 448 {
402 PrintSize_KMGT_Or_Hex(s, minAdd); 449 PrintSize_KMGT_Or_Hex(s, minAdd);
403 s += "-"; 450 s.Add_Minus();
404 } 451 }
405 else 452 else
406 { 453 {
@@ -470,11 +517,10 @@ static void AddBracedString(AString &dest, AString &src)
470{ 517{
471 if (!src.IsEmpty()) 518 if (!src.IsEmpty())
472 { 519 {
473 AString s; 520 dest.Add_Space_if_NotEmpty();
474 s += '('; 521 dest.Add_Char('(');
475 s += src; 522 dest += src;
476 s += ')'; 523 dest.Add_Char(')');
477 dest.Add_OptSpaced(s);
478 } 524 }
479} 525}
480 526
@@ -527,6 +573,13 @@ void CCpuName::Fill()
527 { 573 {
528 Add_sysctlbyname_to_String("machdep.cpu.brand_string", s); 574 Add_sysctlbyname_to_String("machdep.cpu.brand_string", s);
529 } 575 }
576 #elif defined(MY_CPU_E2K) && defined(Z7_MCST_LCC_VERSION) && (Z7_MCST_LCC_VERSION >= 12323)
577 {
578 s += "mcst ";
579 s += __builtin_cpu_name();
580 s.Add_Space();
581 s += __builtin_cpu_arch();
582 }
530 #endif 583 #endif
531 584
532 585
@@ -592,11 +645,11 @@ void CCpuName::Fill()
592 const CByteBuffer &buf = bufs[i]; 645 const CByteBuffer &buf = bufs[i];
593 if (buf.Size() == 8) 646 if (buf.Size() == 8)
594 { 647 {
595 UInt32 high = GetUi32(buf); 648 const UInt32 high = GetUi32(buf);
596 if (high != 0) 649 if (high != 0)
597 { 650 {
598 PrintHex(Microcode, high); 651 PrintHex(Microcode, high);
599 Microcode += "."; 652 Microcode.Add_Dot();
600 } 653 }
601 PrintHex(Microcode, GetUi32(buf + 4)); 654 PrintHex(Microcode, GetUi32(buf + 4));
602 } 655 }
@@ -622,7 +675,7 @@ void AddCpuFeatures(AString &s)
622 UInt64 flags = 0; 675 UInt64 flags = 0;
623 for (unsigned i = 0; i < kNumFeatures; i++) 676 for (unsigned i = 0; i < kNumFeatures; i++)
624 { 677 {
625 if (IsProcessorFeaturePresent(i)) 678 if (IsProcessorFeaturePresent((DWORD)i))
626 { 679 {
627 flags += (UInt64)1 << i; 680 flags += (UInt64)1 << i;
628 // s.Add_Space_if_NotEmpty(); 681 // s.Add_Space_if_NotEmpty();
@@ -682,7 +735,7 @@ void AddCpuFeatures(AString &s)
682 #ifdef AT_HWCAP 735 #ifdef AT_HWCAP
683 s.Add_OptSpaced("hwcap:"); 736 s.Add_OptSpaced("hwcap:");
684 { 737 {
685 unsigned long h = getauxval(AT_HWCAP); 738 unsigned long h = MY_getauxval(AT_HWCAP);
686 PrintHex(s, h); 739 PrintHex(s, h);
687 #ifdef MY_CPU_ARM64 740 #ifdef MY_CPU_ARM64
688 if (h & HWCAP_CRC32) s += ":CRC32"; 741 if (h & HWCAP_CRC32) s += ":CRC32";
@@ -698,7 +751,7 @@ void AddCpuFeatures(AString &s)
698 751
699 #ifdef AT_HWCAP2 752 #ifdef AT_HWCAP2
700 { 753 {
701 unsigned long h = getauxval(AT_HWCAP2); 754 unsigned long h = MY_getauxval(AT_HWCAP2);
702 #ifndef MY_CPU_ARM 755 #ifndef MY_CPU_ARM
703 if (h != 0) 756 if (h != 0)
704 #endif 757 #endif
@@ -722,6 +775,8 @@ void AddCpuFeatures(AString &s)
722#ifdef _WIN32 775#ifdef _WIN32
723#ifndef UNDER_CE 776#ifndef UNDER_CE
724 777
778Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION
779
725EXTERN_C_BEGIN 780EXTERN_C_BEGIN
726typedef void (WINAPI * Func_RtlGetVersion) (OSVERSIONINFOEXW *); 781typedef void (WINAPI * Func_RtlGetVersion) (OSVERSIONINFOEXW *);
727EXTERN_C_END 782EXTERN_C_END
@@ -952,24 +1007,13 @@ void GetVirtCpuid(AString &s)
952 1007
953void GetCompiler(AString &s) 1008void GetCompiler(AString &s)
954{ 1009{
955 #ifdef __VERSION__
956 s += __VERSION__;
957 #endif
958
959 #ifdef __GNUC__
960 s += " GCC ";
961 s.Add_UInt32(__GNUC__);
962 s.Add_Dot();
963 s.Add_UInt32(__GNUC_MINOR__);
964 s.Add_Dot();
965 s.Add_UInt32(__GNUC_PATCHLEVEL__);
966 #endif
967
968 #ifdef __clang__ 1010 #ifdef __clang__
969 s += " CLANG "; 1011 s += " CLANG ";
970 s.Add_UInt32(__clang_major__); 1012 s.Add_UInt32(__clang_major__);
971 s.Add_Dot(); 1013 s.Add_Dot();
972 s.Add_UInt32(__clang_minor__); 1014 s.Add_UInt32(__clang_minor__);
1015 s.Add_Dot();
1016 s.Add_UInt32(__clang_patchlevel__);
973 #endif 1017 #endif
974 1018
975 #ifdef __xlC__ 1019 #ifdef __xlC__
@@ -985,12 +1029,67 @@ void GetCompiler(AString &s)
985 #endif 1029 #endif
986 #endif 1030 #endif
987 1031
1032 // #define __LCC__ 126
1033 // #define __LCC_MINOR__ 20
1034 // #define __MCST__ 1
1035 #ifdef __MCST__
1036 s += " MCST";
1037 #endif
1038 #ifdef __LCC__
1039 s += " LCC ";
1040 s.Add_UInt32(__LCC__ / 100);
1041 s.Add_Dot();
1042 s.Add_UInt32(__LCC__ % 100 / 10);
1043 s.Add_UInt32(__LCC__ % 10);
1044 #ifdef __LCC_MINOR__
1045 s.Add_Dot();
1046 s.Add_UInt32(__LCC_MINOR__ / 10);
1047 s.Add_UInt32(__LCC_MINOR__ % 10);
1048 #endif
1049 #endif
1050
1051 // #define __EDG_VERSION__ 602
1052 #ifdef __EDG_VERSION__
1053 s += " EDG ";
1054 s.Add_UInt32(__EDG_VERSION__ / 100);
1055 s.Add_Dot();
1056 s.Add_UInt32(__EDG_VERSION__ % 100 / 10);
1057 s.Add_UInt32(__EDG_VERSION__ % 10);
1058 #endif
1059
1060 #ifdef __VERSION__
1061 s.Add_Space();
1062 s += "ver:";
1063 s += __VERSION__;
1064 #endif
1065
1066 #ifdef __GNUC__
1067 s += " GCC ";
1068 s.Add_UInt32(__GNUC__);
1069 s.Add_Dot();
1070 s.Add_UInt32(__GNUC_MINOR__);
1071 s.Add_Dot();
1072 s.Add_UInt32(__GNUC_PATCHLEVEL__);
1073 #endif
1074
1075
988 #ifdef _MSC_VER 1076 #ifdef _MSC_VER
989 s += " MSC "; 1077 s += " MSC ";
990 s.Add_UInt32(_MSC_VER); 1078 s.Add_UInt32(_MSC_VER);
1079 #ifdef _MSC_FULL_VER
1080 s.Add_Dot();
1081 s.Add_UInt32(_MSC_FULL_VER);
1082 #endif
1083
991 #endif 1084 #endif
992 1085
993 #if defined(__AVX2__) 1086 #if defined(__AVX512F__)
1087 #if defined(__AVX512VL__)
1088 #define MY_CPU_COMPILE_ISA "AVX512VL"
1089 #else
1090 #define MY_CPU_COMPILE_ISA "AVX512F"
1091 #endif
1092 #elif defined(__AVX2__)
994 #define MY_CPU_COMPILE_ISA "AVX2" 1093 #define MY_CPU_COMPILE_ISA "AVX2"
995 #elif defined(__AVX__) 1094 #elif defined(__AVX__)
996 #define MY_CPU_COMPILE_ISA "AVX" 1095 #define MY_CPU_COMPILE_ISA "AVX"
@@ -1014,9 +1113,61 @@ void GetCompiler(AString &s)
1014 #define MY_CPU_COMPILE_ISA "IA32" 1113 #define MY_CPU_COMPILE_ISA "IA32"
1015 #endif 1114 #endif
1016 1115
1116 AString s2;
1017 1117
1018 #ifdef MY_CPU_COMPILE_ISA 1118 #ifdef MY_CPU_COMPILE_ISA
1019 s += ':'; 1119 s2.Add_OptSpaced(MY_CPU_COMPILE_ISA);
1020 s.Add_OptSpaced(MY_CPU_COMPILE_ISA); 1120 #endif
1121
1122#ifndef MY_CPU_ARM64
1123 #ifdef __ARM_FP
1124 s2.Add_OptSpaced("FP");
1125 #endif
1126 #ifdef __ARM_NEON
1127 s2.Add_OptSpaced("NEON");
1021 #endif 1128 #endif
1129 #ifdef __NEON__
1130 s2.Add_OptSpaced("__NEON__");
1131 #endif
1132 #ifdef __ARM_FEATURE_SIMD32
1133 s2.Add_OptSpaced("SIMD32");
1134 #endif
1135#endif
1136
1137 #ifdef __ARM_FEATURE_CRYPTO
1138 s2.Add_OptSpaced("CRYPTO");
1139 #endif
1140
1141 #ifdef __ARM_FEATURE_SHA2
1142 s2.Add_OptSpaced("SHA2");
1143 #endif
1144
1145 #ifdef __ARM_FEATURE_AES
1146 s2.Add_OptSpaced("AES");
1147 #endif
1148
1149 #ifdef __ARM_FEATURE_CRC32
1150 s2.Add_OptSpaced("CRC32");
1151 #endif
1152
1153 #ifdef __ARM_FEATURE_UNALIGNED
1154 s2.Add_OptSpaced("UNALIGNED");
1155 #endif
1156
1157
1158 #ifdef MY_CPU_BE
1159 s2.Add_OptSpaced("BE");
1160 #endif
1161
1162 #if defined(MY_CPU_LE_UNALIGN) \
1163 && !defined(MY_CPU_X86_OR_AMD64) \
1164 && !defined(MY_CPU_ARM64)
1165 s2.Add_OptSpaced("LE-unaligned");
1166 #endif
1167
1168 if (!s2.IsEmpty())
1169 {
1170 s.Add_OptSpaced(": ");
1171 s += s2;
1172 }
1022} 1173}