12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/*
22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2011 The Android Open Source Project
32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License.
62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at
72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software
112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and
142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License.
152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */
16bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
17166db04e259ca51838c311891598664deeed85adIan Rogers#ifndef ART_RUNTIME_ARCH_ARM_CONTEXT_ARM_H_
18166db04e259ca51838c311891598664deeed85adIan Rogers#define ART_RUNTIME_ARCH_ARM_CONTEXT_ARM_H_
19bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
20166db04e259ca51838c311891598664deeed85adIan Rogers#include "arch/context.h"
21166db04e259ca51838c311891598664deeed85adIan Rogers#include "base/logging.h"
22166db04e259ca51838c311891598664deeed85adIan Rogers#include "registers_arm.h"
23bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
24bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogersnamespace art {
25bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogersnamespace arm {
26bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
27bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogersclass ArmContext : public Context {
28bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers public:
296702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier  ArmContext() {
306702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier    Reset();
316702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier  }
326702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier
33bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers  virtual ~ArmContext() {}
34bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
350bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  void Reset() OVERRIDE;
366702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier
370bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  void FillCalleeSaves(const StackVisitor& fr) OVERRIDE SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
38bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
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";
42bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers  }
43bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
440bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  void SetPC(uintptr_t new_pc) OVERRIDE {
450bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz    bool success = SetGPR(PC, new_pc);
460bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz    CHECK(success) << "Failed to set PC register";
47bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers  }
48bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
490bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  uintptr_t* GetGPRAddress(uint32_t reg) OVERRIDE {
50815873ecc312b1d231acce71e1a16f42cdaf09f2Mathieu Chartier    DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfCoreRegisters));
51815873ecc312b1d231acce71e1a16f42cdaf09f2Mathieu Chartier    return gprs_[reg];
52815873ecc312b1d231acce71e1a16f42cdaf09f2Mathieu Chartier  }
53815873ecc312b1d231acce71e1a16f42cdaf09f2Mathieu Chartier
540bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  bool GetGPR(uint32_t reg, uintptr_t* val) OVERRIDE {
55166db04e259ca51838c311891598664deeed85adIan Rogers    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    }
63d6b1f6190c8ec42facb08aca34b093244774b318Ian Rogers  }
64d6b1f6190c8ec42facb08aca34b093244774b318Ian Rogers
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>(kNumberOfSRegisters));
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;
82bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
83bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers private:
846702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier  // Pointers to register locations, initialized to NULL or the specific registers below.
856702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier  uintptr_t* gprs_[kNumberOfCoreRegisters];
866702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier  uint32_t* fprs_[kNumberOfSRegisters];
876702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier  // Hold values for sp and pc if they are not located within a stack frame.
886702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier  uintptr_t sp_, pc_;
89bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers};
90bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
91bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers}  // namespace arm
92bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers}  // namespace art
93bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
94166db04e259ca51838c311891598664deeed85adIan Rogers#endif  // ART_RUNTIME_ARCH_ARM_CONTEXT_ARM_H_
95