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