* Copyright 2012, Alex Smith, alex@alex-smith.me.uk.
* Copyright 2009-2012, Ingo Weinhold, ingo_weinhold@gmx.de.
* Copyright 2011-2013, Rene Gollent, rene@gollent.com.
* Distributed under the terms of the MIT License.
*/
#ifndef CPU_STATE_X86_64_H
#define CPU_STATE_X86_64_H
#include <bitset>
#include <debugger.h>
#include "CpuState.h"
enum {
X86_64_REGISTER_RIP = 0,
X86_64_REGISTER_RSP,
X86_64_REGISTER_RBP,
X86_64_REGISTER_RAX,
X86_64_REGISTER_RBX,
X86_64_REGISTER_RCX,
X86_64_REGISTER_RDX,
X86_64_REGISTER_RSI,
X86_64_REGISTER_RDI,
X86_64_REGISTER_R8,
X86_64_REGISTER_R9,
X86_64_REGISTER_R10,
X86_64_REGISTER_R11,
X86_64_REGISTER_R12,
X86_64_REGISTER_R13,
X86_64_REGISTER_R14,
X86_64_REGISTER_R15,
X86_64_REGISTER_CS,
X86_64_REGISTER_DS,
X86_64_REGISTER_ES,
X86_64_REGISTER_FS,
X86_64_REGISTER_GS,
X86_64_REGISTER_SS,
X86_64_INT_REGISTER_END,
X86_64_REGISTER_ST0,
X86_64_REGISTER_ST1,
X86_64_REGISTER_ST2,
X86_64_REGISTER_ST3,
X86_64_REGISTER_ST4,
X86_64_REGISTER_ST5,
X86_64_REGISTER_ST6,
X86_64_REGISTER_ST7,
X86_64_FP_REGISTER_END,
X86_64_REGISTER_MM0,
X86_64_REGISTER_MM1,
X86_64_REGISTER_MM2,
X86_64_REGISTER_MM3,
X86_64_REGISTER_MM4,
X86_64_REGISTER_MM5,
X86_64_REGISTER_MM6,
X86_64_REGISTER_MM7,
X86_64_MMX_REGISTER_END,
X86_64_REGISTER_XMM0,
X86_64_REGISTER_XMM1,
X86_64_REGISTER_XMM2,
X86_64_REGISTER_XMM3,
X86_64_REGISTER_XMM4,
X86_64_REGISTER_XMM5,
X86_64_REGISTER_XMM6,
X86_64_REGISTER_XMM7,
X86_64_REGISTER_XMM8,
X86_64_REGISTER_XMM9,
X86_64_REGISTER_XMM10,
X86_64_REGISTER_XMM11,
X86_64_REGISTER_XMM12,
X86_64_REGISTER_XMM13,
X86_64_REGISTER_XMM14,
X86_64_REGISTER_XMM15,
X86_64_XMM_REGISTER_END,
X86_64_REGISTER_COUNT
};
#define X86_64_INT_REGISTER_COUNT X86_64_INT_REGISTER_END
#define X86_64_FP_REGISTER_COUNT (X86_64_FP_REGISTER_END \
- X86_64_INT_REGISTER_END)
#define X86_64_MMX_REGISTER_COUNT (X86_64_MMX_REGISTER_END \
- X86_64_FP_REGISTER_END)
#define X86_64_XMM_REGISTER_COUNT (X86_64_XMM_REGISTER_END \
- X86_64_MMX_REGISTER_END)
struct x86_64_ymm_register {
unsigned long value[4];
};
class CpuStateX8664 : public CpuState {
public:
CpuStateX8664();
CpuStateX8664(const x86_64_debug_cpu_state& state);
virtual ~CpuStateX8664();
virtual status_t Clone(CpuState*& _clone) const;
virtual status_t UpdateDebugState(void* state, size_t size)
const;
virtual target_addr_t InstructionPointer() const;
virtual void SetInstructionPointer(target_addr_t address);
virtual target_addr_t StackFramePointer() const;
virtual target_addr_t StackPointer() const;
virtual bool GetRegisterValue(const Register* reg,
BVariant& _value) const;
virtual bool SetRegisterValue(const Register* reg,
const BVariant& value);
uint64 InterruptVector() const
{ return fInterruptVector; }
bool IsRegisterSet(int32 index) const;
uint64 IntRegisterValue(int32 index) const;
void SetIntRegister(int32 index, uint64 value);
private:
double FloatRegisterValue(int32 index) const;
void SetFloatRegister(int32 index, double value);
const void* MMXRegisterValue(int32 index) const;
void SetMMXRegister(int32 index,
const uint8* value);
const void* XMMRegisterValue(int32 index) const;
void SetXMMRegister(int32 index,
const uint8* highValue, const uint8* lowValue);
void UnsetRegister(int32 index);
private:
typedef std::bitset<X86_64_REGISTER_COUNT> RegisterBitSet;
private:
uint64 fIntRegisters[X86_64_INT_REGISTER_COUNT];
double fFloatRegisters[X86_64_FP_REGISTER_COUNT];
x86_64_fp_register fMMXRegisters[X86_64_MMX_REGISTER_COUNT];
x86_64_ymm_register fXMMRegisters[X86_64_XMM_REGISTER_COUNT];
RegisterBitSet fSetRegisters;
uint64 fInterruptVector;
};
#endif