17fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao/* 27fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * Copyright (C) 2011 The Android Open Source Project 37fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * 47fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * Licensed under the Apache License, Version 2.0 (the "License"); 57fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * you may not use this file except in compliance with the License. 67fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * You may obtain a copy of the License at 77fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * 87fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * http://www.apache.org/licenses/LICENSE-2.0 97fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * 107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * Unless required by applicable law or agreed to in writing, software 117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * distributed under the License is distributed on an "AS IS" BASIS, 127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * See the License for the specific language governing permissions and 147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * limitations under the License. 157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao */ 167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 17166db04e259ca51838c311891598664deeed85adIan Rogers#ifndef ART_RUNTIME_ARCH_MIPS_CONTEXT_MIPS_H_ 18166db04e259ca51838c311891598664deeed85adIan Rogers#define ART_RUNTIME_ARCH_MIPS_CONTEXT_MIPS_H_ 197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 20166db04e259ca51838c311891598664deeed85adIan Rogers#include "arch/context.h" 21166db04e259ca51838c311891598664deeed85adIan Rogers#include "base/logging.h" 22166db04e259ca51838c311891598664deeed85adIan Rogers#include "registers_mips.h" 237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaonamespace art { 257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaonamespace mips { 267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoclass MipsContext : public Context { 287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao public: 296702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier MipsContext() { 306702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier Reset(); 316702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier } 327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual ~MipsContext() {} 337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 340bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz void Reset() OVERRIDE; 356702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier 360bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz void FillCalleeSaves(const StackVisitor& fr) OVERRIDE SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 380bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz void SetSP(uintptr_t new_sp) OVERRIDE { 390bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz bool success = SetGPR(SP, new_sp); 400bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz CHECK(success) << "Failed to set SP register"; 417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 430bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz void SetPC(uintptr_t new_pc) OVERRIDE { 440bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz bool success = SetGPR(RA, new_pc); 450bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz CHECK(success) << "Failed to set RA register"; 467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 480bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz uintptr_t* GetGPRAddress(uint32_t reg) OVERRIDE { 49815873ecc312b1d231acce71e1a16f42cdaf09f2Mathieu Chartier DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfCoreRegisters)); 50815873ecc312b1d231acce71e1a16f42cdaf09f2Mathieu Chartier return gprs_[reg]; 51815873ecc312b1d231acce71e1a16f42cdaf09f2Mathieu Chartier } 52815873ecc312b1d231acce71e1a16f42cdaf09f2Mathieu Chartier 530bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz bool GetGPR(uint32_t reg, uintptr_t* val) OVERRIDE { 548b1ce16de070672f0ab1a30f40853513734ff128Brian Carlstrom CHECK_LT(reg, static_cast<uint32_t>(kNumberOfCoreRegisters)); 550bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz if (gprs_[reg] == nullptr) { 560bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz return false; 570bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz } else { 580bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz DCHECK(val != nullptr); 590bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz *val = *gprs_[reg]; 600bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz return true; 610bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz } 627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 640bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz bool SetGPR(uint32_t reg, uintptr_t value) OVERRIDE; 650bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz 660bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz bool GetFPR(uint32_t reg, uintptr_t* val) OVERRIDE { 670bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz CHECK_LT(reg, static_cast<uint32_t>(kNumberOfFRegisters)); 680bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz if (fprs_[reg] == nullptr) { 690bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz return false; 700bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz } else { 710bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz DCHECK(val != nullptr); 720bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz *val = *fprs_[reg]; 730bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz return true; 740bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz } 750bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz } 760bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz 770bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz bool SetFPR(uint32_t reg, uintptr_t value) OVERRIDE; 780bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz 790bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz void SmashCallerSaves() OVERRIDE; 800bcb2902ec21393d71c94e63aa6733cb5311a0ccSebastien Hertz void DoLongJump() OVERRIDE; 817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao private: 836702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier // Pointers to registers in the stack, initialized to NULL except for the special cases below. 846702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier uintptr_t* gprs_[kNumberOfCoreRegisters]; 856702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier uint32_t* fprs_[kNumberOfFRegisters]; 866702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier // Hold values for sp and ra (return address) if they are not located within a stack frame. 876702243ea2332b566d8e8b871cc9db0906d835adMathieu Chartier uintptr_t sp_, ra_; 887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao}; 897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} // namespace mips 907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} // namespace art 917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 92166db04e259ca51838c311891598664deeed85adIan Rogers#endif // ART_RUNTIME_ARCH_MIPS_CONTEXT_MIPS_H_ 93