blob: ad49f8d39cc3a102d06d76b637d329101c7c6cf5 [file] [log] [blame]
Elliott Hughes2faa5f12012-01-30 14:42:07 -08001/*
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 */
Ian Rogersbdb03912011-09-14 00:55:44 -070016
Ian Rogers57b86d42012-03-27 16:05:41 -070017#ifndef ART_SRC_OAT_RUNTIME_X86_CONTEXT_X86_H_
18#define ART_SRC_OAT_RUNTIME_X86_CONTEXT_X86_H_
Ian Rogersbdb03912011-09-14 00:55:44 -070019
Ian Rogers67375ac2011-09-14 00:55:44 -070020#include "constants_x86.h"
Ian Rogers57b86d42012-03-27 16:05:41 -070021#include "oat/runtime/context.h"
Ian Rogers67375ac2011-09-14 00:55:44 -070022
Ian Rogersbdb03912011-09-14 00:55:44 -070023namespace art {
24namespace x86 {
25
26class X86Context : public Context {
27 public:
Mathieu Chartier67022432012-11-29 18:04:50 -080028 X86Context() {
29 Reset();
30 }
Ian Rogersbdb03912011-09-14 00:55:44 -070031 virtual ~X86Context() {}
32
Mathieu Chartier67022432012-11-29 18:04:50 -080033 virtual void Reset();
34
Ian Rogers0399dde2012-06-06 17:09:28 -070035 virtual void FillCalleeSaves(const StackVisitor& fr);
Ian Rogersbdb03912011-09-14 00:55:44 -070036
37 virtual void SetSP(uintptr_t new_sp) {
Mathieu Chartier67022432012-11-29 18:04:50 -080038 SetGPR(ESP, new_sp);
Ian Rogersbdb03912011-09-14 00:55:44 -070039 }
40
41 virtual void SetPC(uintptr_t new_pc) {
42 eip_ = new_pc;
43 }
44
Ian Rogersd6b1f612011-09-27 13:38:14 -070045 virtual uintptr_t GetGPR(uint32_t reg) {
Mathieu Chartier67022432012-11-29 18:04:50 -080046 CHECK_LT(reg, kNumberOfCpuRegisters);
47 return *gprs_[reg];
Ian Rogersd6b1f612011-09-27 13:38:14 -070048 }
49
Mathieu Chartier67022432012-11-29 18:04:50 -080050 virtual void SetGPR(uint32_t reg, uintptr_t value);
51
Elliott Hughes9c750f92012-04-05 12:07:59 -070052 virtual void SmashCallerSaves();
Ian Rogersbdb03912011-09-14 00:55:44 -070053 virtual void DoLongJump();
54
55 private:
Mathieu Chartier67022432012-11-29 18:04:50 -080056 // Pointers to register locations, floating point registers are all caller save. Values are
57 // initialized to NULL or the special registers below.
58 uintptr_t* gprs_[kNumberOfCpuRegisters];
59 // Hold values for esp and eip if they are not located within a stack frame. EIP is somewhat
60 // special in that it cannot be encoded normally as a register operand to an instruction (except
61 // in 64bit addressing modes).
62 uintptr_t esp_, eip_;
Ian Rogersbdb03912011-09-14 00:55:44 -070063};
64} // namespace x86
65} // namespace art
66
Ian Rogers57b86d42012-03-27 16:05:41 -070067#endif // ART_SRC_OAT_RUNTIME_X86_CONTEXT_X86_H_