xref: /aosp_15_r20/external/lzma/CPP/Windows/SystemInfo.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Windows/SystemInfo.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #include "../../C/CpuArch.h"
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #include "../Common/IntToString.h"
8*f6dc9357SAndroid Build Coastguard Worker #include "../Common/StringConvert.h"
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker #include "Registry.h"
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker #else
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker #include <unistd.h>
17*f6dc9357SAndroid Build Coastguard Worker #include <sys/utsname.h>
18*f6dc9357SAndroid Build Coastguard Worker #ifdef __APPLE__
19*f6dc9357SAndroid Build Coastguard Worker #include <sys/sysctl.h>
20*f6dc9357SAndroid Build Coastguard Worker 
21*f6dc9357SAndroid Build Coastguard Worker #elif !defined(_AIX)
22*f6dc9357SAndroid Build Coastguard Worker 
23*f6dc9357SAndroid Build Coastguard Worker #if defined(__GLIBC__) && (__GLIBC__ * 100 + __GLIBC_MINOR__ >= 216)
24*f6dc9357SAndroid Build Coastguard Worker   #define Z7_GETAUXV_AVAILABLE
25*f6dc9357SAndroid Build Coastguard Worker #else
26*f6dc9357SAndroid Build Coastguard Worker //  #pragma message("=== is not NEW GLIBC === ")
27*f6dc9357SAndroid Build Coastguard Worker   #if defined __has_include
28*f6dc9357SAndroid Build Coastguard Worker   #if __has_include (<sys/auxv.h>)
29*f6dc9357SAndroid Build Coastguard Worker //    #pragma message("=== sys/auxv.h is avail=== ")
30*f6dc9357SAndroid Build Coastguard Worker     #define Z7_GETAUXV_AVAILABLE
31*f6dc9357SAndroid Build Coastguard Worker   #endif
32*f6dc9357SAndroid Build Coastguard Worker   #endif
33*f6dc9357SAndroid Build Coastguard Worker #endif
34*f6dc9357SAndroid Build Coastguard Worker 
35*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_GETAUXV_AVAILABLE
36*f6dc9357SAndroid Build Coastguard Worker // #if defined __has_include
37*f6dc9357SAndroid Build Coastguard Worker // #if __has_include (<sys/auxv.h>)
38*f6dc9357SAndroid Build Coastguard Worker #include <sys/auxv.h>
39*f6dc9357SAndroid Build Coastguard Worker #define USE_HWCAP
40*f6dc9357SAndroid Build Coastguard Worker // #endif
41*f6dc9357SAndroid Build Coastguard Worker // #endif
42*f6dc9357SAndroid Build Coastguard Worker 
43*f6dc9357SAndroid Build Coastguard Worker // #undef AT_HWCAP    // to debug
44*f6dc9357SAndroid Build Coastguard Worker // #undef AT_HWCAP2   // to debug
45*f6dc9357SAndroid Build Coastguard Worker 
46*f6dc9357SAndroid Build Coastguard Worker /* the following patch for some debian systems.
47*f6dc9357SAndroid Build Coastguard Worker    Is it OK to define AT_HWCAP and AT_HWCAP2 here with these constant numbers? */
48*f6dc9357SAndroid Build Coastguard Worker /*
49*f6dc9357SAndroid Build Coastguard Worker #if defined(__FreeBSD_kernel__) && defined(__GLIBC__)
50*f6dc9357SAndroid Build Coastguard Worker   #ifndef AT_HWCAP
51*f6dc9357SAndroid Build Coastguard Worker     #define AT_HWCAP 16
52*f6dc9357SAndroid Build Coastguard Worker   #endif
53*f6dc9357SAndroid Build Coastguard Worker   #ifndef AT_HWCAP2
54*f6dc9357SAndroid Build Coastguard Worker     #define AT_HWCAP2 26
55*f6dc9357SAndroid Build Coastguard Worker   #endif
56*f6dc9357SAndroid Build Coastguard Worker #endif
57*f6dc9357SAndroid Build Coastguard Worker */
58*f6dc9357SAndroid Build Coastguard Worker 
59*f6dc9357SAndroid Build Coastguard Worker #ifdef USE_HWCAP
60*f6dc9357SAndroid Build Coastguard Worker 
61*f6dc9357SAndroid Build Coastguard Worker #if defined(__FreeBSD__)
62*f6dc9357SAndroid Build Coastguard Worker 
63*f6dc9357SAndroid Build Coastguard Worker // #if (__FreeBSD__ >= 13) // (FreeBSD 12.01 is required for elf_aux_info() ???)
MY_getauxval(int aux)64*f6dc9357SAndroid Build Coastguard Worker static unsigned long MY_getauxval(int aux)
65*f6dc9357SAndroid Build Coastguard Worker {
66*f6dc9357SAndroid Build Coastguard Worker   unsigned long val;
67*f6dc9357SAndroid Build Coastguard Worker   if (elf_aux_info(aux, &val, sizeof(val)))
68*f6dc9357SAndroid Build Coastguard Worker     return 0;
69*f6dc9357SAndroid Build Coastguard Worker   return val;
70*f6dc9357SAndroid Build Coastguard Worker }
71*f6dc9357SAndroid Build Coastguard Worker 
72*f6dc9357SAndroid Build Coastguard Worker #else // ! __FreeBSD__
73*f6dc9357SAndroid Build Coastguard Worker 
74*f6dc9357SAndroid Build Coastguard Worker #ifdef MY_CPU_ARM_OR_ARM64
75*f6dc9357SAndroid Build Coastguard Worker   #if defined __has_include
76*f6dc9357SAndroid Build Coastguard Worker   #if __has_include (<asm/hwcap.h>)
77*f6dc9357SAndroid Build Coastguard Worker #include <asm/hwcap.h>
78*f6dc9357SAndroid Build Coastguard Worker   #endif
79*f6dc9357SAndroid Build Coastguard Worker   #endif
80*f6dc9357SAndroid Build Coastguard Worker #endif
81*f6dc9357SAndroid Build Coastguard Worker 
82*f6dc9357SAndroid Build Coastguard Worker #if defined(AT_HWCAP) || defined(AT_HWCAP2)
83*f6dc9357SAndroid Build Coastguard Worker #define MY_getauxval  getauxval
84*f6dc9357SAndroid Build Coastguard Worker #endif
85*f6dc9357SAndroid Build Coastguard Worker 
86*f6dc9357SAndroid Build Coastguard Worker #endif // ! __FreeBSD__
87*f6dc9357SAndroid Build Coastguard Worker #endif // USE_HWCAP
88*f6dc9357SAndroid Build Coastguard Worker #endif // Z7_GETAUXV_AVAILABLE
89*f6dc9357SAndroid Build Coastguard Worker 
90*f6dc9357SAndroid Build Coastguard Worker #endif // !defined(_AIX)
91*f6dc9357SAndroid Build Coastguard Worker 
92*f6dc9357SAndroid Build Coastguard Worker #ifdef __linux__
93*f6dc9357SAndroid Build Coastguard Worker #include "../Windows/FileIO.h"
94*f6dc9357SAndroid Build Coastguard Worker #endif
95*f6dc9357SAndroid Build Coastguard Worker 
96*f6dc9357SAndroid Build Coastguard Worker #endif // WIN32
97*f6dc9357SAndroid Build Coastguard Worker 
98*f6dc9357SAndroid Build Coastguard Worker #include "SystemInfo.h"
99*f6dc9357SAndroid Build Coastguard Worker #include "System.h"
100*f6dc9357SAndroid Build Coastguard Worker 
101*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
102*f6dc9357SAndroid Build Coastguard Worker 
103*f6dc9357SAndroid Build Coastguard Worker #ifdef __linux__
104*f6dc9357SAndroid Build Coastguard Worker 
ReadFile_to_Buffer(CFSTR fileName,CByteBuffer & buf)105*f6dc9357SAndroid Build Coastguard Worker static bool ReadFile_to_Buffer(CFSTR fileName, CByteBuffer &buf)
106*f6dc9357SAndroid Build Coastguard Worker {
107*f6dc9357SAndroid Build Coastguard Worker   NWindows::NFile::NIO::CInFile file;
108*f6dc9357SAndroid Build Coastguard Worker   if (!file.Open(fileName))
109*f6dc9357SAndroid Build Coastguard Worker     return false;
110*f6dc9357SAndroid Build Coastguard Worker   /*
111*f6dc9357SAndroid Build Coastguard Worker   UInt64 size;
112*f6dc9357SAndroid Build Coastguard Worker   if (!file.GetLength(size))
113*f6dc9357SAndroid Build Coastguard Worker   {
114*f6dc9357SAndroid Build Coastguard Worker     // GetLength() doesn't work "/proc/cpuinfo"
115*f6dc9357SAndroid Build Coastguard Worker     return false;
116*f6dc9357SAndroid Build Coastguard Worker   }
117*f6dc9357SAndroid Build Coastguard Worker   if (size >= ((UInt32)1 << 29))
118*f6dc9357SAndroid Build Coastguard Worker     return false;
119*f6dc9357SAndroid Build Coastguard Worker   */
120*f6dc9357SAndroid Build Coastguard Worker   size_t size = 0;
121*f6dc9357SAndroid Build Coastguard Worker   size_t addSize = (size_t)1 << 12;
122*f6dc9357SAndroid Build Coastguard Worker   for (;;)
123*f6dc9357SAndroid Build Coastguard Worker   {
124*f6dc9357SAndroid Build Coastguard Worker     // printf("\nsize = %d\n", (unsigned)size);
125*f6dc9357SAndroid Build Coastguard Worker     buf.ChangeSize_KeepData(size + addSize, size);
126*f6dc9357SAndroid Build Coastguard Worker     size_t processed;
127*f6dc9357SAndroid Build Coastguard Worker     if (!file.ReadFull(buf.NonConstData() + size, addSize, processed))
128*f6dc9357SAndroid Build Coastguard Worker       return false;
129*f6dc9357SAndroid Build Coastguard Worker     if (processed == 0)
130*f6dc9357SAndroid Build Coastguard Worker     {
131*f6dc9357SAndroid Build Coastguard Worker       buf.ChangeSize_KeepData(size, size);
132*f6dc9357SAndroid Build Coastguard Worker       return true;
133*f6dc9357SAndroid Build Coastguard Worker     }
134*f6dc9357SAndroid Build Coastguard Worker     size += processed;
135*f6dc9357SAndroid Build Coastguard Worker     addSize *= 2;
136*f6dc9357SAndroid Build Coastguard Worker   }
137*f6dc9357SAndroid Build Coastguard Worker }
138*f6dc9357SAndroid Build Coastguard Worker 
139*f6dc9357SAndroid Build Coastguard Worker #endif
140*f6dc9357SAndroid Build Coastguard Worker 
141*f6dc9357SAndroid Build Coastguard Worker 
142*f6dc9357SAndroid Build Coastguard Worker #if defined(_WIN32) || defined(AT_HWCAP) || defined(AT_HWCAP2)
PrintHex(AString & s,UInt64 v)143*f6dc9357SAndroid Build Coastguard Worker static void PrintHex(AString &s, UInt64 v)
144*f6dc9357SAndroid Build Coastguard Worker {
145*f6dc9357SAndroid Build Coastguard Worker   char temp[32];
146*f6dc9357SAndroid Build Coastguard Worker   ConvertUInt64ToHex(v, temp);
147*f6dc9357SAndroid Build Coastguard Worker   s += temp;
148*f6dc9357SAndroid Build Coastguard Worker }
149*f6dc9357SAndroid Build Coastguard Worker #endif
150*f6dc9357SAndroid Build Coastguard Worker 
151*f6dc9357SAndroid Build Coastguard Worker #ifdef MY_CPU_X86_OR_AMD64
152*f6dc9357SAndroid Build Coastguard Worker 
153*f6dc9357SAndroid Build Coastguard Worker Z7_NO_INLINE
PrintCpuChars(AString & s,UInt32 v)154*f6dc9357SAndroid Build Coastguard Worker static void PrintCpuChars(AString &s, UInt32 v)
155*f6dc9357SAndroid Build Coastguard Worker {
156*f6dc9357SAndroid Build Coastguard Worker   for (unsigned j = 0; j < 4; j++)
157*f6dc9357SAndroid Build Coastguard Worker   {
158*f6dc9357SAndroid Build Coastguard Worker     const Byte b = (Byte)(v & 0xFF);
159*f6dc9357SAndroid Build Coastguard Worker     v >>= 8;
160*f6dc9357SAndroid Build Coastguard Worker     if (b == 0)
161*f6dc9357SAndroid Build Coastguard Worker       break;
162*f6dc9357SAndroid Build Coastguard Worker     if (b >= 0x20 && b <= 0x7f)
163*f6dc9357SAndroid Build Coastguard Worker       s.Add_Char((char)b);
164*f6dc9357SAndroid Build Coastguard Worker     else
165*f6dc9357SAndroid Build Coastguard Worker     {
166*f6dc9357SAndroid Build Coastguard Worker       s.Add_Char('[');
167*f6dc9357SAndroid Build Coastguard Worker       char temp[16];
168*f6dc9357SAndroid Build Coastguard Worker       ConvertUInt32ToHex(b, temp);
169*f6dc9357SAndroid Build Coastguard Worker       s += temp;
170*f6dc9357SAndroid Build Coastguard Worker       s.Add_Char(']');
171*f6dc9357SAndroid Build Coastguard Worker     }
172*f6dc9357SAndroid Build Coastguard Worker   }
173*f6dc9357SAndroid Build Coastguard Worker }
174*f6dc9357SAndroid Build Coastguard Worker 
175*f6dc9357SAndroid Build Coastguard Worker 
x86cpuid_to_String(AString & s)176*f6dc9357SAndroid Build Coastguard Worker static void x86cpuid_to_String(AString &s)
177*f6dc9357SAndroid Build Coastguard Worker {
178*f6dc9357SAndroid Build Coastguard Worker   s.Empty();
179*f6dc9357SAndroid Build Coastguard Worker 
180*f6dc9357SAndroid Build Coastguard Worker   UInt32 a[4];
181*f6dc9357SAndroid Build Coastguard Worker   // cpuid was called already. So we don't check for cpuid availability here
182*f6dc9357SAndroid Build Coastguard Worker   z7_x86_cpuid(a, 0x80000000);
183*f6dc9357SAndroid Build Coastguard Worker 
184*f6dc9357SAndroid Build Coastguard Worker   if (a[0] >= 0x80000004) // if (maxFunc2 >= hi+4) the full name is available
185*f6dc9357SAndroid Build Coastguard Worker   {
186*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = 0; i < 3; i++)
187*f6dc9357SAndroid Build Coastguard Worker     {
188*f6dc9357SAndroid Build Coastguard Worker       z7_x86_cpuid(a, (UInt32)(0x80000002 + i));
189*f6dc9357SAndroid Build Coastguard Worker       for (unsigned j = 0; j < 4; j++)
190*f6dc9357SAndroid Build Coastguard Worker         PrintCpuChars(s, a[j]);
191*f6dc9357SAndroid Build Coastguard Worker     }
192*f6dc9357SAndroid Build Coastguard Worker   }
193*f6dc9357SAndroid Build Coastguard Worker 
194*f6dc9357SAndroid Build Coastguard Worker   s.Trim();
195*f6dc9357SAndroid Build Coastguard Worker 
196*f6dc9357SAndroid Build Coastguard Worker   if (s.IsEmpty())
197*f6dc9357SAndroid Build Coastguard Worker   {
198*f6dc9357SAndroid Build Coastguard Worker     z7_x86_cpuid(a, 0);
199*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = 1; i < 4; i++)
200*f6dc9357SAndroid Build Coastguard Worker     {
201*f6dc9357SAndroid Build Coastguard Worker       const unsigned j = (i ^ (i >> 1));
202*f6dc9357SAndroid Build Coastguard Worker       PrintCpuChars(s, a[j]);
203*f6dc9357SAndroid Build Coastguard Worker     }
204*f6dc9357SAndroid Build Coastguard Worker     s.Trim();
205*f6dc9357SAndroid Build Coastguard Worker   }
206*f6dc9357SAndroid Build Coastguard Worker }
207*f6dc9357SAndroid Build Coastguard Worker 
208*f6dc9357SAndroid Build Coastguard Worker /*
209*f6dc9357SAndroid Build Coastguard Worker static void x86cpuid_all_to_String(AString &s)
210*f6dc9357SAndroid Build Coastguard Worker {
211*f6dc9357SAndroid Build Coastguard Worker   Cx86cpuid p;
212*f6dc9357SAndroid Build Coastguard Worker   if (!x86cpuid_CheckAndRead(&p))
213*f6dc9357SAndroid Build Coastguard Worker     return;
214*f6dc9357SAndroid Build Coastguard Worker   s += "x86cpuid maxFunc = ";
215*f6dc9357SAndroid Build Coastguard Worker   s.Add_UInt32(p.maxFunc);
216*f6dc9357SAndroid Build Coastguard Worker   for (unsigned j = 0; j <= p.maxFunc; j++)
217*f6dc9357SAndroid Build Coastguard Worker   {
218*f6dc9357SAndroid Build Coastguard Worker     s.Add_LF();
219*f6dc9357SAndroid Build Coastguard Worker     // s.Add_UInt32(j); // align
220*f6dc9357SAndroid Build Coastguard Worker     {
221*f6dc9357SAndroid Build Coastguard Worker       char temp[32];
222*f6dc9357SAndroid Build Coastguard Worker       ConvertUInt32ToString(j, temp);
223*f6dc9357SAndroid Build Coastguard Worker       unsigned len = (unsigned)strlen(temp);
224*f6dc9357SAndroid Build Coastguard Worker       while (len < 8)
225*f6dc9357SAndroid Build Coastguard Worker       {
226*f6dc9357SAndroid Build Coastguard Worker         len++;
227*f6dc9357SAndroid Build Coastguard Worker         s.Add_Space();
228*f6dc9357SAndroid Build Coastguard Worker       }
229*f6dc9357SAndroid Build Coastguard Worker       s += temp;
230*f6dc9357SAndroid Build Coastguard Worker     }
231*f6dc9357SAndroid Build Coastguard Worker 
232*f6dc9357SAndroid Build Coastguard Worker     s += ":";
233*f6dc9357SAndroid Build Coastguard Worker     UInt32 d[4] = { 0 };
234*f6dc9357SAndroid Build Coastguard Worker     MyCPUID(j, &d[0], &d[1], &d[2], &d[3]);
235*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = 0; i < 4; i++)
236*f6dc9357SAndroid Build Coastguard Worker     {
237*f6dc9357SAndroid Build Coastguard Worker       char temp[32];
238*f6dc9357SAndroid Build Coastguard Worker       ConvertUInt32ToHex8Digits(d[i], temp);
239*f6dc9357SAndroid Build Coastguard Worker       s.Add_Space();
240*f6dc9357SAndroid Build Coastguard Worker       s += temp;
241*f6dc9357SAndroid Build Coastguard Worker     }
242*f6dc9357SAndroid Build Coastguard Worker   }
243*f6dc9357SAndroid Build Coastguard Worker }
244*f6dc9357SAndroid Build Coastguard Worker */
245*f6dc9357SAndroid Build Coastguard Worker 
246*f6dc9357SAndroid Build Coastguard Worker #endif
247*f6dc9357SAndroid Build Coastguard Worker 
248*f6dc9357SAndroid Build Coastguard Worker 
249*f6dc9357SAndroid Build Coastguard Worker 
250*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
251*f6dc9357SAndroid Build Coastguard Worker 
252*f6dc9357SAndroid Build Coastguard Worker static const char * const k_PROCESSOR_ARCHITECTURE[] =
253*f6dc9357SAndroid Build Coastguard Worker {
254*f6dc9357SAndroid Build Coastguard Worker     "x86" // "INTEL"
255*f6dc9357SAndroid Build Coastguard Worker   , "MIPS"
256*f6dc9357SAndroid Build Coastguard Worker   , "ALPHA"
257*f6dc9357SAndroid Build Coastguard Worker   , "PPC"
258*f6dc9357SAndroid Build Coastguard Worker   , "SHX"
259*f6dc9357SAndroid Build Coastguard Worker   , "ARM"
260*f6dc9357SAndroid Build Coastguard Worker   , "IA64"
261*f6dc9357SAndroid Build Coastguard Worker   , "ALPHA64"
262*f6dc9357SAndroid Build Coastguard Worker   , "MSIL"
263*f6dc9357SAndroid Build Coastguard Worker   , "x64" // "AMD64"
264*f6dc9357SAndroid Build Coastguard Worker   , "IA32_ON_WIN64"
265*f6dc9357SAndroid Build Coastguard Worker   , "NEUTRAL"
266*f6dc9357SAndroid Build Coastguard Worker   , "ARM64"
267*f6dc9357SAndroid Build Coastguard Worker   , "ARM32_ON_WIN64"
268*f6dc9357SAndroid Build Coastguard Worker };
269*f6dc9357SAndroid Build Coastguard Worker 
270*f6dc9357SAndroid Build Coastguard Worker #define Z7_WIN_PROCESSOR_ARCHITECTURE_INTEL 0
271*f6dc9357SAndroid Build Coastguard Worker #define Z7_WIN_PROCESSOR_ARCHITECTURE_AMD64 9
272*f6dc9357SAndroid Build Coastguard Worker 
273*f6dc9357SAndroid Build Coastguard Worker 
274*f6dc9357SAndroid Build Coastguard Worker #define Z7_WIN_PROCESSOR_INTEL_PENTIUM  586
275*f6dc9357SAndroid Build Coastguard Worker #define Z7_WIN_PROCESSOR_AMD_X8664      8664
276*f6dc9357SAndroid Build Coastguard Worker 
277*f6dc9357SAndroid Build Coastguard Worker /*
278*f6dc9357SAndroid Build Coastguard Worker static const CUInt32PCharPair k_PROCESSOR[] =
279*f6dc9357SAndroid Build Coastguard Worker {
280*f6dc9357SAndroid Build Coastguard Worker   { 2200, "IA64" },
281*f6dc9357SAndroid Build Coastguard Worker   { 8664, "x64" }
282*f6dc9357SAndroid Build Coastguard Worker };
283*f6dc9357SAndroid Build Coastguard Worker 
284*f6dc9357SAndroid Build Coastguard Worker #define PROCESSOR_INTEL_386      386
285*f6dc9357SAndroid Build Coastguard Worker #define PROCESSOR_INTEL_486      486
286*f6dc9357SAndroid Build Coastguard Worker #define PROCESSOR_INTEL_PENTIUM  586
287*f6dc9357SAndroid Build Coastguard Worker #define PROCESSOR_INTEL_860      860
288*f6dc9357SAndroid Build Coastguard Worker #define PROCESSOR_INTEL_IA64     2200
289*f6dc9357SAndroid Build Coastguard Worker #define PROCESSOR_AMD_X8664      8664
290*f6dc9357SAndroid Build Coastguard Worker #define PROCESSOR_MIPS_R2000     2000
291*f6dc9357SAndroid Build Coastguard Worker #define PROCESSOR_MIPS_R3000     3000
292*f6dc9357SAndroid Build Coastguard Worker #define PROCESSOR_MIPS_R4000     4000
293*f6dc9357SAndroid Build Coastguard Worker #define PROCESSOR_ALPHA_21064    21064
294*f6dc9357SAndroid Build Coastguard Worker #define PROCESSOR_PPC_601        601
295*f6dc9357SAndroid Build Coastguard Worker #define PROCESSOR_PPC_603        603
296*f6dc9357SAndroid Build Coastguard Worker #define PROCESSOR_PPC_604        604
297*f6dc9357SAndroid Build Coastguard Worker #define PROCESSOR_PPC_620        620
298*f6dc9357SAndroid Build Coastguard Worker #define PROCESSOR_HITACHI_SH3    10003
299*f6dc9357SAndroid Build Coastguard Worker #define PROCESSOR_HITACHI_SH3E   10004
300*f6dc9357SAndroid Build Coastguard Worker #define PROCESSOR_HITACHI_SH4    10005
301*f6dc9357SAndroid Build Coastguard Worker #define PROCESSOR_MOTOROLA_821   821
302*f6dc9357SAndroid Build Coastguard Worker #define PROCESSOR_SHx_SH3        103
303*f6dc9357SAndroid Build Coastguard Worker #define PROCESSOR_SHx_SH4        104
304*f6dc9357SAndroid Build Coastguard Worker #define PROCESSOR_STRONGARM      2577    // 0xA11
305*f6dc9357SAndroid Build Coastguard Worker #define PROCESSOR_ARM720         1824    // 0x720
306*f6dc9357SAndroid Build Coastguard Worker #define PROCESSOR_ARM820         2080    // 0x820
307*f6dc9357SAndroid Build Coastguard Worker #define PROCESSOR_ARM920         2336    // 0x920
308*f6dc9357SAndroid Build Coastguard Worker #define PROCESSOR_ARM_7TDMI      70001
309*f6dc9357SAndroid Build Coastguard Worker #define PROCESSOR_OPTIL          18767   // 0x494f
310*f6dc9357SAndroid Build Coastguard Worker */
311*f6dc9357SAndroid Build Coastguard Worker 
312*f6dc9357SAndroid Build Coastguard Worker 
313*f6dc9357SAndroid Build Coastguard Worker /*
314*f6dc9357SAndroid Build Coastguard Worker static const char * const k_PF[] =
315*f6dc9357SAndroid Build Coastguard Worker {
316*f6dc9357SAndroid Build Coastguard Worker     "FP_ERRATA"
317*f6dc9357SAndroid Build Coastguard Worker   , "FP_EMU"
318*f6dc9357SAndroid Build Coastguard Worker   , "CMPXCHG"
319*f6dc9357SAndroid Build Coastguard Worker   , "MMX"
320*f6dc9357SAndroid Build Coastguard Worker   , "PPC_MOVEMEM_64BIT"
321*f6dc9357SAndroid Build Coastguard Worker   , "ALPHA_BYTE"
322*f6dc9357SAndroid Build Coastguard Worker   , "SSE"
323*f6dc9357SAndroid Build Coastguard Worker   , "3DNOW"
324*f6dc9357SAndroid Build Coastguard Worker   , "RDTSC"
325*f6dc9357SAndroid Build Coastguard Worker   , "PAE"
326*f6dc9357SAndroid Build Coastguard Worker   , "SSE2"
327*f6dc9357SAndroid Build Coastguard Worker   , "SSE_DAZ"
328*f6dc9357SAndroid Build Coastguard Worker   , "NX"
329*f6dc9357SAndroid Build Coastguard Worker   , "SSE3"
330*f6dc9357SAndroid Build Coastguard Worker   , "CMPXCHG16B"
331*f6dc9357SAndroid Build Coastguard Worker   , "CMP8XCHG16"
332*f6dc9357SAndroid Build Coastguard Worker   , "CHANNELS"
333*f6dc9357SAndroid Build Coastguard Worker   , "XSAVE"
334*f6dc9357SAndroid Build Coastguard Worker   , "ARM_VFP_32"
335*f6dc9357SAndroid Build Coastguard Worker   , "ARM_NEON"
336*f6dc9357SAndroid Build Coastguard Worker   , "L2AT"
337*f6dc9357SAndroid Build Coastguard Worker   , "VIRT_FIRMWARE"
338*f6dc9357SAndroid Build Coastguard Worker   , "RDWRFSGSBASE"
339*f6dc9357SAndroid Build Coastguard Worker   , "FASTFAIL"
340*f6dc9357SAndroid Build Coastguard Worker   , "ARM_DIVIDE"
341*f6dc9357SAndroid Build Coastguard Worker   , "ARM_64BIT_LOADSTORE_ATOMIC"
342*f6dc9357SAndroid Build Coastguard Worker   , "ARM_EXTERNAL_CACHE"
343*f6dc9357SAndroid Build Coastguard Worker   , "ARM_FMAC"
344*f6dc9357SAndroid Build Coastguard Worker   , "RDRAND"
345*f6dc9357SAndroid Build Coastguard Worker   , "ARM_V8"
346*f6dc9357SAndroid Build Coastguard Worker   , "ARM_V8_CRYPTO"
347*f6dc9357SAndroid Build Coastguard Worker   , "ARM_V8_CRC32"
348*f6dc9357SAndroid Build Coastguard Worker   , "RDTSCP"
349*f6dc9357SAndroid Build Coastguard Worker   , "RDPID"
350*f6dc9357SAndroid Build Coastguard Worker   , "ARM_V81_ATOMIC"
351*f6dc9357SAndroid Build Coastguard Worker   , "MONITORX"
352*f6dc9357SAndroid Build Coastguard Worker };
353*f6dc9357SAndroid Build Coastguard Worker */
354*f6dc9357SAndroid Build Coastguard Worker 
355*f6dc9357SAndroid Build Coastguard Worker #endif
356*f6dc9357SAndroid Build Coastguard Worker 
357*f6dc9357SAndroid Build Coastguard Worker 
PrintPage(AString & s,UInt64 v)358*f6dc9357SAndroid Build Coastguard Worker static void PrintPage(AString &s, UInt64 v)
359*f6dc9357SAndroid Build Coastguard Worker {
360*f6dc9357SAndroid Build Coastguard Worker   const char *t = "B";
361*f6dc9357SAndroid Build Coastguard Worker   if ((v & 0x3ff) == 0)
362*f6dc9357SAndroid Build Coastguard Worker   {
363*f6dc9357SAndroid Build Coastguard Worker     v >>= 10;
364*f6dc9357SAndroid Build Coastguard Worker     t = "KB";
365*f6dc9357SAndroid Build Coastguard Worker   }
366*f6dc9357SAndroid Build Coastguard Worker   s.Add_UInt64(v);
367*f6dc9357SAndroid Build Coastguard Worker   s += t;
368*f6dc9357SAndroid Build Coastguard Worker }
369*f6dc9357SAndroid Build Coastguard Worker 
370*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
371*f6dc9357SAndroid Build Coastguard Worker 
TypeToString2(const char * const table[],unsigned num,UInt32 value)372*f6dc9357SAndroid Build Coastguard Worker static AString TypeToString2(const char * const table[], unsigned num, UInt32 value)
373*f6dc9357SAndroid Build Coastguard Worker {
374*f6dc9357SAndroid Build Coastguard Worker   char sz[16];
375*f6dc9357SAndroid Build Coastguard Worker   const char *p = NULL;
376*f6dc9357SAndroid Build Coastguard Worker   if (value < num)
377*f6dc9357SAndroid Build Coastguard Worker     p = table[value];
378*f6dc9357SAndroid Build Coastguard Worker   if (!p)
379*f6dc9357SAndroid Build Coastguard Worker   {
380*f6dc9357SAndroid Build Coastguard Worker     ConvertUInt32ToString(value, sz);
381*f6dc9357SAndroid Build Coastguard Worker     p = sz;
382*f6dc9357SAndroid Build Coastguard Worker   }
383*f6dc9357SAndroid Build Coastguard Worker   return (AString)p;
384*f6dc9357SAndroid Build Coastguard Worker }
385*f6dc9357SAndroid Build Coastguard Worker 
386*f6dc9357SAndroid Build Coastguard Worker // #if defined(Z7_LARGE_PAGES) || defined(_WIN32)
387*f6dc9357SAndroid Build Coastguard Worker // #ifdef _WIN32
PrintSize_KMGT_Or_Hex(AString & s,UInt64 v)388*f6dc9357SAndroid Build Coastguard Worker void PrintSize_KMGT_Or_Hex(AString &s, UInt64 v)
389*f6dc9357SAndroid Build Coastguard Worker {
390*f6dc9357SAndroid Build Coastguard Worker   char c = 0;
391*f6dc9357SAndroid Build Coastguard Worker   if ((v & 0x3FF) == 0) { v >>= 10; c = 'K';
392*f6dc9357SAndroid Build Coastguard Worker   if ((v & 0x3FF) == 0) { v >>= 10; c = 'M';
393*f6dc9357SAndroid Build Coastguard Worker   if ((v & 0x3FF) == 0) { v >>= 10; c = 'G';
394*f6dc9357SAndroid Build Coastguard Worker   if ((v & 0x3FF) == 0) { v >>= 10; c = 'T';
395*f6dc9357SAndroid Build Coastguard Worker   }}}}
396*f6dc9357SAndroid Build Coastguard Worker   else
397*f6dc9357SAndroid Build Coastguard Worker   {
398*f6dc9357SAndroid Build Coastguard Worker     // s += "0x";
399*f6dc9357SAndroid Build Coastguard Worker     PrintHex(s, v);
400*f6dc9357SAndroid Build Coastguard Worker     return;
401*f6dc9357SAndroid Build Coastguard Worker   }
402*f6dc9357SAndroid Build Coastguard Worker   s.Add_UInt64(v);
403*f6dc9357SAndroid Build Coastguard Worker   if (c)
404*f6dc9357SAndroid Build Coastguard Worker     s.Add_Char(c);
405*f6dc9357SAndroid Build Coastguard Worker   s.Add_Char('B');
406*f6dc9357SAndroid Build Coastguard Worker }
407*f6dc9357SAndroid Build Coastguard Worker // #endif
408*f6dc9357SAndroid Build Coastguard Worker // #endif
409*f6dc9357SAndroid Build Coastguard Worker 
SysInfo_To_String(AString & s,const SYSTEM_INFO & si)410*f6dc9357SAndroid Build Coastguard Worker static void SysInfo_To_String(AString &s, const SYSTEM_INFO &si)
411*f6dc9357SAndroid Build Coastguard Worker {
412*f6dc9357SAndroid Build Coastguard Worker   s += TypeToString2(k_PROCESSOR_ARCHITECTURE, Z7_ARRAY_SIZE(k_PROCESSOR_ARCHITECTURE), si.wProcessorArchitecture);
413*f6dc9357SAndroid Build Coastguard Worker 
414*f6dc9357SAndroid Build Coastguard Worker   if (!( (si.wProcessorArchitecture == Z7_WIN_PROCESSOR_ARCHITECTURE_INTEL && si.dwProcessorType == Z7_WIN_PROCESSOR_INTEL_PENTIUM)
415*f6dc9357SAndroid Build Coastguard Worker       || (si.wProcessorArchitecture == Z7_WIN_PROCESSOR_ARCHITECTURE_AMD64 && si.dwProcessorType == Z7_WIN_PROCESSOR_AMD_X8664)))
416*f6dc9357SAndroid Build Coastguard Worker   {
417*f6dc9357SAndroid Build Coastguard Worker     s.Add_Space();
418*f6dc9357SAndroid Build Coastguard Worker     // s += TypePairToString(k_PROCESSOR, Z7_ARRAY_SIZE(k_PROCESSOR), si.dwProcessorType);
419*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt32(si.dwProcessorType);
420*f6dc9357SAndroid Build Coastguard Worker   }
421*f6dc9357SAndroid Build Coastguard Worker   s.Add_Space();
422*f6dc9357SAndroid Build Coastguard Worker   PrintHex(s, si.wProcessorLevel);
423*f6dc9357SAndroid Build Coastguard Worker   s.Add_Dot();
424*f6dc9357SAndroid Build Coastguard Worker   PrintHex(s, si.wProcessorRevision);
425*f6dc9357SAndroid Build Coastguard Worker   if ((UInt64)si.dwActiveProcessorMask + 1 != ((UInt64)1 << si.dwNumberOfProcessors))
426*f6dc9357SAndroid Build Coastguard Worker   if ((UInt64)si.dwActiveProcessorMask + 1 != 0 || si.dwNumberOfProcessors != sizeof(UInt64) * 8)
427*f6dc9357SAndroid Build Coastguard Worker   {
428*f6dc9357SAndroid Build Coastguard Worker     s += " act:";
429*f6dc9357SAndroid Build Coastguard Worker     PrintHex(s, si.dwActiveProcessorMask);
430*f6dc9357SAndroid Build Coastguard Worker   }
431*f6dc9357SAndroid Build Coastguard Worker   s += " threads:";
432*f6dc9357SAndroid Build Coastguard Worker   s.Add_UInt32(si.dwNumberOfProcessors);
433*f6dc9357SAndroid Build Coastguard Worker   if (si.dwPageSize != 1 << 12)
434*f6dc9357SAndroid Build Coastguard Worker   {
435*f6dc9357SAndroid Build Coastguard Worker     s += " page:";
436*f6dc9357SAndroid Build Coastguard Worker     PrintPage(s, si.dwPageSize);
437*f6dc9357SAndroid Build Coastguard Worker   }
438*f6dc9357SAndroid Build Coastguard Worker   if (si.dwAllocationGranularity != 1 << 16)
439*f6dc9357SAndroid Build Coastguard Worker   {
440*f6dc9357SAndroid Build Coastguard Worker     s += " gran:";
441*f6dc9357SAndroid Build Coastguard Worker     PrintPage(s, si.dwAllocationGranularity);
442*f6dc9357SAndroid Build Coastguard Worker   }
443*f6dc9357SAndroid Build Coastguard Worker   s.Add_Space();
444*f6dc9357SAndroid Build Coastguard Worker 
445*f6dc9357SAndroid Build Coastguard Worker   const DWORD_PTR minAdd = (DWORD_PTR)si.lpMinimumApplicationAddress;
446*f6dc9357SAndroid Build Coastguard Worker   UInt64 maxSize = (UInt64)(DWORD_PTR)si.lpMaximumApplicationAddress + 1;
447*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kReserveSize = ((UInt32)1 << 16);
448*f6dc9357SAndroid Build Coastguard Worker   if (minAdd != kReserveSize)
449*f6dc9357SAndroid Build Coastguard Worker   {
450*f6dc9357SAndroid Build Coastguard Worker     PrintSize_KMGT_Or_Hex(s, minAdd);
451*f6dc9357SAndroid Build Coastguard Worker     s.Add_Minus();
452*f6dc9357SAndroid Build Coastguard Worker   }
453*f6dc9357SAndroid Build Coastguard Worker   else
454*f6dc9357SAndroid Build Coastguard Worker   {
455*f6dc9357SAndroid Build Coastguard Worker     if ((maxSize & (kReserveSize - 1)) == 0)
456*f6dc9357SAndroid Build Coastguard Worker       maxSize += kReserveSize;
457*f6dc9357SAndroid Build Coastguard Worker   }
458*f6dc9357SAndroid Build Coastguard Worker   PrintSize_KMGT_Or_Hex(s, maxSize);
459*f6dc9357SAndroid Build Coastguard Worker }
460*f6dc9357SAndroid Build Coastguard Worker 
461*f6dc9357SAndroid Build Coastguard Worker #ifndef _WIN64
462*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_BEGIN
463*f6dc9357SAndroid Build Coastguard Worker typedef VOID (WINAPI *Func_GetNativeSystemInfo)(LPSYSTEM_INFO lpSystemInfo);
464*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_END
465*f6dc9357SAndroid Build Coastguard Worker #endif
466*f6dc9357SAndroid Build Coastguard Worker 
467*f6dc9357SAndroid Build Coastguard Worker #endif
468*f6dc9357SAndroid Build Coastguard Worker 
469*f6dc9357SAndroid Build Coastguard Worker #ifdef __APPLE__
470*f6dc9357SAndroid Build Coastguard Worker #ifndef MY_CPU_X86_OR_AMD64
Add_sysctlbyname_to_String(const char * name,AString & s)471*f6dc9357SAndroid Build Coastguard Worker static void Add_sysctlbyname_to_String(const char *name, AString &s)
472*f6dc9357SAndroid Build Coastguard Worker {
473*f6dc9357SAndroid Build Coastguard Worker   size_t bufSize = 256;
474*f6dc9357SAndroid Build Coastguard Worker   char buf[256];
475*f6dc9357SAndroid Build Coastguard Worker   if (z7_sysctlbyname_Get(name, &buf, &bufSize) == 0)
476*f6dc9357SAndroid Build Coastguard Worker     s += buf;
477*f6dc9357SAndroid Build Coastguard Worker }
478*f6dc9357SAndroid Build Coastguard Worker #endif
479*f6dc9357SAndroid Build Coastguard Worker #endif
480*f6dc9357SAndroid Build Coastguard Worker 
481*f6dc9357SAndroid Build Coastguard Worker void GetSysInfo(AString &s1, AString &s2);
GetSysInfo(AString & s1,AString & s2)482*f6dc9357SAndroid Build Coastguard Worker void GetSysInfo(AString &s1, AString &s2)
483*f6dc9357SAndroid Build Coastguard Worker {
484*f6dc9357SAndroid Build Coastguard Worker   s1.Empty();
485*f6dc9357SAndroid Build Coastguard Worker   s2.Empty();
486*f6dc9357SAndroid Build Coastguard Worker 
487*f6dc9357SAndroid Build Coastguard Worker   #ifdef _WIN32
488*f6dc9357SAndroid Build Coastguard Worker     SYSTEM_INFO si;
489*f6dc9357SAndroid Build Coastguard Worker     GetSystemInfo(&si);
490*f6dc9357SAndroid Build Coastguard Worker     {
491*f6dc9357SAndroid Build Coastguard Worker       SysInfo_To_String(s1, si);
492*f6dc9357SAndroid Build Coastguard Worker       // s += " : ";
493*f6dc9357SAndroid Build Coastguard Worker     }
494*f6dc9357SAndroid Build Coastguard Worker 
495*f6dc9357SAndroid Build Coastguard Worker     #if !defined(_WIN64) && !defined(UNDER_CE)
496*f6dc9357SAndroid Build Coastguard Worker     const
497*f6dc9357SAndroid Build Coastguard Worker     Func_GetNativeSystemInfo fn = Z7_GET_PROC_ADDRESS(
498*f6dc9357SAndroid Build Coastguard Worker     Func_GetNativeSystemInfo, GetModuleHandleA("kernel32.dll"),
499*f6dc9357SAndroid Build Coastguard Worker         "GetNativeSystemInfo");
500*f6dc9357SAndroid Build Coastguard Worker     if (fn)
501*f6dc9357SAndroid Build Coastguard Worker     {
502*f6dc9357SAndroid Build Coastguard Worker       SYSTEM_INFO si2;
503*f6dc9357SAndroid Build Coastguard Worker       fn(&si2);
504*f6dc9357SAndroid Build Coastguard Worker       // if (memcmp(&si, &si2, sizeof(si)) != 0)
505*f6dc9357SAndroid Build Coastguard Worker       {
506*f6dc9357SAndroid Build Coastguard Worker         // s += " - ";
507*f6dc9357SAndroid Build Coastguard Worker         SysInfo_To_String(s2, si2);
508*f6dc9357SAndroid Build Coastguard Worker       }
509*f6dc9357SAndroid Build Coastguard Worker     }
510*f6dc9357SAndroid Build Coastguard Worker     #endif
511*f6dc9357SAndroid Build Coastguard Worker   #endif
512*f6dc9357SAndroid Build Coastguard Worker }
513*f6dc9357SAndroid Build Coastguard Worker 
514*f6dc9357SAndroid Build Coastguard Worker 
AddBracedString(AString & dest,AString & src)515*f6dc9357SAndroid Build Coastguard Worker static void AddBracedString(AString &dest, AString &src)
516*f6dc9357SAndroid Build Coastguard Worker {
517*f6dc9357SAndroid Build Coastguard Worker   if (!src.IsEmpty())
518*f6dc9357SAndroid Build Coastguard Worker   {
519*f6dc9357SAndroid Build Coastguard Worker     dest.Add_Space_if_NotEmpty();
520*f6dc9357SAndroid Build Coastguard Worker     dest.Add_Char('(');
521*f6dc9357SAndroid Build Coastguard Worker     dest += src;
522*f6dc9357SAndroid Build Coastguard Worker     dest.Add_Char(')');
523*f6dc9357SAndroid Build Coastguard Worker   }
524*f6dc9357SAndroid Build Coastguard Worker }
525*f6dc9357SAndroid Build Coastguard Worker 
526*f6dc9357SAndroid Build Coastguard Worker struct CCpuName
527*f6dc9357SAndroid Build Coastguard Worker {
528*f6dc9357SAndroid Build Coastguard Worker   AString CpuName;
529*f6dc9357SAndroid Build Coastguard Worker   AString Revision;
530*f6dc9357SAndroid Build Coastguard Worker   AString Microcode;
531*f6dc9357SAndroid Build Coastguard Worker   AString LargePages;
532*f6dc9357SAndroid Build Coastguard Worker 
533*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
534*f6dc9357SAndroid Build Coastguard Worker   UInt32 MHz;
535*f6dc9357SAndroid Build Coastguard Worker 
536*f6dc9357SAndroid Build Coastguard Worker #ifdef MY_CPU_ARM64
537*f6dc9357SAndroid Build Coastguard Worker #define Z7_SYS_INFO_SHOW_ARM64_REGS
538*f6dc9357SAndroid Build Coastguard Worker #endif
539*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_SYS_INFO_SHOW_ARM64_REGS
540*f6dc9357SAndroid Build Coastguard Worker   bool Arm64_ISAR0_EL1_Defined;
541*f6dc9357SAndroid Build Coastguard Worker   UInt64 Arm64_ISAR0_EL1;
542*f6dc9357SAndroid Build Coastguard Worker #endif
543*f6dc9357SAndroid Build Coastguard Worker #endif
544*f6dc9357SAndroid Build Coastguard Worker 
545*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
CCpuNameCCpuName546*f6dc9357SAndroid Build Coastguard Worker   CCpuName():
547*f6dc9357SAndroid Build Coastguard Worker       MHz(0)
548*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_SYS_INFO_SHOW_ARM64_REGS
549*f6dc9357SAndroid Build Coastguard Worker     , Arm64_ISAR0_EL1_Defined(false)
550*f6dc9357SAndroid Build Coastguard Worker     , Arm64_ISAR0_EL1(0)
551*f6dc9357SAndroid Build Coastguard Worker #endif
552*f6dc9357SAndroid Build Coastguard Worker     {}
553*f6dc9357SAndroid Build Coastguard Worker #endif
554*f6dc9357SAndroid Build Coastguard Worker 
555*f6dc9357SAndroid Build Coastguard Worker   void Fill();
556*f6dc9357SAndroid Build Coastguard Worker 
Get_Revision_Microcode_LargePagesCCpuName557*f6dc9357SAndroid Build Coastguard Worker   void Get_Revision_Microcode_LargePages(AString &s)
558*f6dc9357SAndroid Build Coastguard Worker   {
559*f6dc9357SAndroid Build Coastguard Worker     s.Empty();
560*f6dc9357SAndroid Build Coastguard Worker     AddBracedString(s, Revision);
561*f6dc9357SAndroid Build Coastguard Worker     AddBracedString(s, Microcode);
562*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
563*f6dc9357SAndroid Build Coastguard Worker     if (MHz != 0)
564*f6dc9357SAndroid Build Coastguard Worker     {
565*f6dc9357SAndroid Build Coastguard Worker       s.Add_Space_if_NotEmpty();
566*f6dc9357SAndroid Build Coastguard Worker       s.Add_UInt32(MHz);
567*f6dc9357SAndroid Build Coastguard Worker       s += " MHz";
568*f6dc9357SAndroid Build Coastguard Worker     }
569*f6dc9357SAndroid Build Coastguard Worker #endif
570*f6dc9357SAndroid Build Coastguard Worker     if (!LargePages.IsEmpty())
571*f6dc9357SAndroid Build Coastguard Worker       s.Add_OptSpaced(LargePages);
572*f6dc9357SAndroid Build Coastguard Worker   }
573*f6dc9357SAndroid Build Coastguard Worker 
574*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_SYS_INFO_SHOW_ARM64_REGS
Get_RegistersCCpuName575*f6dc9357SAndroid Build Coastguard Worker   void Get_Registers(AString &s)
576*f6dc9357SAndroid Build Coastguard Worker   {
577*f6dc9357SAndroid Build Coastguard Worker     if (Arm64_ISAR0_EL1_Defined)
578*f6dc9357SAndroid Build Coastguard Worker     {
579*f6dc9357SAndroid Build Coastguard Worker       // ID_AA64ISAR0_EL1
580*f6dc9357SAndroid Build Coastguard Worker       s.Add_OptSpaced("cp4030:");
581*f6dc9357SAndroid Build Coastguard Worker       PrintHex(s, Arm64_ISAR0_EL1);
582*f6dc9357SAndroid Build Coastguard Worker       {
583*f6dc9357SAndroid Build Coastguard Worker         const unsigned sha2 = ((unsigned)(Arm64_ISAR0_EL1 >> 12) & 0xf) - 1;
584*f6dc9357SAndroid Build Coastguard Worker         if (sha2 < 2)
585*f6dc9357SAndroid Build Coastguard Worker         {
586*f6dc9357SAndroid Build Coastguard Worker           s += ":SHA256";
587*f6dc9357SAndroid Build Coastguard Worker           if (sha2)
588*f6dc9357SAndroid Build Coastguard Worker             s += ":SHA512";
589*f6dc9357SAndroid Build Coastguard Worker         }
590*f6dc9357SAndroid Build Coastguard Worker       }
591*f6dc9357SAndroid Build Coastguard Worker     }
592*f6dc9357SAndroid Build Coastguard Worker   }
593*f6dc9357SAndroid Build Coastguard Worker #endif
594*f6dc9357SAndroid Build Coastguard Worker };
595*f6dc9357SAndroid Build Coastguard Worker 
Fill()596*f6dc9357SAndroid Build Coastguard Worker void CCpuName::Fill()
597*f6dc9357SAndroid Build Coastguard Worker {
598*f6dc9357SAndroid Build Coastguard Worker   // CpuName.Empty();
599*f6dc9357SAndroid Build Coastguard Worker   // Revision.Empty();
600*f6dc9357SAndroid Build Coastguard Worker   // Microcode.Empty();
601*f6dc9357SAndroid Build Coastguard Worker   // LargePages.Empty();
602*f6dc9357SAndroid Build Coastguard Worker 
603*f6dc9357SAndroid Build Coastguard Worker   AString &s = CpuName;
604*f6dc9357SAndroid Build Coastguard Worker 
605*f6dc9357SAndroid Build Coastguard Worker   #ifdef MY_CPU_X86_OR_AMD64
606*f6dc9357SAndroid Build Coastguard Worker   {
607*f6dc9357SAndroid Build Coastguard Worker     #if !defined(MY_CPU_AMD64)
608*f6dc9357SAndroid Build Coastguard Worker     if (z7_x86_cpuid_GetMaxFunc())
609*f6dc9357SAndroid Build Coastguard Worker     #endif
610*f6dc9357SAndroid Build Coastguard Worker     {
611*f6dc9357SAndroid Build Coastguard Worker       x86cpuid_to_String(s);
612*f6dc9357SAndroid Build Coastguard Worker       {
613*f6dc9357SAndroid Build Coastguard Worker         UInt32 a[4];
614*f6dc9357SAndroid Build Coastguard Worker         z7_x86_cpuid(a, 1);
615*f6dc9357SAndroid Build Coastguard Worker         char temp[16];
616*f6dc9357SAndroid Build Coastguard Worker         ConvertUInt32ToHex(a[0], temp);
617*f6dc9357SAndroid Build Coastguard Worker         Revision += temp;
618*f6dc9357SAndroid Build Coastguard Worker       }
619*f6dc9357SAndroid Build Coastguard Worker     }
620*f6dc9357SAndroid Build Coastguard Worker   }
621*f6dc9357SAndroid Build Coastguard Worker   #elif defined(__APPLE__)
622*f6dc9357SAndroid Build Coastguard Worker   {
623*f6dc9357SAndroid Build Coastguard Worker     Add_sysctlbyname_to_String("machdep.cpu.brand_string", s);
624*f6dc9357SAndroid Build Coastguard Worker   }
625*f6dc9357SAndroid Build Coastguard Worker   #elif defined(MY_CPU_E2K) && defined(Z7_MCST_LCC_VERSION) && (Z7_MCST_LCC_VERSION >= 12323)
626*f6dc9357SAndroid Build Coastguard Worker   {
627*f6dc9357SAndroid Build Coastguard Worker     s += "mcst ";
628*f6dc9357SAndroid Build Coastguard Worker     s += __builtin_cpu_name();
629*f6dc9357SAndroid Build Coastguard Worker     s.Add_Space();
630*f6dc9357SAndroid Build Coastguard Worker     s += __builtin_cpu_arch();
631*f6dc9357SAndroid Build Coastguard Worker   }
632*f6dc9357SAndroid Build Coastguard Worker   #endif
633*f6dc9357SAndroid Build Coastguard Worker 
634*f6dc9357SAndroid Build Coastguard Worker 
635*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
636*f6dc9357SAndroid Build Coastguard Worker   {
637*f6dc9357SAndroid Build Coastguard Worker     NRegistry::CKey key;
638*f6dc9357SAndroid Build Coastguard Worker     if (key.Open(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0"), KEY_READ) == ERROR_SUCCESS)
639*f6dc9357SAndroid Build Coastguard Worker     {
640*f6dc9357SAndroid Build Coastguard Worker       // s.Empty(); // for debug
641*f6dc9357SAndroid Build Coastguard Worker       {
642*f6dc9357SAndroid Build Coastguard Worker         CSysString name;
643*f6dc9357SAndroid Build Coastguard Worker         if (s.IsEmpty())
644*f6dc9357SAndroid Build Coastguard Worker         if (key.QueryValue(TEXT("ProcessorNameString"), name) == ERROR_SUCCESS)
645*f6dc9357SAndroid Build Coastguard Worker         {
646*f6dc9357SAndroid Build Coastguard Worker           s += GetAnsiString(name);
647*f6dc9357SAndroid Build Coastguard Worker         }
648*f6dc9357SAndroid Build Coastguard Worker         if (key.QueryValue(TEXT("Identifier"), name) == ERROR_SUCCESS)
649*f6dc9357SAndroid Build Coastguard Worker         {
650*f6dc9357SAndroid Build Coastguard Worker           if (!Revision.IsEmpty())
651*f6dc9357SAndroid Build Coastguard Worker             Revision += " : ";
652*f6dc9357SAndroid Build Coastguard Worker           Revision += GetAnsiString(name);
653*f6dc9357SAndroid Build Coastguard Worker         }
654*f6dc9357SAndroid Build Coastguard Worker       }
655*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
656*f6dc9357SAndroid Build Coastguard Worker       key.GetValue_UInt32_IfOk(TEXT("~MHz"), MHz);
657*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_SYS_INFO_SHOW_ARM64_REGS
658*f6dc9357SAndroid Build Coastguard Worker /*
659*f6dc9357SAndroid Build Coastguard Worker mapping arm64 registers to Windows registry:
660*f6dc9357SAndroid Build Coastguard Worker CP 4000: MIDR_EL1
661*f6dc9357SAndroid Build Coastguard Worker CP 4020: ID_AA64PFR0_EL1
662*f6dc9357SAndroid Build Coastguard Worker CP 4021: ID_AA64PFR1_EL1
663*f6dc9357SAndroid Build Coastguard Worker CP 4028: ID_AA64DFR0_EL1
664*f6dc9357SAndroid Build Coastguard Worker CP 4029: ID_AA64DFR1_EL1
665*f6dc9357SAndroid Build Coastguard Worker CP 402C: ID_AA64AFR0_EL1
666*f6dc9357SAndroid Build Coastguard Worker CP 402D: ID_AA64AFR1_EL1
667*f6dc9357SAndroid Build Coastguard Worker CP 4030: ID_AA64ISAR0_EL1
668*f6dc9357SAndroid Build Coastguard Worker CP 4031: ID_AA64ISAR1_EL1
669*f6dc9357SAndroid Build Coastguard Worker CP 4038: ID_AA64MMFR0_EL1
670*f6dc9357SAndroid Build Coastguard Worker CP 4039: ID_AA64MMFR1_EL1
671*f6dc9357SAndroid Build Coastguard Worker CP 403A: ID_AA64MMFR2_EL1
672*f6dc9357SAndroid Build Coastguard Worker */
673*f6dc9357SAndroid Build Coastguard Worker       if (key.GetValue_UInt64_IfOk(TEXT("CP 4030"), Arm64_ISAR0_EL1) == ERROR_SUCCESS)
674*f6dc9357SAndroid Build Coastguard Worker         Arm64_ISAR0_EL1_Defined = true;
675*f6dc9357SAndroid Build Coastguard Worker #endif
676*f6dc9357SAndroid Build Coastguard Worker #endif
677*f6dc9357SAndroid Build Coastguard Worker       LONG res[2];
678*f6dc9357SAndroid Build Coastguard Worker       CByteBuffer bufs[2];
679*f6dc9357SAndroid Build Coastguard Worker       res[0] = key.QueryValue_Binary(TEXT("Previous Update Revision"), bufs[0]);
680*f6dc9357SAndroid Build Coastguard Worker       res[1] = key.QueryValue_Binary(TEXT("Update Revision"),          bufs[1]);
681*f6dc9357SAndroid Build Coastguard Worker       if (res[0] == ERROR_SUCCESS || res[1] == ERROR_SUCCESS)
682*f6dc9357SAndroid Build Coastguard Worker       {
683*f6dc9357SAndroid Build Coastguard Worker         for (unsigned i = 0; i < 2; i++)
684*f6dc9357SAndroid Build Coastguard Worker         {
685*f6dc9357SAndroid Build Coastguard Worker           if (i == 1)
686*f6dc9357SAndroid Build Coastguard Worker             Microcode += "->";
687*f6dc9357SAndroid Build Coastguard Worker           if (res[i] != ERROR_SUCCESS)
688*f6dc9357SAndroid Build Coastguard Worker             continue;
689*f6dc9357SAndroid Build Coastguard Worker           const CByteBuffer &buf = bufs[i];
690*f6dc9357SAndroid Build Coastguard Worker           if (buf.Size() == 8)
691*f6dc9357SAndroid Build Coastguard Worker           {
692*f6dc9357SAndroid Build Coastguard Worker             const UInt32 high = GetUi32(buf);
693*f6dc9357SAndroid Build Coastguard Worker             if (high != 0)
694*f6dc9357SAndroid Build Coastguard Worker             {
695*f6dc9357SAndroid Build Coastguard Worker               PrintHex(Microcode, high);
696*f6dc9357SAndroid Build Coastguard Worker               Microcode.Add_Dot();
697*f6dc9357SAndroid Build Coastguard Worker             }
698*f6dc9357SAndroid Build Coastguard Worker             PrintHex(Microcode, GetUi32(buf + 4));
699*f6dc9357SAndroid Build Coastguard Worker           }
700*f6dc9357SAndroid Build Coastguard Worker         }
701*f6dc9357SAndroid Build Coastguard Worker       }
702*f6dc9357SAndroid Build Coastguard Worker     }
703*f6dc9357SAndroid Build Coastguard Worker   }
704*f6dc9357SAndroid Build Coastguard Worker #endif
705*f6dc9357SAndroid Build Coastguard Worker 
706*f6dc9357SAndroid Build Coastguard Worker   if (s.IsEmpty())
707*f6dc9357SAndroid Build Coastguard Worker   {
708*f6dc9357SAndroid Build Coastguard Worker     #ifdef MY_CPU_NAME
709*f6dc9357SAndroid Build Coastguard Worker       s += MY_CPU_NAME;
710*f6dc9357SAndroid Build Coastguard Worker     #endif
711*f6dc9357SAndroid Build Coastguard Worker   }
712*f6dc9357SAndroid Build Coastguard Worker 
713*f6dc9357SAndroid Build Coastguard Worker   #ifdef __APPLE__
714*f6dc9357SAndroid Build Coastguard Worker   {
715*f6dc9357SAndroid Build Coastguard Worker     AString s2;
716*f6dc9357SAndroid Build Coastguard Worker     UInt32 v = 0;
717*f6dc9357SAndroid Build Coastguard Worker     if (z7_sysctlbyname_Get_UInt32("machdep.cpu.core_count", &v) == 0)
718*f6dc9357SAndroid Build Coastguard Worker     {
719*f6dc9357SAndroid Build Coastguard Worker       s2.Add_UInt32(v);
720*f6dc9357SAndroid Build Coastguard Worker       s2.Add_Char('C');
721*f6dc9357SAndroid Build Coastguard Worker     }
722*f6dc9357SAndroid Build Coastguard Worker     if (z7_sysctlbyname_Get_UInt32("machdep.cpu.thread_count", &v) == 0)
723*f6dc9357SAndroid Build Coastguard Worker     {
724*f6dc9357SAndroid Build Coastguard Worker       s2.Add_UInt32(v);
725*f6dc9357SAndroid Build Coastguard Worker       s2.Add_Char('T');
726*f6dc9357SAndroid Build Coastguard Worker     }
727*f6dc9357SAndroid Build Coastguard Worker     if (!s2.IsEmpty())
728*f6dc9357SAndroid Build Coastguard Worker     {
729*f6dc9357SAndroid Build Coastguard Worker       s.Add_Space_if_NotEmpty();
730*f6dc9357SAndroid Build Coastguard Worker       s += s2;
731*f6dc9357SAndroid Build Coastguard Worker     }
732*f6dc9357SAndroid Build Coastguard Worker   }
733*f6dc9357SAndroid Build Coastguard Worker   #endif
734*f6dc9357SAndroid Build Coastguard Worker 
735*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_LARGE_PAGES
736*f6dc9357SAndroid Build Coastguard Worker   Add_LargePages_String(LargePages);
737*f6dc9357SAndroid Build Coastguard Worker   #endif
738*f6dc9357SAndroid Build Coastguard Worker }
739*f6dc9357SAndroid Build Coastguard Worker 
740*f6dc9357SAndroid Build Coastguard Worker void AddCpuFeatures(AString &s);
AddCpuFeatures(AString & s)741*f6dc9357SAndroid Build Coastguard Worker void AddCpuFeatures(AString &s)
742*f6dc9357SAndroid Build Coastguard Worker {
743*f6dc9357SAndroid Build Coastguard Worker   #ifdef _WIN32
744*f6dc9357SAndroid Build Coastguard Worker   // const unsigned kNumFeatures_Extra = 32; // we check also for unknown features
745*f6dc9357SAndroid Build Coastguard Worker   // const unsigned kNumFeatures = Z7_ARRAY_SIZE(k_PF) + kNumFeatures_Extra;
746*f6dc9357SAndroid Build Coastguard Worker   const unsigned kNumFeatures = 64;
747*f6dc9357SAndroid Build Coastguard Worker   UInt64 flags = 0;
748*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = 0; i < kNumFeatures; i++)
749*f6dc9357SAndroid Build Coastguard Worker   {
750*f6dc9357SAndroid Build Coastguard Worker     if (IsProcessorFeaturePresent((DWORD)i))
751*f6dc9357SAndroid Build Coastguard Worker     {
752*f6dc9357SAndroid Build Coastguard Worker       flags += (UInt64)1 << i;
753*f6dc9357SAndroid Build Coastguard Worker       // s.Add_Space_if_NotEmpty();
754*f6dc9357SAndroid Build Coastguard Worker       // s += TypeToString2(k_PF, Z7_ARRAY_SIZE(k_PF), i);
755*f6dc9357SAndroid Build Coastguard Worker     }
756*f6dc9357SAndroid Build Coastguard Worker   }
757*f6dc9357SAndroid Build Coastguard Worker   s.Add_OptSpaced("f:");
758*f6dc9357SAndroid Build Coastguard Worker   PrintHex(s, flags);
759*f6dc9357SAndroid Build Coastguard Worker 
760*f6dc9357SAndroid Build Coastguard Worker   #elif defined(__APPLE__)
761*f6dc9357SAndroid Build Coastguard Worker   {
762*f6dc9357SAndroid Build Coastguard Worker     UInt32 v = 0;
763*f6dc9357SAndroid Build Coastguard Worker     if (z7_sysctlbyname_Get_UInt32("hw.pagesize", &v) == 0)
764*f6dc9357SAndroid Build Coastguard Worker     {
765*f6dc9357SAndroid Build Coastguard Worker       s.Add_OptSpaced("PageSize:");
766*f6dc9357SAndroid Build Coastguard Worker       PrintPage(s, v);
767*f6dc9357SAndroid Build Coastguard Worker     }
768*f6dc9357SAndroid Build Coastguard Worker   }
769*f6dc9357SAndroid Build Coastguard Worker 
770*f6dc9357SAndroid Build Coastguard Worker   #else
771*f6dc9357SAndroid Build Coastguard Worker 
772*f6dc9357SAndroid Build Coastguard Worker   const long v = sysconf(_SC_PAGESIZE);
773*f6dc9357SAndroid Build Coastguard Worker   if (v != -1)
774*f6dc9357SAndroid Build Coastguard Worker   {
775*f6dc9357SAndroid Build Coastguard Worker     s.Add_OptSpaced("PageSize:");
776*f6dc9357SAndroid Build Coastguard Worker     PrintPage(s, (unsigned long)v);
777*f6dc9357SAndroid Build Coastguard Worker   }
778*f6dc9357SAndroid Build Coastguard Worker 
779*f6dc9357SAndroid Build Coastguard Worker   #if !defined(_AIX)
780*f6dc9357SAndroid Build Coastguard Worker 
781*f6dc9357SAndroid Build Coastguard Worker   #ifdef __linux__
782*f6dc9357SAndroid Build Coastguard Worker 
783*f6dc9357SAndroid Build Coastguard Worker   CByteBuffer buf;
784*f6dc9357SAndroid Build Coastguard Worker   if (ReadFile_to_Buffer("/sys/kernel/mm/transparent_hugepage/enabled", buf))
785*f6dc9357SAndroid Build Coastguard Worker   // if (ReadFile_to_Buffer("/proc/cpuinfo", buf))
786*f6dc9357SAndroid Build Coastguard Worker   {
787*f6dc9357SAndroid Build Coastguard Worker     s.Add_OptSpaced("THP:");
788*f6dc9357SAndroid Build Coastguard Worker     AString s2;
789*f6dc9357SAndroid Build Coastguard Worker     s2.SetFrom_CalcLen((const char *)(const void *)(const Byte *)buf, (unsigned)buf.Size());
790*f6dc9357SAndroid Build Coastguard Worker     const int pos = s2.Find('[');
791*f6dc9357SAndroid Build Coastguard Worker     if (pos >= 0)
792*f6dc9357SAndroid Build Coastguard Worker     {
793*f6dc9357SAndroid Build Coastguard Worker       const int pos2 = s2.Find(']', (unsigned)pos + 1);
794*f6dc9357SAndroid Build Coastguard Worker       if (pos2 >= 0)
795*f6dc9357SAndroid Build Coastguard Worker       {
796*f6dc9357SAndroid Build Coastguard Worker         s2.DeleteFrom((unsigned)pos2);
797*f6dc9357SAndroid Build Coastguard Worker         s2.DeleteFrontal((unsigned)pos + 1);
798*f6dc9357SAndroid Build Coastguard Worker       }
799*f6dc9357SAndroid Build Coastguard Worker     }
800*f6dc9357SAndroid Build Coastguard Worker     s += s2;
801*f6dc9357SAndroid Build Coastguard Worker   }
802*f6dc9357SAndroid Build Coastguard Worker   // else throw CSystemException(MY_SRes_HRESULT_FROM_WRes(errno));
803*f6dc9357SAndroid Build Coastguard Worker 
804*f6dc9357SAndroid Build Coastguard Worker   #endif
805*f6dc9357SAndroid Build Coastguard Worker 
806*f6dc9357SAndroid Build Coastguard Worker 
807*f6dc9357SAndroid Build Coastguard Worker   #ifdef AT_HWCAP
808*f6dc9357SAndroid Build Coastguard Worker   s.Add_OptSpaced("hwcap:");
809*f6dc9357SAndroid Build Coastguard Worker   {
810*f6dc9357SAndroid Build Coastguard Worker     unsigned long h = MY_getauxval(AT_HWCAP);
811*f6dc9357SAndroid Build Coastguard Worker     PrintHex(s, h);
812*f6dc9357SAndroid Build Coastguard Worker     #ifdef MY_CPU_ARM64
813*f6dc9357SAndroid Build Coastguard Worker #ifndef HWCAP_SHA3
814*f6dc9357SAndroid Build Coastguard Worker #define HWCAP_SHA3    (1 << 17)
815*f6dc9357SAndroid Build Coastguard Worker #endif
816*f6dc9357SAndroid Build Coastguard Worker #ifndef HWCAP_SHA512
817*f6dc9357SAndroid Build Coastguard Worker #define HWCAP_SHA512  (1 << 21)
818*f6dc9357SAndroid Build Coastguard Worker // #pragma message("=== HWCAP_SHA512 define === ")
819*f6dc9357SAndroid Build Coastguard Worker #endif
820*f6dc9357SAndroid Build Coastguard Worker     if (h & HWCAP_CRC32)  s += ":CRC32";
821*f6dc9357SAndroid Build Coastguard Worker     if (h & HWCAP_SHA1)   s += ":SHA1";
822*f6dc9357SAndroid Build Coastguard Worker     if (h & HWCAP_SHA2)   s += ":SHA2";
823*f6dc9357SAndroid Build Coastguard Worker     if (h & HWCAP_SHA3)   s += ":SHA3";
824*f6dc9357SAndroid Build Coastguard Worker     if (h & HWCAP_SHA512) s += ":SHA512";
825*f6dc9357SAndroid Build Coastguard Worker     if (h & HWCAP_AES)    s += ":AES";
826*f6dc9357SAndroid Build Coastguard Worker     if (h & HWCAP_ASIMD)  s += ":ASIMD";
827*f6dc9357SAndroid Build Coastguard Worker     #elif defined(MY_CPU_ARM)
828*f6dc9357SAndroid Build Coastguard Worker     if (h & HWCAP_NEON)   s += ":NEON";
829*f6dc9357SAndroid Build Coastguard Worker     #endif
830*f6dc9357SAndroid Build Coastguard Worker   }
831*f6dc9357SAndroid Build Coastguard Worker   #endif // AT_HWCAP
832*f6dc9357SAndroid Build Coastguard Worker 
833*f6dc9357SAndroid Build Coastguard Worker   #ifdef AT_HWCAP2
834*f6dc9357SAndroid Build Coastguard Worker   {
835*f6dc9357SAndroid Build Coastguard Worker     unsigned long h = MY_getauxval(AT_HWCAP2);
836*f6dc9357SAndroid Build Coastguard Worker     #ifndef MY_CPU_ARM
837*f6dc9357SAndroid Build Coastguard Worker     if (h != 0)
838*f6dc9357SAndroid Build Coastguard Worker     #endif
839*f6dc9357SAndroid Build Coastguard Worker     {
840*f6dc9357SAndroid Build Coastguard Worker       s += " hwcap2:";
841*f6dc9357SAndroid Build Coastguard Worker       PrintHex(s, h);
842*f6dc9357SAndroid Build Coastguard Worker       #ifdef MY_CPU_ARM
843*f6dc9357SAndroid Build Coastguard Worker       if (h & HWCAP2_CRC32)  s += ":CRC32";
844*f6dc9357SAndroid Build Coastguard Worker       if (h & HWCAP2_SHA1)   s += ":SHA1";
845*f6dc9357SAndroid Build Coastguard Worker       if (h & HWCAP2_SHA2)   s += ":SHA2";
846*f6dc9357SAndroid Build Coastguard Worker       if (h & HWCAP2_AES)    s += ":AES";
847*f6dc9357SAndroid Build Coastguard Worker       #endif
848*f6dc9357SAndroid Build Coastguard Worker     }
849*f6dc9357SAndroid Build Coastguard Worker   }
850*f6dc9357SAndroid Build Coastguard Worker   #endif // AT_HWCAP2
851*f6dc9357SAndroid Build Coastguard Worker   #endif // _AIX
852*f6dc9357SAndroid Build Coastguard Worker   #endif // _WIN32
853*f6dc9357SAndroid Build Coastguard Worker }
854*f6dc9357SAndroid Build Coastguard Worker 
855*f6dc9357SAndroid Build Coastguard Worker 
856*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
857*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
858*f6dc9357SAndroid Build Coastguard Worker 
859*f6dc9357SAndroid Build Coastguard Worker Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION
860*f6dc9357SAndroid Build Coastguard Worker 
861*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_BEGIN
862*f6dc9357SAndroid Build Coastguard Worker typedef void (WINAPI * Func_RtlGetVersion) (OSVERSIONINFOEXW *);
863*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_END
864*f6dc9357SAndroid Build Coastguard Worker 
My_RtlGetVersion(OSVERSIONINFOEXW * vi)865*f6dc9357SAndroid Build Coastguard Worker static BOOL My_RtlGetVersion(OSVERSIONINFOEXW *vi)
866*f6dc9357SAndroid Build Coastguard Worker {
867*f6dc9357SAndroid Build Coastguard Worker   const HMODULE ntdll = ::GetModuleHandleW(L"ntdll.dll");
868*f6dc9357SAndroid Build Coastguard Worker   if (!ntdll)
869*f6dc9357SAndroid Build Coastguard Worker     return FALSE;
870*f6dc9357SAndroid Build Coastguard Worker   const
871*f6dc9357SAndroid Build Coastguard Worker   Func_RtlGetVersion func = Z7_GET_PROC_ADDRESS(
872*f6dc9357SAndroid Build Coastguard Worker   Func_RtlGetVersion, ntdll,
873*f6dc9357SAndroid Build Coastguard Worker       "RtlGetVersion");
874*f6dc9357SAndroid Build Coastguard Worker   if (!func)
875*f6dc9357SAndroid Build Coastguard Worker     return FALSE;
876*f6dc9357SAndroid Build Coastguard Worker   func(vi);
877*f6dc9357SAndroid Build Coastguard Worker   return TRUE;
878*f6dc9357SAndroid Build Coastguard Worker }
879*f6dc9357SAndroid Build Coastguard Worker 
880*f6dc9357SAndroid Build Coastguard Worker #endif
881*f6dc9357SAndroid Build Coastguard Worker #endif
882*f6dc9357SAndroid Build Coastguard Worker 
883*f6dc9357SAndroid Build Coastguard Worker 
GetOsInfoText(AString & sRes)884*f6dc9357SAndroid Build Coastguard Worker void GetOsInfoText(AString &sRes)
885*f6dc9357SAndroid Build Coastguard Worker {
886*f6dc9357SAndroid Build Coastguard Worker   sRes.Empty();
887*f6dc9357SAndroid Build Coastguard Worker     AString s;
888*f6dc9357SAndroid Build Coastguard Worker 
889*f6dc9357SAndroid Build Coastguard Worker     #ifdef _WIN32
890*f6dc9357SAndroid Build Coastguard Worker     #ifndef UNDER_CE
891*f6dc9357SAndroid Build Coastguard Worker       // OSVERSIONINFO vi;
892*f6dc9357SAndroid Build Coastguard Worker       OSVERSIONINFOEXW vi;
893*f6dc9357SAndroid Build Coastguard Worker       vi.dwOSVersionInfoSize = sizeof(vi);
894*f6dc9357SAndroid Build Coastguard Worker       // if (::GetVersionEx(&vi))
895*f6dc9357SAndroid Build Coastguard Worker       if (My_RtlGetVersion(&vi))
896*f6dc9357SAndroid Build Coastguard Worker       {
897*f6dc9357SAndroid Build Coastguard Worker         s += "Windows";
898*f6dc9357SAndroid Build Coastguard Worker         if (vi.dwPlatformId != VER_PLATFORM_WIN32_NT)
899*f6dc9357SAndroid Build Coastguard Worker           s.Add_UInt32(vi.dwPlatformId);
900*f6dc9357SAndroid Build Coastguard Worker         s.Add_Space(); s.Add_UInt32(vi.dwMajorVersion);
901*f6dc9357SAndroid Build Coastguard Worker         s.Add_Dot();   s.Add_UInt32(vi.dwMinorVersion);
902*f6dc9357SAndroid Build Coastguard Worker         s.Add_Space(); s.Add_UInt32(vi.dwBuildNumber);
903*f6dc9357SAndroid Build Coastguard Worker 
904*f6dc9357SAndroid Build Coastguard Worker         if (vi.wServicePackMajor != 0 || vi.wServicePackMinor != 0)
905*f6dc9357SAndroid Build Coastguard Worker         {
906*f6dc9357SAndroid Build Coastguard Worker           s += " SP:"; s.Add_UInt32(vi.wServicePackMajor);
907*f6dc9357SAndroid Build Coastguard Worker           s.Add_Dot(); s.Add_UInt32(vi.wServicePackMinor);
908*f6dc9357SAndroid Build Coastguard Worker         }
909*f6dc9357SAndroid Build Coastguard Worker         // s += " Suite:"; PrintHex(s, vi.wSuiteMask);
910*f6dc9357SAndroid Build Coastguard Worker         // s += " Type:"; s.Add_UInt32(vi.wProductType);
911*f6dc9357SAndroid Build Coastguard Worker         // s.Add_Space(); s += GetOemString(vi.szCSDVersion);
912*f6dc9357SAndroid Build Coastguard Worker       }
913*f6dc9357SAndroid Build Coastguard Worker       /*
914*f6dc9357SAndroid Build Coastguard Worker       {
915*f6dc9357SAndroid Build Coastguard Worker         s += " OEMCP:"; s.Add_UInt32(GetOEMCP());
916*f6dc9357SAndroid Build Coastguard Worker         s += " ACP:";   s.Add_UInt32(GetACP());
917*f6dc9357SAndroid Build Coastguard Worker       }
918*f6dc9357SAndroid Build Coastguard Worker       */
919*f6dc9357SAndroid Build Coastguard Worker     #endif
920*f6dc9357SAndroid Build Coastguard Worker     #else // _WIN32
921*f6dc9357SAndroid Build Coastguard Worker 
922*f6dc9357SAndroid Build Coastguard Worker       if (!s.IsEmpty())
923*f6dc9357SAndroid Build Coastguard Worker         s.Add_LF();
924*f6dc9357SAndroid Build Coastguard Worker       struct utsname un;
925*f6dc9357SAndroid Build Coastguard Worker       if (uname(&un) == 0)
926*f6dc9357SAndroid Build Coastguard Worker       {
927*f6dc9357SAndroid Build Coastguard Worker         s += un.sysname;
928*f6dc9357SAndroid Build Coastguard Worker         // s += " : "; s += un.nodename; // we don't want to show name of computer
929*f6dc9357SAndroid Build Coastguard Worker         s += " : "; s += un.release;
930*f6dc9357SAndroid Build Coastguard Worker         s += " : "; s += un.version;
931*f6dc9357SAndroid Build Coastguard Worker         s += " : "; s += un.machine;
932*f6dc9357SAndroid Build Coastguard Worker 
933*f6dc9357SAndroid Build Coastguard Worker         #ifdef __APPLE__
934*f6dc9357SAndroid Build Coastguard Worker           // Add_sysctlbyname_to_String("kern.version", s);
935*f6dc9357SAndroid Build Coastguard Worker           // it's same as "utsname.version"
936*f6dc9357SAndroid Build Coastguard Worker         #endif
937*f6dc9357SAndroid Build Coastguard Worker       }
938*f6dc9357SAndroid Build Coastguard Worker     #endif  // _WIN32
939*f6dc9357SAndroid Build Coastguard Worker 
940*f6dc9357SAndroid Build Coastguard Worker     sRes += s;
941*f6dc9357SAndroid Build Coastguard Worker   #ifdef MY_CPU_X86_OR_AMD64
942*f6dc9357SAndroid Build Coastguard Worker   {
943*f6dc9357SAndroid Build Coastguard Worker     AString s2;
944*f6dc9357SAndroid Build Coastguard Worker     GetVirtCpuid(s2);
945*f6dc9357SAndroid Build Coastguard Worker     if (!s2.IsEmpty())
946*f6dc9357SAndroid Build Coastguard Worker     {
947*f6dc9357SAndroid Build Coastguard Worker       sRes += " : ";
948*f6dc9357SAndroid Build Coastguard Worker       sRes += s2;
949*f6dc9357SAndroid Build Coastguard Worker     }
950*f6dc9357SAndroid Build Coastguard Worker   }
951*f6dc9357SAndroid Build Coastguard Worker   #endif
952*f6dc9357SAndroid Build Coastguard Worker }
953*f6dc9357SAndroid Build Coastguard Worker 
954*f6dc9357SAndroid Build Coastguard Worker 
955*f6dc9357SAndroid Build Coastguard Worker 
GetSystemInfoText(AString & sRes)956*f6dc9357SAndroid Build Coastguard Worker void GetSystemInfoText(AString &sRes)
957*f6dc9357SAndroid Build Coastguard Worker {
958*f6dc9357SAndroid Build Coastguard Worker   GetOsInfoText(sRes);
959*f6dc9357SAndroid Build Coastguard Worker   sRes.Add_LF();
960*f6dc9357SAndroid Build Coastguard Worker 
961*f6dc9357SAndroid Build Coastguard Worker     {
962*f6dc9357SAndroid Build Coastguard Worker       AString s, s1, s2;
963*f6dc9357SAndroid Build Coastguard Worker       GetSysInfo(s1, s2);
964*f6dc9357SAndroid Build Coastguard Worker       if (!s1.IsEmpty() || !s2.IsEmpty())
965*f6dc9357SAndroid Build Coastguard Worker       {
966*f6dc9357SAndroid Build Coastguard Worker         s = s1;
967*f6dc9357SAndroid Build Coastguard Worker         if (s1 != s2 && !s2.IsEmpty())
968*f6dc9357SAndroid Build Coastguard Worker         {
969*f6dc9357SAndroid Build Coastguard Worker           s += " - ";
970*f6dc9357SAndroid Build Coastguard Worker           s += s2;
971*f6dc9357SAndroid Build Coastguard Worker         }
972*f6dc9357SAndroid Build Coastguard Worker       }
973*f6dc9357SAndroid Build Coastguard Worker       {
974*f6dc9357SAndroid Build Coastguard Worker         AddCpuFeatures(s);
975*f6dc9357SAndroid Build Coastguard Worker         if (!s.IsEmpty())
976*f6dc9357SAndroid Build Coastguard Worker         {
977*f6dc9357SAndroid Build Coastguard Worker           sRes += s;
978*f6dc9357SAndroid Build Coastguard Worker           sRes.Add_LF();
979*f6dc9357SAndroid Build Coastguard Worker         }
980*f6dc9357SAndroid Build Coastguard Worker       }
981*f6dc9357SAndroid Build Coastguard Worker     }
982*f6dc9357SAndroid Build Coastguard Worker     {
983*f6dc9357SAndroid Build Coastguard Worker       AString s, registers;
984*f6dc9357SAndroid Build Coastguard Worker       GetCpuName_MultiLine(s, registers);
985*f6dc9357SAndroid Build Coastguard Worker       if (!s.IsEmpty())
986*f6dc9357SAndroid Build Coastguard Worker       {
987*f6dc9357SAndroid Build Coastguard Worker         sRes += s;
988*f6dc9357SAndroid Build Coastguard Worker         sRes.Add_LF();
989*f6dc9357SAndroid Build Coastguard Worker       }
990*f6dc9357SAndroid Build Coastguard Worker       if (!registers.IsEmpty())
991*f6dc9357SAndroid Build Coastguard Worker       {
992*f6dc9357SAndroid Build Coastguard Worker         sRes += registers;
993*f6dc9357SAndroid Build Coastguard Worker         sRes.Add_LF();
994*f6dc9357SAndroid Build Coastguard Worker       }
995*f6dc9357SAndroid Build Coastguard Worker     }
996*f6dc9357SAndroid Build Coastguard Worker     /*
997*f6dc9357SAndroid Build Coastguard Worker     #ifdef MY_CPU_X86_OR_AMD64
998*f6dc9357SAndroid Build Coastguard Worker     {
999*f6dc9357SAndroid Build Coastguard Worker       AString s;
1000*f6dc9357SAndroid Build Coastguard Worker       x86cpuid_all_to_String(s);
1001*f6dc9357SAndroid Build Coastguard Worker       if (!s.IsEmpty())
1002*f6dc9357SAndroid Build Coastguard Worker       {
1003*f6dc9357SAndroid Build Coastguard Worker         printCallback->Print(s);
1004*f6dc9357SAndroid Build Coastguard Worker         printCallback->NewLine();
1005*f6dc9357SAndroid Build Coastguard Worker       }
1006*f6dc9357SAndroid Build Coastguard Worker     }
1007*f6dc9357SAndroid Build Coastguard Worker     #endif
1008*f6dc9357SAndroid Build Coastguard Worker     */
1009*f6dc9357SAndroid Build Coastguard Worker }
1010*f6dc9357SAndroid Build Coastguard Worker 
1011*f6dc9357SAndroid Build Coastguard Worker 
1012*f6dc9357SAndroid Build Coastguard Worker void GetCpuName_MultiLine(AString &s, AString &registers);
GetCpuName_MultiLine(AString & s,AString & registers)1013*f6dc9357SAndroid Build Coastguard Worker void GetCpuName_MultiLine(AString &s, AString &registers)
1014*f6dc9357SAndroid Build Coastguard Worker {
1015*f6dc9357SAndroid Build Coastguard Worker   CCpuName cpuName;
1016*f6dc9357SAndroid Build Coastguard Worker   cpuName.Fill();
1017*f6dc9357SAndroid Build Coastguard Worker   s = cpuName.CpuName;
1018*f6dc9357SAndroid Build Coastguard Worker   AString s2;
1019*f6dc9357SAndroid Build Coastguard Worker   cpuName.Get_Revision_Microcode_LargePages(s2);
1020*f6dc9357SAndroid Build Coastguard Worker   if (!s2.IsEmpty())
1021*f6dc9357SAndroid Build Coastguard Worker   {
1022*f6dc9357SAndroid Build Coastguard Worker     s.Add_LF();
1023*f6dc9357SAndroid Build Coastguard Worker     s += s2;
1024*f6dc9357SAndroid Build Coastguard Worker   }
1025*f6dc9357SAndroid Build Coastguard Worker   registers.Empty();
1026*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_SYS_INFO_SHOW_ARM64_REGS
1027*f6dc9357SAndroid Build Coastguard Worker   cpuName.Get_Registers(registers);
1028*f6dc9357SAndroid Build Coastguard Worker #endif
1029*f6dc9357SAndroid Build Coastguard Worker }
1030*f6dc9357SAndroid Build Coastguard Worker 
1031*f6dc9357SAndroid Build Coastguard Worker 
1032*f6dc9357SAndroid Build Coastguard Worker #ifdef MY_CPU_X86_OR_AMD64
1033*f6dc9357SAndroid Build Coastguard Worker 
GetVirtCpuid(AString & s)1034*f6dc9357SAndroid Build Coastguard Worker void GetVirtCpuid(AString &s)
1035*f6dc9357SAndroid Build Coastguard Worker {
1036*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kHv = 0x40000000;
1037*f6dc9357SAndroid Build Coastguard Worker 
1038*f6dc9357SAndroid Build Coastguard Worker   Z7_IF_X86_CPUID_SUPPORTED
1039*f6dc9357SAndroid Build Coastguard Worker   {
1040*f6dc9357SAndroid Build Coastguard Worker     UInt32 a[4];
1041*f6dc9357SAndroid Build Coastguard Worker     z7_x86_cpuid(a, kHv);
1042*f6dc9357SAndroid Build Coastguard Worker 
1043*f6dc9357SAndroid Build Coastguard Worker     if (a[0] < kHv || a[0] >= kHv + (1 << 16))
1044*f6dc9357SAndroid Build Coastguard Worker       return;
1045*f6dc9357SAndroid Build Coastguard Worker     {
1046*f6dc9357SAndroid Build Coastguard Worker       {
1047*f6dc9357SAndroid Build Coastguard Worker         for (unsigned j = 1; j < 4; j++)
1048*f6dc9357SAndroid Build Coastguard Worker           PrintCpuChars(s, a[j]);
1049*f6dc9357SAndroid Build Coastguard Worker       }
1050*f6dc9357SAndroid Build Coastguard Worker     }
1051*f6dc9357SAndroid Build Coastguard Worker     if (a[0] >= kHv + 1)
1052*f6dc9357SAndroid Build Coastguard Worker     {
1053*f6dc9357SAndroid Build Coastguard Worker       UInt32 d[4];
1054*f6dc9357SAndroid Build Coastguard Worker       z7_x86_cpuid(d, kHv + 1);
1055*f6dc9357SAndroid Build Coastguard Worker       s += " : ";
1056*f6dc9357SAndroid Build Coastguard Worker       PrintCpuChars(s, d[0]);
1057*f6dc9357SAndroid Build Coastguard Worker       if (a[0] >= kHv + 2)
1058*f6dc9357SAndroid Build Coastguard Worker       {
1059*f6dc9357SAndroid Build Coastguard Worker         z7_x86_cpuid(d, kHv + 2);
1060*f6dc9357SAndroid Build Coastguard Worker         s += " : ";
1061*f6dc9357SAndroid Build Coastguard Worker         s.Add_UInt32(d[1] >> 16);
1062*f6dc9357SAndroid Build Coastguard Worker         s.Add_Dot();  s.Add_UInt32(d[1] & 0xffff);
1063*f6dc9357SAndroid Build Coastguard Worker         s.Add_Dot();  s.Add_UInt32(d[0]);
1064*f6dc9357SAndroid Build Coastguard Worker         s.Add_Dot();  s.Add_UInt32(d[2]);
1065*f6dc9357SAndroid Build Coastguard Worker         s.Add_Dot();  s.Add_UInt32(d[3] >> 24);
1066*f6dc9357SAndroid Build Coastguard Worker         s.Add_Dot();  s.Add_UInt32(d[3] & 0xffffff);
1067*f6dc9357SAndroid Build Coastguard Worker       }
1068*f6dc9357SAndroid Build Coastguard Worker       /*
1069*f6dc9357SAndroid Build Coastguard Worker       if (a[0] >= kHv + 5)
1070*f6dc9357SAndroid Build Coastguard Worker       {
1071*f6dc9357SAndroid Build Coastguard Worker         z7_x86_cpuid(d, kHv + 5);
1072*f6dc9357SAndroid Build Coastguard Worker         s += " : ";
1073*f6dc9357SAndroid Build Coastguard Worker         s.Add_UInt32(d[0]);
1074*f6dc9357SAndroid Build Coastguard Worker         s += "p";
1075*f6dc9357SAndroid Build Coastguard Worker         s.Add_UInt32(d[1]);
1076*f6dc9357SAndroid Build Coastguard Worker         s += "t";
1077*f6dc9357SAndroid Build Coastguard Worker       }
1078*f6dc9357SAndroid Build Coastguard Worker       */
1079*f6dc9357SAndroid Build Coastguard Worker     }
1080*f6dc9357SAndroid Build Coastguard Worker   }
1081*f6dc9357SAndroid Build Coastguard Worker }
1082*f6dc9357SAndroid Build Coastguard Worker 
1083*f6dc9357SAndroid Build Coastguard Worker #endif
1084*f6dc9357SAndroid Build Coastguard Worker 
1085*f6dc9357SAndroid Build Coastguard Worker 
GetCompiler(AString & s)1086*f6dc9357SAndroid Build Coastguard Worker void GetCompiler(AString &s)
1087*f6dc9357SAndroid Build Coastguard Worker {
1088*f6dc9357SAndroid Build Coastguard Worker   #ifdef __clang__
1089*f6dc9357SAndroid Build Coastguard Worker     s += " CLANG ";
1090*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt32(__clang_major__);
1091*f6dc9357SAndroid Build Coastguard Worker     s.Add_Dot();
1092*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt32(__clang_minor__);
1093*f6dc9357SAndroid Build Coastguard Worker     s.Add_Dot();
1094*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt32(__clang_patchlevel__);
1095*f6dc9357SAndroid Build Coastguard Worker   #endif
1096*f6dc9357SAndroid Build Coastguard Worker 
1097*f6dc9357SAndroid Build Coastguard Worker   #ifdef __xlC__
1098*f6dc9357SAndroid Build Coastguard Worker     s += " XLC ";
1099*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt32(__xlC__ >> 8);
1100*f6dc9357SAndroid Build Coastguard Worker     s.Add_Dot();
1101*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt32(__xlC__ & 0xFF);
1102*f6dc9357SAndroid Build Coastguard Worker     #ifdef __xlC_ver__
1103*f6dc9357SAndroid Build Coastguard Worker       s.Add_Dot();
1104*f6dc9357SAndroid Build Coastguard Worker       s.Add_UInt32(__xlC_ver__ >> 8);
1105*f6dc9357SAndroid Build Coastguard Worker       s.Add_Dot();
1106*f6dc9357SAndroid Build Coastguard Worker       s.Add_UInt32(__xlC_ver__ & 0xFF);
1107*f6dc9357SAndroid Build Coastguard Worker     #endif
1108*f6dc9357SAndroid Build Coastguard Worker   #endif
1109*f6dc9357SAndroid Build Coastguard Worker 
1110*f6dc9357SAndroid Build Coastguard Worker   // #define __LCC__ 126
1111*f6dc9357SAndroid Build Coastguard Worker   // #define __LCC_MINOR__ 20
1112*f6dc9357SAndroid Build Coastguard Worker   // #define __MCST__ 1
1113*f6dc9357SAndroid Build Coastguard Worker   #ifdef __MCST__
1114*f6dc9357SAndroid Build Coastguard Worker     s += " MCST";
1115*f6dc9357SAndroid Build Coastguard Worker   #endif
1116*f6dc9357SAndroid Build Coastguard Worker   #ifdef __LCC__
1117*f6dc9357SAndroid Build Coastguard Worker     s += " LCC ";
1118*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt32(__LCC__ / 100);
1119*f6dc9357SAndroid Build Coastguard Worker     s.Add_Dot();
1120*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt32(__LCC__ % 100 / 10);
1121*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt32(__LCC__ % 10);
1122*f6dc9357SAndroid Build Coastguard Worker     #ifdef __LCC_MINOR__
1123*f6dc9357SAndroid Build Coastguard Worker       s.Add_Dot();
1124*f6dc9357SAndroid Build Coastguard Worker       s.Add_UInt32(__LCC_MINOR__ / 10);
1125*f6dc9357SAndroid Build Coastguard Worker       s.Add_UInt32(__LCC_MINOR__ % 10);
1126*f6dc9357SAndroid Build Coastguard Worker     #endif
1127*f6dc9357SAndroid Build Coastguard Worker   #endif
1128*f6dc9357SAndroid Build Coastguard Worker 
1129*f6dc9357SAndroid Build Coastguard Worker   // #define __EDG_VERSION__ 602
1130*f6dc9357SAndroid Build Coastguard Worker   #ifdef __EDG_VERSION__
1131*f6dc9357SAndroid Build Coastguard Worker     s += " EDG ";
1132*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt32(__EDG_VERSION__ / 100);
1133*f6dc9357SAndroid Build Coastguard Worker     s.Add_Dot();
1134*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt32(__EDG_VERSION__ % 100 / 10);
1135*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt32(__EDG_VERSION__ % 10);
1136*f6dc9357SAndroid Build Coastguard Worker   #endif
1137*f6dc9357SAndroid Build Coastguard Worker 
1138*f6dc9357SAndroid Build Coastguard Worker   #ifdef __VERSION__
1139*f6dc9357SAndroid Build Coastguard Worker     s.Add_Space();
1140*f6dc9357SAndroid Build Coastguard Worker     s += "ver:";
1141*f6dc9357SAndroid Build Coastguard Worker     s += __VERSION__;
1142*f6dc9357SAndroid Build Coastguard Worker   #endif
1143*f6dc9357SAndroid Build Coastguard Worker 
1144*f6dc9357SAndroid Build Coastguard Worker   #ifdef __GNUC__
1145*f6dc9357SAndroid Build Coastguard Worker     s += " GCC ";
1146*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt32(__GNUC__);
1147*f6dc9357SAndroid Build Coastguard Worker     s.Add_Dot();
1148*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt32(__GNUC_MINOR__);
1149*f6dc9357SAndroid Build Coastguard Worker     s.Add_Dot();
1150*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt32(__GNUC_PATCHLEVEL__);
1151*f6dc9357SAndroid Build Coastguard Worker   #endif
1152*f6dc9357SAndroid Build Coastguard Worker 
1153*f6dc9357SAndroid Build Coastguard Worker 
1154*f6dc9357SAndroid Build Coastguard Worker   #ifdef _MSC_VER
1155*f6dc9357SAndroid Build Coastguard Worker     s += " MSC ";
1156*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt32(_MSC_VER);
1157*f6dc9357SAndroid Build Coastguard Worker     #ifdef _MSC_FULL_VER
1158*f6dc9357SAndroid Build Coastguard Worker       s.Add_Dot();
1159*f6dc9357SAndroid Build Coastguard Worker       s.Add_UInt32(_MSC_FULL_VER);
1160*f6dc9357SAndroid Build Coastguard Worker     #endif
1161*f6dc9357SAndroid Build Coastguard Worker 
1162*f6dc9357SAndroid Build Coastguard Worker   #endif
1163*f6dc9357SAndroid Build Coastguard Worker 
1164*f6dc9357SAndroid Build Coastguard Worker     #if defined(__AVX512F__)
1165*f6dc9357SAndroid Build Coastguard Worker       #if defined(__AVX512VL__)
1166*f6dc9357SAndroid Build Coastguard Worker         #define MY_CPU_COMPILE_ISA "AVX512VL"
1167*f6dc9357SAndroid Build Coastguard Worker       #else
1168*f6dc9357SAndroid Build Coastguard Worker         #define MY_CPU_COMPILE_ISA "AVX512F"
1169*f6dc9357SAndroid Build Coastguard Worker       #endif
1170*f6dc9357SAndroid Build Coastguard Worker     #elif defined(__AVX2__)
1171*f6dc9357SAndroid Build Coastguard Worker       #define MY_CPU_COMPILE_ISA "AVX2"
1172*f6dc9357SAndroid Build Coastguard Worker     #elif defined(__AVX__)
1173*f6dc9357SAndroid Build Coastguard Worker       #define MY_CPU_COMPILE_ISA "AVX"
1174*f6dc9357SAndroid Build Coastguard Worker     #elif defined(__SSE2__)
1175*f6dc9357SAndroid Build Coastguard Worker       #define MY_CPU_COMPILE_ISA "SSE2"
1176*f6dc9357SAndroid Build Coastguard Worker     #elif defined(_M_IX86_FP) && (_M_IX86_FP >= 2)
1177*f6dc9357SAndroid Build Coastguard Worker       #define MY_CPU_COMPILE_ISA "SSE2"
1178*f6dc9357SAndroid Build Coastguard Worker     #elif defined(__SSE__)
1179*f6dc9357SAndroid Build Coastguard Worker       #define MY_CPU_COMPILE_ISA "SSE"
1180*f6dc9357SAndroid Build Coastguard Worker     #elif defined(_M_IX86_FP) && (_M_IX86_FP >= 1)
1181*f6dc9357SAndroid Build Coastguard Worker       #define MY_CPU_COMPILE_ISA "SSE"
1182*f6dc9357SAndroid Build Coastguard Worker     #elif defined(__i686__)
1183*f6dc9357SAndroid Build Coastguard Worker       #define MY_CPU_COMPILE_ISA "i686"
1184*f6dc9357SAndroid Build Coastguard Worker     #elif defined(__i586__)
1185*f6dc9357SAndroid Build Coastguard Worker       #define MY_CPU_COMPILE_ISA "i586"
1186*f6dc9357SAndroid Build Coastguard Worker     #elif defined(__i486__)
1187*f6dc9357SAndroid Build Coastguard Worker       #define MY_CPU_COMPILE_ISA "i486"
1188*f6dc9357SAndroid Build Coastguard Worker     #elif defined(__i386__)
1189*f6dc9357SAndroid Build Coastguard Worker       #define MY_CPU_COMPILE_ISA "i386"
1190*f6dc9357SAndroid Build Coastguard Worker     #elif defined(_M_IX86_FP)
1191*f6dc9357SAndroid Build Coastguard Worker       #define MY_CPU_COMPILE_ISA "IA32"
1192*f6dc9357SAndroid Build Coastguard Worker     #endif
1193*f6dc9357SAndroid Build Coastguard Worker 
1194*f6dc9357SAndroid Build Coastguard Worker   AString s2;
1195*f6dc9357SAndroid Build Coastguard Worker 
1196*f6dc9357SAndroid Build Coastguard Worker   #ifdef MY_CPU_COMPILE_ISA
1197*f6dc9357SAndroid Build Coastguard Worker     s2.Add_OptSpaced(MY_CPU_COMPILE_ISA);
1198*f6dc9357SAndroid Build Coastguard Worker   #endif
1199*f6dc9357SAndroid Build Coastguard Worker 
1200*f6dc9357SAndroid Build Coastguard Worker #ifndef MY_CPU_ARM64
1201*f6dc9357SAndroid Build Coastguard Worker   #ifdef __ARM_FP
1202*f6dc9357SAndroid Build Coastguard Worker     s2.Add_OptSpaced("FP");
1203*f6dc9357SAndroid Build Coastguard Worker   #endif
1204*f6dc9357SAndroid Build Coastguard Worker   #ifdef __ARM_NEON
1205*f6dc9357SAndroid Build Coastguard Worker     s2.Add_OptSpaced("NEON");
1206*f6dc9357SAndroid Build Coastguard Worker   #endif
1207*f6dc9357SAndroid Build Coastguard Worker   #ifdef __NEON__
1208*f6dc9357SAndroid Build Coastguard Worker     s2.Add_OptSpaced("__NEON__");
1209*f6dc9357SAndroid Build Coastguard Worker   #endif
1210*f6dc9357SAndroid Build Coastguard Worker   #ifdef __ARM_FEATURE_SIMD32
1211*f6dc9357SAndroid Build Coastguard Worker     s2.Add_OptSpaced("SIMD32");
1212*f6dc9357SAndroid Build Coastguard Worker   #endif
1213*f6dc9357SAndroid Build Coastguard Worker #endif
1214*f6dc9357SAndroid Build Coastguard Worker 
1215*f6dc9357SAndroid Build Coastguard Worker   #ifdef __ARM_FEATURE_CRYPTO
1216*f6dc9357SAndroid Build Coastguard Worker     s2.Add_OptSpaced("CRYPTO");
1217*f6dc9357SAndroid Build Coastguard Worker   #endif
1218*f6dc9357SAndroid Build Coastguard Worker 
1219*f6dc9357SAndroid Build Coastguard Worker   #ifdef __ARM_FEATURE_SHA2
1220*f6dc9357SAndroid Build Coastguard Worker     s2.Add_OptSpaced("SHA2");
1221*f6dc9357SAndroid Build Coastguard Worker   #endif
1222*f6dc9357SAndroid Build Coastguard Worker 
1223*f6dc9357SAndroid Build Coastguard Worker   #ifdef __ARM_FEATURE_AES
1224*f6dc9357SAndroid Build Coastguard Worker     s2.Add_OptSpaced("AES");
1225*f6dc9357SAndroid Build Coastguard Worker   #endif
1226*f6dc9357SAndroid Build Coastguard Worker 
1227*f6dc9357SAndroid Build Coastguard Worker   #ifdef __ARM_FEATURE_CRC32
1228*f6dc9357SAndroid Build Coastguard Worker     s2.Add_OptSpaced("CRC32");
1229*f6dc9357SAndroid Build Coastguard Worker   #endif
1230*f6dc9357SAndroid Build Coastguard Worker 
1231*f6dc9357SAndroid Build Coastguard Worker   #ifdef __ARM_FEATURE_UNALIGNED
1232*f6dc9357SAndroid Build Coastguard Worker     s2.Add_OptSpaced("UNALIGNED");
1233*f6dc9357SAndroid Build Coastguard Worker   #endif
1234*f6dc9357SAndroid Build Coastguard Worker 
1235*f6dc9357SAndroid Build Coastguard Worker 
1236*f6dc9357SAndroid Build Coastguard Worker   #ifdef MY_CPU_BE
1237*f6dc9357SAndroid Build Coastguard Worker     s2.Add_OptSpaced("BE");
1238*f6dc9357SAndroid Build Coastguard Worker   #endif
1239*f6dc9357SAndroid Build Coastguard Worker 
1240*f6dc9357SAndroid Build Coastguard Worker   #if defined(MY_CPU_LE_UNALIGN) \
1241*f6dc9357SAndroid Build Coastguard Worker       && !defined(MY_CPU_X86_OR_AMD64) \
1242*f6dc9357SAndroid Build Coastguard Worker       && !defined(MY_CPU_ARM64)
1243*f6dc9357SAndroid Build Coastguard Worker     s2.Add_OptSpaced("LE-unaligned");
1244*f6dc9357SAndroid Build Coastguard Worker   #endif
1245*f6dc9357SAndroid Build Coastguard Worker 
1246*f6dc9357SAndroid Build Coastguard Worker   if (!s2.IsEmpty())
1247*f6dc9357SAndroid Build Coastguard Worker   {
1248*f6dc9357SAndroid Build Coastguard Worker     s.Add_OptSpaced(": ");
1249*f6dc9357SAndroid Build Coastguard Worker     s += s2;
1250*f6dc9357SAndroid Build Coastguard Worker   }
1251*f6dc9357SAndroid Build Coastguard Worker }
1252