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 #include "perf_regs.h"
18*288bf522SAndroid Build Coastguard Worker
19*288bf522SAndroid Build Coastguard Worker #include <string.h>
20*288bf522SAndroid Build Coastguard Worker
21*288bf522SAndroid Build Coastguard Worker #include <android-base/logging.h>
22*288bf522SAndroid Build Coastguard Worker #include <android-base/stringprintf.h>
23*288bf522SAndroid Build Coastguard Worker #include <android-base/strings.h>
24*288bf522SAndroid Build Coastguard Worker #include <unordered_map>
25*288bf522SAndroid Build Coastguard Worker
26*288bf522SAndroid Build Coastguard Worker #include "perf_event.h"
27*288bf522SAndroid Build Coastguard Worker
28*288bf522SAndroid Build Coastguard Worker namespace simpleperf {
29*288bf522SAndroid Build Coastguard Worker
30*288bf522SAndroid Build Coastguard Worker ArchType ScopedCurrentArch::current_arch = ARCH_UNSUPPORTED;
31*288bf522SAndroid Build Coastguard Worker
GetArchType(const std::string & arch)32*288bf522SAndroid Build Coastguard Worker ArchType GetArchType(const std::string& arch) {
33*288bf522SAndroid Build Coastguard Worker if (arch == "x86" || arch == "i686") {
34*288bf522SAndroid Build Coastguard Worker return ARCH_X86_32;
35*288bf522SAndroid Build Coastguard Worker } else if (arch == "x86_64") {
36*288bf522SAndroid Build Coastguard Worker return ARCH_X86_64;
37*288bf522SAndroid Build Coastguard Worker } else if (arch == "riscv64") {
38*288bf522SAndroid Build Coastguard Worker return ARCH_RISCV64;
39*288bf522SAndroid Build Coastguard Worker } else if (arch == "aarch64") {
40*288bf522SAndroid Build Coastguard Worker return ARCH_ARM64;
41*288bf522SAndroid Build Coastguard Worker } else if (android::base::StartsWith(arch, "arm")) {
42*288bf522SAndroid Build Coastguard Worker // If arch is "armv8l", it is likely that we are using a 32-bit simpleperf
43*288bf522SAndroid Build Coastguard Worker // binary on a aarch64 device. In this case, the profiling environment is
44*288bf522SAndroid Build Coastguard Worker // ARCH_ARM64, because the kernel is aarch64.
45*288bf522SAndroid Build Coastguard Worker if (arch[3] == 'v') {
46*288bf522SAndroid Build Coastguard Worker int version = atoi(&arch[4]);
47*288bf522SAndroid Build Coastguard Worker if (version >= 8) {
48*288bf522SAndroid Build Coastguard Worker return ARCH_ARM64;
49*288bf522SAndroid Build Coastguard Worker }
50*288bf522SAndroid Build Coastguard Worker }
51*288bf522SAndroid Build Coastguard Worker return ARCH_ARM;
52*288bf522SAndroid Build Coastguard Worker }
53*288bf522SAndroid Build Coastguard Worker LOG(ERROR) << "unsupported arch: " << arch;
54*288bf522SAndroid Build Coastguard Worker return ARCH_UNSUPPORTED;
55*288bf522SAndroid Build Coastguard Worker }
56*288bf522SAndroid Build Coastguard Worker
GetArchForAbi(ArchType machine_arch,int abi)57*288bf522SAndroid Build Coastguard Worker ArchType GetArchForAbi(ArchType machine_arch, int abi) {
58*288bf522SAndroid Build Coastguard Worker if (abi == PERF_SAMPLE_REGS_ABI_32) {
59*288bf522SAndroid Build Coastguard Worker if (machine_arch == ARCH_X86_64) {
60*288bf522SAndroid Build Coastguard Worker return ARCH_X86_32;
61*288bf522SAndroid Build Coastguard Worker }
62*288bf522SAndroid Build Coastguard Worker if (machine_arch == ARCH_ARM64) {
63*288bf522SAndroid Build Coastguard Worker return ARCH_ARM;
64*288bf522SAndroid Build Coastguard Worker }
65*288bf522SAndroid Build Coastguard Worker } else if (abi == PERF_SAMPLE_REGS_ABI_64) {
66*288bf522SAndroid Build Coastguard Worker if (machine_arch == ARCH_X86_32) {
67*288bf522SAndroid Build Coastguard Worker return ARCH_X86_64;
68*288bf522SAndroid Build Coastguard Worker }
69*288bf522SAndroid Build Coastguard Worker if (machine_arch == ARCH_ARM) {
70*288bf522SAndroid Build Coastguard Worker return ARCH_ARM64;
71*288bf522SAndroid Build Coastguard Worker }
72*288bf522SAndroid Build Coastguard Worker }
73*288bf522SAndroid Build Coastguard Worker return machine_arch;
74*288bf522SAndroid Build Coastguard Worker }
75*288bf522SAndroid Build Coastguard Worker
GetArchString(ArchType arch)76*288bf522SAndroid Build Coastguard Worker std::string GetArchString(ArchType arch) {
77*288bf522SAndroid Build Coastguard Worker switch (arch) {
78*288bf522SAndroid Build Coastguard Worker case ARCH_X86_32:
79*288bf522SAndroid Build Coastguard Worker return "x86";
80*288bf522SAndroid Build Coastguard Worker case ARCH_X86_64:
81*288bf522SAndroid Build Coastguard Worker return "x86_64";
82*288bf522SAndroid Build Coastguard Worker case ARCH_ARM64:
83*288bf522SAndroid Build Coastguard Worker return "arm64";
84*288bf522SAndroid Build Coastguard Worker case ARCH_ARM:
85*288bf522SAndroid Build Coastguard Worker return "arm";
86*288bf522SAndroid Build Coastguard Worker case ARCH_RISCV64:
87*288bf522SAndroid Build Coastguard Worker return "riscv64";
88*288bf522SAndroid Build Coastguard Worker default:
89*288bf522SAndroid Build Coastguard Worker break;
90*288bf522SAndroid Build Coastguard Worker }
91*288bf522SAndroid Build Coastguard Worker return "unknown";
92*288bf522SAndroid Build Coastguard Worker }
93*288bf522SAndroid Build Coastguard Worker
GetSupportedRegMask(ArchType arch)94*288bf522SAndroid Build Coastguard Worker uint64_t GetSupportedRegMask(ArchType arch) {
95*288bf522SAndroid Build Coastguard Worker switch (arch) {
96*288bf522SAndroid Build Coastguard Worker case ARCH_X86_32:
97*288bf522SAndroid Build Coastguard Worker return ((1ULL << PERF_REG_X86_32_MAX) - 1) & ~(1ULL << PERF_REG_X86_DS) &
98*288bf522SAndroid Build Coastguard Worker ~(1ULL << PERF_REG_X86_ES) & ~(1ULL << PERF_REG_X86_FS) & ~(1ULL << PERF_REG_X86_GS);
99*288bf522SAndroid Build Coastguard Worker case ARCH_X86_64:
100*288bf522SAndroid Build Coastguard Worker return (((1ULL << PERF_REG_X86_64_MAX) - 1) & ~(1ULL << PERF_REG_X86_DS) &
101*288bf522SAndroid Build Coastguard Worker ~(1ULL << PERF_REG_X86_ES) & ~(1ULL << PERF_REG_X86_FS) & ~(1ULL << PERF_REG_X86_GS));
102*288bf522SAndroid Build Coastguard Worker case ARCH_ARM:
103*288bf522SAndroid Build Coastguard Worker return ((1ULL << PERF_REG_ARM_MAX) - 1);
104*288bf522SAndroid Build Coastguard Worker case ARCH_ARM64:
105*288bf522SAndroid Build Coastguard Worker return ((1ULL << PERF_REG_ARM64_MAX) - 1);
106*288bf522SAndroid Build Coastguard Worker case ARCH_RISCV64:
107*288bf522SAndroid Build Coastguard Worker return ((1ULL << PERF_REG_RISCV_MAX) - 1);
108*288bf522SAndroid Build Coastguard Worker default:
109*288bf522SAndroid Build Coastguard Worker return 0;
110*288bf522SAndroid Build Coastguard Worker }
111*288bf522SAndroid Build Coastguard Worker return 0;
112*288bf522SAndroid Build Coastguard Worker }
113*288bf522SAndroid Build Coastguard Worker
114*288bf522SAndroid Build Coastguard Worker static std::unordered_map<size_t, std::string> x86_reg_map = {
115*288bf522SAndroid Build Coastguard Worker {PERF_REG_X86_AX, "ax"}, {PERF_REG_X86_BX, "bx"}, {PERF_REG_X86_CX, "cx"},
116*288bf522SAndroid Build Coastguard Worker {PERF_REG_X86_DX, "dx"}, {PERF_REG_X86_SI, "si"}, {PERF_REG_X86_DI, "di"},
117*288bf522SAndroid Build Coastguard Worker {PERF_REG_X86_BP, "bp"}, {PERF_REG_X86_SP, "sp"}, {PERF_REG_X86_IP, "ip"},
118*288bf522SAndroid Build Coastguard Worker {PERF_REG_X86_FLAGS, "flags"}, {PERF_REG_X86_CS, "cs"}, {PERF_REG_X86_SS, "ss"},
119*288bf522SAndroid Build Coastguard Worker {PERF_REG_X86_DS, "ds"}, {PERF_REG_X86_ES, "es"}, {PERF_REG_X86_FS, "fs"},
120*288bf522SAndroid Build Coastguard Worker {PERF_REG_X86_GS, "gs"},
121*288bf522SAndroid Build Coastguard Worker };
122*288bf522SAndroid Build Coastguard Worker
123*288bf522SAndroid Build Coastguard Worker static std::unordered_map<size_t, std::string> arm_reg_map = {
124*288bf522SAndroid Build Coastguard Worker {PERF_REG_ARM_FP, "fp"}, {PERF_REG_ARM_IP, "ip"}, {PERF_REG_ARM_SP, "sp"},
125*288bf522SAndroid Build Coastguard Worker {PERF_REG_ARM_LR, "lr"}, {PERF_REG_ARM_PC, "pc"},
126*288bf522SAndroid Build Coastguard Worker };
127*288bf522SAndroid Build Coastguard Worker
128*288bf522SAndroid Build Coastguard Worker static std::unordered_map<size_t, std::string> arm64_reg_map = {
129*288bf522SAndroid Build Coastguard Worker {PERF_REG_ARM64_LR, "lr"},
130*288bf522SAndroid Build Coastguard Worker {PERF_REG_ARM64_SP, "sp"},
131*288bf522SAndroid Build Coastguard Worker {PERF_REG_ARM64_PC, "pc"},
132*288bf522SAndroid Build Coastguard Worker };
133*288bf522SAndroid Build Coastguard Worker
134*288bf522SAndroid Build Coastguard Worker static std::unordered_map<size_t, std::string> riscv64_reg_map = {
135*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_PC, "pc"},
136*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_RA, "ra"},
137*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_SP, "sp"},
138*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_GP, "gp"},
139*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_TP, "tp"},
140*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_T0, "t0"},
141*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_T1, "t1"},
142*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_T2, "t2"},
143*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_S0, "s0"},
144*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_S1, "s1"},
145*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_A0, "a0"},
146*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_A1, "a1"},
147*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_A2, "a2"},
148*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_A3, "a3"},
149*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_A4, "a4"},
150*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_A5, "a5"},
151*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_A6, "a6"},
152*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_A7, "a7"},
153*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_S2, "s2"},
154*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_S3, "s3"},
155*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_S4, "s4"},
156*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_S5, "s5"},
157*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_S6, "s6"},
158*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_S7, "s7"},
159*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_S8, "s8"},
160*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_S9, "s9"},
161*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_S10, "s10"},
162*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_S11, "s11"},
163*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_T3, "t3"},
164*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_T4, "t4"},
165*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_T5, "t5"},
166*288bf522SAndroid Build Coastguard Worker {PERF_REG_RISCV_T6, "t6"},
167*288bf522SAndroid Build Coastguard Worker };
168*288bf522SAndroid Build Coastguard Worker
GetRegName(size_t regno,ArchType arch)169*288bf522SAndroid Build Coastguard Worker std::string GetRegName(size_t regno, ArchType arch) {
170*288bf522SAndroid Build Coastguard Worker // Cast regno to int type to avoid -Werror=type-limits.
171*288bf522SAndroid Build Coastguard Worker int reg = static_cast<int>(regno);
172*288bf522SAndroid Build Coastguard Worker switch (arch) {
173*288bf522SAndroid Build Coastguard Worker case ARCH_X86_64: {
174*288bf522SAndroid Build Coastguard Worker if (reg >= PERF_REG_X86_R8 && reg <= PERF_REG_X86_R15) {
175*288bf522SAndroid Build Coastguard Worker return android::base::StringPrintf("r%d", reg - PERF_REG_X86_R8 + 8);
176*288bf522SAndroid Build Coastguard Worker }
177*288bf522SAndroid Build Coastguard Worker FALLTHROUGH_INTENDED;
178*288bf522SAndroid Build Coastguard Worker }
179*288bf522SAndroid Build Coastguard Worker case ARCH_X86_32: {
180*288bf522SAndroid Build Coastguard Worker auto it = x86_reg_map.find(reg);
181*288bf522SAndroid Build Coastguard Worker CHECK(it != x86_reg_map.end()) << "unknown reg " << reg;
182*288bf522SAndroid Build Coastguard Worker return it->second;
183*288bf522SAndroid Build Coastguard Worker }
184*288bf522SAndroid Build Coastguard Worker case ARCH_ARM: {
185*288bf522SAndroid Build Coastguard Worker if (reg >= PERF_REG_ARM_R0 && reg <= PERF_REG_ARM_R10) {
186*288bf522SAndroid Build Coastguard Worker return android::base::StringPrintf("r%d", reg - PERF_REG_ARM_R0);
187*288bf522SAndroid Build Coastguard Worker }
188*288bf522SAndroid Build Coastguard Worker if (auto it = arm_reg_map.find(reg); it != arm_reg_map.end()) {
189*288bf522SAndroid Build Coastguard Worker return it->second;
190*288bf522SAndroid Build Coastguard Worker }
191*288bf522SAndroid Build Coastguard Worker FALLTHROUGH_INTENDED;
192*288bf522SAndroid Build Coastguard Worker }
193*288bf522SAndroid Build Coastguard Worker case ARCH_ARM64: {
194*288bf522SAndroid Build Coastguard Worker if (reg >= PERF_REG_ARM64_X0 && reg <= PERF_REG_ARM64_X29) {
195*288bf522SAndroid Build Coastguard Worker return android::base::StringPrintf("r%d", reg - PERF_REG_ARM64_X0);
196*288bf522SAndroid Build Coastguard Worker }
197*288bf522SAndroid Build Coastguard Worker auto it = arm64_reg_map.find(reg);
198*288bf522SAndroid Build Coastguard Worker CHECK(it != arm64_reg_map.end()) << "unknown reg " << reg;
199*288bf522SAndroid Build Coastguard Worker return it->second;
200*288bf522SAndroid Build Coastguard Worker }
201*288bf522SAndroid Build Coastguard Worker case ARCH_RISCV64: {
202*288bf522SAndroid Build Coastguard Worker auto it = riscv64_reg_map.find(reg);
203*288bf522SAndroid Build Coastguard Worker CHECK(it != riscv64_reg_map.end()) << "unknown reg " << reg;
204*288bf522SAndroid Build Coastguard Worker return it->second;
205*288bf522SAndroid Build Coastguard Worker }
206*288bf522SAndroid Build Coastguard Worker default:
207*288bf522SAndroid Build Coastguard Worker return "unknown";
208*288bf522SAndroid Build Coastguard Worker }
209*288bf522SAndroid Build Coastguard Worker }
210*288bf522SAndroid Build Coastguard Worker
RegSet(int abi,uint64_t valid_mask,const uint64_t * valid_regs)211*288bf522SAndroid Build Coastguard Worker RegSet::RegSet(int abi, uint64_t valid_mask, const uint64_t* valid_regs) : valid_mask(valid_mask) {
212*288bf522SAndroid Build Coastguard Worker arch = GetArchForAbi(ScopedCurrentArch::GetCurrentArch(), abi);
213*288bf522SAndroid Build Coastguard Worker memset(data, 0, sizeof(data));
214*288bf522SAndroid Build Coastguard Worker for (int i = 0, j = 0; i < 64; ++i) {
215*288bf522SAndroid Build Coastguard Worker if ((valid_mask >> i) & 1) {
216*288bf522SAndroid Build Coastguard Worker data[i] = valid_regs[j++];
217*288bf522SAndroid Build Coastguard Worker }
218*288bf522SAndroid Build Coastguard Worker }
219*288bf522SAndroid Build Coastguard Worker if (ScopedCurrentArch::GetCurrentArch() == ARCH_ARM64 && abi == PERF_SAMPLE_REGS_ABI_32) {
220*288bf522SAndroid Build Coastguard Worker // The kernel dumps arm64 regs, but we need arm regs. So map arm64 regs into arm regs.
221*288bf522SAndroid Build Coastguard Worker data[PERF_REG_ARM_PC] = data[PERF_REG_ARM64_PC];
222*288bf522SAndroid Build Coastguard Worker }
223*288bf522SAndroid Build Coastguard Worker }
224*288bf522SAndroid Build Coastguard Worker
GetRegValue(size_t regno,uint64_t * value) const225*288bf522SAndroid Build Coastguard Worker bool RegSet::GetRegValue(size_t regno, uint64_t* value) const {
226*288bf522SAndroid Build Coastguard Worker CHECK_LT(regno, 64U);
227*288bf522SAndroid Build Coastguard Worker if ((valid_mask >> regno) & 1) {
228*288bf522SAndroid Build Coastguard Worker *value = data[regno];
229*288bf522SAndroid Build Coastguard Worker return true;
230*288bf522SAndroid Build Coastguard Worker }
231*288bf522SAndroid Build Coastguard Worker return false;
232*288bf522SAndroid Build Coastguard Worker }
233*288bf522SAndroid Build Coastguard Worker
GetSpRegValue(uint64_t * value) const234*288bf522SAndroid Build Coastguard Worker bool RegSet::GetSpRegValue(uint64_t* value) const {
235*288bf522SAndroid Build Coastguard Worker size_t regno;
236*288bf522SAndroid Build Coastguard Worker switch (arch) {
237*288bf522SAndroid Build Coastguard Worker case ARCH_X86_32:
238*288bf522SAndroid Build Coastguard Worker regno = PERF_REG_X86_SP;
239*288bf522SAndroid Build Coastguard Worker break;
240*288bf522SAndroid Build Coastguard Worker case ARCH_X86_64:
241*288bf522SAndroid Build Coastguard Worker regno = PERF_REG_X86_SP;
242*288bf522SAndroid Build Coastguard Worker break;
243*288bf522SAndroid Build Coastguard Worker case ARCH_ARM:
244*288bf522SAndroid Build Coastguard Worker regno = PERF_REG_ARM_SP;
245*288bf522SAndroid Build Coastguard Worker break;
246*288bf522SAndroid Build Coastguard Worker case ARCH_ARM64:
247*288bf522SAndroid Build Coastguard Worker regno = PERF_REG_ARM64_SP;
248*288bf522SAndroid Build Coastguard Worker break;
249*288bf522SAndroid Build Coastguard Worker case ARCH_RISCV64:
250*288bf522SAndroid Build Coastguard Worker regno = PERF_REG_RISCV_SP;
251*288bf522SAndroid Build Coastguard Worker break;
252*288bf522SAndroid Build Coastguard Worker default:
253*288bf522SAndroid Build Coastguard Worker return false;
254*288bf522SAndroid Build Coastguard Worker }
255*288bf522SAndroid Build Coastguard Worker return GetRegValue(regno, value);
256*288bf522SAndroid Build Coastguard Worker }
257*288bf522SAndroid Build Coastguard Worker
GetIpRegValue(uint64_t * value) const258*288bf522SAndroid Build Coastguard Worker bool RegSet::GetIpRegValue(uint64_t* value) const {
259*288bf522SAndroid Build Coastguard Worker size_t regno;
260*288bf522SAndroid Build Coastguard Worker switch (arch) {
261*288bf522SAndroid Build Coastguard Worker case ARCH_X86_64:
262*288bf522SAndroid Build Coastguard Worker case ARCH_X86_32:
263*288bf522SAndroid Build Coastguard Worker regno = PERF_REG_X86_IP;
264*288bf522SAndroid Build Coastguard Worker break;
265*288bf522SAndroid Build Coastguard Worker case ARCH_ARM:
266*288bf522SAndroid Build Coastguard Worker regno = PERF_REG_ARM_PC;
267*288bf522SAndroid Build Coastguard Worker break;
268*288bf522SAndroid Build Coastguard Worker case ARCH_ARM64:
269*288bf522SAndroid Build Coastguard Worker regno = PERF_REG_ARM64_PC;
270*288bf522SAndroid Build Coastguard Worker break;
271*288bf522SAndroid Build Coastguard Worker case ARCH_RISCV64:
272*288bf522SAndroid Build Coastguard Worker regno = PERF_REG_RISCV_PC;
273*288bf522SAndroid Build Coastguard Worker break;
274*288bf522SAndroid Build Coastguard Worker default:
275*288bf522SAndroid Build Coastguard Worker return false;
276*288bf522SAndroid Build Coastguard Worker }
277*288bf522SAndroid Build Coastguard Worker return GetRegValue(regno, value);
278*288bf522SAndroid Build Coastguard Worker }
279*288bf522SAndroid Build Coastguard Worker
280*288bf522SAndroid Build Coastguard Worker } // namespace simpleperf
281