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 ®isters);
GetCpuName_MultiLine(AString & s,AString & registers)1013*f6dc9357SAndroid Build Coastguard Worker void GetCpuName_MultiLine(AString &s, AString ®isters)
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