@@ -283,11 +283,7 @@ static const char* parseCpuInfo(
283
283
while (ffStrbufGetline (& line , & len , cpuinfo ))
284
284
{
285
285
//Stop after reasonable information is acquired
286
- if ((* line == '\0' || * line == '\n' )
287
- #if __arm__ || __aarch64__ || __loongarch__
288
- && cpu -> name .length > 0 // #1202 #1204
289
- #endif
290
- )
286
+ if ((* line == '\0' || * line == '\n' ) && cpu -> name .length > 0 )
291
287
{
292
288
ffStrbufGetlineRestore (& line , & len , cpuinfo );
293
289
break ;
@@ -296,28 +292,37 @@ static const char* parseCpuInfo(
296
292
(void )(
297
293
// arm64 doesn't have "model name"; arm32 does have "model name" but its value is not useful.
298
294
// "Hardware" should always be used in this case
299
- #if !( __arm__ || __aarch64__ )
295
+ #if __x86_64__ || __i386__
300
296
(cpu -> name .length == 0 && ffParsePropLine (line , "model name :" , & cpu -> name )) ||
301
297
(cpu -> vendor .length == 0 && ffParsePropLine (line , "vendor_id :" , & cpu -> vendor )) ||
302
298
(physicalCoresBuffer -> length == 0 && ffParsePropLine (line , "cpu cores :" , physicalCoresBuffer )) ||
303
299
(cpuMHz -> length == 0 && ffParsePropLine (line , "cpu MHz :" , cpuMHz )) ||
304
300
#endif
305
301
306
- #if !(__x86_64__ || __i386__ || __arm__ || __aarch64__ )
307
- (cpuIsa -> length == 0 && ffParsePropLine (line , "isa :" , cpuIsa )) ||
308
- (cpuUarch -> length == 0 && ffParsePropLine (line , "uarch :" , cpuUarch )) ||
309
- #endif
310
-
311
302
#if __arm__ || __aarch64__
312
303
(cpuImplementer -> length == 0 && ffParsePropLine (line , "CPU implementer :" , cpuImplementer )) ||
313
304
(cpu -> name .length == 0 && ffParsePropLine (line , "Hardware :" , & cpu -> name )) || //For Android devices
314
305
#endif
306
+
315
307
#if __powerpc__ || __powerpc
308
+ (cpuMHz -> length == 0 && ffParsePropLine (line , "clock :" , & cpuMHz )) || //For POWER
316
309
(cpu -> name .length == 0 && ffParsePropLine (line , "cpu :" , & cpu -> name )) || //For POWER
317
310
#endif
318
- #if __mips__
311
+
312
+ #if __mips__ || __mips
319
313
(cpu -> name .length == 0 && ffParsePropLine (line , "cpu model :" , & cpu -> name )) || //For MIPS
320
314
#endif
315
+
316
+ #if __loongarch__
317
+ (cpu -> name .length == 0 && ffParsePropLine (line , "Model Name :" , & cpu -> name )) ||
318
+ (cpuMHz -> length == 0 && ffParsePropLine (line , "CPU MHz :" , cpuMHz )) ||
319
+ #endif
320
+
321
+ #if __riscv__ || __loongarch__
322
+ (cpuIsa -> length == 0 && ffParsePropLine (line , "isa :" , cpuIsa )) ||
323
+ (cpuUarch -> length == 0 && ffParsePropLine (line , "uarch :" , cpuUarch )) ||
324
+ #endif
325
+
321
326
false
322
327
);
323
328
}
@@ -414,6 +419,59 @@ static bool detectFrequency(FFCPUResult* cpu, const FFCPUOptions* options)
414
419
return true;
415
420
}
416
421
422
+ #if __i386__ || __x86_64__
423
+
424
+ FF_MAYBE_UNUSED static uint16_t getPackageCount (FFstrbuf * cpuinfo )
425
+ {
426
+ const char * p = cpuinfo -> chars ;
427
+ uint64_t low = 0 , high = 0 ;
428
+
429
+ while ((p = memmem (p , cpuinfo -> length - (uint32_t ) (p - cpuinfo -> chars ), "\nphysical id\t:" , strlen ("\nphysical id\t:" ))))
430
+ {
431
+ if (!p ) break ;
432
+ p += strlen ("\nphysical id\t:" );
433
+ char * pend ;
434
+ unsigned long id = strtoul (p , & pend , 10 );
435
+ if (__builtin_expect (id > 64 , false)) // Do 129-socket boards exist?
436
+ high |= 1 << (id - 64 );
437
+ else
438
+ low |= 1 << id ;
439
+ p = pend ;
440
+ }
441
+
442
+ return (uint16_t ) (__builtin_popcountll (low ) + __builtin_popcountll (high ));
443
+ }
444
+
445
+ FF_MAYBE_UNUSED static const char * detectCPUX86 (const FFCPUOptions * options , FFCPUResult * cpu )
446
+ {
447
+ FF_STRBUF_AUTO_DESTROY cpuinfo = ffStrbufCreateA (PROC_FILE_BUFFSIZ );
448
+ if (!ffReadFileBuffer ("/proc/cpuinfo" , & cpuinfo ) || cpuinfo .length == 0 )
449
+ return "ffReadFileBuffer(\"/proc/cpuinfo\") failed" ;
450
+
451
+ FF_STRBUF_AUTO_DESTROY physicalCoresBuffer = ffStrbufCreate ();
452
+ FF_STRBUF_AUTO_DESTROY cpuMHz = ffStrbufCreate ();
453
+ const char * error = parseCpuInfo (& cpuinfo , cpu , & physicalCoresBuffer , & cpuMHz , NULL ,NULL , NULL );
454
+ if (error ) return error ;
455
+
456
+ cpu -> coresLogical = (uint16_t ) get_nprocs_conf ();
457
+ cpu -> coresOnline = (uint16_t ) get_nprocs ();
458
+ cpu -> packages = getPackageCount (& cpuinfo );
459
+ cpu -> coresPhysical = (uint16_t ) ffStrbufToUInt (& physicalCoresBuffer , 0 ); // physical cores in single package
460
+ if (cpu -> coresPhysical == 0 )
461
+ cpu -> coresPhysical = cpu -> coresLogical ;
462
+ else if (cpu -> packages > 1 )
463
+ cpu -> coresPhysical *= cpu -> packages ;
464
+
465
+ // Ref https://github.com/fastfetch-cli/fastfetch/issues/1194#issuecomment-2295058252
466
+ ffCPUDetectSpeedByCpuid (cpu );
467
+ if (!detectFrequency (cpu , options ) || cpu -> frequencyBase == 0 )
468
+ cpu -> frequencyBase = (uint32_t ) ffStrbufToUInt (& cpuMHz , 0 );
469
+
470
+ return NULL ;
471
+ }
472
+
473
+ #else
474
+
417
475
FF_MAYBE_UNUSED static void parseIsa (FFstrbuf * cpuIsa )
418
476
{
419
477
// Always use the last part of the ISA string. Ref: #590 #1204
@@ -517,89 +575,74 @@ FF_MAYBE_UNUSED static void detectSocName(FFCPUResult* cpu)
517
575
}
518
576
}
519
577
520
- FF_MAYBE_UNUSED static uint16_t getPackageCount (FFstrbuf * cpuinfo )
521
- {
522
- const char * p = cpuinfo -> chars ;
523
- uint64_t low = 0 , high = 0 ;
524
-
525
- while ((p = memmem (p , cpuinfo -> length - (uint32_t ) (p - cpuinfo -> chars ), "\nphysical id\t:" , strlen ("\nphysical id\t:" ))))
526
- {
527
- if (!p ) break ;
528
- p += strlen ("\nphysical id\t:" );
529
- char * pend ;
530
- unsigned long id = strtoul (p , & pend , 10 );
531
- if (__builtin_expect (id > 64 , false)) // Do 129-socket boards exist?
532
- high |= 1 << (id - 64 );
533
- else
534
- low |= 1 << id ;
535
- p = pend ;
536
- }
537
-
538
- return (uint16_t ) (__builtin_popcountll (low ) + __builtin_popcountll (high ));
539
- }
540
-
541
- const char * ffDetectCPUImpl (const FFCPUOptions * options , FFCPUResult * cpu )
578
+ FF_MAYBE_UNUSED static const char * detectCPUOthers (const FFCPUOptions * options , FFCPUResult * cpu )
542
579
{
543
- FF_STRBUF_AUTO_DESTROY cpuinfo = ffStrbufCreateA (PROC_FILE_BUFFSIZ );
544
- if (!ffReadFileBuffer ("/proc/cpuinfo" , & cpuinfo ) || cpuinfo .length == 0 )
545
- return "ffReadFileBuffer(\"/proc/cpuinfo\") failed" ;
546
-
547
- cpu -> temperature = options -> temp ? detectCPUTemp () : FF_CPU_TEMP_UNSET ;
548
-
549
- FF_STRBUF_AUTO_DESTROY physicalCoresBuffer = ffStrbufCreate ();
550
- FF_STRBUF_AUTO_DESTROY cpuMHz = ffStrbufCreate ();
551
- FF_STRBUF_AUTO_DESTROY cpuIsa = ffStrbufCreate ();
552
- FF_STRBUF_AUTO_DESTROY cpuUarch = ffStrbufCreate ();
553
- FF_STRBUF_AUTO_DESTROY cpuImplementerStr = ffStrbufCreate ();
554
-
555
- const char * error = parseCpuInfo (& cpuinfo , cpu , & physicalCoresBuffer , & cpuMHz , & cpuIsa , & cpuUarch , & cpuImplementerStr );
556
- if (error ) return error ;
557
-
558
- cpu -> coresLogical = (uint16_t ) get_nprocs_conf ();
580
+ cpu -> coresPhysical = cpu -> coresLogical = (uint16_t ) get_nprocs_conf ();
559
581
cpu -> coresOnline = (uint16_t ) get_nprocs ();
560
- cpu -> coresPhysical = (uint16_t ) ffStrbufToUInt (& physicalCoresBuffer , cpu -> coresLogical );
561
- #if __x86_64__ || __i386__
562
- cpu -> packages = getPackageCount (& cpuinfo );
563
- if (cpu -> packages > 1 )
564
- cpu -> coresPhysical *= cpu -> packages ; // https://github.com/hykilpikonna/hyfetch/issues/374#issuecomment-2571578914
565
- #endif
566
-
567
- // Ref https://github.com/fastfetch-cli/fastfetch/issues/1194#issuecomment-2295058252
568
- ffCPUDetectSpeedByCpuid (cpu );
569
- if (!detectFrequency (cpu , options ) || cpu -> frequencyBase == 0 )
570
- cpu -> frequencyBase = (uint32_t ) ffStrbufToUInt (& cpuMHz , 0 );
571
582
572
583
#if __ANDROID__
573
584
detectAndroid (cpu );
574
- #elif !( __x86_64__ || __i386__ )
585
+ #else
575
586
detectSocName (cpu );
576
587
#endif
577
588
578
- #if __arm__ || __aarch64__
579
- uint32_t cpuImplementer = (uint32_t ) strtoul (cpuImplementerStr .chars , NULL , 16 );
580
- ffStrbufSetStatic (& cpu -> vendor , hwImplId2Vendor (cpuImplementer ));
589
+ detectFrequency (cpu , options );
581
590
582
- if (cpu -> name .length == 0 )
583
- detectArmName (& cpuinfo , cpu , cpuImplementer );
584
- #elif !(__x86_64__ || __i386__ )
585
591
if (cpu -> name .length == 0 )
586
592
{
587
- if (cpuUarch .length > 0 )
588
- {
589
- if (cpu -> name .length > 0 )
590
- ffStrbufAppendC (& cpu -> name , ' ' );
591
- ffStrbufAppend (& cpu -> name , & cpuUarch );
592
- }
593
+ FF_STRBUF_AUTO_DESTROY cpuinfo = ffStrbufCreateA (PROC_FILE_BUFFSIZ );
594
+ if (!ffReadFileBuffer ("/proc/cpuinfo" , & cpuinfo ) || cpuinfo .length == 0 )
595
+ return "ffReadFileBuffer(\"/proc/cpuinfo\") failed" ;
596
+
597
+ FF_STRBUF_AUTO_DESTROY cpuMHz = ffStrbufCreate ();
598
+ FF_STRBUF_AUTO_DESTROY cpuIsa = ffStrbufCreate ();
599
+ FF_STRBUF_AUTO_DESTROY cpuUarch = ffStrbufCreate ();
600
+ FF_STRBUF_AUTO_DESTROY cpuImplementerStr = ffStrbufCreate ();
601
+
602
+ const char * error = parseCpuInfo (& cpuinfo , cpu , NULL , & cpuMHz , & cpuIsa , & cpuUarch , & cpuImplementerStr );
603
+ if (error ) return error ;
604
+
605
+ if (cpu -> frequencyBase == 0 )
606
+ cpu -> frequencyBase = (uint32_t ) ffStrbufToUInt (& cpuMHz , 0 );
607
+
608
+ #if __arm__ || __aarch64__
609
+ uint32_t cpuImplementer = (uint32_t ) strtoul (cpuImplementerStr .chars , NULL , 16 );
610
+ ffStrbufSetStatic (& cpu -> vendor , hwImplId2Vendor (cpuImplementer ));
593
611
594
- if (cpuIsa .length > 0 )
612
+ if (cpu -> name .length == 0 )
613
+ detectArmName (& cpuinfo , cpu , cpuImplementer );
614
+ #elif __riscv__ || __riscv
615
+ if (cpu -> name .length == 0 )
595
616
{
596
- parseIsa (& cpuIsa );
597
- if (cpu -> name .length > 0 )
598
- ffStrbufAppendC (& cpu -> name , ' ' );
599
- ffStrbufAppend (& cpu -> name , & cpuIsa );
617
+ if (cpuUarch .length > 0 )
618
+ {
619
+ if (cpu -> name .length > 0 )
620
+ ffStrbufAppendC (& cpu -> name , ' ' );
621
+ ffStrbufAppend (& cpu -> name , & cpuUarch );
622
+ }
623
+
624
+ if (cpuIsa .length > 0 )
625
+ {
626
+ parseIsa (& cpuIsa );
627
+ if (cpu -> name .length > 0 )
628
+ ffStrbufAppendC (& cpu -> name , ' ' );
629
+ ffStrbufAppend (& cpu -> name , & cpuIsa );
630
+ }
600
631
}
632
+ #endif
601
633
}
602
- #endif
603
634
604
635
return NULL ;
605
636
}
637
+ #endif
638
+
639
+ const char * ffDetectCPUImpl (const FFCPUOptions * options , FFCPUResult * cpu )
640
+ {
641
+ cpu -> temperature = options -> temp ? detectCPUTemp () : FF_CPU_TEMP_UNSET ;
642
+
643
+ #if __x86_64__ || __i386__
644
+ return detectCPUX86 (options , cpu );
645
+ #else
646
+ return detectCPUOthers (options , cpu );
647
+ #endif
648
+ }
0 commit comments