@@ -80,7 +80,11 @@ struct proc_cpuinfo_parser_state {
8080 * Decode a single line of /proc/cpuinfo information.
8181 * Lines have format <words-with-spaces>[ ]*:[ ]<space-separated words>
8282 */
83- static bool parse_line (const char * line_start , const char * line_end , void * context , uint64_t line_number ) {
83+ static bool parse_line (
84+ const char * line_start ,
85+ const char * line_end ,
86+ void * context ,
87+ uint64_t line_number ) {
8488 struct proc_cpuinfo_parser_state * restrict state = context ;
8589 /* Empty line. Skip. */
8690 if (line_start == line_end ) {
@@ -211,5 +215,129 @@ bool cpuinfo_x86_linux_parse_proc_cpuinfo(
211215 .max_processors_count = max_processors_count ,
212216 .processors = processors ,
213217 };
214- return cpuinfo_linux_parse_multiline_file ("/proc/cpuinfo" , BUFFER_SIZE , parse_line , & state );
218+ return cpuinfo_linux_parse_multiline_file (
219+ "/proc/cpuinfo" , BUFFER_SIZE , parse_line , & state );
215220}
221+
222+ #ifdef __ANDROID__
223+ bool cpuinfo_x86_linux_parse_cpuid_info (
224+ struct cpuinfo_x86_cpuid_info * x86_cpuid_info )
225+ {
226+ cpuinfo_log_debug ("reading cpuid.info file" );
227+ FILE * fd_info = fopen (CPUID_INFO_FILE , "rb" );
228+ if (!fd_info ) {
229+ cpuinfo_log_warning ("failed to open file %s: %s" , CPUID_INFO_FILE , strerror (errno ));
230+ return false;
231+ }
232+
233+ int ret = fread (x86_cpuid_info , sizeof (struct cpuinfo_x86_cpuid_info ), 1 , fd_info );
234+ if (!ret ) {
235+ cpuinfo_log_warning ("failed to read cpuid info from %s: %s" , CPUID_INFO_FILE , strerror (errno ));
236+ }
237+
238+ if (fclose (fd_info )) {
239+ cpuinfo_log_warning ("failed to close file %s: %s" , CPUID_INFO_FILE , strerror (errno ));
240+ }
241+
242+ return ret ? true : false;
243+ }
244+
245+ #ifdef __DEBUG__
246+ void print_cpuid_info_file (void )
247+ {
248+ cpuinfo_log_debug ("----------------------------" );
249+ /*
250+ cpuinfo_log_debug("%-20s: %d", "ace", cpuinfo_has_x86_ace());
251+ cpuinfo_log_debug("%-20s: %d", "ace2", cpuinfo_has_x86_ace2());
252+ cpuinfo_log_debug("%-20s: %d", "clflush", cpuinfo_has_x86_clflush());
253+ cpuinfo_log_debug("%-20s: %d", "clflushopt", cpuinfo_has_x86_clflushopt());
254+ cpuinfo_log_debug("%-20s: %d", "lwp", cpuinfo_has_x86_lwp());
255+ cpuinfo_log_debug("%-20s: %d", "msr", cpuinfo_has_x86_msr());
256+ cpuinfo_log_debug("%-20s: %d", "phe", cpuinfo_has_x86_phe());
257+ cpuinfo_log_debug("%-20s: %d", "pmm", cpuinfo_has_x86_pmm());
258+ cpuinfo_log_debug("%-20s: %d", "rng", cpuinfo_has_x86_rng());
259+ cpuinfo_log_debug("%-20s: %d", "sysenter", cpuinfo_has_x86_sysenter());
260+ cpuinfo_log_debug("%-20s: %d", "syscall", cpuinfo_has_x86_syscall());
261+ cpuinfo_log_debug("%-20s: %d", "emmx", cpuinfo_has_x86_emmx());
262+ cpuinfo_log_debug("%-20s: %d", "fs_gs_base", cpuinfo_has_x86_fs_gs_base());
263+ cpuinfo_log_debug("%-20s: %d", "fxsave", cpuinfo_has_x86_fxsave());
264+ */
265+ cpuinfo_log_debug ("%-20s: %d" , "erms" , cpuinfo_has_x86_erms ());
266+ cpuinfo_log_debug ("%-20s: %d" , "smap" , cpuinfo_has_x86_smap ());
267+ cpuinfo_log_debug ("%-20s: %d" , "serialize" , cpuinfo_has_x86_serialize ());
268+ cpuinfo_log_debug ("%-20s: %d" , "adx" , cpuinfo_has_x86_adx ());
269+ cpuinfo_log_debug ("%-20s: %d" , "aes" , cpuinfo_has_x86_aes ());
270+ cpuinfo_log_debug ("%-20s: %d" , "avx" , cpuinfo_has_x86_avx ());
271+ cpuinfo_log_debug ("%-20s: %d" , "avx2" , cpuinfo_has_x86_avx2 ());
272+ cpuinfo_log_debug ("%-20s: %d" , "avx512bf16" , cpuinfo_has_x86_avx512bf16 ());
273+ cpuinfo_log_debug ("%-20s: %d" , "avx512bitalg" , cpuinfo_has_x86_avx512bitalg ());
274+ cpuinfo_log_debug ("%-20s: %d" , "avx512bw" , cpuinfo_has_x86_avx512bw ());
275+ cpuinfo_log_debug ("%-20s: %d" , "avx512cd" , cpuinfo_has_x86_avx512cd ());
276+ cpuinfo_log_debug ("%-20s: %d" , "avx512dq" , cpuinfo_has_x86_avx512dq ());
277+ cpuinfo_log_debug ("%-20s: %d" , "avx512er" , cpuinfo_has_x86_avx512er ());
278+ cpuinfo_log_debug ("%-20s: %d" , "avx512f" , cpuinfo_has_x86_avx512f ());
279+ cpuinfo_log_debug ("%-20s: %d" , "avx512ifma" , cpuinfo_has_x86_avx512ifma ());
280+ cpuinfo_log_debug ("%-20s: %d" , "avx512pf" , cpuinfo_has_x86_avx512pf ());
281+ cpuinfo_log_debug ("%-20s: %d" , "avx512vbmi" , cpuinfo_has_x86_avx512vbmi ());
282+ cpuinfo_log_debug ("%-20s: %d" , "avx512vbmi2" , cpuinfo_has_x86_avx512vbmi2 ());
283+ cpuinfo_log_debug ("%-20s: %d" , "avx512vl" , cpuinfo_has_x86_avx512vl ());
284+ cpuinfo_log_debug ("%-20s: %d" , "avx512vnni" , cpuinfo_has_x86_avx512vnni ());
285+ cpuinfo_log_debug ("%-20s: %d" , "avx512vp2intersect" , cpuinfo_has_x86_avx512vp2intersect ());
286+ cpuinfo_log_debug ("%-20s: %d" , "avx512vpopcntdq" , cpuinfo_has_x86_avx512vpopcntdq ());
287+ cpuinfo_log_debug ("%-20s: %d" , "avx512_4fmaps" , cpuinfo_has_x86_avx512_4fmaps ());
288+ cpuinfo_log_debug ("%-20s: %d" , "avx512_4vnniw" , cpuinfo_has_x86_avx512_4vnniw ());
289+ cpuinfo_log_debug ("%-20s: %d" , "bmi" , cpuinfo_has_x86_bmi ());
290+ cpuinfo_log_debug ("%-20s: %d" , "bmi2" , cpuinfo_has_x86_bmi2 ());
291+ cpuinfo_log_debug ("%-20s: %d" , "clwb" , cpuinfo_has_x86_clwb ());
292+ cpuinfo_log_debug ("%-20s: %d" , "clzero" , cpuinfo_has_x86_clzero ());
293+ cpuinfo_log_debug ("%-20s: %d" , "cmpxchg16b" , cpuinfo_has_x86_cmpxchg16b ());
294+ cpuinfo_log_debug ("%-20s: %d" , "f16c" , cpuinfo_has_x86_f16c ());
295+ cpuinfo_log_debug ("%-20s: %d" , "fma3" , cpuinfo_has_x86_fma3 ());
296+ cpuinfo_log_debug ("%-20s: %d" , "fma4" , cpuinfo_has_x86_fma4 ());
297+ cpuinfo_log_debug ("%-20s: %d" , "gfni" , cpuinfo_has_x86_gfni ());
298+ cpuinfo_log_debug ("%-20s: %d" , "hle" , cpuinfo_has_x86_hle ());
299+ cpuinfo_log_debug ("%-20s: %d" , "lzcnt" , cpuinfo_has_x86_lzcnt ());
300+ cpuinfo_log_debug ("%-20s: %d" , "misaligned_sse" , cpuinfo_has_x86_misaligned_sse ());
301+ cpuinfo_log_debug ("%-20s: %d" , "movbe" , cpuinfo_has_x86_movbe ());
302+ cpuinfo_log_debug ("%-20s: %d" , "mpx" , cpuinfo_has_x86_mpx ());
303+ cpuinfo_log_debug ("%-20s: %d" , "mwait" , cpuinfo_has_x86_mwait ());
304+ cpuinfo_log_debug ("%-20s: %d" , "mwaitx" , cpuinfo_has_x86_mwaitx ());
305+ cpuinfo_log_debug ("%-20s: %d" , "pclmulqdq" , cpuinfo_has_x86_pclmulqdq ());
306+ cpuinfo_log_debug ("%-20s: %d" , "popcnt" , cpuinfo_has_x86_popcnt ());
307+ cpuinfo_log_debug ("%-20s: %d" , "prefetch" , cpuinfo_has_x86_prefetch ());
308+ cpuinfo_log_debug ("%-20s: %d" , "prefetchw" , cpuinfo_has_x86_prefetchw ());
309+ cpuinfo_log_debug ("%-20s: %d" , "prefetchwt1" , cpuinfo_has_x86_prefetchwt1 ());
310+ cpuinfo_log_debug ("%-20s: %d" , "rdpid" , cpuinfo_has_x86_rdpid ());
311+ cpuinfo_log_debug ("%-20s: %d" , "rdrand" , cpuinfo_has_x86_rdrand ());
312+ cpuinfo_log_debug ("%-20s: %d" , "rdseed" , cpuinfo_has_x86_rdseed ());
313+ cpuinfo_log_debug ("%-20s: %d" , "rdtscp" , cpuinfo_has_x86_rdtscp ());
314+ cpuinfo_log_debug ("%-20s: %d" , "rtm" , cpuinfo_has_x86_rtm ());
315+ cpuinfo_log_debug ("%-20s: %d" , "sha" , cpuinfo_has_x86_sha ());
316+ cpuinfo_log_debug ("%-20s: %d" , "sse3" , cpuinfo_has_x86_sse3 ());
317+ cpuinfo_log_debug ("%-20s: %d" , "sse4a" , cpuinfo_has_x86_sse4a ());
318+ cpuinfo_log_debug ("%-20s: %d" , "sse4_1" , cpuinfo_has_x86_sse4_1 ());
319+ cpuinfo_log_debug ("%-20s: %d" , "sse4_2" , cpuinfo_has_x86_sse4_2 ());
320+ cpuinfo_log_debug ("%-20s: %d" , "ssse3" , cpuinfo_has_x86_ssse3 ());
321+ cpuinfo_log_debug ("%-20s: %d" , "tbm" , cpuinfo_has_x86_tbm ());
322+ cpuinfo_log_debug ("%-20s: %d" , "three_d_now" , cpuinfo_has_x86_3dnow ());
323+ cpuinfo_log_debug ("%-20s: %d" , "three_d_now_plus" , cpuinfo_has_x86_3dnow_plus ());
324+ cpuinfo_log_debug ("%-20s: %d" , "vaes" , cpuinfo_has_x86_vaes ());
325+ cpuinfo_log_debug ("%-20s: %d" , "vpclmulqdq" , cpuinfo_has_x86_vpclmulqdq ());
326+ cpuinfo_log_debug ("%-20s: %d" , "xop" , cpuinfo_has_x86_xop ());
327+ cpuinfo_log_debug ("%-20s: %d" , "xsave" , cpuinfo_has_x86_xsave ());
328+ cpuinfo_log_debug ("%-20s: %d" , "xtest" , cpuinfo_has_x86_xtest ());
329+ cpuinfo_log_debug ("%-20s: %d" , "cmov" , cpuinfo_has_x86_cmov ());
330+ cpuinfo_log_debug ("%-20s: %d" , "cmpxchg8b" , cpuinfo_has_x86_cmpxchg8b ());
331+ cpuinfo_log_debug ("%-20s: %d" , "daz" , cpuinfo_has_x86_daz ());
332+ cpuinfo_log_debug ("%-20s: %d" , "fpu" , cpuinfo_has_x86_fpu ());
333+ cpuinfo_log_debug ("%-20s: %d" , "mmx" , cpuinfo_has_x86_mmx ());
334+ cpuinfo_log_debug ("%-20s: %d" , "mmx_plus" , cpuinfo_has_x86_mmx_plus ());
335+ cpuinfo_log_debug ("%-20s: %d" , "rdtsc" , cpuinfo_has_x86_rdtsc ());
336+ cpuinfo_log_debug ("%-20s: %d" , "sse" , cpuinfo_has_x86_sse ());
337+ cpuinfo_log_debug ("%-20s: %d" , "sse2" , cpuinfo_has_x86_sse2 ());
338+ cpuinfo_log_debug ("%-20s: %d" , "three_d_now_geode" , cpuinfo_has_x86_3dnow_geode ());
339+ cpuinfo_log_debug ("%-20s: %d" , "lahf_sahf" , cpuinfo_has_x86_lahf_sahf ());
340+ cpuinfo_log_debug ("----------------------------" );
341+ }
342+ #endif // __DEBUG__
343+ #endif // __ANDROID__
0 commit comments