diff options
author | Igor Pavlov <87184205+ip7z@users.noreply.github.com> | 2024-05-14 00:00:00 +0000 |
---|---|---|
committer | Igor Pavlov <87184205+ip7z@users.noreply.github.com> | 2024-05-15 23:55:04 +0500 |
commit | fc662341e6f85da78ada0e443f6116b978f79f22 (patch) | |
tree | 1be1cc402a7a9cbc18d4eeea6b141354c2d559e3 /CPP/Windows/SystemInfo.cpp | |
parent | 5b39dc76f1bc82f941d5c800ab9f34407a06b53a (diff) | |
download | 7zip-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.cpp | 225 |
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() ???) | ||
63 | static 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 | ||
778 | Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION | ||
779 | |||
725 | EXTERN_C_BEGIN | 780 | EXTERN_C_BEGIN |
726 | typedef void (WINAPI * Func_RtlGetVersion) (OSVERSIONINFOEXW *); | 781 | typedef void (WINAPI * Func_RtlGetVersion) (OSVERSIONINFOEXW *); |
727 | EXTERN_C_END | 782 | EXTERN_C_END |
@@ -952,24 +1007,13 @@ void GetVirtCpuid(AString &s) | |||
952 | 1007 | ||
953 | void GetCompiler(AString &s) | 1008 | void 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 | } |