148f512ceSopenharmony_ci/* 248f512ceSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 348f512ceSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 448f512ceSopenharmony_ci * you may not use this file except in compliance with the License. 548f512ceSopenharmony_ci * You may obtain a copy of the License at 648f512ceSopenharmony_ci * 748f512ceSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 848f512ceSopenharmony_ci * 948f512ceSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1048f512ceSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1148f512ceSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1248f512ceSopenharmony_ci * See the License for the specific language governing permissions and 1348f512ceSopenharmony_ci * limitations under the License. 1448f512ceSopenharmony_ci */ 1548f512ceSopenharmony_ci 1648f512ceSopenharmony_ci#include "register_test.h" 1748f512ceSopenharmony_ci 1848f512ceSopenharmony_ci#include <bitset> 1948f512ceSopenharmony_ci 2048f512ceSopenharmony_ciusing namespace testing::ext; 2148f512ceSopenharmony_ciusing namespace std; 2248f512ceSopenharmony_ciusing namespace OHOS::HiviewDFX; 2348f512ceSopenharmony_cinamespace OHOS { 2448f512ceSopenharmony_cinamespace Developtools { 2548f512ceSopenharmony_cinamespace HiPerf { 2648f512ceSopenharmony_ciclass RegisterTest : public testing::Test { 2748f512ceSopenharmony_cipublic: 2848f512ceSopenharmony_ci static void SetUpTestCase(void); 2948f512ceSopenharmony_ci static void TearDownTestCase(void); 3048f512ceSopenharmony_ci void SetUp(); 3148f512ceSopenharmony_ci void TearDown(); 3248f512ceSopenharmony_ci}; 3348f512ceSopenharmony_ci 3448f512ceSopenharmony_civoid RegisterTest::SetUpTestCase() {} 3548f512ceSopenharmony_ci 3648f512ceSopenharmony_civoid RegisterTest::TearDownTestCase() {} 3748f512ceSopenharmony_ci 3848f512ceSopenharmony_civoid RegisterTest::SetUp() {} 3948f512ceSopenharmony_ci 4048f512ceSopenharmony_civoid RegisterTest::TearDown() {} 4148f512ceSopenharmony_ci 4248f512ceSopenharmony_ci 4348f512ceSopenharmony_ci/** 4448f512ceSopenharmony_ci * @tc.name: GetSupportedRegMask 4548f512ceSopenharmony_ci * @tc.desc: 4648f512ceSopenharmony_ci * @tc.type: FUNC 4748f512ceSopenharmony_ci */ 4848f512ceSopenharmony_ciHWTEST_F(RegisterTest, GetSupportedRegMask, TestSize.Level1) 4948f512ceSopenharmony_ci{ 5048f512ceSopenharmony_ci EXPECT_NE(GetSupportedRegMask(ArchType::ARCH_X86), GetSupportedRegMask(ArchType::ARCH_X86_64)); 5148f512ceSopenharmony_ci EXPECT_NE(GetSupportedRegMask(ArchType::ARCH_ARM), GetSupportedRegMask(ArchType::ARCH_ARM64)); 5248f512ceSopenharmony_ci EXPECT_EQ(GetSupportedRegMask(static_cast<ArchType>(100)), 5348f512ceSopenharmony_ci std::numeric_limits<uint64_t>::max()); 5448f512ceSopenharmony_ci EXPECT_EQ(GetSupportedRegMask(static_cast<ArchType>(-1)), std::numeric_limits<uint64_t>::max()); 5548f512ceSopenharmony_ci 5648f512ceSopenharmony_ci std::bitset<64> regMasker; 5748f512ceSopenharmony_ci regMasker = GetSupportedRegMask(ArchType::ARCH_X86); 5848f512ceSopenharmony_ci EXPECT_EQ(regMasker.count(), PERF_REG_X86_32_MAX); 5948f512ceSopenharmony_ci 6048f512ceSopenharmony_ci regMasker = GetSupportedRegMask(ArchType::ARCH_X86_64); 6148f512ceSopenharmony_ci // dont support PERF_REG_X86_DS,PERF_REG_X86_ES,PERF_REG_X86_FS,PERF_REG_X86_GS 6248f512ceSopenharmony_ci EXPECT_EQ(regMasker.count(), PERF_REG_X86_64_MAX - 4u); 6348f512ceSopenharmony_ci 6448f512ceSopenharmony_ci regMasker = GetSupportedRegMask(ArchType::ARCH_ARM); 6548f512ceSopenharmony_ci EXPECT_EQ(regMasker.count(), PERF_REG_ARM_MAX); 6648f512ceSopenharmony_ci 6748f512ceSopenharmony_ci regMasker = GetSupportedRegMask(ArchType::ARCH_ARM64); 6848f512ceSopenharmony_ci EXPECT_EQ(regMasker.count(), PERF_REG_ARM64_MAX); 6948f512ceSopenharmony_ci} 7048f512ceSopenharmony_ci 7148f512ceSopenharmony_ci/** 7248f512ceSopenharmony_ci * @tc.name: RegisterGetIP 7348f512ceSopenharmony_ci * @tc.desc: 7448f512ceSopenharmony_ci * @tc.type: FUNC 7548f512ceSopenharmony_ci */ 7648f512ceSopenharmony_ciHWTEST_F(RegisterTest, RegisterGetIP, TestSize.Level1) 7748f512ceSopenharmony_ci{ 7848f512ceSopenharmony_ci EXPECT_EQ(RegisterGetIP(ArchType::ARCH_X86), PERF_REG_X86_IP); 7948f512ceSopenharmony_ci EXPECT_EQ(RegisterGetIP(ArchType::ARCH_X86_64), PERF_REG_X86_IP); 8048f512ceSopenharmony_ci EXPECT_EQ(RegisterGetIP(ArchType::ARCH_ARM), PERF_REG_ARM_PC); 8148f512ceSopenharmony_ci EXPECT_EQ(RegisterGetIP(ArchType::ARCH_ARM64), PERF_REG_ARM64_PC); 8248f512ceSopenharmony_ci EXPECT_EQ(RegisterGetIP(ArchType::ARCH_UNKNOWN), std::numeric_limits<size_t>::max()); 8348f512ceSopenharmony_ci} 8448f512ceSopenharmony_ci 8548f512ceSopenharmony_ci/** 8648f512ceSopenharmony_ci * @tc.name: RegisterGetSP 8748f512ceSopenharmony_ci * @tc.desc: 8848f512ceSopenharmony_ci * @tc.type: FUNC 8948f512ceSopenharmony_ci */ 9048f512ceSopenharmony_ciHWTEST_F(RegisterTest, RegisterGetSP, TestSize.Level1) 9148f512ceSopenharmony_ci{ 9248f512ceSopenharmony_ci#if defined(target_cpu_x86_64) 9348f512ceSopenharmony_ci EXPECT_EQ(RegisterGetSP(ArchType::ARCH_X86_64), PERF_REG_X86_IP); 9448f512ceSopenharmony_ci#elif defined(target_cpu_arm) 9548f512ceSopenharmony_ci EXPECT_EQ(RegisterGetSP(ArchType::ARCH_ARM), PERF_REG_ARM_SP); 9648f512ceSopenharmony_ci#elif defined(target_cpu_arm64) 9748f512ceSopenharmony_ci EXPECT_EQ(RegisterGetSP(ArchType::ARCH_ARM64), PERF_REG_ARM64_SP); 9848f512ceSopenharmony_ci#endif 9948f512ceSopenharmony_ci} 10048f512ceSopenharmony_ci 10148f512ceSopenharmony_ci/** 10248f512ceSopenharmony_ci * @tc.name: RegisterGetValue 10348f512ceSopenharmony_ci * @tc.desc: 10448f512ceSopenharmony_ci * @tc.type: FUNC 10548f512ceSopenharmony_ci */ 10648f512ceSopenharmony_ciHWTEST_F(RegisterTest, RegisterGetValue, TestSize.Level1) 10748f512ceSopenharmony_ci{ 10848f512ceSopenharmony_ci uint64_t value = 0; 10948f512ceSopenharmony_ci const u64 registers[4] = {1, 2, 3, 4}; 11048f512ceSopenharmony_ci 11148f512ceSopenharmony_ci EXPECT_EQ(RegisterGetValue(value, registers, 0, sizeof(registers)), true); 11248f512ceSopenharmony_ci EXPECT_EQ(RegisterGetValue(value, registers, sizeof(registers), sizeof(registers)), false); 11348f512ceSopenharmony_ci EXPECT_EQ(RegisterGetValue(value, registers, -1, sizeof(registers)), false); 11448f512ceSopenharmony_ci 11548f512ceSopenharmony_ci for (unsigned i = 0; i < sizeof(registers); i++) { 11648f512ceSopenharmony_ci RegisterGetValue(value, registers, i, sizeof(registers)); 11748f512ceSopenharmony_ci EXPECT_EQ(value, registers[i]); 11848f512ceSopenharmony_ci } 11948f512ceSopenharmony_ci} 12048f512ceSopenharmony_ci 12148f512ceSopenharmony_ci/** 12248f512ceSopenharmony_ci * @tc.name: RegisterGetSPValue 12348f512ceSopenharmony_ci * @tc.desc: 12448f512ceSopenharmony_ci * @tc.type: FUNC 12548f512ceSopenharmony_ci */ 12648f512ceSopenharmony_ciHWTEST_F(RegisterTest, RegisterGetSPValue, TestSize.Level1) 12748f512ceSopenharmony_ci{ 12848f512ceSopenharmony_ci uint64_t value = 0; 12948f512ceSopenharmony_ci uint64_t value2 = 0; 13048f512ceSopenharmony_ci u64 registers[PERF_REG_ARM64_MAX] = {1, 2, 3, 4}; 13148f512ceSopenharmony_ci size_t sp = RegisterGetSP(BUILD_ARCH_TYPE); 13248f512ceSopenharmony_ci registers[sp] = 0x1234; 13348f512ceSopenharmony_ci 13448f512ceSopenharmony_ci EXPECT_EQ(RegisterGetValue(value, registers, sp, sizeof(registers)), 13548f512ceSopenharmony_ci RegisterGetSPValue(value2, BUILD_ARCH_TYPE, registers, sizeof(registers))); 13648f512ceSopenharmony_ci 13748f512ceSopenharmony_ci EXPECT_EQ(value, value2); 13848f512ceSopenharmony_ci} 13948f512ceSopenharmony_ci 14048f512ceSopenharmony_ci/** 14148f512ceSopenharmony_ci * @tc.name: RegisterGetIPValue 14248f512ceSopenharmony_ci * @tc.desc: 14348f512ceSopenharmony_ci * @tc.type: FUNC 14448f512ceSopenharmony_ci */ 14548f512ceSopenharmony_ciHWTEST_F(RegisterTest, RegisterGetIPValue, TestSize.Level1) 14648f512ceSopenharmony_ci{ 14748f512ceSopenharmony_ci uint64_t value = 0; 14848f512ceSopenharmony_ci uint64_t value2 = 0; 14948f512ceSopenharmony_ci u64 registers[PERF_REG_ARM64_MAX] = {1, 2, 3, 4}; 15048f512ceSopenharmony_ci size_t ip = RegisterGetIP(BUILD_ARCH_TYPE); 15148f512ceSopenharmony_ci registers[ip] = 0x1234; 15248f512ceSopenharmony_ci 15348f512ceSopenharmony_ci EXPECT_EQ(RegisterGetValue(value, registers, ip, sizeof(registers)), 15448f512ceSopenharmony_ci RegisterGetIPValue(value2, BUILD_ARCH_TYPE, registers, sizeof(registers))); 15548f512ceSopenharmony_ci 15648f512ceSopenharmony_ci EXPECT_EQ(value, value2); 15748f512ceSopenharmony_ci} 15848f512ceSopenharmony_ci 15948f512ceSopenharmony_ci/** 16048f512ceSopenharmony_ci * @tc.name: RegisterGetName 16148f512ceSopenharmony_ci * @tc.desc: 16248f512ceSopenharmony_ci * @tc.type: FUNC 16348f512ceSopenharmony_ci */ 16448f512ceSopenharmony_ciHWTEST_F(RegisterTest, RegisterGetName, TestSize.Level1) 16548f512ceSopenharmony_ci{ 16648f512ceSopenharmony_ci for (unsigned i = 0; i < PERF_REG_ARM64_MAX; i++) { 16748f512ceSopenharmony_ci EXPECT_EQ(RegisterGetName(i).empty(), false); 16848f512ceSopenharmony_ci } 16948f512ceSopenharmony_ci} 17048f512ceSopenharmony_ci 17148f512ceSopenharmony_ci/** 17248f512ceSopenharmony_ci * @tc.name: GetArchName 17348f512ceSopenharmony_ci * @tc.desc: 17448f512ceSopenharmony_ci * @tc.type: FUNC 17548f512ceSopenharmony_ci */ 17648f512ceSopenharmony_ciHWTEST_F(RegisterTest, GetArchName, TestSize.Level1) 17748f512ceSopenharmony_ci{ 17848f512ceSopenharmony_ci RegisterGetSP(ArchType::ARCH_ARM); 17948f512ceSopenharmony_ci EXPECT_STREQ(GetArchName(ArchType::ARCH_ARM).c_str(), "ARM"); 18048f512ceSopenharmony_ci RegisterGetSP(ArchType::ARCH_ARM64); 18148f512ceSopenharmony_ci EXPECT_STREQ(GetArchName(ArchType::ARCH_ARM64).c_str(), "ARM64"); 18248f512ceSopenharmony_ci RegisterGetSP(ArchType::ARCH_X86); 18348f512ceSopenharmony_ci EXPECT_STREQ(GetArchName(ArchType::ARCH_X86).c_str(), "X86_32"); 18448f512ceSopenharmony_ci RegisterGetSP(ArchType::ARCH_X86_64); 18548f512ceSopenharmony_ci EXPECT_STREQ(GetArchName(ArchType::ARCH_X86_64).c_str(), "X86_64"); 18648f512ceSopenharmony_ci RegisterGetSP(ArchType::ARCH_UNKNOWN); 18748f512ceSopenharmony_ci EXPECT_STREQ(GetArchName(ArchType::ARCH_UNKNOWN).c_str(), "Unsupport"); 18848f512ceSopenharmony_ci} 18948f512ceSopenharmony_ci} // namespace HiPerf 19048f512ceSopenharmony_ci} // namespace Developtools 19148f512ceSopenharmony_ci} // namespace OHOS 192