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_X86_CONTEXT_X86_H_ 18*795d594fSAndroid Build Coastguard Worker #define ART_RUNTIME_ARCH_X86_CONTEXT_X86_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_x86.h" 25*795d594fSAndroid Build Coastguard Worker 26*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN { 27*795d594fSAndroid Build Coastguard Worker namespace x86 { 28*795d594fSAndroid Build Coastguard Worker 29*795d594fSAndroid Build Coastguard Worker class X86Context final : public Context { 30*795d594fSAndroid Build Coastguard Worker public: X86Context()31*795d594fSAndroid Build Coastguard Worker X86Context() { 32*795d594fSAndroid Build Coastguard Worker Reset(); 33*795d594fSAndroid Build Coastguard Worker } ~X86Context()34*795d594fSAndroid Build Coastguard Worker virtual ~X86Context() {} 35*795d594fSAndroid Build Coastguard Worker 36*795d594fSAndroid Build Coastguard Worker void Reset() override; 37*795d594fSAndroid Build Coastguard Worker 38*795d594fSAndroid Build Coastguard Worker void FillCalleeSaves(uint8_t* frame, const QuickMethodFrameInfo& fr) override; 39*795d594fSAndroid Build Coastguard Worker SetSP(uintptr_t new_sp)40*795d594fSAndroid Build Coastguard Worker void SetSP(uintptr_t new_sp) override { 41*795d594fSAndroid Build Coastguard Worker SetGPR(ESP, new_sp); 42*795d594fSAndroid Build Coastguard Worker } 43*795d594fSAndroid Build Coastguard Worker SetPC(uintptr_t new_pc)44*795d594fSAndroid Build Coastguard Worker void SetPC(uintptr_t new_pc) override { 45*795d594fSAndroid Build Coastguard Worker eip_ = new_pc; 46*795d594fSAndroid Build Coastguard Worker } 47*795d594fSAndroid Build Coastguard Worker SetNterpDexPC(uintptr_t dex_pc_ptr)48*795d594fSAndroid Build Coastguard Worker void SetNterpDexPC(uintptr_t dex_pc_ptr) override { 49*795d594fSAndroid Build Coastguard Worker SetGPR(ESI, dex_pc_ptr); 50*795d594fSAndroid Build Coastguard Worker } 51*795d594fSAndroid Build Coastguard Worker SetArg0(uintptr_t new_arg0_value)52*795d594fSAndroid Build Coastguard Worker void SetArg0(uintptr_t new_arg0_value) override { 53*795d594fSAndroid Build Coastguard Worker SetGPR(EAX, new_arg0_value); 54*795d594fSAndroid Build Coastguard Worker } 55*795d594fSAndroid Build Coastguard Worker IsAccessibleGPR(uint32_t reg)56*795d594fSAndroid Build Coastguard Worker bool IsAccessibleGPR(uint32_t reg) override { 57*795d594fSAndroid Build Coastguard Worker DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfCpuRegisters)); 58*795d594fSAndroid Build Coastguard Worker return gprs_[reg] != nullptr; 59*795d594fSAndroid Build Coastguard Worker } 60*795d594fSAndroid Build Coastguard Worker GetGPRAddress(uint32_t reg)61*795d594fSAndroid Build Coastguard Worker uintptr_t* GetGPRAddress(uint32_t reg) override { 62*795d594fSAndroid Build Coastguard Worker DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfCpuRegisters)); 63*795d594fSAndroid Build Coastguard Worker return gprs_[reg]; 64*795d594fSAndroid Build Coastguard Worker } 65*795d594fSAndroid Build Coastguard Worker GetGPR(uint32_t reg)66*795d594fSAndroid Build Coastguard Worker uintptr_t GetGPR(uint32_t reg) override { 67*795d594fSAndroid Build Coastguard Worker DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfCpuRegisters)); 68*795d594fSAndroid Build Coastguard Worker DCHECK(IsAccessibleGPR(reg)); 69*795d594fSAndroid Build Coastguard Worker return *gprs_[reg]; 70*795d594fSAndroid Build Coastguard Worker } 71*795d594fSAndroid Build Coastguard Worker 72*795d594fSAndroid Build Coastguard Worker void SetGPR(uint32_t reg, uintptr_t value) override; 73*795d594fSAndroid Build Coastguard Worker IsAccessibleFPR(uint32_t reg)74*795d594fSAndroid Build Coastguard Worker bool IsAccessibleFPR(uint32_t reg) override { 75*795d594fSAndroid Build Coastguard Worker DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfFloatRegisters)); 76*795d594fSAndroid Build Coastguard Worker return fprs_[reg] != nullptr; 77*795d594fSAndroid Build Coastguard Worker } 78*795d594fSAndroid Build Coastguard Worker GetFPR(uint32_t reg)79*795d594fSAndroid Build Coastguard Worker uintptr_t GetFPR(uint32_t reg) override { 80*795d594fSAndroid Build Coastguard Worker DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfFloatRegisters)); 81*795d594fSAndroid Build Coastguard Worker DCHECK(IsAccessibleFPR(reg)); 82*795d594fSAndroid Build Coastguard Worker return *fprs_[reg]; 83*795d594fSAndroid Build Coastguard Worker } 84*795d594fSAndroid Build Coastguard Worker 85*795d594fSAndroid Build Coastguard Worker void SetFPR(uint32_t reg, uintptr_t value) override; 86*795d594fSAndroid Build Coastguard Worker 87*795d594fSAndroid Build Coastguard Worker void SmashCallerSaves() override; 88*795d594fSAndroid Build Coastguard Worker void CopyContextTo(uintptr_t* gprs, uintptr_t* fprs) override; 89*795d594fSAndroid Build Coastguard Worker 90*795d594fSAndroid Build Coastguard Worker private: 91*795d594fSAndroid Build Coastguard Worker // Pretend XMM registers are made of uin32_t pieces, because they are manipulated 92*795d594fSAndroid Build Coastguard Worker // in uint32_t chunks. 93*795d594fSAndroid Build Coastguard Worker enum { 94*795d594fSAndroid Build Coastguard Worker XMM0_0 = 0, XMM0_1, 95*795d594fSAndroid Build Coastguard Worker XMM1_0, XMM1_1, 96*795d594fSAndroid Build Coastguard Worker XMM2_0, XMM2_1, 97*795d594fSAndroid Build Coastguard Worker XMM3_0, XMM3_1, 98*795d594fSAndroid Build Coastguard Worker XMM4_0, XMM4_1, 99*795d594fSAndroid Build Coastguard Worker XMM5_0, XMM5_1, 100*795d594fSAndroid Build Coastguard Worker XMM6_0, XMM6_1, 101*795d594fSAndroid Build Coastguard Worker XMM7_0, XMM7_1, 102*795d594fSAndroid Build Coastguard Worker kNumberOfFloatRegisters}; 103*795d594fSAndroid Build Coastguard Worker 104*795d594fSAndroid Build Coastguard Worker // Pointers to register locations. Values are initialized to null or the special registers below. 105*795d594fSAndroid Build Coastguard Worker uintptr_t* gprs_[kNumberOfCpuRegisters]; 106*795d594fSAndroid Build Coastguard Worker uint32_t* fprs_[kNumberOfFloatRegisters]; 107*795d594fSAndroid Build Coastguard Worker // Hold values for esp, eip and arg0 if they are not located within a stack frame. EIP is somewhat 108*795d594fSAndroid Build Coastguard Worker // special in that it cannot be encoded normally as a register operand to an instruction (except 109*795d594fSAndroid Build Coastguard Worker // in 64bit addressing modes). 110*795d594fSAndroid Build Coastguard Worker uintptr_t esp_, eip_, arg0_; 111*795d594fSAndroid Build Coastguard Worker }; 112*795d594fSAndroid Build Coastguard Worker } // namespace x86 113*795d594fSAndroid Build Coastguard Worker } // namespace art 114*795d594fSAndroid Build Coastguard Worker 115*795d594fSAndroid Build Coastguard Worker #endif // ART_RUNTIME_ARCH_X86_CONTEXT_X86_H_ 116