1*288bf522SAndroid Build Coastguard Worker /*
2*288bf522SAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project
3*288bf522SAndroid Build Coastguard Worker *
4*288bf522SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*288bf522SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*288bf522SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*288bf522SAndroid Build Coastguard Worker *
8*288bf522SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*288bf522SAndroid Build Coastguard Worker *
10*288bf522SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*288bf522SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*288bf522SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*288bf522SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*288bf522SAndroid Build Coastguard Worker * limitations under the License.
15*288bf522SAndroid Build Coastguard Worker */
16*288bf522SAndroid Build Coastguard Worker
17*288bf522SAndroid Build Coastguard Worker #ifndef SIMPLE_PERF_PERF_REGS_H_
18*288bf522SAndroid Build Coastguard Worker #define SIMPLE_PERF_PERF_REGS_H_
19*288bf522SAndroid Build Coastguard Worker
20*288bf522SAndroid Build Coastguard Worker #if defined(USE_BIONIC_UAPI_HEADERS)
21*288bf522SAndroid Build Coastguard Worker #include <uapi/asm-arm/asm/perf_regs.h>
22*288bf522SAndroid Build Coastguard Worker #undef PERF_REG_EXTENDED_MASK
23*288bf522SAndroid Build Coastguard Worker #include <uapi/asm-x86/asm/perf_regs.h>
24*288bf522SAndroid Build Coastguard Worker #undef PERF_REG_EXTENDED_MASK
25*288bf522SAndroid Build Coastguard Worker #include <uapi/asm-riscv/asm/perf_regs.h>
26*288bf522SAndroid Build Coastguard Worker #undef PERF_REG_EXTENDED_MASK
27*288bf522SAndroid Build Coastguard Worker #define perf_event_arm_regs perf_event_arm64_regs
28*288bf522SAndroid Build Coastguard Worker #include <uapi/asm-arm64/asm/perf_regs.h>
29*288bf522SAndroid Build Coastguard Worker #undef PERF_REG_EXTENDED_MASK
30*288bf522SAndroid Build Coastguard Worker #else
31*288bf522SAndroid Build Coastguard Worker #include <asm-arm/asm/perf_regs.h>
32*288bf522SAndroid Build Coastguard Worker #undef PERF_REG_EXTENDED_MASK
33*288bf522SAndroid Build Coastguard Worker #include <asm-x86/asm/perf_regs.h>
34*288bf522SAndroid Build Coastguard Worker #undef PERF_REG_EXTENDED_MASK
35*288bf522SAndroid Build Coastguard Worker #include <asm-riscv/asm/perf_regs.h>
36*288bf522SAndroid Build Coastguard Worker #undef PERF_REG_EXTENDED_MASK
37*288bf522SAndroid Build Coastguard Worker #define perf_event_arm_regs perf_event_arm64_regs
38*288bf522SAndroid Build Coastguard Worker #include <asm-arm64/asm/perf_regs.h>
39*288bf522SAndroid Build Coastguard Worker #undef PERF_REG_EXTENDED_MASK
40*288bf522SAndroid Build Coastguard Worker #endif
41*288bf522SAndroid Build Coastguard Worker
42*288bf522SAndroid Build Coastguard Worker #include <stdint.h>
43*288bf522SAndroid Build Coastguard Worker #include <string>
44*288bf522SAndroid Build Coastguard Worker #include <vector>
45*288bf522SAndroid Build Coastguard Worker
46*288bf522SAndroid Build Coastguard Worker #include "perf_event.h"
47*288bf522SAndroid Build Coastguard Worker
48*288bf522SAndroid Build Coastguard Worker namespace simpleperf {
49*288bf522SAndroid Build Coastguard Worker
50*288bf522SAndroid Build Coastguard Worker enum ArchType {
51*288bf522SAndroid Build Coastguard Worker ARCH_X86_32,
52*288bf522SAndroid Build Coastguard Worker ARCH_X86_64,
53*288bf522SAndroid Build Coastguard Worker ARCH_ARM,
54*288bf522SAndroid Build Coastguard Worker ARCH_ARM64,
55*288bf522SAndroid Build Coastguard Worker ARCH_RISCV64,
56*288bf522SAndroid Build Coastguard Worker ARCH_UNSUPPORTED,
57*288bf522SAndroid Build Coastguard Worker };
58*288bf522SAndroid Build Coastguard Worker
GetTargetArch()59*288bf522SAndroid Build Coastguard Worker constexpr ArchType GetTargetArch() {
60*288bf522SAndroid Build Coastguard Worker #if defined(__i386__)
61*288bf522SAndroid Build Coastguard Worker return ARCH_X86_32;
62*288bf522SAndroid Build Coastguard Worker #elif defined(__x86_64__)
63*288bf522SAndroid Build Coastguard Worker return ARCH_X86_64;
64*288bf522SAndroid Build Coastguard Worker #elif defined(__aarch64__)
65*288bf522SAndroid Build Coastguard Worker return ARCH_ARM64;
66*288bf522SAndroid Build Coastguard Worker #elif defined(__arm__)
67*288bf522SAndroid Build Coastguard Worker return ARCH_ARM;
68*288bf522SAndroid Build Coastguard Worker #elif defined(__riscv)
69*288bf522SAndroid Build Coastguard Worker return ARCH_RISCV64;
70*288bf522SAndroid Build Coastguard Worker #else
71*288bf522SAndroid Build Coastguard Worker return ARCH_UNSUPPORTED;
72*288bf522SAndroid Build Coastguard Worker #endif
73*288bf522SAndroid Build Coastguard Worker }
74*288bf522SAndroid Build Coastguard Worker
75*288bf522SAndroid Build Coastguard Worker ArchType GetArchType(const std::string& arch);
76*288bf522SAndroid Build Coastguard Worker ArchType GetArchForAbi(ArchType machine_arch, int abi);
77*288bf522SAndroid Build Coastguard Worker std::string GetArchString(ArchType arch);
78*288bf522SAndroid Build Coastguard Worker uint64_t GetSupportedRegMask(ArchType arch);
79*288bf522SAndroid Build Coastguard Worker std::string GetRegName(size_t regno, ArchType arch);
80*288bf522SAndroid Build Coastguard Worker
81*288bf522SAndroid Build Coastguard Worker class ScopedCurrentArch {
82*288bf522SAndroid Build Coastguard Worker public:
ScopedCurrentArch(ArchType arch)83*288bf522SAndroid Build Coastguard Worker explicit ScopedCurrentArch(ArchType arch) : saved_arch(current_arch) {
84*288bf522SAndroid Build Coastguard Worker current_arch = arch;
85*288bf522SAndroid Build Coastguard Worker }
~ScopedCurrentArch()86*288bf522SAndroid Build Coastguard Worker ~ScopedCurrentArch() {
87*288bf522SAndroid Build Coastguard Worker current_arch = saved_arch;
88*288bf522SAndroid Build Coastguard Worker }
GetCurrentArch()89*288bf522SAndroid Build Coastguard Worker static ArchType GetCurrentArch() { return current_arch; }
90*288bf522SAndroid Build Coastguard Worker
91*288bf522SAndroid Build Coastguard Worker private:
92*288bf522SAndroid Build Coastguard Worker ArchType saved_arch;
93*288bf522SAndroid Build Coastguard Worker static ArchType current_arch;
94*288bf522SAndroid Build Coastguard Worker };
95*288bf522SAndroid Build Coastguard Worker
96*288bf522SAndroid Build Coastguard Worker struct RegSet {
97*288bf522SAndroid Build Coastguard Worker ArchType arch;
98*288bf522SAndroid Build Coastguard Worker // For each setting bit in valid_mask, there is a valid reg value in data[].
99*288bf522SAndroid Build Coastguard Worker uint64_t valid_mask;
100*288bf522SAndroid Build Coastguard Worker // Stores reg values. Values for invalid regs are 0.
101*288bf522SAndroid Build Coastguard Worker uint64_t data[64];
102*288bf522SAndroid Build Coastguard Worker
103*288bf522SAndroid Build Coastguard Worker RegSet(int abi, uint64_t valid_mask, const uint64_t* valid_regs);
104*288bf522SAndroid Build Coastguard Worker
105*288bf522SAndroid Build Coastguard Worker bool GetRegValue(size_t regno, uint64_t* value) const;
106*288bf522SAndroid Build Coastguard Worker bool GetSpRegValue(uint64_t* value) const;
107*288bf522SAndroid Build Coastguard Worker bool GetIpRegValue(uint64_t* value) const;
108*288bf522SAndroid Build Coastguard Worker };
109*288bf522SAndroid Build Coastguard Worker
110*288bf522SAndroid Build Coastguard Worker } // namespace simpleperf
111*288bf522SAndroid Build Coastguard Worker
112*288bf522SAndroid Build Coastguard Worker #endif // SIMPLE_PERF_PERF_REGS_H_
113