1b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith/* 2b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith * Copyright (C) 2014 The Android Open Source Project 3b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith * 4b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith * Licensed under the Apache License, Version 2.0 (the "License"); 5b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith * you may not use this file except in compliance with the License. 6b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith * You may obtain a copy of the License at 7b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith * 8b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith * http://www.apache.org/licenses/LICENSE-2.0 9b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith * 10b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith * Unless required by applicable law or agreed to in writing, software 11b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith * distributed under the License is distributed on an "AS IS" BASIS, 12b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith * See the License for the specific language governing permissions and 14b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith * limitations under the License. 15b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith */ 16b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 17b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith#ifndef ART_RUNTIME_ARCH_ARM64_CONTEXT_ARM64_H_ 18b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith#define ART_RUNTIME_ARCH_ARM64_CONTEXT_ARM64_H_ 19b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 20b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith#include "arch/context.h" 21b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith#include "base/logging.h" 22b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith#include "registers_arm64.h" 23b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 24b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteithnamespace art { 25b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteithnamespace arm64 { 26b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 27b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteithclass Arm64Context : public Context { 28b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith public: 29b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith Arm64Context() { 30b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith Reset(); 31b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith } 32b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 33b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith ~Arm64Context() {} 34b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 350bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz void Reset() OVERRIDE; 36b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 370bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz void FillCalleeSaves(const StackVisitor& fr) OVERRIDE; 38b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 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"; 42b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith } 43b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 440bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz void SetPC(uintptr_t new_lr) OVERRIDE { 450bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz bool success = SetGPR(LR, new_lr); 460bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz CHECK(success) << "Failed to set LR register"; 47b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith } 48b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 490bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz uintptr_t* GetGPRAddress(uint32_t reg) OVERRIDE { 50b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfCoreRegisters)); 51b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith return gprs_[reg]; 52b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith } 53b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 540bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz bool GetGPR(uint32_t reg, uintptr_t* val) OVERRIDE { 55b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 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 } 63b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith } 64b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 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>(kNumberOfDRegisters)); 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; 82b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 83b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith private: 84b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith // Pointers to register locations, initialized to NULL or the specific registers below. 85b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith uintptr_t* gprs_[kNumberOfCoreRegisters]; 86b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith uint64_t * fprs_[kNumberOfDRegisters]; 87b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith // Hold values for sp and pc if they are not located within a stack frame. 88b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith uintptr_t sp_, pc_; 89b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith}; 90b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 91b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith} // namespace arm64 92b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith} // namespace art 93b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 94b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith#endif // ART_RUNTIME_ARCH_ARM64_CONTEXT_ARM64_H_ 95