148f512ceSopenharmony_ci/* 248f512ceSopenharmony_ci * Copyright (c) 2021-2023 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#ifndef HIPERF_REGISTER_H 1748f512ceSopenharmony_ci#define HIPERF_REGISTER_H 1848f512ceSopenharmony_ci 1948f512ceSopenharmony_ci#include <map> 2048f512ceSopenharmony_ci#include <linux/perf_event.h> 2148f512ceSopenharmony_ci 2248f512ceSopenharmony_ci#include "utilities.h" 2348f512ceSopenharmony_ci#include "unwind_define.h" 2448f512ceSopenharmony_ci 2548f512ceSopenharmony_cinamespace OHOS { 2648f512ceSopenharmony_cinamespace Developtools { 2748f512ceSopenharmony_cinamespace HiPerf { 2848f512ceSopenharmony_ciusing namespace OHOS::HiviewDFX; 2948f512ceSopenharmony_ci 3048f512ceSopenharmony_ci// these define copy from kernel uapi 3148f512ceSopenharmony_cienum PerfEventX86Regs { 3248f512ceSopenharmony_ci PERF_REG_X86_AX, 3348f512ceSopenharmony_ci PERF_REG_X86_BX, 3448f512ceSopenharmony_ci PERF_REG_X86_CX, 3548f512ceSopenharmony_ci PERF_REG_X86_DX, 3648f512ceSopenharmony_ci PERF_REG_X86_SI, 3748f512ceSopenharmony_ci PERF_REG_X86_DI, 3848f512ceSopenharmony_ci PERF_REG_X86_BP, 3948f512ceSopenharmony_ci PERF_REG_X86_SP, 4048f512ceSopenharmony_ci PERF_REG_X86_IP, 4148f512ceSopenharmony_ci PERF_REG_X86_FLAGS, 4248f512ceSopenharmony_ci PERF_REG_X86_CS, 4348f512ceSopenharmony_ci PERF_REG_X86_SS, 4448f512ceSopenharmony_ci PERF_REG_X86_DS, 4548f512ceSopenharmony_ci PERF_REG_X86_ES, 4648f512ceSopenharmony_ci PERF_REG_X86_FS, 4748f512ceSopenharmony_ci PERF_REG_X86_GS, 4848f512ceSopenharmony_ci PERF_REG_X86_R8, 4948f512ceSopenharmony_ci PERF_REG_X86_R9, 5048f512ceSopenharmony_ci PERF_REG_X86_R10, 5148f512ceSopenharmony_ci PERF_REG_X86_R11, 5248f512ceSopenharmony_ci PERF_REG_X86_R12, 5348f512ceSopenharmony_ci PERF_REG_X86_R13, 5448f512ceSopenharmony_ci PERF_REG_X86_R14, 5548f512ceSopenharmony_ci PERF_REG_X86_R15, 5648f512ceSopenharmony_ci PERF_REG_X86_32_MAX = PERF_REG_X86_GS + 1, 5748f512ceSopenharmony_ci PERF_REG_X86_64_MAX = PERF_REG_X86_R15 + 1, 5848f512ceSopenharmony_ci}; 5948f512ceSopenharmony_ci 6048f512ceSopenharmony_cienum PerfEventArm64Regs { 6148f512ceSopenharmony_ci PERF_REG_ARM64_X0, 6248f512ceSopenharmony_ci PERF_REG_ARM64_X1, 6348f512ceSopenharmony_ci PERF_REG_ARM64_X2, 6448f512ceSopenharmony_ci PERF_REG_ARM64_X3, 6548f512ceSopenharmony_ci PERF_REG_ARM64_X4, 6648f512ceSopenharmony_ci PERF_REG_ARM64_X5, 6748f512ceSopenharmony_ci PERF_REG_ARM64_X6, 6848f512ceSopenharmony_ci PERF_REG_ARM64_X7, 6948f512ceSopenharmony_ci PERF_REG_ARM64_X8, 7048f512ceSopenharmony_ci PERF_REG_ARM64_X9, 7148f512ceSopenharmony_ci PERF_REG_ARM64_X10, 7248f512ceSopenharmony_ci PERF_REG_ARM64_X11, 7348f512ceSopenharmony_ci PERF_REG_ARM64_X12, 7448f512ceSopenharmony_ci PERF_REG_ARM64_X13, 7548f512ceSopenharmony_ci PERF_REG_ARM64_X14, 7648f512ceSopenharmony_ci PERF_REG_ARM64_X15, 7748f512ceSopenharmony_ci PERF_REG_ARM64_X16, 7848f512ceSopenharmony_ci PERF_REG_ARM64_X17, 7948f512ceSopenharmony_ci PERF_REG_ARM64_X18, 8048f512ceSopenharmony_ci PERF_REG_ARM64_X19, 8148f512ceSopenharmony_ci PERF_REG_ARM64_X20, 8248f512ceSopenharmony_ci PERF_REG_ARM64_X21, 8348f512ceSopenharmony_ci PERF_REG_ARM64_X22, 8448f512ceSopenharmony_ci PERF_REG_ARM64_X23, 8548f512ceSopenharmony_ci PERF_REG_ARM64_X24, 8648f512ceSopenharmony_ci PERF_REG_ARM64_X25, 8748f512ceSopenharmony_ci PERF_REG_ARM64_X26, 8848f512ceSopenharmony_ci PERF_REG_ARM64_X27, 8948f512ceSopenharmony_ci PERF_REG_ARM64_X28, 9048f512ceSopenharmony_ci PERF_REG_ARM64_X29, 9148f512ceSopenharmony_ci PERF_REG_ARM64_LR, 9248f512ceSopenharmony_ci PERF_REG_ARM64_SP, 9348f512ceSopenharmony_ci PERF_REG_ARM64_PC, 9448f512ceSopenharmony_ci PERF_REG_ARM64_MAX, 9548f512ceSopenharmony_ci}; 9648f512ceSopenharmony_ci 9748f512ceSopenharmony_cienum PerfEventArmRegs { 9848f512ceSopenharmony_ci PERF_REG_ARM_R0, 9948f512ceSopenharmony_ci PERF_REG_ARM_R1, 10048f512ceSopenharmony_ci PERF_REG_ARM_R2, 10148f512ceSopenharmony_ci PERF_REG_ARM_R3, 10248f512ceSopenharmony_ci PERF_REG_ARM_R4, 10348f512ceSopenharmony_ci PERF_REG_ARM_R5, 10448f512ceSopenharmony_ci PERF_REG_ARM_R6, 10548f512ceSopenharmony_ci PERF_REG_ARM_R7, 10648f512ceSopenharmony_ci PERF_REG_ARM_R8, 10748f512ceSopenharmony_ci PERF_REG_ARM_R9, 10848f512ceSopenharmony_ci PERF_REG_ARM_R10, 10948f512ceSopenharmony_ci PERF_REG_ARM_FP = 11, 11048f512ceSopenharmony_ci PERF_REG_ARM_IP = 12, 11148f512ceSopenharmony_ci PERF_REG_ARM_SP = 13, 11248f512ceSopenharmony_ci PERF_REG_ARM_LR = 14, 11348f512ceSopenharmony_ci PERF_REG_ARM_PC = 15, 11448f512ceSopenharmony_ci PERF_REG_ARM_MAX, 11548f512ceSopenharmony_ci}; 11648f512ceSopenharmony_ci 11748f512ceSopenharmony_ci// context name 11848f512ceSopenharmony_cistatic const std::map<uint64_t, const std::string> PERF_CONTEXT_NAME = { 11948f512ceSopenharmony_ci {PERF_CONTEXT_HV, "PERF_CONTEXT_HV"}, 12048f512ceSopenharmony_ci {PERF_CONTEXT_KERNEL, "PERF_CONTEXT_KERNEL"}, 12148f512ceSopenharmony_ci {PERF_CONTEXT_USER, "PERF_CONTEXT_USER"}, 12248f512ceSopenharmony_ci {PERF_CONTEXT_GUEST, "PERF_CONTEXT_GUEST"}, 12348f512ceSopenharmony_ci {PERF_CONTEXT_GUEST_KERNEL, "PERF_CONTEXT_GUEST_KERNEL"}, 12448f512ceSopenharmony_ci {PERF_CONTEXT_GUEST_USER, "PERF_CONTEXT_GUEST_USER"}, 12548f512ceSopenharmony_ci {PERF_CONTEXT_MAX, "PERF_CONTEXT_MAX"}, 12648f512ceSopenharmony_ci}; 12748f512ceSopenharmony_ci 12848f512ceSopenharmony_ci#if defined(target_cpu_x86_64) 12948f512ceSopenharmony_ciconstexpr ArchType BUILD_ARCH_TYPE = ArchType::ARCH_X86_64; 13048f512ceSopenharmony_ci#elif defined(target_cpu_arm64) 13148f512ceSopenharmony_ciconstexpr ArchType BUILD_ARCH_TYPE = ArchType::ARCH_ARM64; 13248f512ceSopenharmony_ci#elif defined(target_cpu_arm) 13348f512ceSopenharmony_ciconstexpr ArchType BUILD_ARCH_TYPE = ArchType::ARCH_ARM; 13448f512ceSopenharmony_ci#else 13548f512ceSopenharmony_ci#error NOT SUPPORT ARCH 13648f512ceSopenharmony_ci#endif 13748f512ceSopenharmony_ci 13848f512ceSopenharmony_ciconst std::string UpdatePerfContext(uint64_t addr, perf_callchain_context &perfCallchainContext); 13948f512ceSopenharmony_ciconst std::string GetArchName(ArchType arch); 14048f512ceSopenharmony_ciuint64_t GetSupportedRegMask(ArchType arch); 14148f512ceSopenharmony_ci 14248f512ceSopenharmony_ci// this is only for debug 14348f512ceSopenharmony_ciconst std::string RegisterGetName(size_t registerIndex); 14448f512ceSopenharmony_ci 14548f512ceSopenharmony_cibool RegisterGetValue(uint64_t &value, const u64 registers[], const size_t registerIndex, 14648f512ceSopenharmony_ci const size_t registerNumber); 14748f512ceSopenharmony_ci 14848f512ceSopenharmony_cisize_t RegisterGetSP(ArchType arch); 14948f512ceSopenharmony_cisize_t RegisterGetIP(ArchType arch); 15048f512ceSopenharmony_ci 15148f512ceSopenharmony_ciinline bool RegisterGetSPValue(uint64_t &value, ArchType arch, const u64 registers[], 15248f512ceSopenharmony_ci const size_t registerNumber) 15348f512ceSopenharmony_ci{ 15448f512ceSopenharmony_ci return RegisterGetValue(value, registers, RegisterGetSP(arch), registerNumber); 15548f512ceSopenharmony_ci} 15648f512ceSopenharmony_ci 15748f512ceSopenharmony_ciinline bool RegisterGetIPValue(uint64_t &value, ArchType arch, const u64 registers[], 15848f512ceSopenharmony_ci const size_t registerNumber) 15948f512ceSopenharmony_ci{ 16048f512ceSopenharmony_ci return RegisterGetValue(value, registers, RegisterGetIP(arch), registerNumber); 16148f512ceSopenharmony_ci} 16248f512ceSopenharmony_ci 16348f512ceSopenharmony_ciint LibunwindRegIdToPerfReg(int regnum); 16448f512ceSopenharmony_ci 16548f512ceSopenharmony_ciArchType GetDeviceArch(); 16648f512ceSopenharmony_ciArchType SetDeviceArch(ArchType arch); 16748f512ceSopenharmony_ciArchType GetArchTypeFromUname(const std::string &machine); 16848f512ceSopenharmony_ciArchType GetArchTypeFromABI(bool abi32); 16948f512ceSopenharmony_civoid UpdateRegForABI(ArchType arch, u64 *registers); 17048f512ceSopenharmony_ci} // namespace HiPerf 17148f512ceSopenharmony_ci} // namespace Developtools 17248f512ceSopenharmony_ci} // namespace OHOS 17348f512ceSopenharmony_ci#endif // HIPERF_REGISTER_H 174