@@ -326,7 +326,7 @@ void cpuinfo_riscv_linux_init(void) {
326
326
if (bitmask_all (riscv_linux_processors [processor ].flags , valid_processor_mask )) {
327
327
riscv_linux_processors [processor ].processor .linux_id = processor ;
328
328
riscv_linux_processors [processor ].flags |= CPUINFO_LINUX_FLAG_VALID ;
329
- cpuinfo_log_debug ("parsed processor %" PRIu32 , processor );
329
+ cpuinfo_log_debug ("parsed processor %zu" , processor );
330
330
}
331
331
}
332
332
@@ -553,12 +553,27 @@ void cpuinfo_riscv_linux_init(void) {
553
553
goto cleanup ;
554
554
}
555
555
556
+ l1i = calloc (valid_processors_count , sizeof (struct cpuinfo_cache ));
557
+ if (l1i == NULL ) {
558
+ cpuinfo_log_error ("failed to allocate %zu bytes for descriptions of %zu L1I caches" ,
559
+ valid_processors_count * sizeof (struct cpuinfo_cache ), valid_processors_count );
560
+ goto cleanup ;
561
+ }
562
+
563
+ l1d = calloc (valid_processors_count , sizeof (struct cpuinfo_cache ));
564
+ if (l1d == NULL ) {
565
+ cpuinfo_log_error ("failed to allocate %zu bytes for descriptions of %zu L1D caches" ,
566
+ valid_processors_count * sizeof (struct cpuinfo_cache ), valid_processors_count );
567
+ goto cleanup ;
568
+ }
569
+
556
570
/* Transfer contents of processor list to ABI structures. */
557
571
size_t valid_processors_index = 0 ;
558
572
size_t valid_cores_index = 0 ;
559
573
size_t valid_clusters_index = 0 ;
560
574
size_t valid_packages_index = 0 ;
561
575
size_t valid_uarchs_index = 0 ;
576
+ size_t l2_count = 0 ;
562
577
last_uarch = cpuinfo_uarch_unknown ;
563
578
for (size_t processor = 0 ; processor < riscv_linux_processors_count ; processor ++ ) {
564
579
if (!bitmask_all (riscv_linux_processors [processor ].flags , CPUINFO_LINUX_FLAG_VALID )) {
@@ -612,10 +627,26 @@ void cpuinfo_riscv_linux_init(void) {
612
627
sizeof (struct cpuinfo_package ));
613
628
}
614
629
630
+ /* Populate cache information structures in l1i, l1d */
631
+ struct cpuinfo_cache temp_l2 = { 0 };
632
+ cpuinfo_riscv_decode_cache (
633
+ riscv_linux_processors [processor ].core .uarch ,
634
+ & l1i [processor ], & l1d [processor ], & temp_l2 );
635
+ l1i [processor ].processor_start = l1d [processor ].processor_start = processor ;
636
+ l1i [processor ].processor_count = l1d [processor ].processor_count = 1 ;
637
+ if (temp_l2 .size != 0 ) {
638
+ /* Assume L2 is shared by cores in the same cluster */
639
+ if (riscv_linux_processors [processor ].package_leader_id == linux_id ) {
640
+ l2_count += 1 ;
641
+ }
642
+ }
643
+
615
644
/* Commit pointers on the final structures. */
616
645
processors [valid_processors_index - 1 ].core = & cores [valid_cores_index - 1 ];
617
646
processors [valid_processors_index - 1 ].cluster = & clusters [valid_clusters_index - 1 ];
618
647
processors [valid_processors_index - 1 ].package = & packages [valid_packages_index - 1 ];
648
+ processors [valid_processors_index - 1 ].cache .l1i = l1i + processor ;
649
+ processors [valid_processors_index - 1 ].cache .l1d = l1d + processor ;
619
650
620
651
cores [valid_cores_index - 1 ].cluster = & clusters [valid_clusters_index - 1 ];
621
652
cores [valid_cores_index - 1 ].package = & packages [valid_packages_index - 1 ];
@@ -627,9 +658,18 @@ void cpuinfo_riscv_linux_init(void) {
627
658
linux_cpu_to_uarch_index_map [linux_id ] = valid_uarchs_index - 1 ;
628
659
}
629
660
661
+ if (l2_count != 0 ) {
662
+ l2 = calloc (l2_count , sizeof (struct cpuinfo_cache ));
663
+ if (l2 == NULL ) {
664
+ cpuinfo_log_error ("failed to allocate %zu bytes for descriptions of %zu L2 caches" ,
665
+ l2_count * sizeof (struct cpuinfo_cache ), l2_count );
666
+ goto cleanup ;
667
+ }
668
+ }
669
+
670
+ /* Populate cache information structures in l2 */
630
671
uint32_t l2_index = UINT32_MAX ;
631
672
for (uint32_t processor = 0 ; processor < valid_processors_count ; processor ++ ) {
632
-
633
673
struct cpuinfo_cache dummy_l1i , dummy_l1d , temp_l2 = { 0 };
634
674
cpuinfo_riscv_decode_cache (
635
675
riscv_linux_processors [processor ].core .uarch ,
0 commit comments