DNBArchImplI386.h revision 9d544f43d8c1637c45562f1402012c235f648ee9
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DNBArchImplI386.h ---------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  Created by Greg Clayton on 6/25/07.
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef __DNBArchImplI386_h__
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define __DNBArchImplI386_h__
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton#if defined (__i386__) || defined (__x86_64__)
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DNBArch.h"
20db15e0cbbd18d6cd10a0197bae31aafb9e078365Sean Callanan#include "../HasAVX.h"
214d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan#include "MachRegisterStatesI386.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass MachThread;
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DNBArchImplI386 : public DNBArchProtocol
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DNBArchImplI386(MachThread *thread) :
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_thread(thread),
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_state()
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual ~DNBArchImplI386()
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
3620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
3720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    static  void            Initialize();
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39fa1502444821fb699b14883bd24188c85a8793e0Johnny Chen    virtual bool            GetRegisterValue(int set, int reg, DNBRegisterValue *value);
40fa1502444821fb699b14883bd24188c85a8793e0Johnny Chen    virtual bool            SetRegisterValue(int set, int reg, const DNBRegisterValue *value);
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual nub_size_t      GetRegisterContext (void *buf, nub_size_t buf_len);
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual nub_size_t      SetRegisterContext (const void *buf, nub_size_t buf_len);
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual kern_return_t   GetRegisterState  (int set, bool force);
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual kern_return_t   SetRegisterState  (int set);
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool            RegisterSetStateIsValid (int set) const;
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual uint64_t        GetPC(uint64_t failValue);    // Get program counter
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual kern_return_t   SetPC(uint64_t value);
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual uint64_t        GetSP(uint64_t failValue);    // Get stack pointer
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void            ThreadWillResume();
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool            ThreadDidStop();
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool            NotifyException(MachException::Data& exc);
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54eb0eae254e4e2d737b9c137296197a70a1ba7f68Johnny Chen    virtual uint32_t        NumSupportedHardwareWatchpoints();
55eb0eae254e4e2d737b9c137296197a70a1ba7f68Johnny Chen    virtual uint32_t        EnableHardwareWatchpoint (nub_addr_t addr, nub_size_t size, bool read, bool write);
56eb0eae254e4e2d737b9c137296197a70a1ba7f68Johnny Chen    virtual bool            DisableHardwareWatchpoint (uint32_t hw_break_index);
57eb0eae254e4e2d737b9c137296197a70a1ba7f68Johnny Chen
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    kern_return_t           EnableHardwareSingleStep (bool enable);
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
614d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    typedef __i386_thread_state_t GPR;
624d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    typedef __i386_float_state_t FPU;
634d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    typedef __i386_exception_state_t EXC;
644d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    typedef __i386_avx_state_t AVX;
65e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton    typedef __i386_debug_state_t DBG;
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static const DNBRegisterInfo g_gpr_registers[];
684d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    static const DNBRegisterInfo g_fpu_registers_no_avx[];
694d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    static const DNBRegisterInfo g_fpu_registers_avx[];
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static const DNBRegisterInfo g_exc_registers[];
714d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    static const DNBRegisterSetInfo g_reg_sets_no_avx[];
724d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    static const DNBRegisterSetInfo g_reg_sets_avx[];
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static const size_t k_num_gpr_registers;
744d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    static const size_t k_num_fpu_registers_no_avx;
754d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    static const size_t k_num_fpu_registers_avx;
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static const size_t k_num_exc_registers;
774d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    static const size_t k_num_all_registers_no_avx;
784d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    static const size_t k_num_all_registers_avx;
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static const size_t k_num_register_sets;
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef enum RegisterSetTag
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        e_regSetALL = REGISTER_SET_ALL,
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        e_regSetGPR,
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        e_regSetFPU,
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        e_regSetEXC,
87e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton        e_regSetDBG,
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        kNumRegisterSets
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    } RegisterSet;
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef enum RegisterSetWordSizeTag
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
934d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan        e_regSetWordSizeGPR = sizeof(GPR) / sizeof(int),
944d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan        e_regSetWordSizeFPR = sizeof(FPU) / sizeof(int),
954d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan        e_regSetWordSizeEXC = sizeof(EXC) / sizeof(int),
96e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton        e_regSetWordSizeAVX = sizeof(AVX) / sizeof(int),
97e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton        e_regSetWordSizeDBG = sizeof(DBG) / sizeof(int)
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    } RegisterSetWordSize;
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    enum
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Read = 0,
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Write = 1,
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        kNumErrors = 2
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    struct Context
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
109e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton        GPR gpr;
1104d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan        union {
111e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton            FPU no_avx;
112e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton            AVX avx;
1134d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan        } fpu;
114e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton        EXC exc;
115e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton        DBG dbg;
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    struct State
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Context context;
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        kern_return_t gpr_errs[2];    // Read/Write errors
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        kern_return_t fpu_errs[2];    // Read/Write errors
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        kern_return_t exc_errs[2];    // Read/Write errors
124e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton        kern_return_t dbg_errs[2];    // Read/Write errors
1254d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        State()
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint32_t i;
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (i=0; i<kNumErrors; i++)
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                gpr_errs[i] = -1;
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                fpu_errs[i] = -1;
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                exc_errs[i] = -1;
134e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton                dbg_errs[i] = -1;
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void InvalidateAllRegisterStates()
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SetError (e_regSetALL, Read, -1);
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        kern_return_t GetError (int flavor, uint32_t err_idx) const
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (err_idx < kNumErrors)
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                switch (flavor)
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // When getting all errors, just OR all values together to see if
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // we got any kind of error.
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case e_regSetALL:    return gpr_errs[err_idx] |
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            fpu_errs[err_idx] |
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            exc_errs[err_idx];
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case e_regSetGPR:    return gpr_errs[err_idx];
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case e_regSetFPU:    return fpu_errs[err_idx];
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case e_regSetEXC:    return exc_errs[err_idx];
155e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton                case e_regSetDBG:    return dbg_errs[err_idx];
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                default: break;
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return -1;
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool SetError (int flavor, uint32_t err_idx, kern_return_t err)
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (err_idx < kNumErrors)
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                switch (flavor)
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case e_regSetALL:
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    gpr_errs[err_idx] =
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    fpu_errs[err_idx] =
170e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton                    exc_errs[err_idx] =
171e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton                    dbg_errs[err_idx] = err;
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case e_regSetGPR:
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    gpr_errs[err_idx] = err;
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case e_regSetFPU:
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    fpu_errs[err_idx] = err;
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case e_regSetEXC:
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    exc_errs[err_idx] = err;
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
185e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton
186e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton                case e_regSetDBG:
187e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton                    dbg_errs[err_idx] = err;
188e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton                    return true;
189e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                default: break;
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool RegsAreValid (int flavor) const
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return GetError(flavor, Read) == KERN_SUCCESS;
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    kern_return_t GetGPRState (bool force);
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    kern_return_t GetFPUState (bool force);
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    kern_return_t GetEXCState (bool force);
204e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton    kern_return_t GetDBGState (bool force);
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    kern_return_t SetGPRState ();
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    kern_return_t SetFPUState ();
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    kern_return_t SetEXCState ();
209e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton    kern_return_t SetDBGState ();
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    static DNBArchProtocol *
21220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    Create (MachThread *thread);
21320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
21420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    static const uint8_t * const
21520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    SoftwareBreakpointOpcode (nub_size_t byte_size);
21620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
21720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    static const DNBRegisterSetInfo *
21820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    GetRegisterSetInfo(nub_size_t *num_reg_sets);
2194d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan
2204d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    static bool
221db15e0cbbd18d6cd10a0197bae31aafb9e078365Sean Callanan    CPUHasAVX()
2224d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    {
2234d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan        if (s_has_avx == kAVXUnknown)
224db15e0cbbd18d6cd10a0197bae31aafb9e078365Sean Callanan            s_has_avx = (::HasAVX() ? kAVXPresent : kAVXNotPresent);
2254d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan
2264d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan        return (s_has_avx == kAVXPresent);
2274d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    }
22820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
22925d2818c62140bb79cc3d689c4052b306c59c6b7Johnny Chen    // Helper functions for watchpoint manipulations.
23025d2818c62140bb79cc3d689c4052b306c59c6b7Johnny Chen    static void SetWatchpoint(DBG &debug_state, uint32_t hw_index, nub_addr_t addr, nub_size_t size, bool read, bool write);
23125d2818c62140bb79cc3d689c4052b306c59c6b7Johnny Chen    static void ClearWatchpoint(DBG &debug_state, uint32_t hw_index);
23225d2818c62140bb79cc3d689c4052b306c59c6b7Johnny Chen    static bool IsVacantWatchpoint(const DBG &debug_state, uint32_t hw_index);
2339d544f43d8c1637c45562f1402012c235f648ee9Johnny Chen    static void ClearWatchpointHit(DBG &debug_state);
2349d544f43d8c1637c45562f1402012c235f648ee9Johnny Chen    static bool IsWatchpointHit(const DBG &debug_state, uint32_t hw_index);
23525d2818c62140bb79cc3d689c4052b306c59c6b7Johnny Chen
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    MachThread *m_thread;
2374d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    State       m_state;
2384d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan
2394d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    static enum AVXPresence {
2404d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan        kAVXPresent,
2414d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan        kAVXNotPresent,
2424d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan        kAVXUnknown
2434d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    } s_has_avx;
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton#endif    // #if defined (__i386__) || defined (__x86_64__)
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif    // #ifndef __DNBArchImplI386_h__
248