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