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"
22b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith#include "registers_arm64.h"
23b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
24b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteithnamespace art {
25b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteithnamespace arm64 {
26b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
27b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteithclass Arm64Context : public Context {
28b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith public:
29b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith  Arm64Context() {
30b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith    Reset();
31b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith  }
32b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
33b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith  ~Arm64Context() {}
34b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
350bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  void Reset() OVERRIDE;
36b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
370bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  void FillCalleeSaves(const StackVisitor& fr) OVERRIDE;
38b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
390bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  void SetSP(uintptr_t new_sp) OVERRIDE {
400bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz    bool success = SetGPR(SP, new_sp);
410bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz    CHECK(success) << "Failed to set SP register";
42b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith  }
43b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
440bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  void SetPC(uintptr_t new_lr) OVERRIDE {
450bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz    bool success = SetGPR(LR, new_lr);
460bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz    CHECK(success) << "Failed to set LR register";
47b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith  }
48b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
490bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  uintptr_t* GetGPRAddress(uint32_t reg) OVERRIDE {
50b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith    DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfCoreRegisters));
51b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith    return gprs_[reg];
52b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith  }
53b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
540bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  bool GetGPR(uint32_t reg, uintptr_t* val) OVERRIDE {
55b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith    DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfCoreRegisters));
560bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz    if (gprs_[reg] == nullptr) {
570bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz      return false;
580bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz    } else {
590bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz      DCHECK(val != nullptr);
600bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz      *val = *gprs_[reg];
610bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz      return true;
620bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz    }
63b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith  }
64b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
650bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  bool SetGPR(uint32_t reg, uintptr_t value) OVERRIDE;
660bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz
670bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  bool GetFPR(uint32_t reg, uintptr_t* val) OVERRIDE {
680bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz    DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfDRegisters));
690bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz    if (fprs_[reg] == nullptr) {
700bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz      return false;
710bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz    } else {
720bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz      DCHECK(val != nullptr);
730bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz      *val = *fprs_[reg];
740bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz      return true;
750bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz    }
760bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  }
770bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz
780bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  bool SetFPR(uint32_t reg, uintptr_t value) OVERRIDE;
790bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz
800bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  void SmashCallerSaves() OVERRIDE;
810bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  void DoLongJump() OVERRIDE;
82b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
83b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith private:
84b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith  // Pointers to register locations, initialized to NULL or the specific registers below.
85b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith  uintptr_t* gprs_[kNumberOfCoreRegisters];
86b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith  uint64_t * fprs_[kNumberOfDRegisters];
87b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith  // Hold values for sp and pc if they are not located within a stack frame.
88b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith  uintptr_t sp_, pc_;
89b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith};
90b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
91b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith}  // namespace arm64
92b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith}  // namespace art
93b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith
94b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith#endif  // ART_RUNTIME_ARCH_ARM64_CONTEXT_ARM64_H_
95