Skip to content

Commit 39dc29d

Browse files
Minor fixes
1 parent 1c03839 commit 39dc29d

File tree

7 files changed

+50
-35
lines changed

7 files changed

+50
-35
lines changed

src/riscv/api.h

+17
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,28 @@ CPUINFO_INTERNAL void cpuinfo_riscv_decode_vendor_uarch(
4242
enum cpuinfo_vendor vendor[restrict static 1],
4343
enum cpuinfo_uarch uarch[restrict static 1]);
4444

45+
/**
46+
* Decodes the cache hierarchy based on the provided inpu parameters,
47+
* regardless of underlying operating system.
48+
*
49+
* @param[uarch]: The processor micro-architecture code.
50+
* @param[l1i] - Reference to the l1i cpuinfo_cache to populate.
51+
* @param[l1d]: - Reference to the l1d cpuinfo_cache to populate.
52+
* @param[l2]: - Reference to the l2 cpuinfo_cache to populate.
53+
*/
54+
4555
CPUINFO_INTERNAL void cpuinfo_riscv_decode_cache(
4656
enum cpuinfo_uarch uarch,
4757
struct cpuinfo_cache l1i[restrict static 1],
4858
struct cpuinfo_cache l1d[restrict static 1],
4959
struct cpuinfo_cache l2[restrict static 1]);
5060

61+
/**
62+
* Extracts the maximum cache size from a RISC-V processor, independently
63+
* of underlying operating system.
64+
*
65+
* @param[processor]: The RISC-V processor.
66+
* @preturn: The maximum cache size.
67+
*/
5168
CPUINFO_INTERNAL uint32_t cpuinfo_riscv_compute_max_cache_size(
5269
const struct cpuinfo_processor processor[restrict static 1]);

src/riscv/cache.c

