root/src/kits/debugger/arch/x86/CpuStateX86.h
/*
 * 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