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