1b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith/*
2b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith * Copyright (C) 2014 The Android Open Source Project
3b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith *
4b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith * Licensed under the Apache License, Version 2.0 (the "License");
5b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith * you may not use this file except in compliance with the License.
6b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith * You may obtain a copy of the License at
7b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith *
8b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith *      http://www.apache.org/licenses/LICENSE-2.0
9b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith *
10b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith * Unless required by applicable law or agreed to in writing, software
11b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith * distributed under the License is distributed on an "AS IS" BASIS,
12b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith * See the License for the specific language governing permissions and
14b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith * limitations under the License.
15b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith */
16b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
17b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith#ifndef ART_RUNTIME_ARCH_ARM64_CONTEXT_ARM64_H_
18b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith#define ART_RUNTIME_ARCH_ARM64_CONTEXT_ARM64_H_
19b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
20b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith#include "arch/context.h"
21b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith#include "base/logging.h"
22794ad76e8d5b5b9132819d5b08a0570e27615644Andreas Gampe#include "base/macros.h"
23b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith#include "registers_arm64.h"
24b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
25b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteithnamespace art {
26b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteithnamespace arm64 {
27b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
28b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteithclass Arm64Context : public Context {
29b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith public:
30b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith  Arm64Context() {
31b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith    Reset();
32b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith  }
33b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
34b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith  ~Arm64Context() {}
35b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
360bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  void Reset() OVERRIDE;
37b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
38524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray  void FillCalleeSaves(uint8_t* frame, const QuickMethodFrameInfo& fr) OVERRIDE;
39b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
400bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  void SetSP(uintptr_t new_sp) OVERRIDE {
4196ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz    SetGPR(SP, new_sp);
42b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith  }
43b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
440bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  void SetPC(uintptr_t new_lr) OVERRIDE {
45639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe    SetGPR(kPC, new_lr);
46639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  }
47639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe
48639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  void SetArg0(uintptr_t new_arg0_value) OVERRIDE {
49639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe    SetGPR(X0, new_arg0_value);
5096ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz  }
5196ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz
5296ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz  bool IsAccessibleGPR(uint32_t reg) OVERRIDE {
53639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe    DCHECK_LT(reg, arraysize(gprs_));
5496ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz    return gprs_[reg] != nullptr;
55b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith  }
56b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
570bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  uintptr_t* GetGPRAddress(uint32_t reg) OVERRIDE {
58639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe    DCHECK_LT(reg, arraysize(gprs_));
59b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith    return gprs_[reg];
60b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith  }
61b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
6296ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz  uintptr_t GetGPR(uint32_t reg) OVERRIDE {
63639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe    // Note: PC isn't an available GPR (outside of internals), so don't allow retrieving the value.
6437c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames    DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfXRegisters));
6596ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz    DCHECK(IsAccessibleGPR(reg));
6696ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz    return *gprs_[reg];
67b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith  }
68b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
6996ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz  void SetGPR(uint32_t reg, uintptr_t value) OVERRIDE;
7096ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz
7196ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz  bool IsAccessibleFPR(uint32_t reg) OVERRIDE {
7296ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz    DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfDRegisters));
7396ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz    return fprs_[reg] != nullptr;
7496ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz  }
750bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz
7696ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz  uintptr_t GetFPR(uint32_t reg) OVERRIDE {
770bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz    DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfDRegisters));
7896ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz    DCHECK(IsAccessibleFPR(reg));
7996ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz    return *fprs_[reg];
800bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  }
810bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz
8296ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz  void SetFPR(uint32_t reg, uintptr_t value) OVERRIDE;
830bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz
840bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  void SmashCallerSaves() OVERRIDE;
85794ad76e8d5b5b9132819d5b08a0570e27615644Andreas Gampe  NO_RETURN void DoLongJump() OVERRIDE;
86b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
87639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  static constexpr size_t kPC = kNumberOfXRegisters;
88639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe
89b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith private:
90639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  // Pointers to register locations, initialized to null or the specific registers below. We need
91639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  // an additional one for the PC.
92639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  uintptr_t* gprs_[kNumberOfXRegisters + 1];
93b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith  uint64_t * fprs_[kNumberOfDRegisters];
94639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  // Hold values for sp, pc and arg0 if they are not located within a stack frame.
95639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  uintptr_t sp_, pc_, arg0_;
96b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith};
97b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
98b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith}  // namespace arm64
99b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith}  // namespace art
100b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
101b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith#endif  // ART_RUNTIME_ARCH_ARM64_CONTEXT_ARM64_H_
102