mirror of
https://github.com/google/cpu_features.git
synced 2025-04-27 07:02:30 +02:00
181 lines
4.7 KiB
C++
181 lines
4.7 KiB
C++
// 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
|