mirror of
				https://github.com/google/cpu_features.git
				synced 2025-10-31 21:20:50 +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
 | 
