| // Copyright 2022 Google LLC |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #include "cpuinfo_riscv.h" |
| |
| #include "filesystem_for_testing.h" |
| #include "gtest/gtest.h" |
| #include "hwcaps_for_testing.h" |
| |
| namespace cpu_features { |
| namespace { |
| |
| TEST(CpuinfoRiscvTest, Sipeed_Lichee_RV_FromCpuInfo) { |
| ResetHwcaps(); |
| auto& fs = GetEmptyFilesystem(); |
| fs.CreateFile("/proc/cpuinfo", R"(processor : 0 |
| hart : 0 |
| isa : rv64imafdc |
| mmu : sv39 |
| uarch : thead,c906)"); |
| const auto info = GetRiscvInfo(); |
| EXPECT_STREQ(info.uarch, "c906"); |
| EXPECT_STREQ(info.vendor, "thead"); |
| |
| EXPECT_FALSE(info.features.RV32I); |
| EXPECT_TRUE(info.features.RV64I); |
| EXPECT_TRUE(info.features.M); |
| EXPECT_TRUE(info.features.A); |
| EXPECT_TRUE(info.features.F); |
| EXPECT_TRUE(info.features.D); |
| EXPECT_FALSE(info.features.Q); |
| EXPECT_TRUE(info.features.C); |
| EXPECT_FALSE(info.features.V); |
| } |
| |
| // https://github.com/ThomasKaiser/sbc-bench/blob/284e82b016ec1beeac42a5fcbe556b670f68441a/results/Kendryte-K510-4.17.0.cpuinfo |
| TEST(CpuinfoRiscvTest, Kendryte_K510_FromCpuInfo) { |
| ResetHwcaps(); |
| auto& fs = GetEmptyFilesystem(); |
| fs.CreateFile("/proc/cpuinfo", R"( |
| hart : 0 |
| isa : rv64i2p0m2p0a2p0f2p0d2p0c2p0xv5-0p0 |
| mmu : sv39 |
| |
| hart : 1 |
| isa : rv64i2p0m2p0a2p0f2p0d2p0c2p0xv5-0p0 |
| mmu : sv39"); |
| const auto info = GetRiscvInfo(); |
| EXPECT_STREQ(info.uarch, ""); |
| EXPECT_STREQ(info.vendor, ""); |
| |
| EXPECT_FALSE(info.features.RV32I); |
| EXPECT_TRUE(info.features.RV64I); |
| EXPECT_TRUE(info.features.M); |
| EXPECT_TRUE(info.features.A); |
| EXPECT_TRUE(info.features.F); |
| EXPECT_TRUE(info.features.D); |
| EXPECT_FALSE(info.features.Q); |
| EXPECT_TRUE(info.features.C); |
| EXPECT_FALSE(info.features.V); |
| } |
| |
| // https://github.com/ThomasKaiser/sbc-bench/blob/284e82b016ec1beeac42a5fcbe556b670f68441a/results/T-Head-C910-5.10.4.cpuinfo |
| TEST(CpuinfoRiscvTest, T_Head_C910_FromCpuInfo) { |
| ResetHwcaps(); |
| auto& fs = GetEmptyFilesystem(); |
| fs.CreateFile("/proc/cpuinfo", R"( |
| processor : 0 |
| hart : 0 |
| isa : rv64imafdcsu |
| mmu : sv39 |
| cpu-freq : 1.2Ghz |
| cpu-icache : 64KB |
| cpu-dcache : 64KB |
| cpu-l2cache : 2MB |
| cpu-tlb : 1024 4-ways |
| cpu-cacheline : 64Bytes |
| cpu-vector : 0.7.1 |
| |
| processor : 1 |
| hart : 1 |
| isa : rv64imafdcsu |
| mmu : sv39 |
| cpu-freq : 1.2Ghz |
| cpu-icache : 64KB |
| cpu-dcache : 64KB |
| cpu-l2cache : 2MB |
| cpu-tlb : 1024 4-ways |
| cpu-cacheline : 64Bytes |
| cpu-vector : 0.7.1"); |
| const auto info = GetRiscvInfo(); |
| EXPECT_STREQ(info.uarch, ""); |
| EXPECT_STREQ(info.vendor, ""); |
| |
| EXPECT_FALSE(info.features.RV32I); |
| EXPECT_TRUE(info.features.RV64I); |
| EXPECT_TRUE(info.features.M); |
| EXPECT_TRUE(info.features.A); |
| EXPECT_TRUE(info.features.F); |
| EXPECT_TRUE(info.features.D); |
| EXPECT_FALSE(info.features.Q); |
| EXPECT_TRUE(info.features.C); |
| EXPECT_FALSE(info.features.V); |
| } |
| |
| TEST(CpuinfoRiscvTest, UnknownFromCpuInfo) { |
| ResetHwcaps(); |
| auto& fs = GetEmptyFilesystem(); |
| fs.CreateFile("/proc/cpuinfo", R"( |
| processor : 0 |
| hart : 2 |
| isa : rv64imafdc |
| mmu : sv39 |
| uarch : sifive,bullet0 |
| |
| processor : 1 |
| hart : 1 |
| isa : rv64imafdc |
| mmu : sv39 |
| uarch : sifive,bullet0 |
| |
| processor : 2 |
| hart : 3 |
| isa : rv64imafdc |
| mmu : sv39 |
| uarch : sifive,bullet0 |
| |
| processor : 3 |
| hart : 4 |
| isa : rv64imafdc |
| mmu : sv39 |
| uarch : sifive,bullet0)"); |
| const auto info = GetRiscvInfo(); |
| EXPECT_STREQ(info.uarch, "bullet0"); |
| EXPECT_STREQ(info.vendor, "sifive"); |
| |
| EXPECT_FALSE(info.features.RV32I); |
| EXPECT_TRUE(info.features.RV64I); |
| EXPECT_TRUE(info.features.M); |
| EXPECT_TRUE(info.features.A); |
| EXPECT_TRUE(info.features.F); |
| EXPECT_TRUE(info.features.D); |
| EXPECT_FALSE(info.features.Q); |
| EXPECT_TRUE(info.features.C); |
| EXPECT_FALSE(info.features.V); |
| } |
| |
| TEST(CpuinfoRiscvTest, QemuCpuInfo) { |
| ResetHwcaps(); |
| auto& fs = GetEmptyFilesystem(); |
| fs.CreateFile("/proc/cpuinfo", R"( |
| processor : 0 |
| hart : 0 |
| isa : rv64imafdcvh_zba_zbb_zbc_zbs |
| mmu : sv48)"); |
| const auto info = GetRiscvInfo(); |
| EXPECT_FALSE(info.features.RV32I); |
| EXPECT_TRUE(info.features.RV64I); |
| EXPECT_TRUE(info.features.M); |
| EXPECT_TRUE(info.features.A); |
| EXPECT_TRUE(info.features.F); |
| EXPECT_TRUE(info.features.D); |
| EXPECT_FALSE(info.features.Q); |
| EXPECT_TRUE(info.features.C); |
| EXPECT_TRUE(info.features.V); |
| } |
| |
| } // namespace |
| } // namespace cpu_features |