⛏️ index : haiku.git

/*
 * 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 <bitset>

#include <debugger.h>

#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<X86_REGISTER_COUNT> 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