+4-3
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ void cpuinfo_riscv_decode_cache(
88
enum cpuinfo_uarch uarch,
99
struct cpuinfo_cache l1i[restrict static 1],
1010
struct cpuinfo_cache l1d[restrict static 1],
11-
struct cpuinfo_cache l2[restrict static 1])
12-
{
11+
struct cpuinfo_cache l2[restrict static 1]) {
1312
switch(uarch) {
13+
// According to https://starfivetech.com/uploads/u74mc_core_complex_manual_21G1.pdf
1414
case cpuinfo_uarch_u74_mc:
1515
*l1i = (struct cpuinfo_cache) {
1616
.size = 32 * 1024,
@@ -43,10 +43,11 @@ void cpuinfo_riscv_decode_cache(
4343

4444
uint32_t cpuinfo_riscv_compute_max_cache_size(const struct cpuinfo_processor* processor) {
4545
switch(processor->core->uarch) {
46+
// According to https://starfivetech.com/uploads/u74mc_core_complex_manual_21G1.pdf
4647
case cpuinfo_uarch_u74_mc:
4748
return 2 * 1024 * 1024;
4849
default:
49-
cpuinfo_log_warning("target uarch not recognized; mas cache size is not populated");
50+
cpuinfo_log_warning("target uarch not recognized; max cache size is not populated");
5051
return 0;
5152
}
5253
}

src/riscv/linux/api.h

+14-3
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,24 @@ CPUINFO_INTERNAL void cpuinfo_riscv_linux_decode_vendor_uarch_from_hwprobe(
8686
enum cpuinfo_vendor vendor[restrict static 1],
8787
enum cpuinfo_uarch uarch[restrict static 1]);
8888

89-
CPUINFO_INTERNAL void cpuinfo_riscv_linux_count_cluster_processors(
90-
uint32_t max_processors,
91-
struct cpuinfo_riscv_linux_processor processors[restrict static max_processors]);
89+
/**
90+
* Reads the value of hwcap from the `getauxval` function, or
91+
* mocks a fake value for testing purposes
92+
*
93+
* @param[hwcap] - The hwcap flags to be populated
94+
*/
9295

9396
CPUINFO_INTERNAL void cpuinfo_riscv_linux_hwcap_from_getauxval(
9497
uint32_t hwcap[restrict static 1]);
9598

99+
/**
100+
* Parses the output of the `/proc/cpuinfo` command to extract
101+
* info about the RISC-V processors.
102+
*
103+
* @param[max_processors_count] - The maximum number of processors.
104+
* @param processors - Reference to the processor list to populate.
105+
* @return false if any error occurred, true otherwise.
106+
*/
96107
CPUINFO_INTERNAL bool cpuinfo_riscv_linux_parse_proc_cpuinfo(
97108
uint32_t max_processors_count,
98109
struct cpuinfo_riscv_linux_processor processors[restrict static max_processors_count]);

src/riscv/linux/cpuinfo.c

+10-12
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ static uint32_t parse_processor_number(
2121

2222
if (processor_length == 0) {
2323
cpuinfo_log_warning("Processor number in /proc/cpuinfo is ignored: string is empty");
24-
return 0;
24+
return -1;
2525
}
2626

2727
uint32_t processor_number = 0;
@@ -45,7 +45,7 @@ static void parse_isa(
4545
struct cpuinfo_riscv_linux_processor processor[restrict static 1])
4646
{
4747
const size_t isa_length = (size_t) (isa_end - isa_start);
48-
if (!(memcmp(isa_start, "rv32", 4) == 0 || memcmp(isa_start, "rv64", 4) == 0)) {
48+
if (isa_length < 4 || !(memcmp(isa_start, "rv32", 4) == 0 || memcmp(isa_start, "rv64", 4) == 0)) {
4949
cpuinfo_log_error("Invalid isa format in /proc/cpuinfo: %.*s. It should start with either `rv32` or `rv64`",
5050
(int) (isa_length), isa_start);
5151
return;
@@ -178,8 +178,8 @@ static bool parse_line(
178178
}
179179
/* Skip line if no ':' separator was found. */
180180
if (separator == line_end) {
181-
cpuinfo_log_info("Line %.*s in /proc/cpuinfo is ignored: key/value separator ':' not found",
182-
(int) (line_end - line_start), line_start);
181+
cpuinfo_log_warning("Line %.*s in /proc/cpuinfo is ignored: key/value separator ':' not found",
182+
(int) (line_end - line_start), line_start);
183183
return true;
184184
}
185185

@@ -238,13 +238,6 @@ static bool parse_line(
238238
goto unknown;
239239
}
240240
break;
241-
case 4:
242-
if (memcmp(line_start, "hart", key_length) == 0) {
243-
// Do nothing
244-
} else {
245-
goto unknown;
246-
}
247-
break;
248241
case 5:
249242
if (memcmp(line_start, "uarch", key_length) == 0) {
250243
parse_uarch(value_start, value_end, processor);
@@ -255,7 +248,10 @@ static bool parse_line(
255248
case 9:
256249
if (memcmp(line_start, "processor", key_length) == 0) {
257250
const uint32_t new_processor_index = parse_processor_number(value_start, value_end);
258-
if (new_processor_index < processor_index) {
251+
if (new_processor_index < 0) {
252+
/* Strange: empty string */
253+
break;
254+
} else if (new_processor_index < processor_index) {
259255
/* Strange: decreasing processor number */
260256
cpuinfo_log_warning(
261257
"unexpectedly low processor number %"PRIu32" following processor %"PRIu32" in /proc/cpuinfo",
@@ -280,6 +276,8 @@ static bool parse_line(
280276
}
281277
break;
282278
default:
279+
// Do nothing
280+
break;
283281
unknown:
284282
cpuinfo_log_debug("unknown /proc/cpuinfo key: %.*s", (int) key_length, line_start);
285283
}

src/riscv/linux/hwcap.c

+2-14
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,16 @@
22

33
#if CPUINFO_MOCK
44
#include <cpuinfo-mock.h>
5-
#endif
6-
7-
#if CPUINFO_ARCH_RISCV32 || CPUINFO_ARCH_RISCV64
8-
#include <sys/auxv.h>
9-
#else
10-
#define AT_HWCAP 16
11-
#define AT_HWCAP2 26
12-
#endif
135

14-
#if CPUINFO_MOCK
156
static uint32_t mock_hwcap = 0;
167
void cpuinfo_set_hwcap(uint32_t hwcap) {
178
mock_hwcap = hwcap;
189
}
19-
20-
static uint32_t mock_hwcap2 = 0;
21-
void cpuinfo_set_hwcap2(uint32_t hwcap2) {
22-
mock_hwcap2 = hwcap2;
23-
}
2410
#endif
2511

2612
#if CPUINFO_ARCH_RISCV32 || CPUINFO_ARCH_RISCV64
13+
#include <sys/auxv.h>
14+
2715
void cpuinfo_riscv_linux_hwcap_from_getauxval(
2816
uint32_t hwcap[restrict static 1])
2917
{

src/riscv/linux/init.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -634,7 +634,7 @@ void cpuinfo_riscv_linux_init(void) {
634634
l1i[processor].processor_count = l1d[processor].processor_count = 1;
635635
if (temp_l2.size != 0) {
636636
/* Assume L2 is shared by cores in the same cluster */
637-
if (riscv_linux_processors[processor].package_leader_id == linux_id) {
637+
if (riscv_linux_processors[processor].cluster_leader_id == linux_id) {
638638
l2_count += 1;
639639
}
640640
}
@@ -674,7 +674,7 @@ void cpuinfo_riscv_linux_init(void) {
674674
&dummy_l1i, &dummy_l1d, &temp_l2);
675675

676676
if (temp_l2.size != 0) {
677-
if (riscv_linux_processors[processor].package_leader_id == riscv_linux_processors[processor].processor.linux_id) {
677+
if (riscv_linux_processors[processor].cluster_leader_id == riscv_linux_processors[processor].processor.linux_id) {
678678
l2_index += 1;
679679
l2[l2_index] = (struct cpuinfo_cache) {
680680
.size = temp_l2.size,

src/riscv/linux/riscv-isa.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
void cpuinfo_riscv_linux_decode_isa_from_hwcap(
88
struct cpuinfo_riscv_isa isa[restrict static 1]) {
9-
unsigned long hwcap = 0;
9+
uint32_t hwcap = 0;
1010
cpuinfo_riscv_linux_hwcap_from_getauxval(&hwcap);
1111

1212
if (hwcap & CPUINFO_RISCV_LINUX_FEATURE_I) {

0 commit comments

Comments
 (0)