xref: /aosp_15_r20/art/runtime/arch/x86/context_x86.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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