context_arm.h revision 166db04e259ca51838c311891598664deeed85ad
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
206702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier#include "locks.h"
21166db04e259ca51838c311891598664deeed85adIan Rogers#include "arch/context.h"
22166db04e259ca51838c311891598664deeed85adIan Rogers#include "base/logging.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
366702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier  virtual void Reset();
376702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier
380399dde18753aa9bd2bd0d7cf60beef154d164a4Ian Rogers  virtual void FillCalleeSaves(const StackVisitor& fr);
39bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
40bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers  virtual void SetSP(uintptr_t new_sp) {
416702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier    SetGPR(SP, new_sp);
42bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers  }
43bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
44bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers  virtual void SetPC(uintptr_t new_pc) {
456702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier    SetGPR(PC, new_pc);
46bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers  }
47bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
48d6b1f6190c8ec42facb08aca34b093244774b318Ian Rogers  virtual uintptr_t GetGPR(uint32_t reg) {
49166db04e259ca51838c311891598664deeed85adIan Rogers    DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfCoreRegisters));
506702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier    return *gprs_[reg];
51d6b1f6190c8ec42facb08aca34b093244774b318Ian Rogers  }
52d6b1f6190c8ec42facb08aca34b093244774b318Ian Rogers
536702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier  virtual void SetGPR(uint32_t reg, uintptr_t value);
549c750f9b6283f62b3e6a93c0c6b2838abde5000eElliott Hughes  virtual void SmashCallerSaves();
55bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers  virtual void DoLongJump();
56bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
57bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers private:
586702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier  // Pointers to register locations, initialized to NULL or the specific registers below.
596702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier  uintptr_t* gprs_[kNumberOfCoreRegisters];
606702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier  uint32_t* fprs_[kNumberOfSRegisters];
616702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier  // Hold values for sp and pc if they are not located within a stack frame.
626702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier  uintptr_t sp_, pc_;
63bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers};
64bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
65bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers}  // namespace arm
66bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers}  // namespace art
67bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
68166db04e259ca51838c311891598664deeed85adIan Rogers#endif  // ART_RUNTIME_ARCH_ARM_CONTEXT_ARM_H_
69