Skip to content

Commit faba41d

Browse files
committed
fix RISC-V _Z extension parsing, they don't have a defined order
1 parent 7a8174a commit faba41d

File tree

3 files changed

+42
-3
lines changed

3 files changed

+42
-3
lines changed

include/cpuinfo_riscv.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ typedef enum {
5757
RISCV_Q,
5858
RISCV_C,
5959
RISCV_V,
60-
RISCV_Zicsr,
60+
RISCV_FIRST_UNORDERED_,
61+
RISCV_Zicsr = RISCV_FIRST_UNORDERED_,
6162
RISCV_Zifencei,
6263
RISCV_LAST_,
6364
} RiscvFeaturesEnum;

src/impl_riscv_linux.c

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,9 @@
5858

5959
static const RiscvInfo kEmptyRiscvInfo;
6060

61-
static void HandleRiscVIsaLine(StringView line, RiscvFeatures* const features) {
62-
for (size_t i = 0; i < RISCV_LAST_; ++i) {
61+
static void HandleRiscVIsaLineOrdered(StringView line,
62+
RiscvFeatures* const features) {
63+
for (size_t i = 0; i < RISCV_FIRST_UNORDERED_; ++i) {
6364
StringView flag = str(kCpuInfoFlags[i]);
6465
int index_of_flag = CpuFeatures_StringView_IndexOf(line, flag);
6566
bool is_set = index_of_flag != -1;
@@ -69,6 +70,22 @@ static void HandleRiscVIsaLine(StringView line, RiscvFeatures* const features) {
6970
}
7071
}
7172

73+
static void HandleRiscVIsaLineUnordered(StringView line,
74+
RiscvFeatures* const features) {
75+
for (size_t i = RISCV_FIRST_UNORDERED_; i < RISCV_LAST_; ++i) {
76+
bool is_set = CpuFeatures_StringView_HasWord(line, kCpuInfoFlags[i], '_');
77+
kSetters[i](features, is_set);
78+
}
79+
}
80+
81+
static void HandleRiscVIsaLine(StringView line, RiscvFeatures* const features) {
82+
int idx_underscore = CpuFeatures_StringView_IndexOfChar(line, '_');
83+
StringView ordered = CpuFeatures_StringView_PopBack(line, idx_underscore);
84+
StringView unordered = CpuFeatures_StringView_PopFront(line, idx_underscore);
85+
HandleRiscVIsaLineOrdered(ordered, features);
86+
HandleRiscVIsaLineUnordered(unordered, features);
87+
}
88+
7289
static bool HandleRiscVLine(const LineResult result, RiscvInfo* const info) {
7390
StringView line = result.line;
7491
StringView key, value;

test/cpuinfo_riscv_test.cc

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,5 +176,26 @@ mmu : sv48)");
176176
EXPECT_TRUE(info.features.V);
177177
}
178178

179+
TEST(CpuinfoRiscvTest, ParsingOrderCpuInfo) {
180+
ResetHwcaps();
181+
auto& fs = GetEmptyFilesystem();
182+
fs.CreateFile("/proc/cpuinfo", R"(
183+
processor : 0
184+
hart : 0
185+
isa : rv64im_zicsr_zba_zbb_zbc_zbs
186+
mmu : sv48)");
187+
const auto info = GetRiscvInfo();
188+
EXPECT_FALSE(info.features.RV32I);
189+
EXPECT_TRUE(info.features.RV64I);
190+
EXPECT_TRUE(info.features.M);
191+
EXPECT_FALSE(info.features.A);
192+
EXPECT_FALSE(info.features.F);
193+
EXPECT_FALSE(info.features.D);
194+
EXPECT_FALSE(info.features.Q);
195+
EXPECT_FALSE(info.features.C);
196+
EXPECT_FALSE(info.features.V);
197+
EXPECT_TRUE(info.features.Zicsr);
198+
}
199+
179200
} // namespace
180201
} // namespace cpu_features

0 commit comments

Comments
 (0)