xref: /aosp_15_r20/art/runtime/arch/arm/context_arm.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_ARM_CONTEXT_ARM_H_
18*795d594fSAndroid Build Coastguard Worker #define ART_RUNTIME_ARCH_ARM_CONTEXT_ARM_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_arm.h"
25*795d594fSAndroid Build Coastguard Worker 
26*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
27*795d594fSAndroid Build Coastguard Worker namespace arm {
28*795d594fSAndroid Build Coastguard Worker 
29*795d594fSAndroid Build Coastguard Worker class ArmContext final : public Context {
30*795d594fSAndroid Build Coastguard Worker  public:
ArmContext()31*795d594fSAndroid Build Coastguard Worker   ArmContext() {
32*795d594fSAndroid Build Coastguard Worker     Reset();
33*795d594fSAndroid Build Coastguard Worker   }
34*795d594fSAndroid Build Coastguard Worker 
~ArmContext()35*795d594fSAndroid Build Coastguard Worker   virtual ~ArmContext() {}
36*795d594fSAndroid Build Coastguard Worker 
37*795d594fSAndroid Build Coastguard Worker   void Reset() override;
38*795d594fSAndroid Build Coastguard Worker 
39*795d594fSAndroid Build Coastguard Worker   void FillCalleeSaves(uint8_t* frame, const QuickMethodFrameInfo& fr) override;
40*795d594fSAndroid Build Coastguard Worker 
SetSP(uintptr_t new_sp)41*795d594fSAndroid Build Coastguard Worker   void SetSP(uintptr_t new_sp) override {
42*795d594fSAndroid Build Coastguard Worker     SetGPR(SP, new_sp);
43*795d594fSAndroid Build Coastguard Worker   }
44*795d594fSAndroid Build Coastguard Worker 
SetPC(uintptr_t new_pc)45*795d594fSAndroid Build Coastguard Worker   void SetPC(uintptr_t new_pc) override {
46*795d594fSAndroid Build Coastguard Worker     SetGPR(PC, new_pc);
47*795d594fSAndroid Build Coastguard Worker   }
48*795d594fSAndroid Build Coastguard Worker 
SetNterpDexPC(uintptr_t dex_pc_ptr)49*795d594fSAndroid Build Coastguard Worker   void SetNterpDexPC(uintptr_t dex_pc_ptr) override {
50*795d594fSAndroid Build Coastguard Worker     SetGPR(R11, dex_pc_ptr);
51*795d594fSAndroid Build Coastguard Worker   }
52*795d594fSAndroid Build Coastguard Worker 
SetArg0(uintptr_t new_arg0_value)53*795d594fSAndroid Build Coastguard Worker   void SetArg0(uintptr_t new_arg0_value) override {
54*795d594fSAndroid Build Coastguard Worker     SetGPR(R0, new_arg0_value);
55*795d594fSAndroid Build Coastguard Worker   }
56*795d594fSAndroid Build Coastguard Worker 
IsAccessibleGPR(uint32_t reg)57*795d594fSAndroid Build Coastguard Worker   bool IsAccessibleGPR(uint32_t reg) override {
58*795d594fSAndroid Build Coastguard Worker     DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfCoreRegisters));
59*795d594fSAndroid Build Coastguard Worker     return gprs_[reg] != nullptr;
60*795d594fSAndroid Build Coastguard Worker   }
61*795d594fSAndroid Build Coastguard Worker 
GetGPRAddress(uint32_t reg)62*795d594fSAndroid Build Coastguard Worker   uintptr_t* GetGPRAddress(uint32_t reg) override {
63*795d594fSAndroid Build Coastguard Worker     DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfCoreRegisters));
64*795d594fSAndroid Build Coastguard Worker     return gprs_[reg];
65*795d594fSAndroid Build Coastguard Worker   }
66*795d594fSAndroid Build Coastguard Worker 
GetGPR(uint32_t reg)67*795d594fSAndroid Build Coastguard Worker   uintptr_t GetGPR(uint32_t reg) override {
68*795d594fSAndroid Build Coastguard Worker     DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfCoreRegisters));
69*795d594fSAndroid Build Coastguard Worker     DCHECK(IsAccessibleGPR(reg));
70*795d594fSAndroid Build Coastguard Worker     return *gprs_[reg];
71*795d594fSAndroid Build Coastguard Worker   }
72*795d594fSAndroid Build Coastguard Worker 
73*795d594fSAndroid Build Coastguard Worker   void SetGPR(uint32_t reg, uintptr_t value) override;
74*795d594fSAndroid Build Coastguard Worker 
IsAccessibleFPR(uint32_t reg)75*795d594fSAndroid Build Coastguard Worker   bool IsAccessibleFPR(uint32_t reg) override {
76*795d594fSAndroid Build Coastguard Worker     DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfSRegisters));
77*795d594fSAndroid Build Coastguard Worker     return fprs_[reg] != nullptr;
78*795d594fSAndroid Build Coastguard Worker   }
79*795d594fSAndroid Build Coastguard Worker 
GetFPR(uint32_t reg)80*795d594fSAndroid Build Coastguard Worker   uintptr_t GetFPR(uint32_t reg) override {
81*795d594fSAndroid Build Coastguard Worker     DCHECK_LT(reg, static_cast<uint32_t>(kNumberOfSRegisters));
82*795d594fSAndroid Build Coastguard Worker     DCHECK(IsAccessibleFPR(reg));
83*795d594fSAndroid Build Coastguard Worker     return *fprs_[reg];
84*795d594fSAndroid Build Coastguard Worker   }
85*795d594fSAndroid Build Coastguard Worker 
86*795d594fSAndroid Build Coastguard Worker   void SetFPR(uint32_t reg, uintptr_t value) override;
87*795d594fSAndroid Build Coastguard Worker 
88*795d594fSAndroid Build Coastguard Worker   void SmashCallerSaves() override;
89*795d594fSAndroid Build Coastguard Worker   void CopyContextTo(uintptr_t* gprs, uintptr_t* fprs) override;
90*795d594fSAndroid Build Coastguard Worker 
91*795d594fSAndroid Build Coastguard Worker  private:
92*795d594fSAndroid Build Coastguard Worker   // Pointers to register locations, initialized to null or the specific registers below.
93*795d594fSAndroid Build Coastguard Worker   uintptr_t* gprs_[kNumberOfCoreRegisters];
94*795d594fSAndroid Build Coastguard Worker   uint32_t* fprs_[kNumberOfSRegisters];
95*795d594fSAndroid Build Coastguard Worker   // Hold values for sp and pc if they are not located within a stack frame.
96*795d594fSAndroid Build Coastguard Worker   uintptr_t sp_, pc_, arg0_;
97*795d594fSAndroid Build Coastguard Worker };
98*795d594fSAndroid Build Coastguard Worker 
99*795d594fSAndroid Build Coastguard Worker }  // namespace arm
100*795d594fSAndroid Build Coastguard Worker }  // namespace art
101*795d594fSAndroid Build Coastguard Worker 
102*795d594fSAndroid Build Coastguard Worker #endif  // ART_RUNTIME_ARCH_ARM_CONTEXT_ARM_H_
103