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