mirror of
				https://github.com/google/cpu_features.git
				synced 2025-11-03 22:40:17 +01: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
 |