Home | History | Annotate | Download | only in arch
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ART_RUNTIME_ARCH_CONTEXT_H_
     18 #define ART_RUNTIME_ARCH_CONTEXT_H_
     19 
     20 #include <stddef.h>
     21 #include <stdint.h>
     22 
     23 namespace art {
     24 
     25 class StackVisitor;
     26 
     27 // Representation of a thread's context on the executing machine, used to implement long jumps in
     28 // the quick stack frame layout.
     29 class Context {
     30  public:
     31   // Creates a context for the running architecture
     32   static Context* Create();
     33 
     34   virtual ~Context() {}
     35 
     36   // Re-initializes the registers for context re-use.
     37   virtual void Reset() = 0;
     38 
     39   // Read values from callee saves in the given frame. The frame also holds
     40   // the method that holds the layout.
     41   virtual void FillCalleeSaves(const StackVisitor& fr) = 0;
     42 
     43   // Set the stack pointer value
     44   virtual void SetSP(uintptr_t new_sp) = 0;
     45 
     46   // Set the program counter value
     47   virtual void SetPC(uintptr_t new_pc) = 0;
     48 
     49   // Read the given GPR
     50   virtual uintptr_t GetGPR(uint32_t reg) = 0;
     51 
     52   // Set the given GPR.
     53   virtual void SetGPR(uint32_t reg, uintptr_t value) = 0;
     54 
     55   // Smash the caller save registers. If we're throwing, we don't want to return bogus values.
     56   virtual void SmashCallerSaves() = 0;
     57 
     58   // Switch execution of the executing context to this context
     59   virtual void DoLongJump() = 0;
     60 
     61  protected:
     62   enum {
     63     kBadGprBase = 0xebad6070,
     64     kBadFprBase = 0xebad8070,
     65   };
     66 };
     67 
     68 }  // namespace art
     69 
     70 #endif  // ART_RUNTIME_ARCH_CONTEXT_H_
     71