1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2011 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker #ifndef ART_RUNTIME_ARCH_ARM_CONTEXT_ARM_H_ 18*795d594fSAndroid Build Coastguard Worker #define ART_RUNTIME_ARCH_ARM_CONTEXT_ARM_H_ 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker #include <android-base/logging.h> 21*795d594fSAndroid Build Coastguard Worker 22*795d594fSAndroid Build Coastguard Worker #include "arch/context.h" 23*795d594fSAndroid Build Coastguard Worker #include "base/macros.h" 24*795d594fSAndroid Build Coastguard Worker #include "registers_arm.h" 25*795d594fSAndroid Build Coastguard Worker 26*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN { 27*795d594fSAndroid Build Coastguard Worker namespace arm { 28*795d594fSAndroid Build Coastguard Worker 29*795d594fSAndroid Build Coastguard Worker class ArmContext final : public Context { 30*795d594fSAndroid Build Coastguard Worker public: ArmContext()31*795d594fSAndroid Build Coastguard Worker ArmContext() { 32*795d594fSAndroid Build Coastguard Worker Reset(); 33*795d594fSAndroid Build Coastguard Worker } 34*795d594fSAndroid Build Coastguard Worker ~ArmContext()35*795d594fSAndroid Build Coastguard Worker virtual ~ArmContext() {} 36*795d594fSAndroid Build Coastguard Worker 37*795d594fSAndroid Build Coastguard Worker void Reset() override; 38*795d594fSAndroid Build Coastguard Worker 39*795d594fSAndroid Build Coastguard Worker void FillCalleeSaves(uint8_t* frame, const QuickMethodFrameInfo& fr) override; 40*795d594fSAndroid Build Coastguard Worker SetSP(uintptr_t new_sp)41*795d594fSAndroid Build Coastguard Worker void SetSP(uintptr_t new_sp) override { 42*795d594fSAndroid Build Coastguard Worker SetGPR(SP, new_sp); 43*795d594fSAndroid Build Coastguard Worker } 44*795d594fSAndroid Build Coastguard Worker SetPC(uintptr_t new_pc)45*795d594fSAndroid Build Coastguard Worker void SetPC(uintptr_t new_pc) override { 46*795d594fSAndroid Build Coastguard Worker SetGPR(PC, new_pc); 47*795d594fSAndroid Build Coastguard Worker } 48*795d594fSAndroid Build Coastguard Worker SetNterpDexPC(uintptr_t dex_pc_ptr)49*795d594fSAndroid Build Coastguard Worker void SetNterpDexPC(uintptr_t dex_pc_ptr) override { 50*795d594fSAndroid Build Coastguard Worker SetGPR(R11, dex_pc_ptr); 51*795d594fSAndroid Build Coastguard Worker } 52*795d594fSAndroid Build Coastguard Worker SetArg0(uintptr_t new_arg0_value)53*795d594fSAndroid Build Coastguard Worker void SetArg0(uintptr_t new_arg0_value) override { 54*795d594fSAndroid Build Coastguard Worker SetGPR(R0, new_arg0_value); 55*795d594fSAndroid Build Coastguard Worker } 56*795d594fSAndroid Build Coastguard Worker IsAccessibleGPR(uint32_t reg)57*795d594fSAndroid Build Coastguard Worker bool IsAccessibleGPR(uint32_t reg) override { 58*795d594fSAndroid Build Coastguard Worker DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfCoreRegisters)); 59*795d594fSAndroid Build Coastguard Worker return gprs_[reg] != nullptr; 60*795d594fSAndroid Build Coastguard Worker } 61*795d594fSAndroid Build Coastguard Worker GetGPRAddress(uint32_t reg)62*795d594fSAndroid Build Coastguard Worker uintptr_t* GetGPRAddress(uint32_t reg) override { 63*795d594fSAndroid Build Coastguard Worker DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfCoreRegisters)); 64*795d594fSAndroid Build Coastguard Worker return gprs_[reg]; 65*795d594fSAndroid Build Coastguard Worker } 66*795d594fSAndroid Build Coastguard Worker GetGPR(uint32_t reg)67*795d594fSAndroid Build Coastguard Worker uintptr_t GetGPR(uint32_t reg) override { 68*795d594fSAndroid Build Coastguard Worker DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfCoreRegisters)); 69*795d594fSAndroid Build Coastguard Worker DCHECK(IsAccessibleGPR(reg)); 70*795d594fSAndroid Build Coastguard Worker return *gprs_[reg]; 71*795d594fSAndroid Build Coastguard Worker } 72*795d594fSAndroid Build Coastguard Worker 73*795d594fSAndroid Build Coastguard Worker void SetGPR(uint32_t reg, uintptr_t value) override; 74*795d594fSAndroid Build Coastguard Worker IsAccessibleFPR(uint32_t reg)75*795d594fSAndroid Build Coastguard Worker bool IsAccessibleFPR(uint32_t reg) override { 76*795d594fSAndroid Build Coastguard Worker DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfSRegisters)); 77*795d594fSAndroid Build Coastguard Worker return fprs_[reg] != nullptr; 78*795d594fSAndroid Build Coastguard Worker } 79*795d594fSAndroid Build Coastguard Worker GetFPR(uint32_t reg)80*795d594fSAndroid Build Coastguard Worker uintptr_t GetFPR(uint32_t reg) override { 81*795d594fSAndroid Build Coastguard Worker DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfSRegisters)); 82*795d594fSAndroid Build Coastguard Worker DCHECK(IsAccessibleFPR(reg)); 83*795d594fSAndroid Build Coastguard Worker return *fprs_[reg]; 84*795d594fSAndroid Build Coastguard Worker } 85*795d594fSAndroid Build Coastguard Worker 86*795d594fSAndroid Build Coastguard Worker void SetFPR(uint32_t reg, uintptr_t value) override; 87*795d594fSAndroid Build Coastguard Worker 88*795d594fSAndroid Build Coastguard Worker void SmashCallerSaves() override; 89*795d594fSAndroid Build Coastguard Worker void CopyContextTo(uintptr_t* gprs, uintptr_t* fprs) override; 90*795d594fSAndroid Build Coastguard Worker 91*795d594fSAndroid Build Coastguard Worker private: 92*795d594fSAndroid Build Coastguard Worker // Pointers to register locations, initialized to null or the specific registers below. 93*795d594fSAndroid Build Coastguard Worker uintptr_t* gprs_[kNumberOfCoreRegisters]; 94*795d594fSAndroid Build Coastguard Worker uint32_t* fprs_[kNumberOfSRegisters]; 95*795d594fSAndroid Build Coastguard Worker // Hold values for sp and pc if they are not located within a stack frame. 96*795d594fSAndroid Build Coastguard Worker uintptr_t sp_, pc_, arg0_; 97*795d594fSAndroid Build Coastguard Worker }; 98*795d594fSAndroid Build Coastguard Worker 99*795d594fSAndroid Build Coastguard Worker } // namespace arm 100*795d594fSAndroid Build Coastguard Worker } // namespace art 101*795d594fSAndroid Build Coastguard Worker 102*795d594fSAndroid Build Coastguard Worker #endif // ART_RUNTIME_ARCH_ARM_CONTEXT_ARM_H_ 103