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" 22794ad76e8d5b5b9132819d5b08a0570e27615644Andreas Gampe#include "base/macros.h" 23b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith#include "registers_arm64.h" 24b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 25b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteithnamespace art { 26b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteithnamespace arm64 { 27b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 28b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteithclass Arm64Context : public Context { 29b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith public: 30b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith Arm64Context() { 31b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith Reset(); 32b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith } 33b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 34b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith ~Arm64Context() {} 35b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 360bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz void Reset() OVERRIDE; 37b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 38524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray void FillCalleeSaves(uint8_t* frame, const QuickMethodFrameInfo& fr) OVERRIDE; 39b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 400bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz void SetSP(uintptr_t new_sp) OVERRIDE { 4196ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz SetGPR(SP, new_sp); 42b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith } 43b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 440bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz void SetPC(uintptr_t new_lr) OVERRIDE { 45639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe SetGPR(kPC, new_lr); 46639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe } 47639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe 48639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe void SetArg0(uintptr_t new_arg0_value) OVERRIDE { 49639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe SetGPR(X0, new_arg0_value); 5096ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz } 5196ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz 5296ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz bool IsAccessibleGPR(uint32_t reg) OVERRIDE { 53639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe DCHECK_LT(reg, arraysize(gprs_)); 5496ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz return gprs_[reg] != nullptr; 55b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith } 56b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 570bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz uintptr_t* GetGPRAddress(uint32_t reg) OVERRIDE { 58639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe DCHECK_LT(reg, arraysize(gprs_)); 59b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith return gprs_[reg]; 60b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith } 61b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 6296ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz uintptr_t GetGPR(uint32_t reg) OVERRIDE { 63639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe // Note: PC isn't an available GPR (outside of internals), so don't allow retrieving the value. 6437c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfXRegisters)); 6596ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz DCHECK(IsAccessibleGPR(reg)); 6696ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz return *gprs_[reg]; 67b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith } 68b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 6996ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz void SetGPR(uint32_t reg, uintptr_t value) OVERRIDE; 7096ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz 7196ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz bool IsAccessibleFPR(uint32_t reg) OVERRIDE { 7296ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfDRegisters)); 7396ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz return fprs_[reg] != nullptr; 7496ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz } 750bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz 7696ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz uintptr_t GetFPR(uint32_t reg) OVERRIDE { 770bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfDRegisters)); 7896ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz DCHECK(IsAccessibleFPR(reg)); 7996ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz return *fprs_[reg]; 800bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz } 810bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz 8296ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz void SetFPR(uint32_t reg, uintptr_t value) OVERRIDE; 830bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz 840bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz void SmashCallerSaves() OVERRIDE; 85794ad76e8d5b5b9132819d5b08a0570e27615644Andreas Gampe NO_RETURN void DoLongJump() OVERRIDE; 86b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 87639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe static constexpr size_t kPC = kNumberOfXRegisters; 88639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe 89b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith private: 90639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe // Pointers to register locations, initialized to null or the specific registers below. We need 91639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe // an additional one for the PC. 92639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe uintptr_t* gprs_[kNumberOfXRegisters + 1]; 93b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith uint64_t * fprs_[kNumberOfDRegisters]; 94639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe // Hold values for sp, pc and arg0 if they are not located within a stack frame. 95639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe uintptr_t sp_, pc_, arg0_; 96b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith}; 97b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 98b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith} // namespace arm64 99b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith} // namespace art 100b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith 101b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith#endif // ART_RUNTIME_ARCH_ARM64_CONTEXT_ARM64_H_ 102