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