DNBArchImplX86_64.h revision 5693e875ac7ac8d6ce1614da40e0b56f3f58716c
1ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch//===-- DNBArchImplX86_64.h -------------------------------------*- C++ -*-===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  Created by Greg Clayton on 6/25/07.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef __DNBArchImplX86_64_h__
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __DNBArchImplX86_64_h__
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined (__i386__) || defined (__x86_64__)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "DNBArch.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "../HasAVX.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "MachRegisterStatesX86_64.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MachThread;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DNBArchImplX86_64 : public DNBArchProtocol
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch{
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochpublic:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DNBArchImplX86_64(MachThread *thread) :
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        m_thread(thread),
2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        m_state()
3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    virtual ~DNBArchImplX86_64()
338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    {
348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    }
358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    static  void            Initialize();
378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    virtual bool            GetRegisterValue(int set, int reg, DNBRegisterValue *value);
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    virtual bool            SetRegisterValue(int set, int reg, const DNBRegisterValue *value);
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    virtual nub_size_t      GetRegisterContext (void *buf, nub_size_t buf_len);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual nub_size_t      SetRegisterContext (const void *buf, nub_size_t buf_len);
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual kern_return_t   GetRegisterState  (int set, bool force);
4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    virtual kern_return_t   SetRegisterState  (int set);
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    virtual bool            RegisterSetStateIsValid (int set) const;
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    virtual uint64_t        GetPC(uint64_t failValue);    // Get program counter
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    virtual kern_return_t   SetPC(uint64_t value);
488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    virtual uint64_t        GetSP(uint64_t failValue);    // Get stack pointer
498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    virtual void            ThreadWillResume();
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    virtual bool            ThreadDidStop();
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    virtual bool            NotifyException(MachException::Data& exc);
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    virtual uint32_t        NumSupportedHardwareWatchpoints();
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    virtual uint32_t        EnableHardwareWatchpoint (nub_addr_t addr, nub_size_t size, bool read, bool write);
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    virtual bool            DisableHardwareWatchpoint (uint32_t hw_break_index);
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    virtual void            HardwareWatchpointStateChanged ();
57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    virtual uint32_t        GetHardwareWatchpointHit(nub_addr_t &addr);
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)protected:
60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    kern_return_t           EnableHardwareSingleStep (bool enable);
61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    typedef __x86_64_thread_state_t GPR;
63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    typedef __x86_64_float_state_t FPU;
64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    typedef __x86_64_exception_state_t EXC;
65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    typedef __x86_64_avx_state_t AVX;
6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    typedef __x86_64_debug_state_t DBG;
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    static const DNBRegisterInfo g_gpr_registers[];
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    static const DNBRegisterInfo g_fpu_registers_no_avx[];
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    static const DNBRegisterInfo g_fpu_registers_avx[];
718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    static const DNBRegisterInfo g_exc_registers[];
728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    static const DNBRegisterSetInfo g_reg_sets_no_avx[];
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    static const DNBRegisterSetInfo g_reg_sets_avx[];
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    static const size_t k_num_gpr_registers;
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    static const size_t k_num_fpu_registers_no_avx;
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    static const size_t k_num_fpu_registers_avx;
7768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    static const size_t k_num_exc_registers;
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    static const size_t k_num_all_registers_no_avx;
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    static const size_t k_num_all_registers_avx;
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    static const size_t k_num_register_sets;
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    typedef enum RegisterSetTag
838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    {
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        e_regSetALL = REGISTER_SET_ALL,
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        e_regSetGPR,
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        e_regSetFPU,
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        e_regSetEXC,
8868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        e_regSetDBG,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kNumRegisterSets
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } RegisterSet;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typedef enum RegisterSetWordSizeTag
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    {
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        e_regSetWordSizeGPR = sizeof(GPR) / sizeof(int),
9568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        e_regSetWordSizeFPU = sizeof(FPU) / sizeof(int),
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        e_regSetWordSizeEXC = sizeof(EXC) / sizeof(int),
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        e_regSetWordSizeAVX = sizeof(AVX) / sizeof(int),
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        e_regSetWordSizeDBG = sizeof(DBG) / sizeof(int)
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    } RegisterSetWordSize;
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    enum
102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    {
10368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        Read = 0,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Write = 1,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kNumErrors = 2
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct Context
10968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    {
11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        GPR gpr;
11168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        union {
11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            FPU no_avx;
11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            AVX avx;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } fpu;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXC exc;
11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        DBG dbg;
11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    };
11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // See also HardwareWatchpointStateChanged() which updates this class-wide variable.
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    static DBG Global_Debug_State;
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    static bool Valid_Global_Debug_State;
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    struct State
12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    {
12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        Context context;
12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        kern_return_t gpr_errs[2];    // Read/Write errors
12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        kern_return_t fpu_errs[2];    // Read/Write errors
1288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        kern_return_t exc_errs[2];    // Read/Write errors
1298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        kern_return_t dbg_errs[2];    // Read/Write errors
13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        State()
13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        {
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            uint32_t i;
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            for (i=0; i<kNumErrors; i++)
13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            {
13668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                gpr_errs[i] = -1;
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                fpu_errs[i] = -1;
13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                exc_errs[i] = -1;
13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                dbg_errs[i] = -1;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        void
14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        InvalidateAllRegisterStates()
145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        {
14668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            SetError (e_regSetALL, Read, -1);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kern_return_t
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetError (int flavor, uint32_t err_idx) const
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
15268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            if (err_idx < kNumErrors)
15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            {
15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                switch (flavor)
15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                {
15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                // When getting all errors, just OR all values together to see if
15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                // we got any kind of error.
15868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                case e_regSetALL:    return gpr_errs[err_idx] |
15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                            fpu_errs[err_idx] |
16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                            exc_errs[err_idx];
16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                case e_regSetGPR:    return gpr_errs[err_idx];
16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                case e_regSetFPU:    return fpu_errs[err_idx];
16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                case e_regSetEXC:    return exc_errs[err_idx];
16468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                case e_regSetDBG:    return dbg_errs[err_idx];
165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                default: break;
166a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                }
167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)            }
168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)            return -1;
169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        }
17068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
171a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        bool
172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        SetError (int flavor, uint32_t err_idx, kern_return_t err)
173a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        {
174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)            if (err_idx < kNumErrors)
175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)            {
17658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                switch (flavor)
17758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                {
17858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                case e_regSetALL:
17958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                    gpr_errs[err_idx] =
18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                    fpu_errs[err_idx] =
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    exc_errs[err_idx] =
18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                    dbg_errs[err_idx] = err;
18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                    return true;
18458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
18558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                case e_regSetGPR:
186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                    gpr_errs[err_idx] = err;
18758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                    return true;
18858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
18958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                case e_regSetFPU:
19058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                    fpu_errs[err_idx] = err;
19158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                    return true;
19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
19358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                case e_regSetEXC:
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    exc_errs[err_idx] = err;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    return true;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                case e_regSetDBG:
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    dbg_errs[err_idx] = err;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    return true;
200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                default: break;
202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                }
203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            }
204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            return false;
205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        }
206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        bool
208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        RegsAreValid (int flavor) const
209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return GetError(flavor, Read) == KERN_SUCCESS;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    };
21358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
21458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    kern_return_t GetGPRState (bool force);
21558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    kern_return_t GetFPUState (bool force);
21658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    kern_return_t GetEXCState (bool force);
21758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    kern_return_t GetDBGState (bool force);
21858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
21958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    kern_return_t SetGPRState ();
22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    kern_return_t SetFPUState ();
221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    kern_return_t SetEXCState ();
222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    kern_return_t SetDBGState ();
223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static DNBArchProtocol *
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Create (MachThread *thread);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    static const uint8_t * const
228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SoftwareBreakpointOpcode (nub_size_t byte_size);
22958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    static const DNBRegisterSetInfo *
231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    GetRegisterSetInfo(nub_size_t *num_reg_sets);
232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Helper functions for watchpoint manipulations.
234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    static void SetWatchpoint(DBG &debug_state, uint32_t hw_index, nub_addr_t addr, nub_size_t size, bool read, bool write);
235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    static void ClearWatchpoint(DBG &debug_state, uint32_t hw_index);
236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    static bool IsWatchpointVacant(const DBG &debug_state, uint32_t hw_index);
237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    static void ClearWatchpointHits(DBG &debug_state);
238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    static bool IsWatchpointHit(const DBG &debug_state, uint32_t hw_index);
239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    static nub_addr_t GetWatchAddress(const DBG &debug_state, uint32_t hw_index);
240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    virtual bool StartTransForHWP();
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool RollbackTransForHWP();
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool FinishTransForHWP();
24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DBG GetDBGCheckpoint();
24558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
24658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    MachThread *m_thread;
24758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    State       m_state;
24858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DBG         m_2pc_dbg_checkpoint;
249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    uint32_t    m_2pc_trans_state; // Is transaction of DBG state change: Pedning (0), Done (1), or Rolled Back (2)?
250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif    // #if defined (__i386__) || defined (__x86_64__)
253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif    // #ifndef __DNBArchImplX86_64_h__
25458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)