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"
22794ad76e8d5b5b9132819d5b08a0570e27615644Andreas Gampe#include "base/macros.h"
23166db04e259ca51838c311891598664deeed85adIan Rogers#include "registers_arm.h"
24bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
25bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogersnamespace art {
26bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogersnamespace arm {
27bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
28bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogersclass ArmContext : public Context {
29bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers public:
306702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier  ArmContext() {
316702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier    Reset();
326702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier  }
336702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier
34bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers  virtual ~ArmContext() {}
35bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
360bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  void Reset() OVERRIDE;
376702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier
38524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray  void FillCalleeSaves(uint8_t* frame, const QuickMethodFrameInfo& fr) OVERRIDE;
39bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
400bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  void SetSP(uintptr_t new_sp) OVERRIDE {
4196ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz    SetGPR(SP, new_sp);
42bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers  }
43bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
440bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  void SetPC(uintptr_t new_pc) OVERRIDE {
4596ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz    SetGPR(PC, new_pc);
4696ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz  }
4796ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz
48639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  void SetArg0(uintptr_t new_arg0_value) OVERRIDE {
49639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe    SetGPR(R0, new_arg0_value);
50639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  }
51639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe
5296ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz  bool IsAccessibleGPR(uint32_t reg) OVERRIDE {
5396ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz    DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfCoreRegisters));
5496ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz    return gprs_[reg] != nullptr;
55bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers  }
56bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
570bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  uintptr_t* GetGPRAddress(uint32_t reg) OVERRIDE {
58815873ecc312b1d231acce71e1a16f42cdaf09f2Mathieu Chartier    DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfCoreRegisters));
59815873ecc312b1d231acce71e1a16f42cdaf09f2Mathieu Chartier    return gprs_[reg];
60815873ecc312b1d231acce71e1a16f42cdaf09f2Mathieu Chartier  }
61815873ecc312b1d231acce71e1a16f42cdaf09f2Mathieu Chartier
6296ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz  uintptr_t GetGPR(uint32_t reg) OVERRIDE {
63166db04e259ca51838c311891598664deeed85adIan Rogers    DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfCoreRegisters));
6496ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz    DCHECK(IsAccessibleGPR(reg));
6596ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz    return *gprs_[reg];
66d6b1f6190c8ec42facb08aca34b093244774b318Ian Rogers  }
67d6b1f6190c8ec42facb08aca34b093244774b318Ian Rogers
6896ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz  void SetGPR(uint32_t reg, uintptr_t value) OVERRIDE;
6996ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz
7096ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz  bool IsAccessibleFPR(uint32_t reg) OVERRIDE {
7196ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz    DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfSRegisters));
7296ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz    return fprs_[reg] != nullptr;
7396ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz  }
740bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz
7596ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz  uintptr_t GetFPR(uint32_t reg) OVERRIDE {
760bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz    DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfSRegisters));
7796ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz    DCHECK(IsAccessibleFPR(reg));
7896ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz    return *fprs_[reg];
790bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  }
800bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz
8196ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz  void SetFPR(uint32_t reg, uintptr_t value) OVERRIDE;
820bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz
830bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz  void SmashCallerSaves() OVERRIDE;
84794ad76e8d5b5b9132819d5b08a0570e27615644Andreas Gampe  NO_RETURN void DoLongJump() OVERRIDE;
85bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
86bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers private:
872cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  // Pointers to register locations, initialized to null or the specific registers below.
886702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier  uintptr_t* gprs_[kNumberOfCoreRegisters];
896702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier  uint32_t* fprs_[kNumberOfSRegisters];
906702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier  // Hold values for sp and pc if they are not located within a stack frame.
91639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  uintptr_t sp_, pc_, arg0_;
92bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers};
93bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
94bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers}  // namespace arm
95bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers}  // namespace art
96bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
97166db04e259ca51838c311891598664deeed85adIan Rogers#endif  // ART_RUNTIME_ARCH_ARM_CONTEXT_ARM_H_
98