/* * Copyright 2009-2012, Ingo Weinhold, ingo_weinhold@gmx.de. * Copyright 2011-2014, Rene Gollent, rene@gollent.com. * Distributed under the terms of the MIT License. */ #ifndef CPU_STATE_X86_H #define CPU_STATE_X86_H #include #include #include "CpuState.h" enum { X86_REGISTER_EIP = 0, X86_REGISTER_ESP, X86_REGISTER_EBP, X86_REGISTER_EAX, X86_REGISTER_EBX, X86_REGISTER_ECX, X86_REGISTER_EDX, X86_REGISTER_ESI, X86_REGISTER_EDI, X86_REGISTER_CS, X86_REGISTER_DS, X86_REGISTER_ES, X86_REGISTER_FS, X86_REGISTER_GS, X86_REGISTER_SS, X86_INT_REGISTER_END, X86_REGISTER_ST0, X86_REGISTER_ST1, X86_REGISTER_ST2, X86_REGISTER_ST3, X86_REGISTER_ST4, X86_REGISTER_ST5, X86_REGISTER_ST6, X86_REGISTER_ST7, X86_FP_REGISTER_END, X86_REGISTER_MM0, X86_REGISTER_MM1, X86_REGISTER_MM2, X86_REGISTER_MM3, X86_REGISTER_MM4, X86_REGISTER_MM5, X86_REGISTER_MM6, X86_REGISTER_MM7, X86_MMX_REGISTER_END, X86_REGISTER_XMM0, X86_REGISTER_XMM1, X86_REGISTER_XMM2, X86_REGISTER_XMM3, X86_REGISTER_XMM4, X86_REGISTER_XMM5, X86_REGISTER_XMM6, X86_REGISTER_XMM7, X86_XMM_REGISTER_END, X86_REGISTER_COUNT }; #define X86_INT_REGISTER_COUNT X86_INT_REGISTER_END #define X86_FP_REGISTER_COUNT (X86_FP_REGISTER_END - X86_INT_REGISTER_END) #define X86_MMX_REGISTER_COUNT (X86_MMX_REGISTER_END - X86_FP_REGISTER_END) #define X86_XMM_REGISTER_COUNT (X86_XMM_REGISTER_END - X86_MMX_REGISTER_END) class CpuStateX86 : public CpuState { public: CpuStateX86(); CpuStateX86(const x86_debug_cpu_state& state); virtual ~CpuStateX86(); 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); uint32 InterruptVector() const { return fInterruptVector; } bool IsRegisterSet(int32 index) const; uint32 IntRegisterValue(int32 index) const; void SetIntRegister(int32 index, uint32 value); 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* value); void UnsetRegister(int32 index); private: typedef std::bitset RegisterBitSet; private: uint32 fIntRegisters[X86_INT_REGISTER_COUNT]; double fFloatRegisters[X86_FP_REGISTER_COUNT]; x86_fp_register fMMXRegisters[X86_MMX_REGISTER_COUNT]; x86_xmm_register fXMMRegisters[X86_XMM_REGISTER_COUNT]; RegisterBitSet fSetRegisters; uint32 fInterruptVector; }; #endif // CPU_STATE_X86_H