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