1ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers/* 2ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * Copyright (C) 2011 The Android Open Source Project 3ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * 4ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * Licensed under the Apache License, Version 2.0 (the "License"); 5ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * you may not use this file except in compliance with the License. 6ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * You may obtain a copy of the License at 7ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * 8ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * http://www.apache.org/licenses/LICENSE-2.0 9ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * 10ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * Unless required by applicable law or agreed to in writing, software 11ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * distributed under the License is distributed on an "AS IS" BASIS, 12ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * See the License for the specific language governing permissions and 14ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * limitations under the License. 15ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers */ 16ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 17ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#ifndef ART_RUNTIME_ARCH_X86_64_CONTEXT_X86_64_H_ 18ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#define ART_RUNTIME_ARCH_X86_64_CONTEXT_X86_64_H_ 19ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 20ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#include "arch/context.h" 21ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#include "base/logging.h" 22794ad76e8d5b5b9132819d5b08a0570e27615644Andreas Gampe#include "base/macros.h" 23ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#include "registers_x86_64.h" 24ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 25ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersnamespace art { 26ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersnamespace x86_64 { 27ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 28ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersclass X86_64Context : public Context { 29ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers public: 30ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers X86_64Context() { 31ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers Reset(); 32ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 33ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers virtual ~X86_64Context() {} 34ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 350bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz void Reset() OVERRIDE; 36ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 37524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray void FillCalleeSaves(uint8_t* frame, const QuickMethodFrameInfo& fr) OVERRIDE; 38ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 390bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz void SetSP(uintptr_t new_sp) OVERRIDE { 4096ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz SetGPR(RSP, new_sp); 41ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 42ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 430bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz void SetPC(uintptr_t new_pc) OVERRIDE { 44ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers rip_ = new_pc; 45ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 46ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 47639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe void SetArg0(uintptr_t new_arg0_value) OVERRIDE { 48639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe SetGPR(RDI, new_arg0_value); 49639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe } 50639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe 5196ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz bool IsAccessibleGPR(uint32_t reg) OVERRIDE { 5296ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfCpuRegisters)); 5396ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz return gprs_[reg] != nullptr; 5496ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz } 5596ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz 560bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz uintptr_t* GetGPRAddress(uint32_t reg) OVERRIDE { 5717a7fc7f66d3e5e1ed6654134cfcec3babf2474aMathieu Chartier DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfCpuRegisters)); 58815873ecc312b1d231acce71e1a16f42cdaf09f2Mathieu Chartier return gprs_[reg]; 59815873ecc312b1d231acce71e1a16f42cdaf09f2Mathieu Chartier } 60815873ecc312b1d231acce71e1a16f42cdaf09f2Mathieu Chartier 6196ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz uintptr_t GetGPR(uint32_t reg) OVERRIDE { 6217a7fc7f66d3e5e1ed6654134cfcec3babf2474aMathieu Chartier DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfCpuRegisters)); 6396ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz DCHECK(IsAccessibleGPR(reg)); 6496ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz return *gprs_[reg]; 65ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 66ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 6796ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz void SetGPR(uint32_t reg, uintptr_t value) OVERRIDE; 6896ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz 6996ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz bool IsAccessibleFPR(uint32_t reg) OVERRIDE { 7096ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfFloatRegisters)); 7196ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz return fprs_[reg] != nullptr; 7296ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz } 73ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 7496ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz uintptr_t GetFPR(uint32_t reg) OVERRIDE { 750bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfFloatRegisters)); 7696ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz DCHECK(IsAccessibleFPR(reg)); 7796ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz return *fprs_[reg]; 780bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz } 790bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz 8096ba8dc82e7bd859106af837623fe8b2e9e772c3Sebastien Hertz void SetFPR(uint32_t reg, uintptr_t value) OVERRIDE; 810bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz 820bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz void SmashCallerSaves() OVERRIDE; 83794ad76e8d5b5b9132819d5b08a0570e27615644Andreas Gampe NO_RETURN void DoLongJump() OVERRIDE; 84ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 85ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers private: 862cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier // Pointers to register locations. Values are initialized to null or the special registers below. 87ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers uintptr_t* gprs_[kNumberOfCpuRegisters]; 88bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe uint64_t* fprs_[kNumberOfFloatRegisters]; 89639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe // Hold values for rsp, rip and arg0 if they are not located within a stack frame. RIP is somewhat 90ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers // special in that it cannot be encoded normally as a register operand to an instruction (except 91ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers // in 64bit addressing modes). 92639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe uintptr_t rsp_, rip_, arg0_; 93ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers}; 94ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers} // namespace x86_64 95ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers} // namespace art 96ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 97ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#endif // ART_RUNTIME_ARCH_X86_64_CONTEXT_X86_64_H_ 98