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