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