xref: /developtools/hiperf/include/register.h (revision 48f512ce)
1/*
2 * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef HIPERF_REGISTER_H
17#define HIPERF_REGISTER_H
18
19#include <map>
20#include <linux/perf_event.h>
21
22#include "utilities.h"
23#include "unwind_define.h"
24
25namespace OHOS {
26namespace Developtools {
27namespace HiPerf {
28using namespace OHOS::HiviewDFX;
29
30// these define copy from kernel uapi
31enum PerfEventX86Regs {
32    PERF_REG_X86_AX,
33    PERF_REG_X86_BX,
34    PERF_REG_X86_CX,
35    PERF_REG_X86_DX,
36    PERF_REG_X86_SI,
37    PERF_REG_X86_DI,
38    PERF_REG_X86_BP,
39    PERF_REG_X86_SP,
40    PERF_REG_X86_IP,
41    PERF_REG_X86_FLAGS,
42    PERF_REG_X86_CS,
43    PERF_REG_X86_SS,
44    PERF_REG_X86_DS,
45    PERF_REG_X86_ES,
46    PERF_REG_X86_FS,
47    PERF_REG_X86_GS,
48    PERF_REG_X86_R8,
49    PERF_REG_X86_R9,
50    PERF_REG_X86_R10,
51    PERF_REG_X86_R11,
52    PERF_REG_X86_R12,
53    PERF_REG_X86_R13,
54    PERF_REG_X86_R14,
55    PERF_REG_X86_R15,
56    PERF_REG_X86_32_MAX = PERF_REG_X86_GS + 1,
57    PERF_REG_X86_64_MAX = PERF_REG_X86_R15 + 1,
58};
59
60enum PerfEventArm64Regs {
61    PERF_REG_ARM64_X0,
62    PERF_REG_ARM64_X1,
63    PERF_REG_ARM64_X2,
64    PERF_REG_ARM64_X3,
65    PERF_REG_ARM64_X4,
66    PERF_REG_ARM64_X5,
67    PERF_REG_ARM64_X6,
68    PERF_REG_ARM64_X7,
69    PERF_REG_ARM64_X8,
70    PERF_REG_ARM64_X9,
71    PERF_REG_ARM64_X10,
72    PERF_REG_ARM64_X11,
73    PERF_REG_ARM64_X12,
74    PERF_REG_ARM64_X13,
75    PERF_REG_ARM64_X14,
76    PERF_REG_ARM64_X15,
77    PERF_REG_ARM64_X16,
78    PERF_REG_ARM64_X17,
79    PERF_REG_ARM64_X18,
80    PERF_REG_ARM64_X19,
81    PERF_REG_ARM64_X20,
82    PERF_REG_ARM64_X21,
83    PERF_REG_ARM64_X22,
84    PERF_REG_ARM64_X23,
85    PERF_REG_ARM64_X24,
86    PERF_REG_ARM64_X25,
87    PERF_REG_ARM64_X26,
88    PERF_REG_ARM64_X27,
89    PERF_REG_ARM64_X28,
90    PERF_REG_ARM64_X29,
91    PERF_REG_ARM64_LR,
92    PERF_REG_ARM64_SP,
93    PERF_REG_ARM64_PC,
94    PERF_REG_ARM64_MAX,
95};
96
97enum PerfEventArmRegs {
98    PERF_REG_ARM_R0,
99    PERF_REG_ARM_R1,
100    PERF_REG_ARM_R2,
101    PERF_REG_ARM_R3,
102    PERF_REG_ARM_R4,
103    PERF_REG_ARM_R5,
104    PERF_REG_ARM_R6,
105    PERF_REG_ARM_R7,
106    PERF_REG_ARM_R8,
107    PERF_REG_ARM_R9,
108    PERF_REG_ARM_R10,
109    PERF_REG_ARM_FP = 11,
110    PERF_REG_ARM_IP = 12,
111    PERF_REG_ARM_SP = 13,
112    PERF_REG_ARM_LR = 14,
113    PERF_REG_ARM_PC = 15,
114    PERF_REG_ARM_MAX,
115};
116
117// context name
118static const std::map<uint64_t, const std::string> PERF_CONTEXT_NAME = {
119    {PERF_CONTEXT_HV, "PERF_CONTEXT_HV"},
120    {PERF_CONTEXT_KERNEL, "PERF_CONTEXT_KERNEL"},
121    {PERF_CONTEXT_USER, "PERF_CONTEXT_USER"},
122    {PERF_CONTEXT_GUEST, "PERF_CONTEXT_GUEST"},
123    {PERF_CONTEXT_GUEST_KERNEL, "PERF_CONTEXT_GUEST_KERNEL"},
124    {PERF_CONTEXT_GUEST_USER, "PERF_CONTEXT_GUEST_USER"},
125    {PERF_CONTEXT_MAX, "PERF_CONTEXT_MAX"},
126};
127
128#if defined(target_cpu_x86_64)
129constexpr ArchType BUILD_ARCH_TYPE = ArchType::ARCH_X86_64;
130#elif defined(target_cpu_arm64)
131constexpr ArchType BUILD_ARCH_TYPE = ArchType::ARCH_ARM64;
132#elif defined(target_cpu_arm)
133constexpr ArchType BUILD_ARCH_TYPE = ArchType::ARCH_ARM;
134#else
135#error NOT SUPPORT ARCH
136#endif
137
138const std::string UpdatePerfContext(uint64_t addr, perf_callchain_context &perfCallchainContext);
139const std::string GetArchName(ArchType arch);
140uint64_t GetSupportedRegMask(ArchType arch);
141
142// this is only for debug
143const std::string RegisterGetName(size_t registerIndex);
144
145bool RegisterGetValue(uint64_t &value, const u64 registers[], const size_t registerIndex,
146                      const size_t registerNumber);
147
148size_t RegisterGetSP(ArchType arch);
149size_t RegisterGetIP(ArchType arch);
150
151inline bool RegisterGetSPValue(uint64_t &value, ArchType arch, const u64 registers[],
152                               const size_t registerNumber)
153{
154    return RegisterGetValue(value, registers, RegisterGetSP(arch), registerNumber);
155}
156
157inline bool RegisterGetIPValue(uint64_t &value, ArchType arch, const u64 registers[],
158                               const size_t registerNumber)
159{
160    return RegisterGetValue(value, registers, RegisterGetIP(arch), registerNumber);
161}
162
163int LibunwindRegIdToPerfReg(int regnum);
164
165ArchType GetDeviceArch();
166ArchType SetDeviceArch(ArchType arch);
167ArchType GetArchTypeFromUname(const std::string &machine);
168ArchType GetArchTypeFromABI(bool abi32);
169void UpdateRegForABI(ArchType arch, u64 *registers);
170} // namespace HiPerf
171} // namespace Developtools
172} // namespace OHOS
173#endif // HIPERF_REGISTER_H
174