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),
304d35f889ec869f86e950059470e90c99857ce477Johnny Chen        m_state(),
314d35f889ec869f86e950059470e90c99857ce477Johnny Chen        m_2pc_dbg_checkpoint(),
324d35f889ec869f86e950059470e90c99857ce477Johnny Chen        m_2pc_trans_state(Trans_Done)
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual ~DNBArchImplI386()
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
3820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
3920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    static  void            Initialize();
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41fa1502444821fb699b14883bd24188c85a8793e0Johnny Chen    virtual bool            GetRegisterValue(int set, int reg, DNBRegisterValue *value);
42fa1502444821fb699b14883bd24188c85a8793e0Johnny Chen    virtual bool            SetRegisterValue(int set, int reg, const DNBRegisterValue *value);
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual nub_size_t      GetRegisterContext (void *buf, nub_size_t buf_len);
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual nub_size_t      SetRegisterContext (const void *buf, nub_size_t buf_len);
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual kern_return_t   GetRegisterState  (int set, bool force);
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual kern_return_t   SetRegisterState  (int set);
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool            RegisterSetStateIsValid (int set) const;
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual uint64_t        GetPC(uint64_t failValue);    // Get program counter
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual kern_return_t   SetPC(uint64_t value);
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual uint64_t        GetSP(uint64_t failValue);    // Get stack pointer
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void            ThreadWillResume();
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool            ThreadDidStop();
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool            NotifyException(MachException::Data& exc);
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56eb0eae254e4e2d737b9c137296197a70a1ba7f68Johnny Chen    virtual uint32_t        NumSupportedHardwareWatchpoints();
574e49a5bfccc0a51185eadf69b3e23f68e70f1676Jim Ingham    virtual uint32_t        EnableHardwareWatchpoint (nub_addr_t addr, nub_size_t size, bool read, bool write, bool also_set_on_task);
584e49a5bfccc0a51185eadf69b3e23f68e70f1676Jim Ingham    virtual bool            DisableHardwareWatchpoint (uint32_t hw_break_index, bool also_set_on_task);
59fc8909388e6f1cea591c0d56434236f8d16543e6Johnny Chen    virtual uint32_t        GetHardwareWatchpointHit(nub_addr_t &addr);
60eb0eae254e4e2d737b9c137296197a70a1ba7f68Johnny Chen
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    kern_return_t           EnableHardwareSingleStep (bool enable);
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
644d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    typedef __i386_thread_state_t GPR;
654d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    typedef __i386_float_state_t FPU;
664d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    typedef __i386_exception_state_t EXC;
674d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    typedef __i386_avx_state_t AVX;
68e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton    typedef __i386_debug_state_t DBG;
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static const DNBRegisterInfo g_gpr_registers[];
714d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    static const DNBRegisterInfo g_fpu_registers_no_avx[];
724d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    static const DNBRegisterInfo g_fpu_registers_avx[];
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static const DNBRegisterInfo g_exc_registers[];
744d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    static const DNBRegisterSetInfo g_reg_sets_no_avx[];
754d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    static const DNBRegisterSetInfo g_reg_sets_avx[];
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static const size_t k_num_gpr_registers;
774d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    static const size_t k_num_fpu_registers_no_avx;
784d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    static const size_t k_num_fpu_registers_avx;
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static const size_t k_num_exc_registers;
804d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    static const size_t k_num_all_registers_no_avx;
814d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    static const size_t k_num_all_registers_avx;
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static const size_t k_num_register_sets;
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef enum RegisterSetTag
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        e_regSetALL = REGISTER_SET_ALL,
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        e_regSetGPR,
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        e_regSetFPU,
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        e_regSetEXC,
90e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton        e_regSetDBG,
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        kNumRegisterSets
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    } RegisterSet;
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef enum RegisterSetWordSizeTag
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
964d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan        e_regSetWordSizeGPR = sizeof(GPR) / sizeof(int),
972080155a1aecfa50a82760dcc4127575fb5dea67Greg Clayton        e_regSetWordSizeFPU = sizeof(FPU) / sizeof(int),
984d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan        e_regSetWordSizeEXC = sizeof(EXC) / sizeof(int),
99e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton        e_regSetWordSizeAVX = sizeof(AVX) / sizeof(int),
100e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton        e_regSetWordSizeDBG = sizeof(DBG) / sizeof(int)
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    } RegisterSetWordSize;
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    enum
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Read = 0,
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Write = 1,
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        kNumErrors = 2
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    struct Context
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
112e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton        GPR gpr;
1134d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan        union {
114e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton            FPU no_avx;
115e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton            AVX avx;
1164d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan        } fpu;
117e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton        EXC exc;
118e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton        DBG dbg;
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    struct State
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Context context;
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        kern_return_t gpr_errs[2];    // Read/Write errors
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        kern_return_t fpu_errs[2];    // Read/Write errors
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        kern_return_t exc_errs[2];    // Read/Write errors
127e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton        kern_return_t dbg_errs[2];    // Read/Write errors
1284d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        State()
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint32_t i;
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (i=0; i<kNumErrors; i++)
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                gpr_errs[i] = -1;
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                fpu_errs[i] = -1;
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                exc_errs[i] = -1;
137e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton                dbg_errs[i] = -1;
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void InvalidateAllRegisterStates()
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SetError (e_regSetALL, Read, -1);
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        kern_return_t GetError (int flavor, uint32_t err_idx) const
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (err_idx < kNumErrors)
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                switch (flavor)
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // When getting all errors, just OR all values together to see if
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // we got any kind of error.
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case e_regSetALL:    return gpr_errs[err_idx] |
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            fpu_errs[err_idx] |
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            exc_errs[err_idx];
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case e_regSetGPR:    return gpr_errs[err_idx];
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case e_regSetFPU:    return fpu_errs[err_idx];
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case e_regSetEXC:    return exc_errs[err_idx];
158e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton                case e_regSetDBG:    return dbg_errs[err_idx];
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                default: break;
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return -1;
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool SetError (int flavor, uint32_t err_idx, kern_return_t err)
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (err_idx < kNumErrors)
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                switch (flavor)
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case e_regSetALL:
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    gpr_errs[err_idx] =
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    fpu_errs[err_idx] =
173e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton                    exc_errs[err_idx] =
174e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton                    dbg_errs[err_idx] = err;
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case e_regSetGPR:
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    gpr_errs[err_idx] = err;
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case e_regSetFPU:
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    fpu_errs[err_idx] = err;
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case e_regSetEXC:
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    exc_errs[err_idx] = err;
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
188e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton
189e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton                case e_regSetDBG:
190e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton                    dbg_errs[err_idx] = err;
191e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton                    return true;
192e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                default: break;
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool RegsAreValid (int flavor) const
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return GetError(flavor, Read) == KERN_SUCCESS;
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    kern_return_t GetGPRState (bool force);
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    kern_return_t GetFPUState (bool force);
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    kern_return_t GetEXCState (bool force);
207e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton    kern_return_t GetDBGState (bool force);
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    kern_return_t SetGPRState ();
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    kern_return_t SetFPUState ();
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    kern_return_t SetEXCState ();
2124e49a5bfccc0a51185eadf69b3e23f68e70f1676Jim Ingham    kern_return_t SetDBGState (bool also_set_on_task);
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    static DNBArchProtocol *
21520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    Create (MachThread *thread);
21620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
21720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    static const uint8_t * const
21820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    SoftwareBreakpointOpcode (nub_size_t byte_size);
21920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
22020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    static const DNBRegisterSetInfo *
22120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    GetRegisterSetInfo(nub_size_t *num_reg_sets);
2224d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan
22325d2818c62140bb79cc3d689c4052b306c59c6b7Johnny Chen    // Helper functions for watchpoint manipulations.
22425d2818c62140bb79cc3d689c4052b306c59c6b7Johnny Chen    static void SetWatchpoint(DBG &debug_state, uint32_t hw_index, nub_addr_t addr, nub_size_t size, bool read, bool write);
22525d2818c62140bb79cc3d689c4052b306c59c6b7Johnny Chen    static void ClearWatchpoint(DBG &debug_state, uint32_t hw_index);
226fe98a2e6d17f0cb3ffa4a071bb43eb76c339adefJohnny Chen    static bool IsWatchpointVacant(const DBG &debug_state, uint32_t hw_index);
2270875a979e39324f0b8e7597b8ba37cca9efa0d27Johnny Chen    static void ClearWatchpointHits(DBG &debug_state);
2289d544f43d8c1637c45562f1402012c235f648ee9Johnny Chen    static bool IsWatchpointHit(const DBG &debug_state, uint32_t hw_index);
229fc8909388e6f1cea591c0d56434236f8d16543e6Johnny Chen    static nub_addr_t GetWatchAddress(const DBG &debug_state, uint32_t hw_index);
23025d2818c62140bb79cc3d689c4052b306c59c6b7Johnny Chen
2315693e875ac7ac8d6ce1614da40e0b56f3f58716cJohnny Chen    virtual bool StartTransForHWP();
2325693e875ac7ac8d6ce1614da40e0b56f3f58716cJohnny Chen    virtual bool RollbackTransForHWP();
2335693e875ac7ac8d6ce1614da40e0b56f3f58716cJohnny Chen    virtual bool FinishTransForHWP();
2345693e875ac7ac8d6ce1614da40e0b56f3f58716cJohnny Chen    DBG GetDBGCheckpoint();
2355693e875ac7ac8d6ce1614da40e0b56f3f58716cJohnny Chen
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    MachThread *m_thread;
2374d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    State       m_state;
2385693e875ac7ac8d6ce1614da40e0b56f3f58716cJohnny Chen    DBG         m_2pc_dbg_checkpoint;
2395693e875ac7ac8d6ce1614da40e0b56f3f58716cJohnny Chen    uint32_t    m_2pc_trans_state; // Is transaction of DBG state change: Pedning (0), Done (1), or Rolled Back (2)?
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton#endif    // #if defined (__i386__) || defined (__x86_64__)
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif    // #ifndef __DNBArchImplI386_h__
244