1*eb293b8fSAndroid Build Coastguard Worker /*
2*eb293b8fSAndroid Build Coastguard Worker * Copyright (C) 2022 The Android Open Source Project
3*eb293b8fSAndroid Build Coastguard Worker *
4*eb293b8fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*eb293b8fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*eb293b8fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*eb293b8fSAndroid Build Coastguard Worker *
8*eb293b8fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*eb293b8fSAndroid Build Coastguard Worker *
10*eb293b8fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*eb293b8fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*eb293b8fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*eb293b8fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*eb293b8fSAndroid Build Coastguard Worker * limitations under the License.
15*eb293b8fSAndroid Build Coastguard Worker */
16*eb293b8fSAndroid Build Coastguard Worker
17*eb293b8fSAndroid Build Coastguard Worker #include <signal.h>
18*eb293b8fSAndroid Build Coastguard Worker #include <stdint.h>
19*eb293b8fSAndroid Build Coastguard Worker #include <sys/types.h>
20*eb293b8fSAndroid Build Coastguard Worker #include <sys/wait.h>
21*eb293b8fSAndroid Build Coastguard Worker #include <unistd.h>
22*eb293b8fSAndroid Build Coastguard Worker
23*eb293b8fSAndroid Build Coastguard Worker #include <memory>
24*eb293b8fSAndroid Build Coastguard Worker
25*eb293b8fSAndroid Build Coastguard Worker #include <gtest/gtest.h>
26*eb293b8fSAndroid Build Coastguard Worker
27*eb293b8fSAndroid Build Coastguard Worker #include <unwindstack/Regs.h>
28*eb293b8fSAndroid Build Coastguard Worker
29*eb293b8fSAndroid Build Coastguard Worker #include "ForkTest.h"
30*eb293b8fSAndroid Build Coastguard Worker #include "PidUtils.h"
31*eb293b8fSAndroid Build Coastguard Worker
32*eb293b8fSAndroid Build Coastguard Worker namespace unwindstack {
33*eb293b8fSAndroid Build Coastguard Worker
34*eb293b8fSAndroid Build Coastguard Worker class RegsRemoteTest : public ForkTest {
35*eb293b8fSAndroid Build Coastguard Worker protected:
SetUp()36*eb293b8fSAndroid Build Coastguard Worker void SetUp() override { Fork(); }
37*eb293b8fSAndroid Build Coastguard Worker };
38*eb293b8fSAndroid Build Coastguard Worker
TEST_F(RegsRemoteTest,remote_get)39*eb293b8fSAndroid Build Coastguard Worker TEST_F(RegsRemoteTest, remote_get) {
40*eb293b8fSAndroid Build Coastguard Worker std::unique_ptr<Regs> regs(Regs::RemoteGet(pid_));
41*eb293b8fSAndroid Build Coastguard Worker #if defined(__arm__)
42*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(ARCH_ARM, regs->Arch());
43*eb293b8fSAndroid Build Coastguard Worker #elif defined(__aarch64__)
44*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(ARCH_ARM64, regs->Arch());
45*eb293b8fSAndroid Build Coastguard Worker #elif defined(__i386__)
46*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(ARCH_X86, regs->Arch());
47*eb293b8fSAndroid Build Coastguard Worker #elif defined(__x86_64__)
48*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(ARCH_X86_64, regs->Arch());
49*eb293b8fSAndroid Build Coastguard Worker #elif defined(__riscv)
50*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(ARCH_RISCV64, regs->Arch());
51*eb293b8fSAndroid Build Coastguard Worker #else
52*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(nullptr, regs.get());
53*eb293b8fSAndroid Build Coastguard Worker #endif
54*eb293b8fSAndroid Build Coastguard Worker }
55*eb293b8fSAndroid Build Coastguard Worker
TEST_F(RegsRemoteTest,remote_get_ptrace_fails)56*eb293b8fSAndroid Build Coastguard Worker TEST_F(RegsRemoteTest, remote_get_ptrace_fails) {
57*eb293b8fSAndroid Build Coastguard Worker ErrorCode error_code;
58*eb293b8fSAndroid Build Coastguard Worker // Use our own pid since that will always fail.
59*eb293b8fSAndroid Build Coastguard Worker std::unique_ptr<Regs> regs(Regs::RemoteGet(getpid(), &error_code));
60*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(regs == nullptr);
61*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(ERROR_PTRACE_CALL, error_code);
62*eb293b8fSAndroid Build Coastguard Worker }
63*eb293b8fSAndroid Build Coastguard Worker
TEST_F(RegsRemoteTest,remote_get_arch)64*eb293b8fSAndroid Build Coastguard Worker TEST_F(RegsRemoteTest, remote_get_arch) {
65*eb293b8fSAndroid Build Coastguard Worker #if defined(__arm__)
66*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(ARCH_ARM, Regs::RemoteGetArch(pid_));
67*eb293b8fSAndroid Build Coastguard Worker #elif defined(__aarch64__)
68*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(ARCH_ARM64, Regs::RemoteGetArch(pid_));
69*eb293b8fSAndroid Build Coastguard Worker #elif defined(__i386__)
70*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(ARCH_X86, Regs::RemoteGetArch(pid_));
71*eb293b8fSAndroid Build Coastguard Worker #elif defined(__x86_64__)
72*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(ARCH_X86_64, Regs::RemoteGetArch(pid_));
73*eb293b8fSAndroid Build Coastguard Worker #elif defined(__riscv)
74*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(ARCH_RISCV64, Regs::RemoteGetArch(pid_));
75*eb293b8fSAndroid Build Coastguard Worker #else
76*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(ARCH_NONE, Regs::RemoteGetArch(pid_));
77*eb293b8fSAndroid Build Coastguard Worker #endif
78*eb293b8fSAndroid Build Coastguard Worker }
79*eb293b8fSAndroid Build Coastguard Worker
TEST_F(RegsRemoteTest,remote_get_arch_ptrace_fails)80*eb293b8fSAndroid Build Coastguard Worker TEST_F(RegsRemoteTest, remote_get_arch_ptrace_fails) {
81*eb293b8fSAndroid Build Coastguard Worker ErrorCode error_code;
82*eb293b8fSAndroid Build Coastguard Worker // Use our own pid since that will always fail.
83*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(ARCH_UNKNOWN, Regs::RemoteGetArch(getpid(), &error_code));
84*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(ERROR_PTRACE_CALL, error_code);
85*eb293b8fSAndroid Build Coastguard Worker }
86*eb293b8fSAndroid Build Coastguard Worker
87*eb293b8fSAndroid Build Coastguard Worker } // namespace unwindstack
88