124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DNBArchImplX86_64.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 __DNBArchImplX86_64_h__
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define __DNBArchImplX86_64_h__
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton#if defined (__i386__) || defined (__x86_64__)
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DNBArch.h"
19db15e0cbbd18d6cd10a0197bae31aafb9e078365Sean Callanan#include "../HasAVX.h"
204d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan#include "MachRegisterStatesX86_64.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass MachThread;
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DNBArchImplX86_64 : public DNBArchProtocol
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DNBArchImplX86_64(MachThread *thread) :
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_thread(thread),
294d35f889ec869f86e950059470e90c99857ce477Johnny Chen        m_state(),
304d35f889ec869f86e950059470e90c99857ce477Johnny Chen        m_2pc_dbg_checkpoint(),
314d35f889ec869f86e950059470e90c99857ce477Johnny Chen        m_2pc_trans_state(Trans_Done)
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual ~DNBArchImplX86_64()
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    static  void            Initialize();
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
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual kern_return_t   GetRegisterState  (int set, bool force);
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual kern_return_t   SetRegisterState  (int set);
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool            RegisterSetStateIsValid (int set) const;
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual uint64_t        GetPC(uint64_t failValue);    // Get program counter
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual kern_return_t   SetPC(uint64_t value);
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual uint64_t        GetSP(uint64_t failValue);    // Get stack pointer
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void            ThreadWillResume();
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool            ThreadDidStop();
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool            NotifyException(MachException::Data& exc);
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55eb0eae254e4e2d737b9c137296197a70a1ba7f68Johnny Chen    virtual uint32_t        NumSupportedHardwareWatchpoints();
564e49a5bfccc0a51185eadf69b3e23f68e70f1676Jim Ingham    virtual uint32_t        EnableHardwareWatchpoint (nub_addr_t addr, nub_size_t size, bool read, bool write, bool also_set_on_task);
574e49a5bfccc0a51185eadf69b3e23f68e70f1676Jim Ingham    virtual bool            DisableHardwareWatchpoint (uint32_t hw_break_index, bool also_set_on_task);
58fc8909388e6f1cea591c0d56434236f8d16543e6Johnny Chen    virtual uint32_t        GetHardwareWatchpointHit(nub_addr_t &addr);
59eb0eae254e4e2d737b9c137296197a70a1ba7f68Johnny Chen
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    kern_return_t           EnableHardwareSingleStep (bool enable);
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
634d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    typedef __x86_64_thread_state_t GPR;
644d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    typedef __x86_64_float_state_t FPU;
654d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    typedef __x86_64_exception_state_t EXC;
664d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    typedef __x86_64_avx_state_t AVX;
67e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton    typedef __x86_64_debug_state_t DBG;
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static const DNBRegisterInfo g_gpr_registers[];
704d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    static const DNBRegisterInfo g_fpu_registers_no_avx[];
714d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    static const DNBRegisterInfo g_fpu_registers_avx[];
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static const DNBRegisterInfo g_exc_registers[];
734d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    static const DNBRegisterSetInfo g_reg_sets_no_avx[];
744d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    static const DNBRegisterSetInfo g_reg_sets_avx[];
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static const size_t k_num_gpr_registers;
764d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    static const size_t k_num_fpu_registers_no_avx;
774d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    static const size_t k_num_fpu_registers_avx;
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static const size_t k_num_exc_registers;
794d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    static const size_t k_num_all_registers_no_avx;
804d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    static const size_t k_num_all_registers_avx;
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static const size_t k_num_register_sets;
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef enum RegisterSetTag
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        e_regSetALL = REGISTER_SET_ALL,
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        e_regSetGPR,
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        e_regSetFPU,
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        e_regSetEXC,
89e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton        e_regSetDBG,
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        kNumRegisterSets
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    } RegisterSet;
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
934d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    typedef enum RegisterSetWordSizeTag
944d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    {
954d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan        e_regSetWordSizeGPR = sizeof(GPR) / sizeof(int),
962080155a1aecfa50a82760dcc4127575fb5dea67Greg Clayton        e_regSetWordSizeFPU = sizeof(FPU) / sizeof(int),
974d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan        e_regSetWordSizeEXC = sizeof(EXC) / sizeof(int),
98e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton        e_regSetWordSizeAVX = sizeof(AVX) / sizeof(int),
99e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton        e_regSetWordSizeDBG = sizeof(DBG) / sizeof(int)
1004d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan    } RegisterSetWordSize;
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    enum
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Read = 0,
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Write = 1,
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        kNumErrors = 2
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    struct Context
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
11125d2818c62140bb79cc3d689c4052b306c59c6b7Johnny Chen        GPR gpr;
11225d2818c62140bb79cc3d689c4052b306c59c6b7Johnny Chen        union {
113e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton            FPU no_avx;
114e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton            AVX avx;
1154d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan        } fpu;
116e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton        EXC exc;
117e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton        DBG dbg;
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    struct State
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Context context;
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        kern_return_t gpr_errs[2];    // Read/Write errors
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        kern_return_t fpu_errs[2];    // Read/Write errors
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        kern_return_t exc_errs[2];    // Read/Write errors
126e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton        kern_return_t dbg_errs[2];    // Read/Write errors
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        State()
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint32_t i;
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (i=0; i<kNumErrors; i++)
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                gpr_errs[i] = -1;
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                fpu_errs[i] = -1;
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                exc_errs[i] = -1;
136e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton                dbg_errs[i] = -1;
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        InvalidateAllRegisterStates()
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SetError (e_regSetALL, Read, -1);
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        kern_return_t
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        GetError (int flavor, uint32_t err_idx) const
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (err_idx < kNumErrors)
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                switch (flavor)
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // When getting all errors, just OR all values together to see if
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // we got any kind of error.
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case e_regSetALL:    return gpr_errs[err_idx] |
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            fpu_errs[err_idx] |
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            exc_errs[err_idx];
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case e_regSetGPR:    return gpr_errs[err_idx];
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case e_regSetFPU:    return fpu_errs[err_idx];
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case e_regSetEXC:    return exc_errs[err_idx];
161e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton                case e_regSetDBG:    return dbg_errs[err_idx];
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                default: break;
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return -1;
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SetError (int flavor, uint32_t err_idx, kern_return_t err)
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (err_idx < kNumErrors)
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                switch (flavor)
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case e_regSetALL:
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    gpr_errs[err_idx] =
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    fpu_errs[err_idx] =
178e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton                    exc_errs[err_idx] =
179e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton                    dbg_errs[err_idx] = err;
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case e_regSetGPR:
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    gpr_errs[err_idx] = err;
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case e_regSetFPU:
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    fpu_errs[err_idx] = err;
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case e_regSetEXC:
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    exc_errs[err_idx] = err;
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
194e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton                case e_regSetDBG:
195e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton                    dbg_errs[err_idx] = err;
196e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton                    return true;
197e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                default: break;
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        RegsAreValid (int flavor) const
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return GetError(flavor, Read) == KERN_SUCCESS;
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    kern_return_t GetGPRState (bool force);
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    kern_return_t GetFPUState (bool force);
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    kern_return_t GetEXCState (bool force);
214e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton    kern_return_t GetDBGState (bool force);
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    kern_return_t SetGPRState ();
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    kern_return_t SetFPUState ();
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    kern_return_t SetEXCState ();
2194e49a5bfccc0a51185eadf69b3e23f68e70f1676Jim Ingham    kern_return_t SetDBGState (bool also_set_on_task);
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    static DNBArchProtocol *
22220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    Create (MachThread *thread);
22320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
22420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    static const uint8_t * const
22520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    SoftwareBreakpointOpcode (nub_size_t byte_size);
22620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
22720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    static const DNBRegisterSetInfo *
22820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    GetRegisterSetInfo(nub_size_t *num_reg_sets);
2294d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan
230738fe1ba1fb9b7add6f5be5d65c6f73c944b422fJohnny Chen    // Helper functions for watchpoint manipulations.
231738fe1ba1fb9b7add6f5be5d65c6f73c944b422fJohnny Chen    static void SetWatchpoint(DBG &debug_state, uint32_t hw_index, nub_addr_t addr, nub_size_t size, bool read, bool write);
232738fe1ba1fb9b7add6f5be5d65c6f73c944b422fJohnny Chen    static void ClearWatchpoint(DBG &debug_state, uint32_t hw_index);
233fe98a2e6d17f0cb3ffa4a071bb43eb76c339adefJohnny Chen    static bool IsWatchpointVacant(const DBG &debug_state, uint32_t hw_index);
2340875a979e39324f0b8e7597b8ba37cca9efa0d27Johnny Chen    static void ClearWatchpointHits(DBG &debug_state);
2359d544f43d8c1637c45562f1402012c235f648ee9Johnny Chen    static bool IsWatchpointHit(const DBG &debug_state, uint32_t hw_index);
236fc8909388e6f1cea591c0d56434236f8d16543e6Johnny Chen    static nub_addr_t GetWatchAddress(const DBG &debug_state, uint32_t hw_index);
237738fe1ba1fb9b7add6f5be5d65c6f73c944b422fJohnny Chen
2385693e875ac7ac8d6ce1614da40e0b56f3f58716cJohnny Chen    virtual bool StartTransForHWP();
2395693e875ac7ac8d6ce1614da40e0b56f3f58716cJohnny Chen    virtual bool RollbackTransForHWP();
2405693e875ac7ac8d6ce1614da40e0b56f3f58716cJohnny Chen    virtual bool FinishTransForHWP();
2415693e875ac7ac8d6ce1614da40e0b56f3f58716cJohnny Chen    DBG GetDBGCheckpoint();
2425693e875ac7ac8d6ce1614da40e0b56f3f58716cJohnny Chen
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    MachThread *m_thread;
2445693e875ac7ac8d6ce1614da40e0b56f3f58716cJohnny Chen    State       m_state;
2455693e875ac7ac8d6ce1614da40e0b56f3f58716cJohnny Chen    DBG         m_2pc_dbg_checkpoint;
2465693e875ac7ac8d6ce1614da40e0b56f3f58716cJohnny Chen    uint32_t    m_2pc_trans_state; // Is transaction of DBG state change: Pedning (0), Done (1), or Rolled Back (2)?
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton#endif    // #if defined (__i386__) || defined (__x86_64__)
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif    // #ifndef __DNBArchImplX86_64_h__
251